第3章三思而后行:前期准备下(代码大全8)

第3章 Measure Twice, Cut Once:Upstream Prerequisities 三思而后行:前期准备

  • 3.4 需求的先决条件
  • 3.5 架构的先决条件
  • 3.6 花在前期准备上的时间长度
  • 要点

3.4 Requirements Prerequisite 需求的先决条件

软件架构(software architecture)是软件设计的高层部分,是用于支撑更细节的设计的框架。

为什么要把架构作为前期准备工作呢?因为架构的质量决定了系统的“概念完整性”。后者继而决定了系统的最终质量。一个经过慎重考虑的架构为“从顶层到底层维护系统的概念完整性”提供了必备的结构和体系,它为程序员提供了指引——其细节程度与程序员的技能和手边的工作相配。它将工作分为几个部分,使多个开发者或多个开发团队可以独立工作。

“需求”详细描述软件系统应该做什么?这是达成解决方案的第一步。

3.4.1  Why Have Official Requirements 为什么要有正式的需求

要求一套明确的需求,这点很重要,理由很多。

明确的需求有助于确保用户(而不是程序员)驾驭系统的功能。如果需求明确,那么用户就可以自行评审,并进行审核。否则,程序员就常常会在编程期间自行决定需求。明确的需求免得你去猜测用户想要什么。

明确的需求还有助于避免争论。在开始编程之前,先把系统的范围(scope)确定下来。如果你和另外一个程序员对于“程序应该做什么”意见不一致,你们可以查看书面的需求,以解决分歧。

重视需求有助于减少开始编程开发之后的系统变更情况。如果你在编码过程中,发现了一个代码上的错误,你只需要修改几行的代码,然后就能继续工作。但是如果你在编码的时候发现了一个需求错误,那么你就得改变设计,使之符合更改后的需求。你可能要扔掉部分旧的设计,并且因为要与已经写好的代码相适应,可能导致新的设计,与在项目之初的设计相比,花费更长的时间。此外,还需要废弃那些受此次需求变更影响的代码和测试用例,还需要编写新的代码和测试用例。即便是未受需求变更影响的代码也需要重新测试,以确保其他地方的改变没有引入任何新的错误

需求错误,带来的成本是非常高的。如图3-1报告的那样。

充分详尽地描述(specify)需求,是项目成功的关键,它甚至很可能比有效的构建技术更重要(见图3-6)。

3.4.2  The Myth of Stable Requirements 稳定需求的神话

一旦需求稳定,项目就能以有序的,可预测的,平稳的方式,完成从架构设到设计到编码到测试等一系列工作。

"一旦客户接受了一份需求文档, 就再也不做更改"是一个美好的愿望。然而对一个典型的项目来说,在编写代码之前,客户无法可靠地描述他们想要的是什么。开发过程能够帮助客户更好地理解自己的需求,这是需求变更的主要来源。计划严格依照需求行事,实际上就是计划不对客户的要求做出回应。你应该采取一些步骤来使变更的负面影响最小化。

3.4.3  Handling Requirements Changes During Construction 在构建期间处理需求变更

在构建期间,要更好地应对需求变更,有以下一些可以采用的方式。

使用本节末尾的需求核对表来评估你的需求质量  如果你的需求不够好,那么就停止工作,退回去,先把它做好,再继续前进。当然,因为在此期间你会停止编码,所以感觉似乎会落后。不过,假设你正开车从芝加哥到洛杉矶,突然看到纽约的路牌,那么停下来查看路线图是浪费时间?当然不是,如果没有对准正确的方向,那就要停下来检查一下路线。

确保每一个人都知道需求变更的代价  客户只想到一个新功能就会很兴奋。在兴奋时血液会涌向大脑,人会晕头晕闹,他会把所你们开过的讨论需求的会议、签字仪式,以及已经完成的需求文档抛诸脑后。最简单的对付这种新功能中毒症患者的方式是:“咦,这听起来是一个很不错的注意。不过由于它不是需求文档里的内容,我会整理一份修订过的进度表和成本估计表,这样你可以决定是现在事实,还是过一阵子再说。”“进度”和“成本”这两个字眼比咖啡和洗冷水澡都要提神,许多“必须要有/must haves”很快会变成“有就最好/nice to haves”。

建立一套变更控制程序  如果你的客户激情不减,那就要考虑建立一个正式的变更控制委员会,评审提交上来的更改方案。客户改变他们的想法,认识到他们需要更多的功能,这不是坏事。问题是他们提出更改方案太频繁了,让你跟不上进度。如果有一套固定的变更控制程序,那么大家都会很愉快——你知道自己只需在特定时候处理变更;而客户知道你打算处理他们的提议。

使用能使用变更的开发方法  某些开发方法让你“对需求变更做出响应”的能力最大化。演讲原型(evolutionary prototyping)法能让你在投入全部精力建造系统之前,先探索系统的需求。演进交付(evolutionary delivery)是一种分阶段交付系统的方法。你可以建造一小块、从用户获得一点反馈、调整一点设计、做少量改动,再多建造一小块。关键在于缩短开发周期,以便更块地响应用户的要求。

