这是一本能帮助你成为更好的程序员的书。编写代码是一项极其复杂的工作,有不少软件都声称可以帮助你解决编程中遇到的困难,然而事实并非如此。编程领域并不存在最佳解决方案这样一种东西,你能做的只有让自己拥有更多的知识和经验,以便在特定的情况下选择最合适的解决方案。
注重实效的哲学
如果我们想做一个高效的程序员,首先要从思想层面来改变自己。
第一,我们要对结果负责,即使再完善的项目也不能保证不会出现问题,当出现问题时要去主动寻找自己的错误,而不是推卸责任或者拼凑借口。
第二,我们要尽可能去做变化的催化剂,催化剂指的是要主动去推动变化。现实中有一种很普遍的情况,即项目的技术栈很陈旧,对生产效率造成了很大的影响,但大家往往都选择沉默,都在等着别人去推动这种改变。而正确的做法是,我们可以先自已用比较前沿的技术开发一个 demo 出来,然后使自己的同事意识到新技术的优越性。只要足够好,会有足够多的人站在你的这一边,推动这一技术的革新。
第三,定期学习,学习就是对自己的一种投资。计算机领域日新月异,一段时间不学习可能就无法跟上同事们的步伐,然后逐渐掉队,成为一名平庸的程序员。但是,在学习过程中要秉承一种批判性的思维,网络上的知识虽然多,但也杂,要去分辨哪些知识是正确的,哪些知识是误导人的。
第四,注重人与人之间的沟通。虽然编程主要是与电脑打交道,但与人交流也是作为一名高效程序员不可或缺的能力。探讨需求要和产品经理打交道,修改 Bug 要和测试人员打交道,到我们在表达的时候要明确自己想说的,如果还可以了解自己的听众,就再好不过。
作者在书中还提到一种“破窗户理论”,该理论指的是如果一栋建筑有一面破窗户一直无人修理,就会给居民一种废弃感,最后导致破窗户越来越多,以至于无人愿意修理的状态。写代码也是如此,如果留着破窗户(不好的设计、糟糕的代码等等)不管,代码质量也会越来越差。
动手写代码前
一个项目,最开始进行的工作就是需求分析,需求分析的好不好直接关系到这一项目的成败。我们要意识到,需求很少存在于表面,用户表达的往往并不是他们真正的需求。对于需求我们需要挖掘,而不仅仅是发现,要以用户的角度来思考。另外,在项目的前期分析阶段,往往会使用到一些形式化的工具,例如 UML 图等等,我们要意识到这只是一种帮助我们的工具,不要被其限制,成为工具的奴隶。
进入到系统的详细设计阶段,我们要有意识的编写正交的系统。正交意味着解耦,两个模块之间不会互相产生影响,这就有效降低了风险,从而提高生产率。复用也是一个重要的方法,对于重复问题应该将重复部分抽象出来,否则极有可能带来代码的一致性问题,高效的程序员应该不会想修改一个方法的逻辑要挨个修改十几处地方吧。最后,时刻谨记保持代码的灵活性。需求随时会变,如果把代码写死,后续修改会是极大的痛苦。至于如何保持代码灵活,可以使用动态配置,使用视图与模型分离的结构(MVC)进行设计等等。
编写高效的代码
这里有几项不错的建议,可以帮助我们写出更优秀的代码,减小出现 Bug 的概率。
- 按合约进行编码,明确函数的输入项是什么,函数会做什么,哪些是变量哪些是不变量等等。
- 使用异常。如果在代码中捕获了异常,不但可以防止程序直接崩溃,还可以帮助我们抓住程序中的错误,发现问题的根源。
- 对于资源的使用要有始有终。打开的文件要记得关闭,分配过的内存不要忘了回收。
- 关注算法的时间复杂度,使用大 O 表示法比较不同算法的复杂度。
- 注意变量名的选择,不要使用简写,也不要使用会误导人的名称。
- 编写易于测试的代码,没有什么修正错误的方法比在一开始就发现错误更好。
除了以上建议,编程工具的使用也是一个要考虑的方面。工欲善其事,必先利其器,好的工具能大幅提高工作效率。例如,选择一种好的编辑器,最好是跨平台的,这将保证我们不论在什么平台开发都有着熟悉的快捷键配置;使用 Shell 命令而不是 GUI 程序,GUI 程序受限于设计者本身,往往无法发挥全部实力;使用源码控制工具,即使团队只有自己一个人,源码控制工具可以很方便地回退代码,并标识各次发布。
编程之外
除了编程本身,一些琐碎的细节也会影响到整体的效率。高效的团队对个体有增益效果,一个程序员在一个高效的团队能产生更多的效益。建议管理者可以按照功能来划分团队,团队内部再自行组织,保证人与人之间的良好交流。除此之外,在项目的开发过程中,应该尽量少的使用手工流程,使用自动化进行代替,让计算机去做这类重复且繁杂的事务。程序员应该专注于编码本身,而不是这些没什么技术含量的工作。
最后,我们要明白不管交付的产品在绝对的意义上有多么好,如果没有满足用户的期望,那项目也是失败的。我们要学着去管理用户的期望,这并不是说要去控制用户,而是要和用户工作工作,共同探讨,达成对最终产品的一致期望。项目交付时,可以给用户一些额外的 bonus,例如界面上或使用上的一些工具,这不会耗费多少时间,但对用户来说是一种惊喜。