科技>计算机>编程语言
编程卓越之道(卷3):软件工程化  

编程卓越之道(卷3):软件工程化  "

作者:张若飞
ISBN:9787121439933
定价:¥128.0
字数:423千字
页数:388
出版时间:2022-08
开本:16开
版次:01-01
装帧:
出版社:电子工业出版社
简介

本书深入介绍了从开发方法、生产力到面向对象的设计需求和系统文档的方方面面。通过本书,你将学习到:为什么遵循软件匠艺模型可以让你做到最好;如何利用可追溯性来加强文档的一致性;如何通过用例分析来创建自己的UML需求;如何利用IEEE文档标准开发出更好的软件。通过对高质量软件开发中技能、态度和道德方面的深入讲解,本书揭示了如何将工程原理应用于编程的正确方法。在这个过程中,Hyde不仅会教给你规则,还会告诉你什么时候该打破规则。他不仅会启发你认识什么是最佳实践,同时还会让你发现适合自己的最佳实践。本书中包含了大量的资源和示例,它是你编写代码的首选指南,将让你从同行中脱颖而出。

前言

推荐序 1 我刚做软件开发工作时,特别关注“编程”这件事,以为最重要的工作就是写代码,对于写代码之外的事情,比如文档、测试、修复缺陷等,都比较排斥,觉得它们都是额外开销,浪费时间。但随着参与的项目越来越复杂,尤其是做了软件研发经理之后,认知发生了很大变化,我意识到,编程只是软件开发众多环节中的一环,仅仅完成它,距离顺利交付完整的软件系统,还有十万八千里的距离。 此时,我也发现,团队里的多数程序员和当初的我一样,过于关注“编码”环节,对编码之外的事情,诸如设计、文档、测试、软件开发方法论等,不是一知半解,就是主动忽略,这严重影响了个人生产力和团队生产力。我曾试着寻找一些接地气的软件工程类图书来改善这个问题,但一直没找到合适的。后来我因个人兴趣,转去做了生涯咨询工作,这件事就搁置了。 一个偶然的机会,我看到了《编程卓越之道(卷 3):软件工程化》这本书,大受震撼,这就是我当年要找的图书啊! 之所以这么说,有三个方面的原因。 第一,这本书的作者 Randall Hyde 一直从事嵌入式软件及硬件工程师的工作,有丰富的工程实践,同时 Randall Hyde 又有丰富的计算机科学教学经验,能把复杂的事情深入浅出地讲出来。 第二,这本书选择的主题,诸如生产力、软件开发模型、系统需求文档、软件需求规范、软件设计描述文档等,都是软件开发当中极重要、极难讲清楚,因而极易被忽略的内容。 第三,更重要的是,这本书让我重新理解了原来做软件开发和研发管理时遇到的 4 个相关问题。 1. 为什么 LOC 度量指标如此流行 业界有很多度量生产力的指标,比如可执行文件大小、机器指令、代码行数、语句数量、功能点分析、圈复杂度、操作符数量、令牌数量等。为什么最终 LOC(代码行数)度量指标成功了呢? 原因有两点:一是采用 LOC 度量指标,统计极其方便,使用现成的工具(比如UNIX 下的 wc)就可以完成,而采用其他度量指标,通常需要编写一个依赖于某种编程语言的应用程序;二是现行的各种度量指标都不能完全有效地反映出程序员的生产力,选择一个“更好的”度量指标也不会有更好的结果,这就使得大家更愿意采用既易用又不那么糟糕的指标,即 LOC。 不过,我们在用 LOC 时,一定要意识到几个缺陷:一是用代码行数无法很好地说明程序员完成了多少工作;二是用代码行数无法测量出编写代码所耗费的脑力劳动有多少;三是优秀程序员的代码行数可能偏少(他们常常重构以精简代码);四是不同环境的代码行数无法直接比较(10 行汇编代码与 10 行 Go 语言代码完成的工作可能相差巨大)。 2. 估算开发时间为何总有巨大偏差 但凡有过商业项目开发经验的程序员都在开发时间估算方面遇到过各种状况,其中最常见的是——实际的开发时间总比估算的多很多。 很多人说不清楚为什么会这样,而《编程卓越之道(卷 3):软件工程化》用了很短的篇幅就把这件事说明白了。 首先,作者指出软件开发项目的工作分为两类:一类是与项目直接相关的工作,比如编写代码、测试、发现与修复缺陷、编写文档等;另一类是与项目间接相关的工作,比如会议、阅读和回复电子邮件、更新日程安排等。程序员在估算开发时间时,一般都会把第一类工作所需的时间计算出来,但往往忘记第二类工作可能耗费的时间。 然后,在第一类工作中,又有一些需要先做大量探索才能确认的工作,在估算开发时间时还没有办法清晰定义,这就使得一个软件项目在一开始时并不能被彻底拆解成多个可以估算的子任务,最终就导致类 WBS 估算法难以顺畅实施。 接下来,第一类工作中关于缺陷的发现和修复这部分,也难以估算,因为你既不知道会出现多少缺陷,也不知道是否会出现一些迟迟无法修复的缺陷。最后,大中型项目会有许多意外情况,比如掌握关键知识的程序员休假或生病,耽误了依赖他的工程师开展工作;比如一些有经验的程序员离开了,另一些人不得不接手他们的任务;比如必须等待一些硬件设备到位……很少有人能准确预测出这些情况会消耗多少时间。 如果你看了这本书,理解了开发时间估算的问题,就能更为现实和灵活地看待开发计划和进度估算。 3. 文档到底有哪些作用 我接触过的多数程序员都讨厌撰写软件需求规范、软件设计描述等文档,因为大家认为这些文档对确保当前项目顺利进行、提升软件项目质量等并没有什么帮助,属于纯开销。其实这只是我们没有意识到而已。《编程卓越之道(卷 3):软件工程化》指出,文档至少有如下这些作用: ? 文档是软件项目开发各个团队和各阶段协同工作的基础,比如系统需求文档可以在客户、管理层、利益相关方之间同步及确认需求;比如软件需求规范(SRS)可以产生软件设计描述文档和软件测试用例文档。 ? 文档可以降低开发成本。在需求阶段,通过确认系统需求文档和软件需求规范,能够确保不做客户不需要的需求,并确保解决的是客户所面临的问题。软件需求规范和软件设计描述文档的验证过程,会确保你按项目规范开发了产品。确认和验证,能够让团队开发正确的产品并用正确的方式开发产品,可以大幅降低开发成本。 ? 文档可以帮助新加入项目的程序员快速获取项目信息,有效提升他们的生产力。同时,文档还可以减少项目中的老程序员向他人普及项目相关信息带来的生产力下降。 ? 文档能够帮助软件研发团队在未来的项目中预测和提高生产力。 4. 到底该选择哪一种软件开发模型 许多程序员(包括我)对软件开发模型都会有明显的偏好,比如总用增量模型,总是嫌弃瀑布模型。但实际上,没有哪个模型好到可以适用任何类型的软件项目,也没有哪个模型不好到一无是处,我们应当理性评估,选择更适合项目的模型。 《编程卓越之道(卷 3):软件工程化》给出了非正式模型、瀑布模型、V 模型、迭代模型、螺旋模型、快速应用程序开发模型、增量模型等常见软件开发模型的优点、缺点及适用边界,你只要比对一下项目情况,就可以做出自己的选择。比如很多人嫌弃的瀑布模型,其实很适合需求稳定的小项目或者超大型项目(如开发一款操作系统);比如很多受过规范化训练的程序员讨厌非正式模型,但实际上,非正式模型对于开发小型项目的原型或向潜在客户演示正在开发的程序效果就很有用。 以上,我提到了 4 个问题,但这只是软件开发过程中众多问题的一小部分,还有大量的问题,在这时或那时,在这里或那里,令程序员和软件研发管理人员深陷“焦油坑”。Randall Hyde 的《编程卓越之道(卷 3):软件工程化》,凝聚了作者多年的软件工程实践经验和深刻认知,可以给你系统的指导,帮助你找到属于自己的最佳实践,应对此起彼伏的问题。 最后,我想说,无论是作为程序员想要寻找更好的软件开发实践,走向卓越,还是作为管理者想要带领团队践行更好的方法,更有效地交付高质量软件,这本书都可以带给你启发。 ——安晓辉 资深软件开发工程师,职业规划师 《这本书能帮你成功转行》《大话程序员》《Qt Quick 核心编程》作者 推荐序 2 初次阅读本书令我十分意外。意外之处有两点: 第一,根据作者的介绍,这一系列书按计划至少写到卷 6。倘若如此,本系列将成为编程领域的又一部鸿篇巨制。 第二,本书虽然以探讨软件工程、软件开发的一般方法作为主线,但是却以培养优秀的开发者、激发程序员的创造力为最终目标。讲软件工程方法的书有很多,但是意识到激发创造力之重要性的人不多,能够以此为目标去实践的作者更是罕见。 如何培养一位“卓越的程序员”,这个问题就像如何培养一位武林高手一样,是一件复杂而难以言说的庞大话题。以此为目标,总结出一般性的软件方法论相当困难。因为无论从哪个角度描述,总有一些实践中的反例,或者作者知识面触及不到的盲区。更多的技术作者(包括本人),宁可退一步,讲一些具体的经验、知识和技巧,也不敢去讲解一般性的思维方法,或者直接讲解大型软件工程的开发方法。 当然,软件行业始终有这方面的需求,我们需要让新一代开发者具备更广阔的视野,对实际的大型软件工程有更多的了解,以及更全面的技术素养。虽然传统的软件工程理论给了我们一部分答案,但由于软件行业依然是一个新兴的、蓬勃发展的行业,新的编程语言、新的技术方案以及新的硬件平台层出不穷,让传统软件工程理论越来越显得不合时宜。按本书作者的说法,软件工程经常“阻止程序员发挥 他们的才能”。 要把这种庞大的问题讲解清楚,不仅需要深厚的技术储备和丰富的大型工程经验,还需要充分的自信与数以年计的耐心。通过本书我们看到,作者已经证明了他的勇气与耐心。 本系列图书本身就是一个“大型工程”,不仅篇幅庞大,而且涉及的知识点和理论十分庞杂。通过目录,可以看出本书内容翔实,重点面面俱到。但作为读者来说,由于自身的技术积累有限,且不同软件领域的侧重点有差异,只能有所侧重地去理解。 在我看来,本书第 1 部分——个人软件工程,适合细读。特别是作者对“生产力”的解释十分精彩。作者由软件生产力引申出一些讨论,以事实为基础,让读者快速了解现实软件开发中的各种问题。进一步,本书介绍了实践中正在应用的多种软件开发模型,以及它们的优缺点。这些内容对于读者建立软件工程的观念很有帮助。 本书第 2 部分——UML,贴近软件工程实践。由于本人从事游戏开发行业,UML的应用经验很少,能力有限,无法做出准确的评价。 本书第 3 部分——文档,在我个人看来,这是本书最有价值的一部分内容。文档并不是设计师和产品经理的专利,程序员其实更有必要掌握编写文档的技术。从一定程度上讲,文档就是不能运行的代码。文档的结构是否清晰、详略是否得当、描述是否准确,能在很大程度上表现出产品设计水平,进而决定了软件开发的成败。 软件开发者可以遵循书中所讲的要点,参考书中的文档实例,去为自己的项目编写产品文档或技术文档,切身体会书中的精华。而且你会发现,一份思路清晰的文档,与优秀的代码距离非常近。 本书第 3 部分也适合所有置身于软件工程中的人员阅读,包括但不限于设计师、产品经理、测试人员或运营人员。阅读第 3 部分有助于建立良好的文档编写观念,而文档是软件工程中高效协作的最佳方式之一。 阅读本书之后,我们要做的就是在实践中应用和检验书中所讲的各种知识点。书中所讲未必绝对正确,实践才是检验真理的唯一标准。在实践中,我们还会有新的创造和突破。祝愿本书的读者最终都能成为卓越的软件开发者。 —— 皮皮关 马遥 2022 年 8 月 2 日于成都 前 言 在 20 世纪 60 年代后期,人们对计算机软件的需求已经超过了技术学校、学院和大学培养计算机专业人员开发软件的能力——这种现象后来被称为软件危机。提高高校的人才产出并不是一个切实可行的方法,因为报考计算机科学专业的合格学生太少,无法满足实际的需求。当时,研究人员认为,一种更好的解决方案是提高现有计算机程序员的生产力。由于注意到软件开发和其他工程活动之间的相似之处, 这些研究人员得出结论,其他工程学科中的流程和策略可以用来帮助解决软件危机。 因此,软件工程(software engineering)诞生了。 在软件工程蓬勃发展之前,软件开发一直是一门神秘的手艺,掌握在拥有不同能力和成就的大师们手中。当时,一个软件项目的成功完全取决于一两个关键程序员的能力,而不是整个团队的能力。而软件工程的出现,正是为了平衡软件团队成员之间的各种技能,使他们更加具有生产力,并且减少对那一两个关键程序员的依赖。 在很大程度上,软件工程的实践已经被证明是成功的。由众多程序员团队构建的大型项目,不可能再使用过去那种特别的组织方式来完成。但与此同时,一些重要的品质也丢失了。软件工程以牺牲个人的创造力、技能和成长为代价,来提高团队的生产力。尽管软件工程技术有可能将糟糕的程序员变成优秀的程序员,但它们也会限制优秀程序员发挥最佳的工作能力。毕竟,这个世界上卓越的程序员太少了。 我们最不愿意做的事情就是阻止程序员去发挥他们的潜能,然而,这正是软件工程经常会做的事情。 《编程卓越之道》系列图书,旨在恢复一些已经失去的个人创造力、技能和成长性。它涵盖了我称之为个人软件工程的内容,或者说一个程序员应该如何提高他的代码质量。具体来说,它会告诉你如何编写出卓越的代码——易于维护、扩展、测试和调试、文档化、可部署的代码,甚至是易于丢弃的代码。卓越的代码会避免代码拼凑和使用奇技淫巧,而这些会给工程师和管理者带来不可预料的压力或者错误的 计划。卓越的代码应该是那些你可以引以为豪的代码。 当我编写完《编程卓越之道 第二卷:运用底层语言思想编写高级语言代码》(张菲译,电子工业出版社出版)一书时,我打算在第 3 卷中加入更多的内容。在第 2 卷的最后一章中,我写下了以下内容: 《编程卓越之道(卷 3):软件工程化》会开始讨论编程领域的“个人软件工程”。软件工程领域主要关注管理大型软件系统,而个人软件工程主要关注个体层面如何编写卓越的代码,即创作中的技巧、艺术和愉悦感。 我们将在第 3 卷中通过对软件开发、软件开发人员以及系统文档(重点添加)的讨论,来详细剖析个人软件工程的各个方面。 系统文档(包括需求文档、测试过程文档、设计文档等)是软件工程的重要组成部分。因此,一本关于这些主题的书,至少应该提供对它们的概要介绍。但是,在编写了 7 章内容之后,我开始意识到无法在一本书里涵盖所有这些内容。因此,最后我把《软件工程化》这本书又分成了 4 卷。其中第 1 卷就是这本书,它是《编程卓越之道》系列的第 3 卷,主要介绍软件开发模型和系统文档。该系列的第 4 卷主要介绍软件设计,第 5 卷将进一步介绍如何编写卓越的代码,第 6 卷主要介绍有关测试的内容。 在我编写本书时,距离我完成《编程卓越之道》系列的第 2 卷已经过去了 10 年。 现在是完成第 3 卷的时候了,即使这意味着要将原来的内容拆分成两卷甚至更多卷。 如果你读过我早期出版的书,就会知道我喜欢深入探讨一些话题,我对编写那些只介绍皮毛的书不感兴趣。因此,我所面临的问题是,要么将一本书的内容拆分到多本书中,要么制作一本超过 2000 页的大部头,历史证明,这本大部头很可能永远无法完成。我向那些期待本书应该涵盖更多内容的人道歉,但是请不用担心,这些内容都会被包含在陆续出版的分卷中。在本书中,你会更快地了解第一部分内容。 假设和前提 为了专注于介绍软件工程化的相关内容,本书必须先进行一些假设。虽然我已经尽力减少这些假设条件,但是如果你的个人技能可以满足一些前提条件,那么你将从本书中得到更多的收获。 你应该至少精通一种命令式(过程式)或面向对象的编程语言,包括 C 和 C++、C#、Swift、Pascal、BASIC、Java 以及汇编语言。你应该知道如何描述一个小问题,并通过软件的设计和实现来解决它。对于本书而言,如果你在大学中学习过一个学期或一个季度的专业课程,或者有过几个月的实际编程经验,应该就足够了。 你还应该对计算机原理和数据结构有基本的了解。例如,你应该了解十六进制和二进制编码,以及计算机如何在内存中表示各种高级数据类型,如有符号整数、字符和字符串。如果你觉得自己在这方面的知识比较薄弱,请阅读《编程卓越之道(卷1):深入理解计算机》中对计算机原理的介绍。尽管我可能会偶尔引用第 1 卷中的内容,但是你应该也可以独立阅读本书。 什么是卓越的代码 卓越的代码是按照一套可以指导程序员在编码时做出决策的规则,所编写出来的软件。在和其他程序员一起编写卓越的代码时,时刻要注意编写相关文档,使得其他人也可以阅读、理解和维护软件。我认为这套规则是软件开发的黄金法则,是软件工程的关键核心。 具体一点,卓越的代码就是: ? 运行速度快,可以有效地利用 CPU、系统资源和内存的代码。 ? 文档良好,易于阅读、维护和扩展的代码。 ? 遵循一套统一编程风格的代码。 ? 经过明确的设计,遵循已建立的软件工程约定的代码。 ? 经过良好的测试,运行稳定的代码。 ? 效率高、成本低的代码。 虽然《编程卓越之道》系列的第 1 卷和第 2 卷都讨论了卓越代码的许多方面,但是本系列的其余分卷(从本卷开始)会特别关注如何编写满足上述标准的代码。 程序员分类 为了理解是什么造就了卓越的程序员,让我们首先来思考业余程序员、不同级别的程序员和软件工程师之间的区别。 业余程序员 业余程序员是指自学成才、只有很少编程经验的人,因此与我们说的卓越的程序员相反。在计算机行业发展的早期阶段,这些程序员被称为黑客。现在这个术语已经演变出一些不同的含义,不一定用来描述一个没有足够教育背景或者编程经验,但是从事专业级别软件工程的程序员。 业余程序员编写的代码的问题在于,他们通常只为自己或者朋友编写代码,因此,这些代码通常不符合现代软件工程的项目标准。但是,业余程序员可以通过少量的培训教育(正如《编程卓越之道》系列图书所提供的帮助)来提高他们的水平。 程序员 计算机程序员涵盖了广泛的经验和职责范围,通常可以从初级程序员、编码人员、一级程序员和二级程序员、分析师/系统分析师以及系统架构师等岗位头衔上反映出来。这里我们将探讨其中的一些角色以及它们之间的区别。 实习生 实习生通常是指做兼职工作的学生,他们会被分配一些所谓的烦琐工作,比如运行一套固定的测试程序,或者为软件编写文档。 初级程序员 刚毕业的学生通常会填补初级程序员的岗位。通常,他们会从事测试或者维护的工作。他们很少有机会从事新项目的开发;相反,他们的大部分编程时间都花在重新编写已有的代码逻辑,或者处理遗留代码上。 编码人员 当初级程序员获得了足够的经验,让管理层信任他们可以为项目开发新的代码时,他们就可以晋升为编码人员。较资深的程序员会将一个大项目的一些(不太复杂的)子模块分配给这些编码人员,以帮助自己更快地完成项目。 一级程序员和二级程序员 当程序员获得了更多的经验,并且能够自己编写复杂的代码时,他们会从编码人员晋升为一级程序员,然后晋升为二级程序员。系统分析师通常会向一级程序员和二级程序员提供他们的一个大概设想,而一级程序员和二级程序员能够帮助补充所缺少的细节部分,并且开发出符合系统分析师期望的应用程序。 系统分析师 系统分析师会研究某个问题,并且确定实现某种解决方案的最佳方法。通常,系统分析师会选择要使用的主要算法,以及组建最终开发应用程序的团队。 系统架构师 系统架构师会根据系统分析师设计的多个组件,选择如何让它们在一个更大的系统中协同工作。通常,系统架构师会指定软件开发流程、硬件,以及其他与软件无关的事项,作为整个解决方案的一部分。 终极程序员 终极程序员是所有这些细分职责的组合。也就是说,终极程序员能够研究一个问题,设计一种解决方案,用某种编程语言实现该解决方案,并且测试最终的结果。 程序员分类的问题 实际上,大多数对程序员的分类都是人为决定的,只是为了证明对新手程序员和有经验的程序员提供不同的工资标准是合理的。例如,系统分析师为指定的应用程序设计算法和总体数据流,然后将设计交给编码人员,由编码人员用特定的编程语言来实现该设计。我们通常不会将这两项工作与编程联系起来,因为尽管初级程序员完全有能力将一个设计转换成一种合适的编程语言,但是他们没有从头开始设计大型系统的经验。系统分析师和系统架构师通常具有负责整个项目的经验和能力,但是管理层通常会发现,在项目中让系统分析师和系统架构师发挥他们的经验,要比让他们做一个毕业生可以做的低层次的编码工作更划算(因为成本更低)。 软件工程师 在传统工程领域,工程师通常会遵循一套既定的规则,通过组合已知的解决方案来建立一种新的解决方案,从而达到解决某个特定问题的目的。这种方法甚至可以让普通的工程师有效地解决问题,而不必从头开发一个系统。软件工程将传统的工程理念应用到软件开发领域,从而最大化整个开发团队的价值。在很大程度上,“软件工程革命”是成功的。拥有适当培训和领导能力的软件工程师,可以用比以前更少的时间和更低的成本,编写出更高质量的代码。 纯粹的软件工程并不鼓励发散思维,因为它有浪费时间并将工程师引向失败之路的风险(会导致更高的开发成本和更长的开发时间)。一般来说,软件工程更关心的是如何在预算范围内按时开发完成应用程序,而不是尽可能用最好的方式来编写代码。但是,如果软件工程从业者们从来没有尝试过任何新的东西,那么他们常常会错过产生伟大设计的机会,永远无法在规则手册中增加任何实践原则,也永远无法成为卓越的程序员。 卓越的程序员 卓越的程序员能够认识到成本问题,但是他们也能够意识到,探索新的想法和方法论对于推进这一领域很重要。他们知道什么时候必须遵守规则,也知道什么时候可以打破(或至少绕过)规则。最重要的是,卓越的程序员会将他们的技能发挥到极限,取得那些不是通过简单思考就能够达到的成就。黑客是天生的,软件工程师是后天培养的,而卓越的程序员则两者兼而有之。他们有三个主要的特征:对工 作真正地热爱,持续不断地接受教育和培训,以及拥有在解决问题时跳出思维定式的能力。 热爱你的工作,做你热爱的工作 人们往往擅长做自己喜欢的工作,而不擅长做自己不喜欢的工作。最重要的是,如果你讨厌计算机编程,那么你就不可能成为一个很好的计算机程序员。如果你天生没有解决问题和克服挑战的欲望,那么再多的教育和培训也改变不了你的性格。因此,如果你想成为一个卓越的程序员,那么最重要的先决条件就是你真的喜欢编写计算机程序。 优先接受教育和培训 卓越的程序员喜欢挑战这个领域中各种类型的问题,但他们还需要其他一些东西——正规的教育和培训。我们将在后面的章节中更深入地讨论教育和培训的作用,但就目前而言,我们知道卓越的程序员一定是受过良好教育的(也许受过高等以上教育),并且他们在整个职业生涯中持续接受教育就足够了。 跳出思维定式 如上所述,遵循一套预先定义的规则来开发代码,是软件工程师的典型特征。 然而,正如你将在第 1 章中所看到的,要想成为一个卓越的程序员(“编程大师”),你需要愿意并且能够设计出新的编程技术,而这些技术只能来自发散的思维,而非盲目地循规蹈矩。卓越的程序员有一种内在的欲望去突破他们的极限,不断探索新的解决方案。 如果你想成为一个卓越的程序员 总而言之,如果你想成为一个真正卓越的程序员,并获得同行的尊敬,你需要拥有以下几个特点: ? 对计算机编程和解决问题热爱。 ? 在专科或者本科的基础上,拥有广泛的计算机科学知识。 ? 终身接受教育和培训。 ? 具有在探索解决方案时能够跳出固有思维定式的能力和意愿。 ? 具有总是以最好的方式完成某项任务和工作的愿望与动力。 在拥有以上这些特点之后,唯一能够阻止你成为一个卓越的程序员的就是新的知识,而这也是本书的价值所在。 最后一点关于道德和个人性格的说明 软件工程师的工作是在面临众多相互冲突的需求的情况下,通过在系统设计中做出适当的妥协来创造出最好的产品。在此过程中,软件工程师必须对需求的优先级进行排序,并根据项目的约束条件来选择解决问题的最佳方案。在较为复杂的项目,尤其是压力较大的项目中,道德和个人性格通常会影响他们的决策。理智上的不诚实(例如,夸大项目评估,或者声称软件的某一部分没有经过完全测试)、使用 盗版软件开发工具(或者其他软件)、未经许可在软件中引入没有文档的功能(比如后门程序),或者态度傲慢(认为自己比其他团队成员都好),这些都是软件工程道德缺失的例子。遵守良好的道德准则和践行良好的道德规范,将使你成为一个更好的人,以及一个更好的程序员。

