Reading Note on Code Complete 2

《代码大全2》阅读笔记

这本书买了几年了,记得当时买来的时候很嗨,拿着手感很好,像字典一样(900多页),但看了十几页觉得不能快速解决工作中的问题,于是就放下了。这几年做了各种类型的产品和项目,除了具体开发之外也接触了一些技术管理工作,突然想起这本书讲述了软件构建过程中的林林总总,或许能为我实践中的问题解惑,于是拿起便觉得如遇故人,放不下了。

Steve McConnell作为和Bill Gates、Linus Torvalds齐名的当代软件开发领域三位大师之一,读完这本书便觉得此言不虚。《代码大全2》涉及领域之广泛,研究问题之深入,见解之深刻,建议和指导之实用为同类书籍中罕见,而且行文娓娓道来、讲解朴实无华,加之中文翻译质量颇高,总体的阅读体验那是相当棒。当然,软件开发是一个大的话题,软件领域又能细分成多个子领域,对于不同角色的软件从业者,看这本书的感觉必然不同。对于我自己来说,在阅读的过程中有些章节会精读,有些章节会略读,这都是根据个人兴趣而定。

总体来说,《代码大全2》主要讲的是软件构建,软件构建不仅仅是编码,而是涵盖软件从需求到实现的过程。本书中,作者从软件开发的源头——需求讲起,一直讲到配置管理和集成,重点在设计和实现。书中在一些必要的章节,例如需求分析、架构设计、写测试用例等都给出了一种相当实用的工具:核对表(Checklist),这种方式的好处是在做具体任务的时候可以对照参考,以衡量自己的工作制品(文档、代码等)是否满足基本的质量要求。同时,在一些重点的章节之后,都附有更多资源,主要是相关的书籍、论文以及网站等等,这些往往对于特定领域的深入研究是非常有价值的。另外,本书还配有一个官方网站cc2e,上面扩展的资源很丰富,而且在书中不同的参考点都有快速链接,如代码调整技术的快速参考链接是cc2e.com/2679。在书的最后,作者又总结并列出了开发者进阶的计划,其中包含开发者能力的度量模型,进阶需要的经验、书籍和培训等等,这些对于团队软件开发能力提升有较强的指导作用。

阅读本书的同时,我在微博上记载了本书的一些精彩片段,虽然不能涵盖书的核心内容,但是以管窥豹,也能了解作者的文风和对于软件开发的精辟见解。下面我使用和云风(《代码大全2》的阅读笔记)相似的记录形式(链接),也将这些精彩片段分享如下:

信息隐藏是软件的首要技术使命中格外重要的一种启发式方法,因为它强调的就是隐藏复杂度,这一点无论是从它的名称还是其实施细节上都能看得很清楚。

很多程序员——或者说很多人——对在高层和低层思考之间的升降感到困惑。从系统的一个视角转到另一个视角,从智力上来说是很费力的,但对于创建有效的设计方案而言却是极其重要的。如果你想获得愉悦的、提高智力灵活性的练习,请阅读……《Conceptual Blockbusting》一书(Adams 2001)

换句话说,最大的设计问题通常不是来自于那些我认为是很困难的,并且在其中做出了不好的设计的区域;而是来自于那些我认为是很简单的,而没有做出任何设计的区域。我几乎没有遇到过因为做了太多设计而受损害的项目。[评]:过度设计是一个误解吗?

设计精良的模块和设计糟糕的模块的唯一最大区别,就是对其他模块隐藏本模块内部数据和其他实现细节的程度。——Joshua Bloch

调试代码的难度是首次编写这些代码的两倍。因此,如果你在编写代码的时候就已经发挥了全部聪明才智,那么从概念上讲,你将无法凭借自己的智慧去调试这些代码。—— Brian Kernighan

重构的理由(一):代码重复;冗长的子程序;循环过长或嵌套过深;内聚性太差的类;类的接口未能提供层次一致的抽象;拥有太多参数的参数列表;类的内部修改往往被局限于某个部分;变化导致对多个类的相同修改;对继承体系的同样修改;case语句需要做同样的修改

重构的理由(二):同时使用的相关数据并未以类的方式进行组织;成员函数使用其他类的特征比使用自身类的特征还要多;过多使用基本数据类型;某个类无所事事;一系列传递流浪数据的子程序;中间人对象无事可做;某个类同其他类关系过于亲密;子程序命名不恰当

重构的理由(三):数据成员被设置为公用;某个派生类仅适用了基类很少的一部分成员函数;注释被用于解释难懂的代码;使用了全局变量;在子程序调用前设置代码,或者在调用后使用了收尾代码;程序中的一些代码似乎是在将来的某个时候才会用到。

HARD DATA 随着项目规模的增加,下面这些活动的工作量增长超过线性:交流,计划,管理,需求分析,系统功能设计,接口设计和规格说明,架构,集成,消除缺陷,系统测试,文档生成。

鼓励良好的编码实践技术:给项目的每一部分分派两个人;逐行复查代码;要求代码签名;安排一些好的代码示例供人参考;强调代码是公有财产;奖励好代码;一份简单的标准。

代码大全的最后一部分讲的是《软件工艺》,其中的许多具体话题现在看起来也都非常有代表性,如第33章对于个人性格的讨论对软件开发者和管理者都很有借鉴意义,而第34章对于帮助开发者如何从初级水平达到专家水平提供了翔实的、宝贵的建议,专业必学而时习之才能精进。

你愿意阅读本书就很值得称赞。你已经学到了比软件业中多数人都更多的知识,因为大部分程序员一年下来还看不完一本书(DeMarco and Lister 1999)。只要稍稍看一些书就会使你的专业知识又迈进了一步。[评]先自己高兴一下,不过,Steve你不知道中国程序员有多勤奋吧,呵呵

人们容易混淆行动与进展,混淆忙碌与多产。有效编程最重要的工作是思考,而人思考时通常不会看上去很忙。如果和我共事的程序员总是忙个不停,我会认为他并非优秀的程序员,因为他没用最有价值的工具——自己的脑袋。

这一经典论文拉开了探究程序员心理与计算机编程之间到底有多大关系的研究序幕。Dijkstra一直强调,编程的本质任务就是驾驭计算机科学的极端复杂性。他认为编程是唯一要求掌握最底层到最高层的9个数量级上细节差异的人类活动。由于其历史意义,这篇文章值得读读the humble programmer

征服复杂性;精选开发过程;首先为人写程序,其次才是为机器;深入一门语言去编程,不要浮于表面;借助规范集中注意力;基于问题域编程;当心落石;迭代,反反复复,一次又一次;汝当分离软件与信仰。

HARD DATA 一项研究发现,程序在重写前平均要经过10代维护程序员的修改(Thomas 1984)。维护程序员要花其50%到60%的时间,去搞懂他们要维护的代码的含义(Parikh and Zvegintzov 1983)。如果你能在代码中加入说明,他们会感激涕零的。

同时,我也给一些具体的章节绘制了思维导图,希望能起到一个快速了解梗概的作用(在新的标签页中打开可看高清无码大图)。

第8章思维导图
第13章思维导图
第22章思维导图