导读:本文作者Payson Wu,硕士研究方向二维PDE数值解析算法,五年前端开发经验,现就职于Microsoft。
现在的工作市场越来越讲究综合人才,软件开发行业也一样。以前的设计、开发、测试、上线分别由单独的团队负责,现在越来越多的公司需要combined engineer,就是上面这些都需要软件工程师全权负责。软件工程师需要掌握很多知识和技巧,才可以在如今竞争激烈的市场中永葆青春。
一个好的软件工程师,应该注重三方面的能力培养:设计、开发、个人素养。设计包括理解UI、重视UX、Architecture、掌握良好算法数据结构等;开发包括优秀的编程实践、测试的设计、按时交付代码等等;个人素养也十分重要,包括写文档、写邮件、演讲等能力。
今天推荐的书单主要针对前两个能力:设计和开发。因为软件开发过程中,语言的选择并不是最重要的,所以本文推荐的书单尽量避免针对某种语言。如果有需要某种特定开发语言的书籍推荐,例如Java,C++,C,C#,Python,Java等等,欢迎留言询问。
关于设计
软件的设计跟建设大楼的设计一样重要,有了图纸大楼才能开土动工,软件有了设计才可以真正开始进入开发环节。
《写给大家看的设计书》
这本书出自一个著名设计师之手,他抽茧剥丝地把复杂的设计理论归为简单的四个基本原理:亲密性、对齐、重复和对比。书里面有色彩鲜艳的插图,生动鲜活的例子,利用正反两种例子解释什么样的设计好,什么样的不好,让人一目了然。非常适合作为快速入门的读物。
《Head First Design Pattern》
Head First这系列书风趣幽默,无论是图片还是漫画都十分吸引人,让枯燥无聊的技术变得活灵活现。很多年前我刚毕业时候拿到Thoughtworks的offer,Thoughtworks推荐了一些列报到前读的书,有一本就是这本Head First Design Pattern.这本书非常适合初学者理解设计模式。不过并没有太多的实际例子。大家应该都听过四人帮(the gang of four)的Design Pattern那本书吧。那本书更为深入,建议初学者在读完Head First之后可以拿来四人帮那本书深入理解。Head First 这系列还有很多别的书,各方面都包含,都很适合初学者。
《Effective Java》
Effective系列我一共只读过三本,分别是:Effective Java, Effective C#, Effective Java。这系列还有一些针对别的语言的,比如Effective C++。学习任何一门编程语言,只看书是不够的,一定要结合实际,通过做一个小项目来学习一门语言最为合适。不但能学会语法和语言中常用的包,还能学会调适、测试等。Effective 这系列的书是我最喜欢的编程书籍系列之一,不但包含大量的编程实例,还列出了很多常见错误和陷阱。对一些常犯的错误给出了有用的建议,对一些小陷阱指出了有效的解决方式。
《C和指针》
开头声明了本书单尽量不涉及某一特定语言,但实在是避不开这个最经典的C语言了。我接触编程比较晚,第一次亲密接触就是大一的时候上C语言编程基础,用的教科书是那本很差的绿皮谭浩强的书。当时被指针绕的七荤八素的,什么是指针,什么是指向指针的指针,谭浩强的绿皮书解释的模棱两可,老师讲的也是稀里糊涂。直到我都工作好几年了,一直都特别“幸运”地避开了一切指针。有一次偶然的机会听说了这本书,拜读了一下,果然是C语言初学者的福音。不但详细解释了C语言的种种基础和标准库,还特别感人的清晰地讲解了曾经迷茫了整整一代人的数组和指针。
《Introduction to Algorithms》
这本算法书包含了很多现代的算法,从算法到数据结构,甚至包括多项式算法、数论、图论等。不得不说如果想要完全读懂所有的算法,还是需要一些数学背景知识的。这本书是很多美国大学的算法教科书。如果做到融会贯通,那面试美国大公司就是分分钟的事儿。不过说实话,这本书并不适合作为面试算法练习,因为实在是太厚重了,无论是书本身的厚度,还是书中包含的内容,都十分厚重。
关于开发
软件开发过程是软件的筋骨,我们所说的程序员主要就是做开发过程。开发过程不是跟建房子不一样,不是按照图纸一块块的搬砖,更重要的在于能够编写可以测试、可以维护、可以向后兼容的代码。
《Refactoring》
Martin Flower是一个很优秀的大师。他在1999年写的这本书至今仍十分畅销。这本书中他用一个实例一步步的解释如何重构代码。世界上任何一种产品都是逐渐更新换代变得越来越优秀的,写代码也是一样,优秀高效的代码需要在不断修改中演化而来。重构这本书帮助我们理解重构的意义:如何在保持功能性不变的基础上,提高代码的质量和效率。
《How to Break Software》
这本书又有趣又实用,实属业界良心。刚开始变成Combined Engineer的时候很不适应,最不喜欢写测试。一旦写测试,就发现很多软件的错误,大量的bug向我袭来的感觉实在是苦不堪言。但其实正是因为这些测试才能保证软件的质量。这本书特别适合程序员,因为完全是从程序员的心理出发,一步步引导你思考bug可能产生的路径,然后疯狂的对这些bug可能产生的路径进行大量测试。作者的想法刁钻古怪,毫不留情地揭露了程序员得过且过的心理。只有抱着这种心态才能保证软件的质量。如果你读完觉得这种方式实在是太残忍,大可把这些测试方式用在你同事的身上,互相伤害,这样才能互相帮助。
《Code Complete 2》
让大部分人来推荐软件工程师书单,这本Code Complete 2都会高居榜首。中文版的翻译书名叫做《代码大全》。既然是大全那就一定是覆盖各种概念各种设计结构。很多人说这本书适合作为程序员的入门阅读起点。我倒是觉得这本书更适合作为一本参考阅读手册。任何经验背景的人都会从中受益。
《Team Geek》
电影里面的极客都是单刀赴会一个人挑大梁,从焊电路板一直到拥有好几亿用户。这种角色往往给大家一种错觉,就是好的程序员都是独来独往不需要跟别人合作的。这是一种理想主义状态。优秀的软件靠的是团队合作。如果想在自己的职业生涯走的更远,我总结的就靠三点:技术的提高、机会的把握要、团队的和谐。这本书围绕着团队合作三大原则:谦逊、尊重、信任,系统地介绍了如何打造优秀团队。
关于个人素养
如果不注重自己的演讲和写作能力,即使是再优秀的工程师,最后也很难突破自我更上一层楼。个人素养的提高是一个缓慢的过程。在这里推荐一本书。
《程序员职业素养》
程序员的工作不只是日复一日的写代码,更重要的是知道自己在做什么,什么时候做,什么时候不做,什么时候该把活儿推出去,如何管理时间,如何管理deadline,如何正确估计项目所需的时间和精力,面对压力时候如何沉着冷静。这一切的一切都需要有好的心理素质。这本书给出了上述所有问题的分析解答,是程序员前进的指明灯。题外话:除了心理素质,更重要的是身体健康。
总结
列这个书单,既是为了帮助刚入职场或者尚未入职场的软件工程师们理解软件设计和开发,也是为了自勉,时刻提醒自己:只有终身学习才能不被淘汰。
有哪些书是作为程序员/数据分析师的你喜欢的呢?欢迎留言告诉我们。
课程推荐
Payson现在也是BitTiger王牌课程【全栈工程师直通车】的特约教师之一,如果你也想成为全栈工程师,欢迎点击以下图片(或者直接扫码咨询)。