软件构建(十五)——尾声

本文是《代码大全》学习笔记系列的最后一篇。书中最后几章是一些杂项主题,本文将简要记录这几个主题的内容,包括个人性格对编程的影响,软件开发艺术的有关问题,以及关于软件工程的推荐书单。

1. 个人性格

编程过程非常耗用脑力,这种特性使得个人性格显得很重要。而编程工作本质上是项无法监督的工作,因为没人真正清楚你正在做什么。老板也无法强迫你成为好的程序员,很多时候他甚至无法判断你是否合格,一切都只能靠自己。你无法提升自己的聪明程度,但性格在一定程度上能够改进。事实证明,个人性格对于造就出程序员高手更具有决定性意义。

1.1 个人性格对编程的影响

  • 聪明和谦虚:高智商与优秀程序员之间并无太密切的联系。实际上许多好的编程做法都是为了减轻脑力负担,例如将系统分解是为了使之易于理解,进行审查、评审和测试是为了减少人为失误,通过各种各样的规范是为了将思路从相对繁琐的编程事务中解放出来。精通编程的人是那些了解自己头脑有多大局限性的人,都很谦虚。
  • 求知欲:技术环境的特定特征每5到10年就变化一番,如果没有足够的求知欲来跟上这些变化,就会面临落伍的威胁,下面是一些培养求知欲的方法
    • 在开发过程中建立自我意识
    • 不断用小程序来试验技术点
    • 阅读解决问题的有关方法
    • 在行动之前做分析和计划
    • 学习成功项目的开发经验,阅读高手的代码
    • 认真阅读文档和其他书本期刊
    • 同专业人士交往
    • 向专业开发看齐:专业开发可分为这样四个等级:入门级(会使用某语言的基本功能和特性),中级(已度过入门期,能使用多种 语言,并得心应手使用至少一种语言),熟练级(对语言或环境有着专业技能,通常是公司的核心开发,很多程序员不能超越该层次),技术带头人级(具有熟练级的专业技能,也明白写代码是给人看而非给机器看)
  • 诚实:通常表现为:不是高手时不假装是高手;乐于承认错误;力图理解编译器的警告,而非弃之不理;透彻理解自己的程序,而不要只是编译看看能否运行;提供实际的状况报告;提供现实的进度方案,在上司面前坚持自己的意见
  • 交流与合作:真正优秀的程序员知道怎样同别人融洽地工作和娱乐,并且会把提高代码可读性和修改你代码的人放在心上
  • 创造力和纪律:不要把各种标准和规范的纪律看成是对创造力的约束,相反,许多有很强创造力的人都极其遵守纪律和规范
  • 偷懒:通常表现为拖延不喜欢的任务(没有任何益处),迅速做完不喜欢的任务以摆脱之(尽管是偷懒,但毕竟用最少时间完成了任务),编写某个工具来完成不喜欢的任务以便再也不用做这样的事情(一劳永逸的懒,无疑是最具产值的偷懒形式)
  • 习惯:优秀的程序员早就养成了编程各方面的良好习惯,而不是最近才培养的。初涉某事时,就应端正态度来学,干了一段时间后,“习惯的力量”就开始起作用。如果没养成最有效的习惯,或者想改掉坏习惯,应该用良好的新习惯去取代,而不是强行杜绝掉坏习惯

1.2 不如你想象中那样起作用的性格因素

注意以下列举的性格都是反面因素

  • 坚持:多数时候软件开发中的坚持其实就是没有好处的“固执”,当在某段新代码上卡壳时,不妨另辟蹊径,尝试重新设计类,或者绕过去,以后回头再试。花好几个小时干掉某一错误确实会有满足感,但实际上早点放弃固有的思路,换个角度可能可以节省更多时间。
  • 经验:由于软件技术更新换代太快,所谓的“经验”很快就会落伍,程序员要持续学些,保持与时俱进。
  • 编程狂人:彻夜编程让你感觉像是世上最好的程序员,却要花几个星期去纠正你在短暂辉煌时埋下的失误。可以热爱编程,但热情不能代替熟练的能力,请想明白什么更重要。

2. 软件开发艺术的有关问题

这一章相当于对全书介绍的各种细节背后所折射出的哲学思想做出一个总结。

  • 克服复杂性:《代码大全》绝大部分的篇幅都用于阐述如何划分系统模块,抽象类和接口,遵循什么样的编程规范等等,归根结底是为了降低软件的复杂性。
  • 精选开发过程:对于小的项目,程序员的个人才能对软件质量影响最大,对于多人项目,组织性的重要程度超过了个人技能。关于开发过程的重要性,一个明显的例子是看看在需求还未确定就开始设计和编码的后果。其他有用的开发过程,如增量开发,先设计后编码,先粗调后优化,伪代码编码并不断添加注释等等,均在之前的文章提到过,不再赘述。
  • 首先为人写程序,其次才是为机器:可读的代码写起来并不比含糊的代码多花时间,得到的好处是巨大的。自己维护,后期重构,复审代码,别人修改程序,统统都要读到代码,因此一次性编写可读性强的代码,是非常经济划算的。即便是自写自用的私有代码,也应该认真对待,因为这是一种优秀的习惯(习惯在上述个人性格中提到过)。
  • 深入一门语言去编程,不浮于表面:要先考虑要干什么,然后采用手头的工具去实现目标。如果你所用的语言不支持某种你想要的特性,可以尝试用一些变通的方法以最大限度地遵循编程规范,因为规范能帮助你理清环境中的危险特性。
  • 借助规范集中注意力:规范能够节省程序员回答同样问题的麻烦,能精确地传达重要信息,免除各种编码的危险做法,还能弥补语言的某些不足之处
  • 基于问题域编程:顶层的代码要说明想解决的问题,而不要充斥各种与文件、数据结构、数据类型有关的操作细节。设计程序时,应考虑下图这样的抽象层次
    • 程序的抽象层次
  • 留心警告信号:当你或其他人说“这段代码暗藏玄机”时,或者类中含有比平均数目更多的错误,或者发现子程序中有许多判断点、嵌套,或者发现代码有重复,或者发现代码不容易写注释和命名变量,或者编译时出现警告等等,这些都是警告信号。任何警告信号都应让你质疑程序的质量,并促使你去寻求更满意的解决之道。
  • 一次又一次迭代:需求、设计、开发、测试,软件开发从头到尾每一步都充斥着迭代并逐步精化的过程。所以不要追求所谓的“一步登天”。
  • 不要存在软件信仰(即坚持某种做法)
    • 折中主义:要对编程问题找出最有效的解决方案时,盲目迷信某种方法只会缩小你的选择余地。折中主义是一种有益的态度,对于每个特定问题,应该将多种方法视为工具箱中的工具。多数时候工具的选择关系不大,但有些场合需要自己判断权衡,挑选最好的工具
    • 试验:要想有效地试验,应能基于试验结果改变思路。许多顽固的方法源于对错误的畏惧心理,“试图没有错误”是最大的错误。软件开发的各方面,你都应保待开放的心态

3. 书单

书中最后一章作者给出了一些建议阅读的经典著作,下面挑选了一部分有中译版本的书(有一些书再版了多次,链接给出的都是最新的版本)组成一个参考书单,供以后学习。

参考文献:电子工业出版社《代码大全(第2版)》第33、34、35章

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器