放弃这个项目  如果需求特别糟糕,或者极不稳定,而上面的建议没有一条能奏效,那就取消这个项目。即使你无法真的取消这个项目,也设想一下取消它之后会是怎样的情况。在取消它之前想想它可能会变得多糟糕。假如在某种情况下你可以放弃这个项目,那么至少也要问问自己,目前的情况和你所设想的那种情况有多大的距离。

注意项目的商业案例  在提到实施这个项目的商业理由的时候,许多需求事项就会从你眼前消失。有些需求作为功能来看是不错的想法,但是当你评估“增加的商业价值”时就会觉得它是个糟糕了的主意。那些记得“考虑自己的决定所带来的商业影响”的程序的身价与黄金相当——不过我更乐意为此建议获得现金报酬

3.4.4  Checklist:Requirements 核对表:需求

针对功能需求

针对非功能需求(质量需求)

需求的完备性

3.5 Architecture Prerequisite 架构的先决条件

3.5.1 Typical Architectural Components 架构的典型组成部分

Program Organization 程序组织

Main Classes 主要的类

Data Design 数据设计

Business Rules 业务规则

User Interface Design 用户界面设计

Resource Management 资源管理

Security 安全性

Performance 性能

Scalability 可伸缩性

Interoperability 互用性

Internationlization/Localization 国际化/本地化

Input/Output 输入输出

Error Processing 错误处理

Fault Tolerance 容错性

Architectural Feasibility 架构的可行性

Overengineering 过度工作

Buy-vs-Build Decisions 关于“买”还是“造”的决策

Reuse Decisions 关于复用的决策

Change Strategy 变更策略

General Architectural Quality 机构的总体质量

3.5.2 Checklist:Architecture 架构核对表:架构

针对各架构主题

架构的总体质量

Amount of Time to Spend on Upstream Prerequisities 花费在前期准备上时间的长度

花费在问题定义、需求分析、架构上的时间,依据项目的需要而变化。一般说来,一个运作良好的项目会在需求、架构以及其他前期时间方面突入10%~20%的工作量和20%~30%的时间。这些数字不包括详细设计的时间——那是构建活动的一部分。

3.6.1 Checklist:Upstream Prerequisites 核对表:前期准备

你是否辨明自己所从事的软件的类型,并对所应用的开发方法做出相应的剪裁?

是否充分明确地定义了需求?而且需求足够稳定,能开始构建了?(详见需求核对表)

是否充分明确地定义了架构,以便开始构建?(详见架构核对表)

Key Points 要点

构建活动的准备工作的根本目标在于降低风险。要确认你的准备活动是在降低风险,而非增加风险。

如果你想开发高质量的软件,软件开发过程必须至始至终关注质量。在项目初期关注质量,对产品质量的正面影响比在项目末期关注质量的影响要大。

程序员的一部分工作是教育老板和合作者,告诉他们软件开发过程,包括在开始编程之前进行充分准备的重要性。

你所从事的软件项目的类型对构建活动的前期准备有重大影响——许多项目应该是高度迭代式的,某些应该是序列式的

如果没有明确的问题定义,那么你可能会在构建期间解决错误的问题。

如果没有做完良好的需求分析工作,你可能没能察觉待解决的问题的重要细节。如果需求变更发生在构建之后的阶段,其代价是"在项目早起更改需求"的20至100倍。因此在开始编程之前,你要确认“需求”已经到位了。

理解项目的前期准备所采用的方法,并相应地选择构建方法。

代码大全  
2014-09-12

时间: 2024-11-05 18:58:31

第3章三思而后行:前期准备下(代码大全8)的相关文章

第33章个人性格(代码大全5)

第33章 Personal Character 个人性格 33.1 个人性格是否和本书话题无关 33.2 聪明和谦虚 33.3 求知欲 33.4 诚实 33.5 交流与合作 33.6 创造力和纪律 33.7 懒惰 33.8 不如你想象中那样其作用的性格因素 33.9 习惯 33.1 Isn't Personal Character Off The Topic 个人性格是否和本书话题无关 编程过程非常耗用脑力,这种特性使得个人性格显得很重要.编程工作本质上是项无法监督的工作,因为没人真正清楚你正在

第四章关键的构建决策(代码大全2)

