如何面试研发人员程序员,软件工程师,开发人员,研发人员

软件(技术类)岗位简历的撰写要点 - 乔布简历
软件(技术类)岗位简历的撰写要点
浏览( 164156 )
同学们要应聘的软件工程师,其实就是众所周知的程序员、coder,说白了就是“写代码的”,不要小看这写代码的,写代码对技术的要求是非常高的,不同的IT公司倾向于不同的技术,他们在招聘时会有针对性地侧重对你的技术的考察,所以“技术”是你的简历中的重头戏,是关键词,是标签,是你向用人单位亮出的尚方宝剑。
本文由乔布简历小编彭飞@乔布堂辛苦整理成文,转载请注明出处
一、提亮你的技能
1. 详列具体的语言技能
翻开你的简历,先把你掌握了哪些语言技能通通列出来,不要嫌啰嗦,HR第一个寻找的就是这个信息。
比如2013年 乔布简历 在招聘软件开发工程师时,我们的招聘说明(JD)如下:
想象乔布简历的HR们大笔一挥,在上千份简历中圈圈点点勾画我们需要的技术,如果你列出了以上技术,我们就会留意,如果有应用以上技术的项目经历,我们就会花时间好好看看,可是如果你的简历毫无圈点之处,那么很可惜你就被pass掉了。所以乔布简历建议同学们把你所掌握的技术放在简历中最醒目的位置,有多少写多少。
2. 经历要呼应并突出技能
亮出技能之后,你的各种经历就要围绕这些技术来写。这就好比做一道菜,你的实习工作、比赛获奖、课程作业、专业培训等等经历都是原材料,你加入这些材料的目的就是为了一个共同的目的,要让人尝一口你的菜,就能品出其中的酸甜苦辣咸,所以像实习经历、知名比赛这样能提味的材料就多放,课程作业、专业培训这类味道淡的材料就少放。和技术无关的兼职打工行政经历,尽可能不放——这个我们乔布简历的小编们会在后面具体细说。
3. 技能的掌握程度并不可信
有些同学会在所列的语言技能后面标上“熟练”、“精通”等表示掌握程度的字眼,是否精通、熟练并没有一个统一的权衡标准,你所谓的“精通”,到了HR那里可能连“良好”都谈不上。而且你对语言技能的掌握程度也不是你说一说别人就相信的,HR一定会在面试的时候再具体考察你的熟练程度,特别是你所谓“精通”的技能,HR是绝不会放过的,所以掌握程度一般般的同学要小心了,千万别夸大事实,弄巧成拙。
4. 证书只是技能的简单证明
在程序员的简历中,证书的地位远不如技能,不要过于迷信认证的威力,如果你确实考了许多认证,那么挑选一些含金量高的列在技能后面。乔布简历建议你在罗列证书的时候要注意以下几点:
写清楚名称(中文全名或者英文名的缩写),全球公认的证书还好,如果你考的是一个不知名的培训机构颁发的小范围认证的证书,再不写清楚具体是什么,想吸引HR的眼球是不太可能了。
认证级别一定要写明,初级高级,或者分数(有分数的要写清楚总分,eg:88/100),有级别区分的千万不要一个“通过”就代替了。
认证时间要表明,有些证书是XX年之内有效的,所以什么时候考的要说明。
证书的具体内容就没有必要罗列了,原本证书只是起到一个辅助证明的作用,占太多空间就有些喧宾夺主了。
5. 技能和证书怎样排版
在简历排版上,你要将你掌握的技能和证书单独列出一项,直接显示在简历的前1/3处,如果技能不多,可以像 中一样:
技能较多的可以分类列出,参考 :
技能和证书都不突出的同学,也可以将其罗列在教育背景里:
乔布小编提醒要特别注意一些细节,技能的书写要在英文状态下,大小写要统一,书写格式的规范能体现出一名程序员最基本的专业素质。
6. 如何选取含金量高的证书
有些“考霸”每天忙于考这个证那个证,求职的时候通通列在简历中,特别自豪地向HR展示自己的能力,甚至把“导游资格证”、“营养师证”、“钢琴9级”等与计算机专业不相干的证书也与技能证书混在一起来写,殊不知你列出的那些边边角角没多大意义的证书只会干扰HR的注意力,直接忽视你最重要的那几个认证。
计算机软件专业的同学应多关注这些认证:JAVA系列认证、微软的MCP/MCTS认证、LINUX和UNIX认证、ORACLE系列认证、CISCO系列认证等。而像国二、国三这样的全国各个专业大学生都能考的证书,就不要列在简历中了。
同学们还想了解更多更详细的资格认证么?乔布简历的小编们为你们细心整理了
对于有些证书的认可程度的争议还蛮多的,比如《全国计算机软件技术资格与水平考试》,俗称“软考”,在网上就形成两派,一半认为软考很有意义,是评职称的必备条件,考试范围广,能学到很多东西;另一半认为软考不被大企业认可,应付考试浪费时间。
其实考证是有针对性的,面向政府事业单位,有官方颁发的证书就要多多地列出,这是评职称的加分点;而那些想进军外企的同学,应关注各大企业推出的培训认证。考软考的软件设计师不如微软的MCSD,SUN的SCJP,不如ORICAL,SAP的认证;考网络工程师不如CISCO,JUNIPER,CHECK POINT, CIW的认证,甚至是国内华为的认证;数据库的认证当属微软,甲骨文,IBM和MySQL的。
二、技术经历的撰写
1. 技术经历该如何写
技术经历是你的专业能力的直接体现,而且这也是简历中特别被看重的部分,所以不要一笔带过,要详细提到你在项目中用到的程序语言、你的个人贡献和产品细节。简历需要突出自己的经验,看简历的人希望了解你做的工作的难度和对本公司有多少帮助。尤其在项目中遇到关于技术的问题时,你是如何通过怎样的技能解决这些难题的。
很多同学在描述自己的实习或项目经历时都是这样写的:
乔布简历推荐你这样写:
2012.02 – 2012.06
网上订餐管理系统
系统为客户提供餐品浏览、点菜订单等服务
负责处理后台管理员信息,对完成后的项目进行测试、优化
运用sql server经行前后台连接,实现后台对会员信息的添加和删除
后期对用例经行测试,提交bug,跟踪bug,执行回归测试
该系统已尝试在3家餐厅推广使用,优化订餐的业务流程,降低成本
为什么同样的经历,用不同的方式写出来会有如此不同的效果呢?
前者在项目中对网上订餐管理系统做了过多的描述,把系统的具体构成都一 一列出来了,这些HR是不会看的,而在责任描述中恰恰忽略了HR希望看到的内容,他只是概略地写他负责哪些部分,既没有写清楚他做了什么,也没有表明他用到了哪些技术。而在乔布简历改写后的经历中,我们可以清晰地知道系统的功能、应聘者的职责、应用的技术以及工作成果。
请同学们注意,“独立完成”要比“主要负责”的效果更好,“主要负责”太泛泛了,谁知道你这个“负责”的背后到底做了些什么呢?而“独立完成”就让人感觉你有很强的行动力和独立性,专业能力很强。同时将成果量化到具体数字会更有说服力。
现在我们知道了不能大段地描写经历,但是经历描述得过于简单也是不合适的。下面我们看一下乔小布在参加乔布简历的百度应用开发项目中的经历:
参与乔布堂首届全国大学生简历大赛的百度应用开发项目
负责网页前端和后端的程序编写
参与后台框架搭建
这三句话过于简洁和笼统,“参与乔布堂首届全国大学生简历大赛的百度应用开发项目”这样的话是没有意义的,你可以随便写你参加了什么项目,可是就算描绘得天花乱坠,HR在意的依旧是你做了什么,应用到哪些技术。“负责网页前端和后端的程序编写”、“参与后台框架搭建”,这样的描述语句同样属于“假大空”,因为从中看不出任何实质性的东西。
乔布简历对上述项目经历做如下改写:
可以看到,改写后的项目经历写出了他所应用的语言:JS,CSS,HTML,提到了BS结构、SPRING、HIBEMATE等专业名词,顿时提升了他在软件开发方面的技术含量,HR一下就可以从众多简历中发现这一份,对其产生见一面好好聊一聊的兴趣。
综合上面两个例子,乔布简历为你总结以下要点:
A. 简历中不要写项目介绍,要写你做的事情和结果。
B. 按逻辑分行写,每行写一个点。
C. 用技术和专业术语说话。
D. 经历和技能相呼应。
E. 专业术语比简单罗列更亮眼(如JSP,跨系统交互,同步改变等)。
F. 写结果(时间、独立完成等)。
G. 写了几行代码就不用提了,这个不能衡量你的水平。
2. 各类技术经历的撰写顺序
技术经历是很宽泛的,它既可以是你在实习工作中经历的一个项目,也可以是你在学校里参与的一个科研课题,或是一次技能大赛,甚至只是你的一次课程作业,我们在列举这些经历的时候,要注意一下前后次序,乔布简历建议你按照以下内容的先后,挖掘你的经历:IT技术实习 & 知名IT赛事 & 课程作业 & 相关培训
(1)实习经历
实习经历的撰写一定要具体、简洁、有条理,具体是指你对工作的描述一定要详细,你做了什么、取得哪些成果,要一一列出,不可泛泛而谈;简洁是指你的语言要精练,每行每句话描述一件事情,与你的职责无关的事情不必多写;有条理是指你对工作经历的描述要按照一定的时间顺序或者逻辑顺序,不能想起什么写什么,要让HR能一眼抓住你的工作要点。
实习经历如何撰写呢?请看如下 示例:
乔小布的项目经历描写了三段,仔细观察你会发现,前两段的经历其实都是他在乔布简历实习时的经历,只不过是做了两件不同的事情,一个是开发乔布简历的百度应用,一个是设计简历大赛的页面,这种按项目描述经历的写法很聪明,让人一目了然。当然也有实习中并没有接触到独立项目的同学,那就直接描述你的实习的具体内容就可以了。
(2)比赛经历
专业的比赛经历是技能的PK场,特别能检验你的专业动手能力,IT公司尤其看重这一点,特别是当你取得名次奖项的时候。
计算机软件类的专业竞赛主要分为算法类和产品开发类。
算法类的主要有: ACM ICPC, 国内各大互联网厂商组织的算法比赛。
产品开发类的主要有:微软全球的“创新杯”,花旗集团的“花旗杯”,苹果中国的苹果技术开发大赛,谷歌中国的Android开发大赛。
还有两种类型竞赛都举办的、业界知名的、线上的 Topcoder。
同学们想知道还有哪些知名大赛么?乔布小编推荐大家快来看看
那么比赛经历该如何描述呢?
A. 如果你的实习经历很少,可以把参赛经历展开写出来。
通过这段比赛经历,就可以了解到该同学的工作职责、应用的技术以及取得的成果。
B. 在实习经历很丰富、足以展现你的能力的情况下,比赛经历就没必要详细描述了,只要一行文字说明你所取得的成绩就好。仍以乔布简历中
(3)课程作业——小程序的编写
对于应届毕业生来说,能够进入软件公司实习,并有一个完整的项目经验的人只是少数,大多数同学还只是白纸一张,毫无工作经验可写,乔布小编觉得这时也不要轻易放过简历上的空白,要抓住自己在校的实践经历。参与老师的某个课题,或是某天一时兴起编辑的一个游戏软件,都可以写到简历中来,只要你能够在具体描述这一过程中,展现你的能力,你的闪光点,这也能够在众多简历中脱颖而出,抓住HR的眼球。如下图示
上面这段经历是完全凭借兴趣自己编写的一个游戏,很好地突出了他在APP应用开发这方面的能力,而且他对编程的热情让他在应聘中获得更大的优势。
(4)培训经历
乔布小编们把培训经历排在最后,是因为把培训列在简历中,其实是没有什么实际意义的,人人都可以参加培训,一段培训就好比多选修了一门课程,并不会给你多加分。
培训的含金量取决于培训的级别和培训的技能,招聘方假设你在参加培训后就可以掌握相应的技能,因此,如果你没有更好的实际经历证明你掌握技能的能力,那么在培训经历中就需要展开描述。否则你的培训经历可以直接归并到教育背景当中,一句话概括就可以了。
如下例是乔小堂想要应聘 ,这个游戏策划培训的经历,就给他带来一定的相关背景与经验。
三、教育背景
相比较专业技能和项目经历,教育背景并不是十分重要,因为一般的软件公司只看你的能力和你的作品,如果你对软件开发有足够的热情并且精通几门开发语言,有一定的软件开发经验,用人单位是不会苛刻你是否是211,985出身,也不会限定非计算机软件专业的学生不要。
所以如果你只是一个三等院校、专科学历,甚至专业也不是软件科班出身,但是你非常热爱IT行业,对软件编程有独到的见解,并且有比较牛的项目经历和作品,那么不要犹豫,先亮出你的成果吧,至于教育背景,排在最后就OK了。
但是要想申请微软、甲骨文这样的顶尖级软件公司,还是很看重教育背景的。他们会青睐重点大学毕业、专业成绩非常优异的同学,比如以下
这是乔小堂应聘软件工程师的简历,因为他是名牌大学的研究生毕业,有很高的GPA,有很多证书,这些都是是他应聘大企业的优势,所以开篇就亮出来是很明智的。
四、校园活动/社会活动
除了技能证书、项目经历、教育背景在简历中占有重要的一席之地,校园活动、社会活动也可以作为简历内容的补充,但是要特别注意,简历的至少2/3都应该用来突出你的专业技术,非技术类的经历最多不超多1/3,如果你的简历通篇都在写社团活动、志愿者活动、干部经历,那么快快回去修改吧。
因为这类校园活动对于想招聘软件技术人才的公司来说,参考价值不大,你的社会经历再丰富,HR也不会多看几眼,企业更关心的是你的编程语言学的怎么样,逻辑思维强不强,分析能力、算法能力是否擅长。
不过在“程序猿”的世界里,也是有“社会活动猿”的。在招聘开发人员时,还会考察我们常见的软技能,因为大部分产品、项目都是团队合作出来的,像微软、IBM、Google这样的知名的大型IT公司,会在应届生中挑出一批既有突出的开发技能,又有较强的管理能力、协调能力的综合性人才,作为公司的后备管理人才,即管理培训生。
例如微软中国在招聘2013研发管理培训生的要求如下:
可见,这一类的管培生会特别看重你的校园活动、社会经历,尤其青睐有社团经验、学生会干部经历的学生。如果你想成为一名项目经理或是IT系统架构师,不妨从管培生做起,一步一步实现你的目标。
乔布简历为你找到乔小堂应聘 ,同学们可以加以参考。
乔小堂的简历中,除了有较丰富的项目经历,还详细描述了他在校期间作为院学生会主席和班级团支书的经历,充分展现了他的组织协调能力和沟通能力,这种既有技术又有管理能力的高素质全才,正是企业所要寻找的未来的管理层人才。
同学们若想了解详细的经历写法请点击
五、其他信息
一般在简历开头表明,这部分要尽量简洁,必备信息包括:姓名、性别、联系方式、求职意向。
是HR了解你性格的另一个方面,对于想进入软件行业的你,不爱计算机,不爱互联网,岂不是太说不过去了。如果你没有让人刮目相看的一技之长,不妨写一写你对专业的热爱。
比如下面这份 ,该同学想做游戏开发,他就写到了他喜欢玩网游,并玩出了名堂,以致去分析游戏市场,分析玩家需求,这样HR一看就会觉得,该同学凭借这股热情,做游戏开发肯定错不了。
六、让自己成为一名技术极客
前面我们列出的种种简历撰写要点,都是以传统的人事部门的视角来分析的,而一名资深的“程序猿”在审核你的简历时,往往喜欢关注一些技术极客,他们更倾向对技术狂热的、有想法的“程序猿”。
乔布小编们找到网上就流行过的这样一张图片,分别比较了人事专员和“程序猿”是如何看你的简历的,这张有趣的图片形象地向我们展示了哪些特质是一名“程序猿”的加分亮点。
在人事部门眼中,只要你在简历中提到了与应聘工作相符的技能就可以加分,但是在一名程序员眼中,他更看重你的一些极客特质,比如:
因为好玩而写过操作系统或编译器
简历被LaTeX编译过
为开源软件贡献过代码
有自己的BLOG专门分享IT技术知识
编程/机器人/工程俱乐部主席或是竞赛参与者
有一个自己域名的个人主页或邮件地址
类似这些有趣的又吸引HR眼球的经历,都可以写到你的简历中,使其更有创意,它会帮助你向“程序猿”更进一步,当然你最好真的属于这一类极客。
七、应届毕业生可以应聘的软件技术类岗位
1. 软件开发工程师
大多数软件专业的毕业生都是从最基础的程序员做起的,对一名程序员最基本的要求就是要熟练掌握一门编程语言,以至精通。编程语言不下百种,例如C、C++、Java、JSP、SQL、PHP、JavaScript等等。
每个方向都有特殊的技能要求,但无论你做哪方面的开发,你都必须具备以下通用技能:吃苦耐劳、稳重踏实、学会自学、有创新能力和逻辑分析能力。
详细介绍请点击
2. 软件测试工程师
软件测试工程师就是一家软件企业的“质量管理”,技术要求不高,但专业的知识面要广,而且它的工作的认真、耐心、细致等个性偏好,更适合女生来承担。
,要在两个方面突出体现。
一是软件测试方向的专业技能,主要体现在实践能力上;
二是需要有自己独到的观点,简历中要展现你的观察力、创新力。
详细介绍请点击
3. 售前/售后技术支持工程师
技术支持就是在售前或售后提供技术维护、应用培训、升级管理、解决投诉等工作,所以要兼具技术人员和销售人员两方面的素质。
一方面在个性上要开朗、乐于沟通、能吃苦、有团队合作意识;
另一方面要有“广而优”的专业知识、良好的自学能力以及优秀的英语口语。
详细介绍请点击
4. IT技术员/网管
网络管理员不同于网吧管理员,他负责所有与网络的建立、管理、故障排除以及网络安全等有关的工作。网管通常是一个没有工作经验的应届生的工作的起点,虽然相比较软件开发是一个技术要求低的岗位,但也不是丝毫没有技术含量的。
应聘网管你需要具备以下特质:
有一个公认的资格认证
兼具软件和硬件的专业知识
强大的自学能力
良好的英文阅读能力
详细介绍请点击
5. 数据库管理员(DBA)
因为数据库是一个企业的心脏,所以DBA是一个门槛比较高的职位,通常需要有一定经验的人来承担。除了需要抗压能力、好奇心、自学能力、耐心、细心、善于沟通等特质,还要具备以下技能,以 为例:
掌握一款数据库产品,如SQL Server 、MySQL、Oracle
熟悉一种操作系统,如Linux系统
至少会一种编程工具,如C++,JAVA,PHP
有一个闪亮的资格认证,oracle 的ocp认证或国家软考的数据库工程师
详细介绍请点击
6. 软件运维工程师
小型网站可能没有真正意义上的运维工程师,更多的是集合网络、系统、开发工作于一身的“复合型人才”,所以软件工程专业的应届毕业生想应聘运维工程师的职位不太可能。运维工程师对技能的要求也非常高,运维是一个集多种IT技能于一身的岗位,对系统、网络、存储、协议、需求、开发、测试、安全等各环节都需要了解一些,但对于某些环节需熟悉甚至精通。
想做运维工程师的同学要培养以下这些能力:
运维所需的技能:
通用应用方面的了解
系统、网络、安全方面的知识
运维所需的个人素质:
沟通能力、团队协作
胆大心细、创新能力
主动性、执行力
精力旺盛、抗压能力
7. 系统构架工程师
应届毕业生不会直接做系统架构,一般会从程序设计、代码编写、单元测试以及文档编写等工作做起,积累一定开发经验以后,才会逐渐涉及到架构的工作。因为架构师的要求非常高,需要技术水平高超、经验丰富的人来承担,而且在有些软件公司,架构师往往不是一个专门的和正式的职位,一般由最有经验的程序员来负责架构方面的工作。
八、软件专业毕业生可以应聘的其他岗位
1.软件销售简历模板
2.网络运营推广简历模板
3.客服专员简历模板
4.行政文秘简历模板
5.淘宝客服简历模板
乔布简历模板:
乔布简历模板:
乔布简历模板:
乔布简历模板:
转载请注明出处,欢迎参与讨论,纠错和补充内容
使用量14540
使用量11740
使用量9372
使用量9087
back to top
看过软件类文章的用户使用的简历模板2004年9月 Oracle大版内专家分月排行榜第二2004年7月 Oracle大版内专家分月排行榜第二2004年6月 Oracle大版内专家分月排行榜第二
2004年10月 Oracle大版内专家分月排行榜第三
2004年12月 .NET技术大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。软件开发工程师的面试应该考察哪些素质,如何做权衡? - 知乎1064被浏览55451分享邀请回答18524 条评论分享收藏感谢收起237 条评论分享收藏感谢收起查看更多回答5 个回答被折叠()验&&证&&码:
当前位置: &
将回答分享到微信
自己研发,自己创业。都是方向。只是IT到了35可能加班阿节奏不好跟得上
将回答分享到微信
讲说35是人生最风华正茂的时候,不过IT软件开发到35就感觉要退休了,我个人感觉主要是很多IT需要加班,一般到35以后精力上就不够了,所以很多公司不看好。特别是游戏行业加班比较严重的年轻是最大的门槛。
将回答分享到微信
不是,还是工程师
将回答分享到微信
将回答分享到微信
认真关注,虚心学习
将回答分享到微信
不能以年龄来一棍子敲好吧。
将回答分享到微信
懂设计的人做房产营销应该会有一个独特的视角,只要发挥专长,想必会有一番作为
将回答分享到微信
找不到满意答案?没解决问题?
点下方按钮开启问答新篇章
大家都在搜查看: 15459|回复: 2
程序员必读书单(非常经典,强烈推荐)
作者:微博:
原文链接:关于本文把程序员所需掌握的关键知识总结为三大类19个关键概念,然后给出了掌握每个关键概念所需的入门书籍,必读书籍,以及延伸阅读。旨在成为最好最全面的程序员必读书单。前言Read co and writing an exact man.Francis Bacon优秀的程序员应该具备两方面能力:良好的能力:掌握常用的数据结构和算法(例如链表,栈,堆,队列,排序和散列);
理解计算机科学的核心概念(例如计算机系统结构、操作系统、编译原理和计算机网络);
熟悉至少两门以上编程语言(例如C++,Java,C#,和Python);
专业的素养:具备良好的编程实践,能够编写可测试(Testable),可扩展(Extensible),可维护(Maintainable)的代码;
把握客户需求,按时交付客户所需要的软件产品;
理解现代软件开发过程中的核心概念(例如面向对象程序设计,测试驱动开发,持续集成,和持续交付等等)。
和其它能力一样,能力和素养源自项目经验和书本知识。项目经验因人而异(来自不同领域的程序员,项目差异会很大);但书本知识是相通的——尤其是经典图书,它们都能够拓宽程序员的视野,提高程序员的成长速度。在过去几年的学习和工作中,我阅读了大量的程序设计/软件开发书籍。随着阅读量的增长,我意识到:经典书籍需要不断被重读——每一次重读都会有新的体会;
书籍并非读的越多越好——大多数书籍只是经典书籍中的概念延伸(有时甚至是照搬);
意识到这两点之后,我开始思考一个很的问题:如何从尽可能少的书中,获取尽可能多的关键知识?换句话说:优秀的程序员应该掌握哪些关键概念?
哪些书籍来可以帮助程序员掌握这些关键概念?
这即是这篇文章的出发点——我试图通过这篇文章来回答上面两个问题。标准进入必读书单之前,我先介绍下书单里的书籍选择标准和领域选择标准。当然你也直接跳转到书单开始阅读。书籍选择标准必读:什么是必读书籍呢?如果学习某项技术有一本书无论如何都不能错过,那么这本书就是必读书籍——例如于Java,于C#;注意我没有使用“经典”这个词,因为经典计算机书籍往往和计算机科学联系在一起,而且经典往往需要10年甚至更长的时间进行考验;
注重实践,而非理论:所以这个书单不会包含过于原理性的书籍;
入门—必读—延伸:必读书籍的问题在于:1. 大多不适合入门;2. 不够全面。考虑到没有入门阅读和延伸阅读的阅读列表是不完整的——所以书单中每个关键概念都会由一本入门书籍,一本必读书籍(有时入门书籍和必读书籍是同一本),和若干延伸阅读书籍所构成。
概念选择标准全面:全面覆盖软件开发中重要的概念;
通用:适用于每一个程序员,和领域特定方向无关;
注重基础,但不过于深入:优秀的程序员需要良好的计算机科学基础,但程序员并没必要掌握过于深入的计算机科学知识。以算法为例,每个程序员都应该掌握排序、链表、栈以及队列这些基本数据结构和算法,但计算几何、线性规划和网络流这些算法可能就不是每个程序员都需要掌握的了;
通过这几个标准,我把程序员应掌握的关键概念分为程序设计,软件开发,以及个人成长三大类,每一大类均由若干关键概念组成。快速通道自从开博以来,经常会有朋友在论坛,微博,和QQ上提问学习X技术读什么书合适(例如:学习Java读什么书合适?如何学习程序设计?)所以我在这里列出了一个“快速通道”——把常见的问题集中在一起,点击问题,即可直接进入答案。(当然,如果你把本文从头读到尾帮助会更大 :-))
程序员必读书单入门书籍程序设计::
软件开发::
个人成长::
必读书籍程序设计::
软件开发::
个人成长::
这个阅读列表覆盖了软件开发各个关键领域的入门书籍和必读书籍,我相信它可以满足绝大多数程序员的需求,无论你是初学者,还是进阶者,都可以从中获益:包括了程序员应该掌握的计算机基础知识;
对软件开发至关重要,我选择了,,,,,和这六门进行介绍,如果想进一步理解编程语言,可以阅读里的书目;
在理解编程语言的基础上,优秀的程序员还应该了解各种技巧,熟悉基本的,并且能够高效的进行。
良好的程序设计能力是成为优秀程序员的前提,但软件开发知识也是必不可少的:优秀的程序员应具备良好的,知道如何利用,,和编写可复用,可扩展,可维护的代码,并具备软件知识和素养;
就像我们可以从名人传记里学习名人的成功经验,程序员也可以通过追随优秀程序员的足迹使自己少走弯路。包含一系列对大师程序员/计算机科学家的访谈,任何程序员都可以从中获益良多;
为了打造用户满意的软件产品,程序员应当掌握一定的知识和知识(是的,这些工作应该交给UI和UX,但如果你想独自打造一个产品呢?);
专业程序员应当对自己进行,并熟悉程序员的流程,以便在职业道路上越走越远;
软件开发是一项需要不断学习的技能,学习可以有效的提升学习能力和学习效率;
软件开发是一项国际化的工作,为了让更多的人了解你的代码(工作),良好的能力必不可少。
尽管我尽可能的去完善这个书单,但受限于我的个人经历,这个书单难免会有所偏颇。所以如果你有不同的意见,或者认为这个书单漏掉了某些重要书籍,请在评论中指出,我会及时更新。:-)程序设计1. 基础理论这本书其实不应该叫编码——它更应该叫“Petzold教你造计算机”——作者创造性的以编码为主题,从电报机和手电筒讲到数字电路,然后利用中的逻辑门构造出和,最后构造出一个完整的。不要被这些电路概念吓到——使用大量形象贴切的类比简化了这些概念,使其成为最精彩最通俗易懂的计算机入门读物。这本书的全名是:Computer Systems:A Programmer's Perspective(所以它又被称为CSAPP),我个人习惯把它翻译为程序员所需了解的计算机系统知识,尽管土了些,但更名副其实。是我读过的最优秀的计算机系统导论型作品,它创造性的把操作系统,计算机组成结构,数字电路,以及编译原理这些计算机基础学科中的核心概念汇集在一起,从而覆盖了指令集体系架构,汇编语言,代码优化,计算机存储体系架构,链接,装载,进程,以及虚拟内存这些程序员所需了解的关键计算机系统知识。如果想打下扎实的计算机基础又不想把操作系统计算机结构编译原理这些书统统读一遍,阅读是最有效率的方式。延伸阅读::中的K()的近作,这本书源自Brian在普林斯顿大学所教授的计算机基础课程,以通俗易懂的方式讲述了现代人所应了解的计算机知识和网络知识;
:的另一部作品,这本书以图灵的论文论可计算数及其在判定问题上的应用()为主题,阐述了图灵机(现代计算机的始祖)的构造,原理,以及应用。
:另一部优秀的计算机系统导论型作品,和不同,这本书采用自下而上的方式,从二进制,和数字逻辑这些底层知识一步步过渡到高级编程语言(C),从而以另一种方式理解计算机系统。
2. 编程语言编程语言是程序员必不可少的日常工具。工欲善其事,必先利其器。我在这里给出了C,C++,Java,C#,JavaScript,和Python这六种的书单(我个人不熟悉Objective-C和PHP,因此它们不在其中)。需要注意的是:我在这里给出的是编程语言(Programming Language)书籍,而非编程平台(Programming Platform)书籍。以Java为例,属于编程语言书籍,而就属于编程平台书籍。C忘记谭浩强那本糟糕不堪的C程序设计,才是C语言的最佳入门书籍。它详细但又不失简练的介绍了C语言以及C标准库的方方面面。对于C语言初学者,最难的概念不仅仅是指针和数组,还有指向数组的指针和指向指针的指针。花了大量的篇幅和图示来把这些难懂但重要的概念讲的清清楚楚,这也是我推荐它作为C语言入门读物的原因。尽管是二十多年前的书籍,但它仍然是C语言——以及计算机科学中最重要的书籍之一,它的重要性不仅仅在于它用清晰的语言和简练的代码描述了C语言全貌,而且在于它为之后的计算机书籍——尤其是编程语言书籍树立了新的标杆。以至于在很多计算机书籍的扉页,都会有“感谢Kernighan教会我写作”这样的字样。延伸阅读::不要被标题中的“专家”吓到,这实际是一本很轻松的书籍,它既包含了大量C语言技术细节和编程技巧,也包含了很多有趣的编程轶事;
:书如其名,这本书介绍了C语言中常见的坑和一些稀奇古怪的编程“技巧”,不少刁钻的C语言面试题都源自这本小册子;
:全面且权威的C语言参考手册,而且覆盖C99,如果你打算成为C语言专家,那么这本书不可错过;
:给出了15个C标准库的设计思路,实现代码,以及测试代码,配合阅读效果更佳;
:这本书展示了如何使用C语言实现可复用的数据结构,其中包含大量C语言高级技巧,以至于Amazon上排行第一的评论是“Probably the best advanced C book in existance”,而排行第二的评论则是“By far the most advanced C book I read”。
C++作为C++的发明者,没有人能比更理解C++。Bjarne在Texas A&M大学任教时使用C++为大学新生讲授编程,从而就有了这本书——它面向编程初学者,既包含C++教程,也包含大量程序设计原则。它不但是我读过最好的C++入门书,也是我读过最好的编程入门书。比较有趣的是,直到全书过半都没有出现指针,我想这可能是Bjarne为了证明不学C也可以学好C++吧。同样是的作品,是C++最权威且最全面的书籍。第4版相对于之前的版本进行了全面的更新,覆盖了第二新的C++ 11标准,并砍掉了部分过时的内容。延伸阅读::如果你觉得过于庞大,但你又想快速的浏览一遍新版C++的语言特色,那么可以试试这本小红书;
:C++的“历史书”,讲述了C++是如何一步一步从C with Classes走到如今这一步,以及C++语言特性背后的故事;
:相对于其它语言的标准库,C++标准库虽然强大,但学习曲线十分陡峭,这本书是学习C++标准库有力的补充;
:这本书系统的讲解了C++是如何以最小的性能代价实现对象模型,很多C++面试题(包括被问烂的虚函数指针)都可以在这本书里找到答案;
和:由于C++的特性实在繁杂,因此很容易就掉到坑里。Effective系列既讲述了C++的良好编程实践,也包含C++的使用误区,从而帮你绕过这些坑。
Java平心而论(即Core Java)并不算是一本特别出色的书籍:示例代码不够严谨,充斥着很多与C/C++的比较,语言也不够简洁——问题在于Java并没有一本很出色的入门书籍,与同类型的相比,至少做到了废话不多,与时俱进(还停留在Java 6之前),矮子里面选将军,算不错了。尽管Java没有什么出色的入门书籍,但这不代表Java没有出色的必读书籍。是我读过的最好的编程书籍之一,它包含大量的优秀Java编程实践,并对泛型和并发这两个充满陷阱的Java特性给出了充满洞察力的建议,以至于Java之父为这本书作序:“我很希望10年前就拥有这本书。可能有人认为我不需要任何Java方面的书籍,但是我需要这本书。”延伸阅读::非常优秀且难得的国产佳作,系统的介绍了Java虚拟机和相关工具,并给出了一些调优建议;
:在这本书之前,并没有一本Java书籍系统详细的介绍Java 7的新特性(例如新的垃圾收集器,try using结构和invokedynamic指令),这本书填补了这个空白;
:系统全面的介绍了Java的并发,如何设计支持并发的数据结构,以及如何编写正确的并发程序;
:包含了大量的Java陷阱——以至于读这本书时我说的最多的一个词就是WTF,这本书的意义在于它是一个大全,告诉你如何写好的Java程序,而则告诉你糟糕的Java程序是什么样子。更有意思的是,这两本书的作者都是。
C#可能你会疑问我为什么会推荐这本接近1200页的“巨著”用作C#入门,这是我的答案:C#的语言特性非常丰富,很难用简短的篇幅概括这些特性;
之所以有近1200页的篇幅,是因为它不但全面介绍了C#语言,而且还覆盖了ADO.NET,WCF,WF,WPF,以及ASP.NET这些.Net框架。你可以把这本书视为两本书——一本500多页的C#语言教程和一本600多页的.Net平台框架快速上手手册。
尽管标题带有“精通”两字,实际上是一本面向初学者的C#书籍,你甚至不需要太多编程知识,就可以读懂它。
是C#/.Net最重要的书籍,没有之一。它全面介绍了.Net的基石——的运行原理,以及构建于CLR之上的C#类型系统,运行时关系,泛型,以及线程/并行等高级内容。任何一个以C#为工作内容的程序员都应该阅读此书。延伸阅读::C#进阶必读,这本书偏重于C#的语言特性,它系统的介绍了C#从1.0到C# 4.0的语言特性演化,并展示了如何利用C#的语言特性编写优雅的程序;
:C#专业程序员必读,从变量命名规范讲到类型系统设计原则,这本书提供了一套完整的.Net编程规范,使得程序员可以编写出一致,严谨的代码,
:来自O'Reilly的C#参考手册,严谨的介绍了C#语法,使用,以及核心类库,C#程序员案头必备;
和:LINQ和async分别是.Net 3.5和.Net 4.5中所引入的最重要的语言特性,所以我认为有必要在它们上面花点功夫——这两本书是介绍LINQ和async编程的最佳读物。
JavaScript尽管JavaScript现在可以做到客户端服务器端通吃,尽管之类的前端框架使得一些人可以不懂JavaScript也可以编程,但我还是认为学习JavaScript从HTML DOM开始最为适合,因为这是JavaScript设计的初衷。系统的介绍了如何使用JavaScript,HTML,以及CSS创建可用的Web页面,是一本前端入门佳作。JavaScript语言包含大量的陷阱和误区,但它却又有一些相当不错的特性,这也是为什么称JavaScript为,并编写了一书来帮助前端开发者绕开JavaScript中的陷阱。和同类书籍不同,用精炼的语言讲解了JavaScript语言中好的那部分(例如闭包,函数是头等对象,以及对象字面量),并建议读者不要使用其它不好的部分(例如混乱的类型转换,默认全局命名空间,以及),毕竟,用糟糕的特性编写出来的程序往往也是糟糕的。延伸阅读::详尽且深入的介绍了Javascript语言,DOM,以及Ajax,并针对HTML5做了对应更新;
:这本书的第5版曾被前端专家称之为“唯一靠谱的JavaScript书”。相对于,更像是一本案头参考书,当然如果你感兴趣也可以从头读到尾;
:书如其名,这本书给出了大量的优秀JavaScript编程实践,使得程序员编写出健壮且易于维护的JavaScript代码;
:和常见的支持并发的编程语言(例如Java和C#)不同,JavaScript本身是单线程的,因此不能把其它语言处理并发的方式照搬到JavaScript。系统的介绍了JavaScript中的并发原理,并阐述了如何使用Promise、Deferred以及Async.js编写出简洁高效的异步程序。
PythonPython的入门书籍很多,而且据说质量大多不错,我推荐的原因是因为它是我的Python入门读物——简洁,全面,代码质量很不错,而且有几个很有趣的课后作业,使得我可以快速上手。这里顺便多说一句,不要用作为Python入门——它的废话实在太多,你能想象它用了15页的篇幅去讲解if语句吗?尽管O'Reilly出了很多经典编程书,但这本绝对不在其中。权威且实用的Python书籍,覆盖Python 2和Python 3。尽管它名为参考手册,但在Python语法和标准库基础之上对其实现机制也给出了深入的讲解,不容错过。延伸阅读::实用且便携的Python参考手册,我会说我在飞机上写程序时用的就是它么 -_-#;
:非常好的Python进阶读物,包含各种常用场景下的Python代码,使得读者可以写出更加Pythonic的代码;
:Python高级读物,针对Python 3,2014年的,不可错过;
:少见的国产精品,这本书以Python 2.5为例,从源代码出发,一步步分析了CPython是如何实现类型,控制流,函数/方法的声明与调用,类型以及装饰器等Python核心概念,读过之后会大大加深对Python的理解。尽管这本书有些过时,但我们仍然可以按照它分析源代码的方式来分析新版Python。
3. 编程语言理论大多数程序员并不需要从头编写一个编译器或解释器,因此就显得过于重量级;然而多数程序员还是需要解析文本,处理配置文件,或者写一个小语言,很好的满足了这个需求。它把常用的文本解析/代码生成方法组织成一个个模式,并为每个模式给出了实例和应用场景。这本书既会提高你的动手能力,也会加深你对编程语言的理解。Python发明者Guido van Rossum甚至为这本书给出了“Throw away your compiler theory book!”这样的超高评价。程序员每天都要和编程语言打交道,但是思考编程语言为什么会被设计成这个样子的程序员并不多,完美的回答了这个问题。这本书从编程语言的解析和运行开始讲起,系统了介绍了命名空间,作用域,控制流,数据类型以及方法(控制抽象)这些程序设计语言的核心概念,然后展示了这些概念是如何被应用到过程式语言,面向对象语言,函数式语言,脚本式,逻辑编程语言以及并发编程语言这些具有不同编程范式的编程语言之上。这本书或极大的拓宽你的视野——无论你使用什么编程语言,都会从这本书中获益良多。理解这一本书,胜过学习十门新的编程语言。延伸阅读::尽管我们在日常工作中可能只使用两三门编程语言,但是了解其它编程语言范式是很重要的。一书用精简的篇幅介绍了Ruby,Io,Prolog,Scala,Erlang,Clojure,和Haskell这七种具有不同编程范式的语言——是的,你没法通过这本书变成这七种语言的专家,但你的视野会得到极大的拓宽;
:另一本优秀的编译原理作品,通过从零开始制作一门无类型语言Crowbar和一门静态类型语言Diksam,把类型系统,垃圾回收,和代码生成等编程语言的关键概念讲的清清楚楚;
:披着Ruby外衣的入门书籍,使你对编程语言的理解更上一层楼。
4. 程序设计现代编程语言的语法大多很繁杂,初学者使用这些语言学习编程会导致花大量的时间在编程语言语法(诸如指针,引用和类型定义)而不是程序设计方法(诸如数据抽象和过程抽象)之上。解决了这个问题——它专注于程序设计方法,使得读者无需把大量时间花在编程语言上。这本书还有一个与之配套的教学开发环境,这个环境会根据读者的程度变换编程语言的深度,使得读者可以始终把注意力集中在程序设计方法上。我个人很奇怪这样的佳作为什么会绝版,而谭浩强C语言这样的垃圾却大行其道——好在是程序设计方法已经被免费发布在网上。是另一本被国内大学忽视(至少在我本科时很少有人知道这本书)的教材,这本书和有很多共同点——都使用作为教学语言;都专注于程序设计方法而非编程语言本身;都拥有相当出色的课后题。相对于,要更加深入程序设计的本质(过程抽象,数据抽象,以及元语言抽象),以至于Google技术总监给了这本书。延伸阅读::作者的关于程序设计方法佳作——他把关系代数和群论引入编程之中,试图为程序设计提供一个坚实的理论基础,从而构建出更加稳固的软件。这本书是和的绝好补充——前者使用函数式语言(Scheme)讲授程序设计,而则使用命令式语言(C++);
:总结了面向对象程序设计中的模式,而这本书分析了程序设计中的常见模式的本质,阅读这本书会让你对程序设计有更深的理解;
:会编程的人很多,但能够编写正确程序的人就少多了。通过前条件——不变式——后条件以及逻辑谓词演算,为编写正确程序提供了强有力的理论基础,然后这本书通过实例阐述了如何应用这些理论到具体程序上。任何一个想大幅提高开发效率的程序员都应阅读此书。
5. 算法与数据结构我在一文中提到我的算法入门教材是,我曾经认为它是最好的算法入门教材,但自从我读到的之后我就改变了观点——这本才是最好的算法入门教材:使用更为容易的Java语言作为教学语言;
覆盖所有常用的数据结构和算法,并均给出其完整实现;
包含大量的图示用于可视化算法——事实上这是我读过的图示最为丰富形象的书籍,这也是我称其为最好的算法入门书籍的原因。
是一本少见的实践型算法书籍——它并非一一介绍数据结构/算法的教材,而是实践性极强的算法应用手册。作者()从他多年的实际经验精选出一些有趣而又实用的问题,然后展示了他解决这些问题的过程(分析问题,选择合适的算法,解决问题,以及验证答案)。任何程序员都可以从中获益。延伸阅读::严格来说这本书并非的续作,而是一本类似于番外篇的编程技巧/实践手册;它不像那般重视算法的应用,而是全面覆盖了程序员所需的能力;
:尽管我在这边文章开头提到会尽量避免理论性的书籍,但没有的算法阅读列表是不完整的,我想这本书就不需要我多介绍了; :-)
:侧重于算法设计,这本书创新的把常见算法分为分治,减治,变治三大类,并覆盖了动态规划,回溯,以及分支定界等高级算法设计方法,属于算法设计的入门佳作;
6. 程序调试一个让非编程从业人员惊讶的事实是程序员的绝大多时间都花在调试上,而不是写程序上,以至于把调试时间占工作时间的比例作为衡量程序员开发能力的标准。既是调试领域的入门作品,也是必读经典之作。的作者是一个具有丰富实战经验的硬件工程师,他把他多年的调试经验总结成九条调试法则,并对每一条法则都给对应的实际案例。任何程序员都应通过阅读这本书改善调试效率,即便是非程序员,也可以从这本书中学到系统解决问题的方法。延伸阅读::最好的调试是不调试——介绍了断言,设计清晰的API,以及单步代码等技巧,用于编写健壮的代码,减少调试的时间;
:调试工具书——这本书详细的介绍了常见的调试器工具,并通过具体案例展示了它们的使用技巧;
软件开发1. 编程实践是这个星球上最好的计算机书籍作者:从上古时期的,到早期的和,再到这本,每本书都是必读之作。尽管程序设计实践只有短短200余页,但它使用精炼的代码和简要的原则覆盖了程序设计的所有关键概念(包括编程风格,算法与数据结构,API设计,调试,测试,优化,移植,以及领域特定语言等概念)。如果你想快速掌握良好的编程实践,或者你觉着900多页的过于沉重,那么程序设计实践是你的不二之选。我第一次读这本书就被它简洁的语言和优雅的代码所吸引,以至于读研时我买了三本程序设计实践——一本放在学校实验室,一本放在宿舍,一本随身携带阅读。我想我至少把它读了十遍以上——每一次都有新的收获。无论在哪个版本的程序员必读书单,都会高居首位。和其它程序设计书籍不同,用通俗清晰的语言覆盖了软件构建(Software Construction)中各个层次上所有的重要概念——从变量命名到类型设计,从控制循环到代码结构,从测试和调试到构建和集成,可谓无所不包,你可以把这本书看作为程序员的一站式(Once and for all)阅读手册。更珍贵的是,在每一章末尾都给出了价值很高的参考书目(参考我之前的一文),如果你是一个初出茅庐的程序员,是绝好的阅读起点。延伸阅读::专注于代码可读性(Code Readability),这本书来自Google的两位工程师对的总结。它给出了大量命名,注释,代码结构,以及API设计等日常编码的最佳实践,并包含了很多看似细微但却可以显著提升代码可读性的编程技巧。这本书的翻译还不错,但如果你想体会书中的英语幽默(例如Tyrannosaurus——Stegosaurus——Thesaurus),建议阅读它的;
:专注于生产效率(Productivity),它既包含源自作者多年经验的高生产率原则,也包含大量的提高生产率的小工具,每个追求高生产率的程序员都应该阅读这本书;
:专注于程序设计哲学,这本书首先总结出包括模块化,清晰化,可组合,可分离等17个Unix程序设计哲学,接下来通过Unix历史以及各种Unix编程工具展示了这些原则的应用。尽管个人觉的这本书有些过度拔高Unix且过度贬低Windows和M$,但书中的Unix设计哲学非常值得借鉴。
2. 面向对象程序设计无论是在Amazon还是在Google上搜索设计模式相关书籍,都会排在首位——它使用风趣的语言和诙谐的图示讲述了观察者,装饰者,抽象工厂,和单例等关键设计模式,使得初学者可以迅速的理解并掌握设计模式。在Amazon上,就连设计模式原书作者都对它给出了很高的评价。需要注意,是非常好的设计模式入门书,但千万不要把这本书作为学习设计模式的唯一的书——是的,Head First设计模式拥有风趣的语言和诙谐的例子,但它既缺乏实际的工程范例,也没有给出设计模式的应用/适用场景。我个人建议是在读过这本书之后立即阅读的或的,以便理解设计模式在实际中的应用。作为设计模式领域的开山之作,Erich Gamma,Richard Helm,Ralph Johnson等四位作者将各个领域面向对象程序开发的经验总结成三大类23种模式,并给出了每个模式的使用场景,变体,不足,以及如何克服这些不足。这本书行文严谨紧凑(四位作者都是PhD),并且代码源自实际项目,属于设计模式领域的必读之作。需要注意:不适合初学者阅读——它更像是一篇博士论文而非技术书籍,加上它的范例都具有很强的领域背景(诸如GUI窗口系统和富文本编辑器),缺乏实际经验的程序员很难理解这本书。延伸阅读::尽管标题带有“敏捷”,但这本书实际是一本面向对象程序设计读物——通过丰富的例子讲解设计模式的应用和,如果你觉着过于晦涩,那么你完全可以从这本书开始学习。这本书使用Java作为讲解语言,它也有对应的;
:同样是的作品,这本书教导读者使用面向对象+敏捷开发原则编写清晰可维护的代码;
:这本书专注于架构,作者针对企业应用的特点(诸如持久化数据,多人访问,操作数据的界面以及复杂的业务逻辑),总结出若干企业架构模式,以便程序员构建强大且可扩展的企业应用。
3. 重构任何产品代码都不是一蹴而就,而是在反复不断的修改中进化而来。正是这样一本介绍如何改进代码的书籍——如何在保持代码行为的基础上,提升代码的质量(这也是重构的定义)。我见过很多程序员,他们经常声称自己在重构代码,但他们实际只做了第二步(提升代码的质量),却没有保证第一步(保持代码行为),因此他们所谓的重构往往会适得其反——破坏现有代码或是引入新bug。这也是我推荐这本书的原因——它既介绍糟糕代码的特征(Bad smell)和改进代码的方法,也给出了重构的完整流程——1. 编写单元测试保持(Preserve)程序行为;2. 重构代码;3. 保证单元测试通过。还引入了一套重构术语(诸如封装字段,内联方法,和字段上移),以便程序员之间交流。只有理解了这三个方面,才能算是理解重构。这里再重复一遍重构的定义——在保持代码行为的基础上,提升代码的质量。专注于第二步,即如何提升代码的质量,而专注于第一步,即如何保持代码的行为。提升代码质量并不困难,但保持代码行为就难多了,尤其是对没有测试的遗留代码(Legacy Code)而言——你需要首先引入测试,但遗留代码往往可测试性(Testability)很差,这时你就需要把代码变的可测试。包含大量的实用建议,用来把代码变的可测试(Testable),从而使重构变为可能,使提高代码质量变为可能。延伸阅读::这本书的中文书名存在误导,它的原书书名是Refactoring to Patterns——通过重构,把模式引入代码。这本书阐述了重构和设计模式之间的关系,使得程序员可以在更高的层次上思考重构,进行重构。
4. 软件测试关于软件测试的书籍很多,但很少有一本测试书籍能像这般既有趣又实用。不同于传统的软件测试书籍(往往空话连篇,无法直接应用),非常实际——它从程序员的心理出发,分析软件错误/Bug最可能产生的路径,然后针对这些路径进行残酷的测试,以保证软件质量。我在第一次阅读这本书时大呼作者太过“残忍”——连这些刁钻诡异的测试招数都能想出来。但这种毫不留情(Relentless)的测试风格正是每个专业程序员所应具备的心态。注意:如果你是一个测试工程师,那么在阅读这本书前请三思——因为阅读它之后你会让你身边的程序员苦不堪言,甚至连掐死你的心都有 :-D。注重黑盒测试,而这本则注重白盒测试。正如书名所示,覆盖了单元测试的每个方面:从如何编写良好的单元测试,到如何设计可测试(Testable)的软件,再到如何重构测试——可以把它看作为单元测试的百科全书。延伸阅读::尽管覆盖了单元测试的方方面面,但它的问题在于不够与时俱进(07年出版)。弥补了这个缺陷——它详细介绍了如何通过测试框架和Mock框架编写良好的单元测试,并给出了大量优秀单元测试的原则;
:可以把这本书看作为前一本书的.Net版,适合.Net程序员;
:这本书详细介绍了Google如何测试软件——包括Google的软件测试流程以及Google软件测试工程师的日常工作/职业发展。需要注意的是:这本书中的测试流程在国内很可能行不通(国内企业缺乏像Google那般强大的基础设施(Infrastructure)),但它至少可以让国内企业有一个可以效仿的目标;
:的另一本测试著作,不同于传统的黑盒/白盒测试,这本书创造性的把测试比喻为“探索”(Exploration),然后把不同的探索方式对应到不同的测试方式上,以便尽早发现更多的软件错误/Bug。
5. 项目管理很多程序员都向往成为横扫千军(One-man Army)式的“编程英雄”,但卓越的软件并非一人之力,而是由团队合力而成。就是这样一本写给程序员的如何在团队中工作的绝好书籍,它围绕着HRT三大原则(Humility谦逊,Respect尊重,和Trust信任),系统的介绍了如何融入团队,如何打造优秀的团队,如何领导团队,以及如何应对团队中的害群之马(Poisonous People)。这本书实用性极强,以至于Python之父都盛赞这本书“说出了我一直在做但总结不出来的东西”。尽管成书于40年前,但它仍是软件项目管理最重要的书籍。源自作者领导并完成和这两个即是放到现在也是巨型软件项目的里程碑项目的经验总结。它覆盖了软件项目各个方面的关键概念:从工期管理()到团队建设(),从程序设计(编程的本质是使用正确的数据结构)到架构设计(),从原型设计(Plan to Throw one away)到团队交流(形式化文档+会议)。令人惊讶的是,即便40年之后,中的关键概念(包括焦油坑,,,,等等)依然适用,而软件开发的仍然没有得到解决()。延伸阅读::从人的角度分析软件项目。从雇佣正确的人,创建健康的工作环境,以及打造高效的开发团队等角度阐述了如何改善人,从而改善软件项目;
:这本书生动的再现了软件项目管理工作的场景,并给出了各种实用管理技巧,如果你有意转向管理岗位,这本书不容错过;
:这本书从黑客的历史说起,系统而又风趣的讲述了开源运动的理论和实践,以及开源软件项目是如何运作并发展的。了解开源,从这本书开始。
6. 专业开发不要被庸俗的译名迷惑,是一本价值极高的程序员成长手册。这本书并不局限于特定的编程语言或框架,而是提出了一套切实可行的实效(Pragmatic)开发哲学,并通过程序设计,测试,编程工具,以及项目管理等方面的实例展示了如何应用这套开发哲学,从而使得程序员更加高效专业。有人把这本书称之为迷你版——给出了大量的优秀程序设计实践,偏向术;而给出了程序设计实践背后的思想,注重道。指出了如何成为专业程序员,这本则指出了专业程序员应该是什么样子——承担责任;知道自己在做什么;知道何时说不/何时说是;在正确的时间编写正确的代码;懂得自我时间管理和工期预估;知道如何应对压力。如果你想成为专业程序员(Professional Developer)(而不是码农(Code Monkey)),这本书会为你指明前进的方向。延伸阅读::“敏捷”版的,可以把这本书作为的补充;
:尽管这是一本讲如何创业的书,但其中的精益生产,最小价值产品,以及构建-度量-学习循环都值得程序员借鉴。
7. 大师之言是一本极具眼光的技术访谈书籍——在这本书访谈的15位计算机科学家中,竟出现了12位获得者——要知道图灵奖从1966年设奖到现在也只有六十几位获奖者而已。把计算机科学分为四大领域:编程语言;算法;架构;人工智能。并选取了每个领域下最具代表性的计算机科学家进行访谈。因为这些计算机科学家都是其所在领域的开拓者,因此他们能给出常人无法给出的深刻见解。通过这本书,你可以了解前三十年的计算机科学的发展历程——计算机科学家做了什么,而计算机又能做到/做不到什么。从而避免把时间浪费在前人已经解决的问题(或者根本无法解决的问题)上面。同样是访谈录,同样访谈15个人,把重点放在程序员(Coders at work)上。它从各个领域选取了15位顶尖的程序员,这些程序员既包括和这些老牌Unix黑客,也包括这样的80后新生代,还包括和这样的计算机科学家。这种多样性(Diversity)使得兼具严谨性和趣味性,无论你是什么类型的程序员,都能从中受益良多。延伸阅读::通过图灵奖介绍整个计算机科学发展史,非常难得的国产精品图书;
:可以把这本书看作为二十年前的,被访谈者都是当时叱咤风云的人物(例如微软的创造者,Macintosh的发明者,以及Adobe的创始人等等)。有趣的是这本书中大量的经验和建议到如今依然适用;
:类似于,不同的是被访谈者都是编程语言的设计者——这本书覆盖了除C语言以外的几乎所有主流编程语言。通过这本书,你可以从中学到编程语言背后的设计思想——编程语言为什么要被设计成这样,是什么促使设计者要在语言中加入这个特性(或拒绝那个特性)。从而提升对编程语言的理解。
8. 界面设计书如其名,是一本面向初学者的快速设计入门。它覆盖了版式,色彩,和字体这三个设计中的关键元素,并创造性的为版式设计总结出CRAP四大原则(Contrast对比,Repetition重复,Alignment对齐,Proximity亲密)。全书使用丰富生动的范例告诉读者什么是好的设计,什么是不好的设计,使得即便是对设计一无所知的人,也可以从这本书快速入门。强调实践,即如何做出好的设计;强调理论,即为什么我们会接受这样的设计而反感那样的设计。如果你想要搞清楚设计背后的心理学知识,但又不想阅读大部头的心理学著作,那么是你的首选。延伸阅读::这本书指出了GUI设计的原则和常见误区,然后通过具体范例指出了如何避免这些误区。如果你的工作涉及到用户界面,那么这本书会为你减少很多麻烦;
:这本书将用户界面中的常见元素/行为组织成彼此关联的模式,以便读者理解并举一反三,从而将其运用到自己的应用中;
:类似于,但面向移动平台。它给出了iOS,Android,以及Windows Phones上常用的90余种界面设计模式,从而使得你不必把这些平台的应用挨个玩一遍也可以掌握各个平台的设计精髓。如果你主攻Android平台,那么会是更好的选择;
和:如果你读过之后想继续深入学习设计,这两本书是不错的起点。
9. 交互设计书如其名,给出了重要的125个设计原则,并用简练的语言和范例展示了这些原则的实际应用。每个原则都有对应的参考文献,以便读者进一步学习。我之所以推荐这本书,是因为:1. 程序员需要对设计有全面的认识;2. 程序员并不需要知道这些设计原则是怎么来的,知道怎么用即可。这本书很好的满足了这两个要求。是交互设计领域的圣经级著作。交互设计专家(以及VB之父)在这本书中详细介绍了交互设计的原则,流程,以及方法,然后通过各种范例(主要来自桌面系统)展示了如何应用这些原则。需要注意的是这本书的已经出版,它在第三版的基础上增加了移动设计以及Web设计等内容。延伸阅读::交互设计领域的另一本经典之作,它通过解读人类行动背后的心理活动,展示了设计问题的根源,并给出了一系列方法用以解决设计问题(需要注意,尽管这本书有中译版,但中译版对应的是02年的旧版,而非13年的新版);
:的另一本经典,这本书非常辛辣的指出让不具备人机交互知识的程序员直接编写面向用户的软件就像让精神病人管理疯人院(The Inmates Are Running the Asylum),然后给出了一套交互设计流程以挽救这个局面;
:专注于把产品变的更加简单易用。作者通过删除,组织,隐藏,和转移这四个策略,展示了如何创造出简约优质的用户体验。
个人成长1. 职业规划是一本优秀且实用的程序员职业规划手册。这本书由若干个模式组成,每个模式都对应于程序员职业生涯中的特定阶段。通过这本书,读者可以很方便的找到自己目前所处的模式(阶段),应该做什么,目标是什么,以及下一个模式(阶段)会是什么。如果你时常感到迷茫,那么请阅读这本,找到自己的位置,确定接下来的方向。延伸阅读::非常著名的为人处世书籍。很多人把这本书归类到成功学,但我并不这么认为——在我看来,这本书教的更多的是如何成为一个让大家喜欢的人。作为天天和机器打交道的程序员,这套书会帮助我们与人打交道;
:这本书不是教你去谈判,而是教你通过谈判(Negotiation)去得到更多(Getting more,这也是这本书的原书书名)。小到买菜砍价,大到争取项目,这本书中的谈判原则会让你收益良多;
:作为长期与计算机打交道的职业,程序员往往会受到各式各样疾病的困扰,这本书正是为了解决这个问题而出现:它从改善工作环境,调整饮食结构,预防头痛眼痛,以及进行室内/室外锻炼等方面出发,给出了一套全面且可行的程序员健康改善计划,以帮助程序员打造健康的身体。
2. 思维方式作为程序员,我们需要不断地学习——既要学习新技术,也要学习如何解决各种领域的问题。为了提升学习效率,我们需要学习如何学习。正是这样一本讲如何学习的书,它集合了认知科学,神经学,以及行为理论的最新研究成果,并系统的介绍了大脑的工作机制。通过这本书,你将学会如何高效的使用自己的大脑,从而提高思考能力,改善学习效率。Mastery is not about perfection. It’s about a process, a journey. The master is the one who stays on the path day after day, year after year. The master is the one who is willing to try, and fail, and try again, for as long as he or she lives.为什么同样资质的人,大多数人会碌碌无为,而只有极少数能做到登峰造极?如何在领域内做到顶尖?如何克服通往顶尖之路上的重重险阻?回答了这些问题,并极具哲理的指出登峰造极并不是结果,而是一段永不停止的旅程。阅读这本书不会让你立刻脱胎换骨,但它会指引你走向正确的道路——通往登峰造极之路。延伸阅读::不要被标题中的“数学思维”吓到,它并不仅仅只是一本数学解题书,它所提出的四步解题法(理解题目-&拟定方案-&执行计划-&总结反思)适用于任何领域;
:所写的关于学习思维方法的文章集,既包含了他对学习方法的思考,也包含了大量进一步阅读的资源;
:这本书系统的分析了人类思维的常见误区,并针对各个误区给出了解决方案,从而帮助程序员养成严谨正确的思考方式;
:与批判性思维相反,这本书专注于创造性思维(Creative Thinking),它分析了阻碍创造性思维的常见思维障碍(Blockbuster)以及这些思维障碍背后的成因,并给出了各种方法以破除这些障碍。
3. 求职面试知己知彼,百战不殆。是程序员求职的必读书籍,它覆盖了程序员求职的方方面面:从开始准备到编写简历,从技术面试到薪酬谈判。由于该书作者曾在Google,微软,和苹果任职并进行过技术招聘,因此这本书的内容非常实用。顺便吐个槽:这本书翻译的还不错,但我实在无法理解封面上的“进入顶级科技公司的葵花宝典”这段文字——找个工作而已,用不着切JJ这么凶残吧。-_-#同样是来自作者的作品,专注于技术面试题,它既包含了IT企业(诸如微软,Google,和苹果)的面试流程以及如何准备技术面试,也包含了大量(超过200道)常见技术面试题题目以及解题思路。无论你打算进入国内企业还是外企,你都应该把这本书的题目练一遍,以找到技术面试的感觉(我在求职时就曾经专门搞了一块白板,然后每二十分钟一道题的练习,效果很不错)。延伸阅读::恐怕是国内技术面试第一书,这本书里面的多数题目都曾经是国内IT企业面试的必问题目。这本书的缺点是它太旧而且被用滥了(以至于一些企业开始避免使用这本书上的题目)——但你可以把它当成一本算法趣题来读;
:相对于东拼西凑的XX面试宝典,是一本少见的国产精品技术面试书籍,尽管这本书的技术面试题目不多(60余道),但作者为大多数题目都给出了不同方式的解法,并分析了这些解法之间的优劣,此外作者还以面试官的视角分析了技术面试的各个环节,从而帮助读者把握技术面试;
:可以把它看做的补充阅读——这本书的特点在于它给出了非常详细的简历/求职信/电子邮件编写技巧,而这正是不少国内程序员所缺乏的。
4. 英语写作词汇量决定阅读能力,语法决定写作能力。计算机专业词汇并不多,但精确性非常重要,因此每个程序员都应具备良好的英语语法,但程序员并不需要过于专业的英语语法——掌握常用语法并把它用对就可以。正好可以满足这个需求,尽管它篇幅不大(不足200页),却覆盖了英语中的关键语法以及常见错误。把这本书读两遍,它会大幅度提高你的英语写作能力。既是最畅销的英语写作书籍,也是计算机书籍中引用最多的非计算机书籍。用极其简练的语言讲述了如何进行严肃,精确,清楚的英语写作。从这本书中,你不仅可以学到英语写作,更可以学到一种严谨至简的处事态度,而这正是专业开发所必需的。延伸阅读::全面且权威的英语用法指南,它覆盖语法,词汇,发音,以及修辞等方面,并兼顾口语和书面语,以帮助读者掌握合理的英语用法(Proper English Usage)。不要被这本书的篇幅(1000多页)吓到——原书并没有这么厚,因为这本书被翻译成中文但又得保留原有的英文内容,所以它的篇幅几乎翻了一倍。考虑到这本书使用的词汇都很基础,所以我认为具有英语基础的读者直接阅读原版()会更合适;
:详尽的非虚构(Non-Fiction)写作指南,无论你要写地方,技术,商务,运动,艺术,还是自传,你都可以从这本书中找到珍贵的建议;
:中国人使用英语最大的问题就是会把中式思维掺杂其中,从而形成啰里啰嗦不伦不类的中式英语(Chinglish)。系统的探讨了中式英语以及其成因,然后根据成因对中式英语进行归类,并对每个类别给出了大量的实际案例以及修改建议。如果你想摆脱中式英语,那么这本书是绝好的起点。
如何使用这个书单学而不思则罔,思而不学则殆。不愤不启,不悱不发。举一隅不以三隅反,则不复也。不闻不若闻之,闻之不若见之,见之不若知之,知之不若行之,学至于行之而止矣。来自他人的书单它山之石,可以攻玉。我在本文最后给出其他中外优秀程序员的书单,以便参考&补充。刘未鹏(暗时间作者)以下同一条目下用“/”隔开的表示任选,当然也可以都读。
云风(中国游戏编程先行者,前网易游戏部门资深程序员,简悦创始人)
洪强宁(豆瓣技术总监)
陈皓(CoolShell博主)
张峥(微软亚洲研究院副院长)
Jeff Atwood(Stackoverflow联合创始人)
Joel Spolsky(Stackoverflow联合创始人)软件项目管理
DHH(Ruby on Rails创始人)
以上作者:微博:
原文链接:
太厉害了!!!
n牛人,崇拜
Powered by}

我要回帖

更多关于 研发人员面试问题 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信