“构建”既是名词,也是动词,但在现实生活中,最好不要把它当作形容词,比方说“您真‘构建’的”。(Sorry,忍不住又在扯了 –_-#)
我对本章内容的概括是:在软件开发过程中,构建活动是一个程序员最最应该关注的活动。至于W-H-Y,Why,作者用了一章的篇幅来阐述这个问题。
1.1 什么是软件构建
在本章的开头,可以得知研究者把软件开发过程中的各种不同的活动(acitivity)归纳为以下11种:
- 定义问题(problem definition)
- 需求分析(requirements planning)
- 规划构建(construction planning)
- 软件构架(software architecture ,或高层设计(high-level design)
- 详细设计(detailed design)
- 编码与调试(coding and debugging)
- 单元测试(unit testing)
- 集成测试(integration testing)
- 集成(integration)
- 系统测试(system testing)
- 保障维护(corrective maintenance)
作者用下面这张“本书的立体视图”来表示构建活动与上面11种活动的关系:
图中的灰色椭圆表示构建活动,由此可见:
构建活动主要关注与编码与调试,同时也包含了详细设计、单元测试,集成测试以及其他一些活动。
我们目前还无需急于理清构建活动都包括了哪些具体任务,因为书中写得很清楚:
想要获得一份构建活动的完整列表,请看一遍目录中各章节的标题吧。
1.2 软件构建为何如此重要
鹅厂《瑞雪会议公约》的会前三问,第一问就是:这个会议要不要开?少一场是一场。这是一种比较成熟的思维,在学习和探讨“怎么去构建”之前,作者希望通过本节内容给本书读者说清楚“为什么要构建”。书中列举了5大原因,摘抄如下:
- 构建活动是软件开发的主要组成部分;
- 构建活动是软件开发中的核心活动;
- 把主要精力集中于构建活动,可以大大提高程序员的生产率;
- 构建活动的产物——源代码——往往是对软件的唯一精确描述;
- 构建活动是唯一一项确保会完成的工作。
第1点和第5点,作者在书中使用了列数字和举例子的方式,说明了为什么构建活动比软件开发中的其它活动更重要。
第2点是无可否认的事实,当然,我们(程序员)并不需要强迫项目组的其他成员(比如产品经理和测试工程师)去接受这样的观点,强调构建活动的核心地位并非是要否定其它活动的重要性。
第3点里面提到的“不同程序员的生产率(productivity)的差异可达到10到20倍”,我觉得这对于一个程序员来说,是一件“让我欢喜让我忧”的事情:
- 喜的一面,通过持续地学习,个人的生产率将可达到数倍的提高,呵呵呵;
- 忧的一面,如果被告知有人的生产率是自己的数倍,呵呵(如果这个人或这些人就在身边,那么也许你可以开始多留意一下中华英才网或者智联招聘上面的机会了)。
第4点,很容易让人联想到开发文档的问题,有人也许会说,既然大师都说了“代码是对软件的唯一精确描述”,那说明文档其实并没有那么重要。关于文档,我是有话要说的。我还记得初中的思想政治课里面,在抨击万恶的资本主义之前,有提到过“劳动者”和“商品”的概念。在就业之前,我常在想的一个问题就是:如果“劳动者”对应于程序员,那么“商品”对应于什么呢?时至今日,这个问题的答案已经没有那么重要,我只是想通过这样的类比来说明一个观点,那就是:文档是否重要主要取决于在最终交付的时候,你(程序员)把不把它当作“商品”看待,能不能体现你的价值。
- 不需要把文档当商品的场景有:一个QQ客户端的程序员,我们对他所创造的商品的最直接理解,就是那个运行在用户电脑上的QQ,从这个角度上看,开发文档的有无并不会影响QQ的可用性,所以我们不必为没有精确的文档感到沮丧。
- 需要把文档当作商品交付的场景,典型的有:对于一个类库(例如MFC,ATL)的程序员来说,文档理应是他最终交付的商品的一部分,缺少文档或者文档质量比较糟糕的类库通常有两种下场,要么是使用者越来越少,不久后被淘汰,要么就是其他程序员在无法选择的情况下一边抱怨一边使用。
以上就是我对于文档重要性的一些看法,不过话说回来,虽然我未曾因为缺少文档而沮丧,但却经常因为缺少文档而要付出额外的代价,这些经历包括:
- 接手新的(这里的“新”主要是自己以前没有接触过的意思)功能模块之后,由于没有文档,必须通过看源代码来熟悉了解整个模块的逻辑,偏偏原来的代码又写得比较那个,苦不堪言;
- 开发较为复杂的需求时,在设计阶段没有形成文档记录,进入编码阶段之后,处处捉襟见肘,提交测试之后更加是bug多多;
- 提交测试的时候,因为没有文档,需要更测试同事面对面地解释开发实现的流程,测试人员变动之后,往往又要给新的测试同事再讲一遍;
- 同事离职之后,交接给我的,除了代码没有任何文档。将来还要继续在上面做开发,我感觉到压力山大。“得到了她的人,却得不到她的心”大概也是这种体验吧。
- 说多了都是泪……
正因为在以上这些地方吃过亏,所以在我眼中,所有程序员所撰写的文档都是有价值的,都是重要的,它们的区别只是在于哪些文档更加重要。这就正如所有女性在我心目中都是美丽的,善良的,她们的区别只是在于能体现她们美丽善良的地方不尽相同……(这种敏感的两性言论还是适可而止吧)
1.3 如何阅读本书
这一节是作者对本书阅读方式的一些建议,我当然是选择“从头到尾”的阅读方式啦。
本章要点
- 软件构建是软件开发的核心活动; 构建活动是每个项目中唯一一项必不可少的工作。
- 软件构建的主要活动包括:详细设计,编码,调试,集成,开发者测试(developer testing)(包括单元测试和集成测试)。
- 构建也常被称作“编码”和“编程”。
- 构建活动的质量对软件的质量有着实质性的影响。
- 最后,你对“如何进行构建”的理解程度,决定了你这名程序员的优秀程度——这就是本书其余部分的主题了。