一旦你能确定 “构建”的基础已经打好,那么准备工作就转变为针对特定“构建”的决策了.第3章“三思而后行:前期准备”讨论了设计蓝图和建筑许可证在软件业务里的等价物.你可能对那些准备工作没有多少发言权,所以在第3章关注的焦点是确定“当构建开始后你需要做什么”.本章关注的焦点是程序员和技术带头人个人必须(直接或间接)负责的准备工作.在向工地进发之前,如何选择适用的工作别在你的腰带上,你的手里车里应该装哪些东西?本章讨论的就是这事务在软件中的等价物. 4.1 选择编程语言(Choice of Progr

第8章防范式编程下(代码大全4)

8.4 Exceptions 异常 用异常通知程序的其他部分,发生了不可忽略的错误 只在真正例外的情况下才抛出异常 不能用异常来推卸责任 避免在构造函数和析构函数中抛出异常,除非你在同一地方把它们捕获 在恰当的抽象层次抛出异常 在异常消息中加入关于导致异常发生的全部信息 避免使用空的catch语句 了解所用函数库可能抛出的异常 考虑创建一个集中的异常报告机制 把项目中对异常的使用标准化 对于像C++这类语言,其中允许抛出多种多样的对象.数据及指针的话,那么就应该为到底可以抛出哪些类的异常建立一个

第8章防范式编程上(代码大全3)

防御式编程并不是说让你在编程时持“防备批评或攻击”的态度——“它就是这么工作!”这一概念来自防御式驾驶.在防御式驾驶中要建立这样一种思维,那就是你永远也不能确定另一位司机将要做什么.这样才能确保其他人在做出危险动作时你也不会受到伤害.你要担负起保护自己的责任,哪怕是其他司机犯的错误.防御式编程的主要思想是:子程序应该不因为传入错误数据而被破坏,哪怕是由其他子程序产生的错误数据.更一般地说,其核心是要承认程序都会有问题,都需要被修改,聪明的程序员应该根据这一点来编程序. 8.1 Protectin

《代码大全》学习摘要(五)软件构建中的设计(下)

这次的学习内容主要是设计过程中的启发式方法和设计实践中的一些经验. 对于具体的编程工作来说,期待确定性的行为是很正常的,由于软件设计是非确定性的,灵活熟练地运用一组有效的启发方法(试探法),便成了合理的软件设计的核心工作. 1.在确定设计方案时,首选且最流行的方法是面向对象的方法,此方法的要点是辨别现实世界中的对象以及人造的对象.这个过程分为以下几步:辨识对象及其属性.确定可以对各个对象进行的操作.确定各个对象能对其他对象进行的操.确定对象的哪些部分对其他对象可见.定义每个对象的公开接口. 2.

《代码大全2》读后感czz

经老师推荐,买了一本<代码大全2>,花了近3个月的时间看完了,看完后觉得还有很多值得回味的地方,而且每部分之后作者还推荐了不少经典书籍.所以,作个读书心得.全书的主题是软件构建,关于软件构建问题的方方面面均有涉及,共分7个部分,从软件构建前期准备,到语言层的一些问题,再到代码完善,系统考虑以及软件工艺等等.以下分别进行简单说明. 第一部分是打好基础,本部分主要是软件构建前期的工作,以及对一些基本概念的介绍,具体包括如何选择编程语言和构建实践方法,如何理解软件开发的过程.软件开发本质上说就是工程

初读《代码大全》

对于<代码大全>这本书我还没有仔细的读,更别说是看完了,我就重点看了一下第三.四章,主要讲软件工程的前期准备,其次就是我大致浏览了一下后面的内容.第一感觉就是作者写得相当好,插入了不少段子,比喻形象,生动诙谐.但是没有深入的研读难以给出有意义的问题,想问题快把我想得头都要爆炸了,最终还挤出了几个问题.虽然本书主要讲的是软件构建过程,下面的问题主要集中在软件架构相关的领域.1字符集总是让人捉摸不透,那么常用的编程语言都分别支持哪些字符集,如何用这种语言编写制定字符集的程序?字符串类型和字符集类型

《代码大全》读后有感

原本是为了完成软件工程课的作业任务,才打开了这么一本大部头的著作.虽然这一周只读了几章,但是却觉得第一次这样认真的将软件与代码区别开来,也是第一次以工程的角度考虑软件.虽然上了“软件工程”这样的课程,但一来上课不认真,二来课程内容经常纠结于局部问题,所以没有感觉.想来这门课的老师也知道这样的情况,所以第一堂课就说明要我们找些这方面的著作看.然而...还是没能引起我们的重视. 直到上周这个时候,说道要检查博客,才想起这回事.原本想随便找本薄些的书看看,但又想着,要看还是看些经典,于是找到了<代码大

《代码大全》阅读笔记01

代码大全,对实际的设计和编码有着很好的指导意义: 第一章 欢迎进入软件构建的世界  这章讲述了软件构建的重要性,软件构建大体上就是说具体程序员做的工作,而不是需求收集人员,产品设计人员,业务分析人员,架构设计人员,测试人员,运维人员等做的工作,虽然这些人的工作在整个软件开发生命周期中也非常的重要,但是一个软件开发的最主要的部分却是具体程序员做的那部分事情.一般的软件公司里具体程序员的数量应该占很大的比重,大多数的程序员也是具体程序员,只有很少的程序员经过多年的工作学习能成为项目经理,业务分析人员