目录

第 1 部分 个人软件工程 1 软件开发的比喻 ................................................................................................. 2 1.1 什么是软件 .......................................................................................................... 2 1.1.1 软件不是被制造出来的 ........................................................................... 3 1.1.2 软件不会磨损 ........................................................................................... 3 1.1.3 大多数软件都是定制化的 ....................................................................... 3 1.1.4 软件可以很容易升级 ............................................................................... 4 1.1.5 软件不是一个独立的实体 ....................................................................... 4 1.2 与其他领域的相似性 ........................................................................................... 4 1.2.1 程序员像艺术家一样 ............................................................................... 4 1.2.2 程序员像建筑师一样 ............................................................................... 5 1.2.3 程序员像工程师一样 ............................................................................... 6 1.2.4 程序员像工匠一样 ................................................................................... 7 1.2.5 究竟是艺术家、建筑师、工程师还是工匠 ........................................... 7 1.3 软件工程 .............................................................................................................. 8 1.3.1 一个正式的定义 ....................................................................................... 9 1.3.2 项目规模 ................................................................................................. 10 1.3.3 软件工程的问题 ..................................................................................... 12 1.4 软件匠艺 ............................................................................................................ 13 1.4.1 教育 ......................................................................................................... 13 1.4.2 学徒阶段 ................................................................................................. 14 1.4.3 软件熟练工 ............................................................................................. 15 1.4.4 大师级工匠 ............................................................................................. 15 1.4.5 软件匠艺的不足 ..................................................................................... 16 目录 XXI 1.5 通往卓越编程的道路 ......................................................................................... 16 1.6 获取更多信息 .................................................................................................... 17 2 生产力 ............................................................................................................. 18 2.1 什么是生产力 .................................................................................................... 18 2.2 程序员生产力与团队生产力的比较 ................................................................. 19 2.3 工时和实际时间 ................................................................................................ 20 2.4 概念复杂性和范围复杂性 ................................................................................. 21 2.5 预测生产力 ........................................................................................................ 22 2.6 度量指标,以及我们为什么需要它们 ............................................................. 23 2.6.1 可执行文件大小度量指标 ..................................................................... 24 2.6.2 机器指令度量指标 ................................................................................. 24 2.6.3 代码行数度量指标 ................................................................................. 25 2.6.4 语句数量度量指标 ................................................................................. 25 2.6.5 功能点分析 ............................................................................................. 26 2.6.6 McCabe 圈复杂度度量指标 ................................................................... 26 2.6.7 其他度量指标 ......................................................................................... 27 2.6.8 度量指标的问题 ..................................................................................... 28 2.7 我们怎样才能每天写出 10 行代码 ................................................................... 29 2.8 估计开发时间 .................................................................................................... 30 2.8.1 估计小型项目的开发时间 ..................................................................... 30 2.8.2 估计中型项目和大型项目的开发时间 ................................................. 31 2.8.3 估计开发时间的问题 ............................................................................. 32 2.9 危机模式项目管理............................................................................................. 33 2.10 如何提高工作效率 ........................................................................................... 34 2.10.1 合理选择软件开发工具 ....................................................................... 34 2.10.2 管理开销 ............................................................................................... 36 2.10.3 设置明确的目标和里程碑 ................................................................... 37 2.10.4 练习自我激励 ....................................................................................... 37 2.10.5 集中注意力,消除干扰 ....................................................................... 38 2.10.6 如果你觉得无聊,那么就做点别的事情 ........................................... 39 2.10.7 尽可能自立 ........................................................................................... 39 XXII 编程卓越之道(卷 3):软件工程化 2.10.8 识别何时需要帮助 ............................................................................... 40 2.10.9 克服士气低落 ....................................................................................... 40 2.11 获取更多信息 ................................................................................................... 41 3 软件开发模型................................................................................................... 42 3.1 软件开发生命周期............................................................................................. 42 3.2 软件开发模型 .................................................................................................... 45 3.2.1 非正式模型 ............................................................................................. 46 3.2.2 瀑布模型 ................................................................................................. 47 3.2.3 V 模型 ..................................................................................................... 49 3.2.4 迭代模型 ................................................................................................. 50 3.2.5 螺旋模型 ................................................................................................. 52 3.2.6 快速应用程序开发模型 ......................................................................... 54 3.2.7 增量模型 ................................................................................................. 56 3.3 软件开发方法论 ................................................................................................ 57 3.3.1 传统的(预测型)方法论 ..................................................................... 57 3.3.2 自适应型方法论 ..................................................................................... 57 3.3.3 敏捷开发 ................................................................................................. 58 3.3.4 极限编程 ................................................................................................. 60 3.3.5 Scrum ....................................................................................................... 73 3.3.6 功能驱动开发 ......................................................................................... 74 3.4 卓越程序员的模型和方法论 ............................................................................. 77 3.5 获取更多信息 .................................................................................................... 77 第 2 部分 UML 4 UML 和用例介绍 .............................................................................................. 80 4.1 UML 标准 ........................................................................................................... 80 4.2 UML 用例模型 ................................................................................................... 81 4.2.1 用例图的元素 ......................................................................................... 81 4.2.2 用例包 ..................................................................................................... 84 目录 XXIII 4.2.3 用例包含 ................................................................................................. 84 4.2.4 用例泛化 ................................................................................................. 85 4.2.5 用例扩展 ................................................................................................. 87 4.2.6 用例故事 ................................................................................................. 88 4.2.7 用例场景 ................................................................................................. 95 4.3 UML 系统边界图 ............................................................................................... 97 4.4 除用例以外 ........................................................................................................ 97 4.5 获取更多信息 .................................................................................................... 98 5 UML 活动图 ..................................................................................................... 99 5.1 UML 活动状态符号 ........................................................................................... 99 5.1.1 开始和结束状态 ................................................................................... 100 5.1.2 活动 ....................................................................................................... 100 5.1.3 状态 ....................................................................................................... 101 5.1.4 转移 ....................................................................................................... 101 5.1.5 条件 ....................................................................................................... 102 5.1.6 合并点 ................................................................................................... 104 5.1.7 事件和触发器 ....................................................................................... 105 5.1.8 分叉和合并(同步) ........................................................................... 107 5.1.9 调用符号 ............................................................................................... 108 5.1.10 分区 ..................................................................................................... 108 5.1.11 注释和注解 ......................................................................................... 110 5.1.12 连接器 ................................................................................................. 110 5.1.13 其他活动图符号 ................................................................................. 111 5.2 扩展 UML 活动图 ............................................................................................ 111 5.3 获取更多信息 .................................................................................................. 113 6 UML 类图 ...................................................................................................... 114 6.1 UML 中的面向对象分析与设计 ..................................................................... 114 6.2 类图中的可见性 .............................................................................................. 116 6.2.1 公共的类可见性 ................................................................................... 116 6.2.2 私有的类可见性 ................................................................................... 117 XXIV 编程卓越之道(卷 3):软件工程化 6.2.3 受保护的类可见性 ............................................................................... 118 6.2.4 包级别的类可见性 ............................................................................... 118 6.2.5 不支持的可见性类型 ........................................................................... 119 6.3 类属性 .............................................................................................................. 120 6.3.1 属性可见性 ........................................................................................... 120 6.3.2 属性派生值 ........................................................................................... 120 6.3.3 属性名称 ............................................................................................... 121 6.3.4 属性数据类型 ....................................................................................... 122 6.3.5 操作数据类型(返回值) ................................................................... 122 6.3.6 属性多重性 ........................................................................................... 123 6.3.7 属性初始值 ........................................................................................... 123 6.3.8 属性字符串 ........................................................................................... 124 6.3.9 属性语法 ............................................................................................... 124 6.4 类操作 .............................................................................................................. 125 6.5 UML 的类关系 ................................................................................................. 126 6.5.1 类的依赖关系 ....................................................................................... 127 6.5.2 类的关联关系 ....................................................................................... 127 6.5.3 类的聚合关系 ....................................................................................... 129 6.5.4 类的组合关系 ....................................................................................... 130 6.5.5 关系特性 ............................................................................................... 131 6.5.6 类的继承关系 ....................................................................................... 140 6.6 对象 .................................................................................................................. 140 6.7 获取更多信息 .................................................................................................. 141 7 UML 交互图 ................................................................................................... 142 7.1 时序图 .............................................................................................................. 142 7.1.1 生命线 ................................................................................................... 143 7.1.2 消息类型 ............................................................................................... 143 7.1.3 消息标签 ............................................................................................... 145 7.1.4 消息序号 ............................................................................................... 145 7.1.5 守卫条件 ............................................................................................... 146 7.1.6 迭代 ....................................................................................................... 147 目录 XXV 7.1.7 长延迟和时间约束 ............................................................................... 148 7.1.8 外部对象 ............................................................................................... 149 7.1.9 激活条 ................................................................................................... 150 7.1.10 分支 ..................................................................................................... 150 7.1.11 可选流 ................................................................................................. 152 7.1.12 对象的创建和销毁 ............................................................................. 153 7.1.13 时序片段 ............................................................................................. 154 7.2 协作图 .............................................................................................................. 173 7.3 获取更多信息 .................................................................................................. 174 8 其他 UML 图 .................................................................................................. 175 8.1 组件图 .............................................................................................................. 175 8.2 包图 .................................................................................................................. 178 8.3 部署图 .............................................................................................................. 179 8.4 合成结构图 ...................................................................................................... 181 8.5 状态图 .............................................................................................................. 185 8.6 关于 UML 的更多信息 .................................................................................... 187 8.7 获取更多信息 .................................................................................................. 188 第 3 部分 文档 9 系统文档 ........................................................................................................ 190 9.1 系统文档类型 .................................................................................................. 191 9.2 可追溯性 .......................................................................................................... 193 9.2.1 建立文档可追溯性的方法 ................................................................... 193 9.2.2 标签格式 ............................................................................................... 194 9.2.3 需求/反向可追溯性矩阵 ...................................................................... 200 9.3 确认、验证和审查........................................................................................... 204 9.4 通过文档降低开发成本 ................................................................................... 205 9.4.1 通过确认降低成本 ............................................................................... 205 9.4.2 通过验证降低成本 ............................................................................... 206 XXVI 编程卓越之道(卷 3):软件工程化 9.5 获取更多信息 .................................................................................................. 207 10 需求文档 ...................................................................................................... 209 10.1 需求的来源和可追溯性 ................................................................................. 209 10.1.1 建议的需求格式 ................................................................................. 210 10.1.2 好需求的特点 ..................................................................................... 211 10.2 设计目标 ........................................................................................................ 218 10.3 系统需求规范文档 ......................................................................................... 218 10.4 软件需求规范文档 ......................................................................................... 219 10.4.1 介绍 ..................................................................................................... 221 10.4.2 总体描述 ............................................................................................. 222 10.4.3 具体需求 ............................................................................................. 224 10.4.4 支持信息 ............................................................................................. 229 10.4.5 软件需求规范示例 ............................................................................. 230 10.5 创建需求 ........................................................................................................ 240 10.6 用例 ................................................................................................................ 242 10.6.1 启用/禁用调试模式 ............................................................................ 244 10.6.2 启用/禁用以太网 ................................................................................ 244 10.6.3 启用/禁用 RS-232 ............................................................................... 246 10.6.4 启用/禁用测试模式 ............................................................................ 246 10.6.5 启用/禁用 USB ................................................................................... 246 10.6.6 读取拨码开关 ..................................................................................... 247 10.7 根据用例创建 DAQ 软件需求 ...................................................................... 247 10.8 (从 SRS 中选择的)DAQ 软件需求 .......................................................... 248 10.9 用需求信息更新可追溯性矩阵 ..................................................................... 252 10.9.1 通过审查验证的需求 ......................................................................... 253 10.9.2 通过测试验证的需求 ......................................................................... 255 10.10 获取更多信息 .............................................................................................. 255 11 软件设计描述文档 ........................................................................................ 256 11.1 IEEE Std 1016-1998 和 IEEE Std 1016-2009 ................................................ 257 11.2 IEEE 1016-2009 的概念模型 ......................................................................... 257 目录 XXVII 11.2.1 设计关注点和设计利益相关方 ......................................................... 257 11.2.2 设计观点和设计元素 ......................................................................... 258 11.2.3 设计视图、设计覆盖和设计原理 ..................................................... 270 11.2.4 IEEE Std 1016-2009 的概念模型 ....................................................... 273 11.3 SDD 所需内容 ................................................................................................ 275 11.3.1 SDD 标识 ............................................................................................ 275 11.3.2 设计利益相关方和设计关注点 ......................................................... 276 11.3.3 设计视图、设计观点、设计覆盖和设计原理 .................................. 276 11.4 SDD 的可追溯性和标签 ................................................................................ 276 11.5 建议的 SDD 大纲 ........................................................................................... 277 11.6 SDD 文档示例 ................................................................................................ 278 11.7 用设计信息更新可追溯性矩阵 ..................................................................... 293 11.8 创建软件设计 ................................................................................................. 293 11.9 获取更多信息 ................................................................................................... 294 12 软件测试文档 ............................................................................................... 295 12.1 Std 829 中的软件测试文档 ........................................................................... 295 12.1.1 流程支持 ............................................................................................. 296 12.1.2 完整性级别和风险评估 ..................................................................... 297 12.1.3 软件开发测试级别 ............................................................................. 299 12.2 测试计划 ........................................................................................................ 300 12.2.1 主测试计划 ......................................................................................... 300 12.2.2 级别测试计划 ..................................................................................... 302 12.2.3 级别测试设计文档 ............................................................................. 304 12.3 软件审查列表文档 ......................................................................................... 305 12.3.1 SRL 大纲示例 ..................................................................................... 306 12.3.2 SRL 文档示例 ..................................................................................... 306 12.3.3 将 SRL 项添加到可追溯性矩阵中 .................................................... 310 12.4 软件测试用例文档 ......................................................................................... 310 12.4.1 STC 文档中的介绍 ............................................................................. 313 12.4.2 详细说明 ............................................................................................. 314 12.4.3 其他 ..................................................................................................... 317 XXVIII 编程卓越之道(卷 3):软件工程化 12.4.4 软件测试用例文档示例 ..................................................................... 318 12.4.5 用 STC 信息更新 RTM 文档.............................................................. 327 12.5 软件测试过程文档 ......................................................................................... 327 12.5.1 IEEE Std 829-2009 软件测试过程 ..................................................... 329 12.5.2 软件测试过程的大纲扩展 ................................................................. 329 12.5.3 STP 文档中的介绍 ............................................................................. 332 12.5.4 测试过程 ............................................................................................. 334 12.5.5 其他 ..................................................................................................... 337 12.5.6 索引 ..................................................................................................... 337 12.5.7 STP 文档示例 ..................................................................................... 338 12.5.8 用 STP 信息更新 RTM 文档 .............................................................. 344 12.6 级别测试日志 ................................................................................................ 345 12.6.1 级别测试日志文档中的介绍 ............................................................. 346 12.6.2 详细说明 ............................................................................................. 346 12.6.3 术语表 ................................................................................................. 347 12.6.4 关于测试日志的一些注释 ................................................................. 347 12.7 异常报告 ........................................................................................................ 351 12.7.1 异常报告文档中的介绍 ..................................................................... 352 12.7.2 详细说明 ............................................................................................. 353 12.7.3 对异常报告的几点建议 ..................................................................... 354 12.8 测试报告 ........................................................................................................ 355 12.8.1 主测试报告的简要介绍 ..................................................................... 356 12.8.2 级别测试报告 ..................................................................................... 357 12.9 你真的需要这些吗 ......................................................................................... 358 12.10 获取更多信息 .............................................................................................. 359 后记:如何设计卓越的代码................................................................................. 360

作者简介

编辑推荐

作者寄语

电子资料

www.luweidong.cn

下一个