书籍作者:Randall Hyde | ISBN:9787121439933 |
书籍语言:简体中文 | 连载状态:全集 |
电子书格式:pdf,txt,epub,mobi,azw3 | 下载次数:8483 |
创建日期:2023-05-05 | 发布日期:2023-05-05 |
运行环境:PC/Windows/Linux/Mac/IOS/iPhone/iPad/Kindle/Android/安卓/平板 |
本书深入介绍了从开发方法、生产力到面向对象的设计需求和系统文档的方方面面。通过本书,你将学习到:为什么遵循软件匠艺模型可以让你做到最好;如何利用可追溯性来加强文档的一致性;如何通过用例分析来创建自己的UML需求;如何利用IEEE文档标准开发出更好的软件。通过对高质量软件开发中技能、态度和道德方面的深入讲解,本书揭示了如何将工程原理应用于编程的正确方法。在这个过程中,Hyde不仅会教给你规则,还会告诉你什么时候该打破规则。他不仅会启发你认识什么是最佳实践,同时还会让你发现适合自己的最佳实践。本书中包含了大量的资源和示例,它是你编写代码的**指南,将让你从同行中脱颖而出。
Randall Hyde是The Art of Assembly Language(《汇编语言的编程艺术》)和Write Great Code(《编程卓越之道》)第1~3卷(均由No Starch Press出版),以及Using 6502 Assembly Language和P-Source(由Datamost出版)的作者。他也是Microsoft Macro Assembler 6.0 Bible(由Waite Group出版)一书的合著者。在过去的40年里,Hyde一直从事嵌入式软件/硬件工程师的工作,为核反应堆、交通控制系统和其他电子设备开发相关指令集。他还在加州理工大学波莫纳分校和加州大学河滨分校教授计算机科学课程。
张若飞,曾任多家互联网金融公司CTO,在宜人贷、雅虎北研、金山云等知名公司担任架构师。十余年互联网研发及技术管理经验,对搭建海量数据、大型分布式系统有丰富经验。著有十余本技术译著,包括《Grails权威指南》《给大忙人看的JavaSE 8》《代码不朽:编写可维护软件的十大原则》《面向可伸缩架构》《云原生Java》等书,总计400余万字。
软件工程领域可能更加重视团队的生产力,而不是个人的成长,但是传奇的计算机科学家Randall Hyde想让优秀的程序员成为这个领域中的大师。为此,Hyde编写了备受推崇的《编程卓越之道》系列的新卷——《软件工程化》,深入介绍了从开发方法、生产力到面向对象的设计需求和系统文档的方方面面。你将从本书中学习到:
为什么遵循软件匠艺模型可以让你做得更好
如何利用可追溯性来加强文档的一致性
如何通过用例分析来创建自己的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 日于成都
前 言
当我编写完《编程卓越之道 第二卷:运用底层语言思想编写高级语言代码》(张菲译,电子工业出版社出版)一书时,我打算在第 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 软件开发的比喻 ................................................................................................. 2
目录 XXI
2 生产力 ........................................................................................................... 18
XXII 编程卓越之道(卷 3):软件工程化
3 软件开发模型................................................................................................... 42
第 2 部分 UML
4 UML 和用例介绍 .............................................................................................. 80
5 UML 活动图 ..................................................................................................... 99
6 UML 类图 ...................................................................................................... 114
XXIV 编程卓越之道(卷 3):软件工程化
7 UML 交互图 ................................................................................................... 142
目录 XXV
第 3 部分 文档
9 系统文档 ........................................................................................................ 190
10 需求文档 ...................................................................................................... 209
11 软件设计描述文档 ........................................................................................ 256
目录 XXVII
12 软件测试文档 ............................................................................................... 295
XXVIII 编程卓越之道(卷 3):软件工程化
后记:如何设计卓越的代码................................................................................. 360
真的推荐啊,快递速度特别的快,爱了爱了
2022-10-14 09:42:26
作者为希望能编写出卓越代码的人提供了自己积累的关于卓越编程的真知灼见。它弥补了计算机科学和工程课程中被忽略的一个部分——底层细节,而这正是构建卓越代码的基石。具体内容包括:计算机数据表示法,二进制数学运算与位运算,内存组织与内存访问,数据类型及其表示,布尔逻辑与数字设计,CPU体系结构,CPU指令集的体系结构,内存体系与内存组织,计算机系统如何与外界通信等。
2022-09-25 16:03:27
非常经典的书籍,值得拥有
2022-09-22 20:23:16