第6章 · 播客 第2集
开发方法 · 演化、螺旋、增量与构件组装
🎙️ 本集播客:第2集:上集瀑布的病根是「一次性想清楚」,这集讲药方——演化模型一家四口:螺旋凭什么姓「风险」、增量发布的两个注意点、原型法为什么用完就扔,最后是搭积木的构件组装模型,它的缺点清单是必考题。 语音由微软 Edge 神经网络语音预生成(女声·晓伊,男声·云希)。点击下方任意对话可直接从该句开始播,当前句朗读时下一句已预先加载,无缝衔接。
明
阿明
师姐,瀑布听完我算是明白了,问题出在「一次性把需求想清楚」。可人的认知怎么可能一次到位呢?
雅
小雅
原文明明白白就是这么说的:在应用软件开发的过程中,人们发现很难一次性完全理解用户的需求、设计出完美的架构、开发出可用的系统,这是由于人的认知本身就是一个过程,这个过程是渐进的、不断深化的。于是有了那句关键判断——对于复杂问题,「做两次」肯定能够做得更好。软件开发这个复杂而且与人的认知过程紧密相关的事,也应该是一个渐进的过程。
明
阿明
「做两次」更好——所以演化模型就是做两遍?
雅
小雅
不完全是「两遍」,而是「若干遍」。演化模型正是基于这个观点提出的:一般情况下,一个演化模型可以看做若干次瀑布模型的迭代,当完成一个瀑布模型后,重新进入下一个迭代周期,软件在这样的迭代过程中得以演化、完善。演化模型的身份证就这一句——瀑布的循环版。后面三个模型都是它的孩子,原文说,根据不同的迭代特点,演化模型可以演变为螺旋模型、增量模型和原型法开发。这个演变关系本身就能出题。
明
阿明
那先说螺旋,这名字听着就很贵。
雅
小雅
螺旋模型的定位一句话:将瀑布模型和演化模型结合起来,不仅体现了两个模型的优点,而且还强调了其他模型均忽略了的风险分析。这句话里有它的双重身份——「瀑布加演化的结合体」是出身,「强调风险分析」是身份证。考试问「螺旋模型相比其他模型最突出的特点是什么」,四个选项:面向文档、强调风险分析、强调用户参与、强调快速发布——答强调风险分析。后面两个干扰项我等下会展开,它们都是别的模型的特点。
明
阿明
螺旋一圈是多久?每圈里面干什么?
雅
小雅
原文的数字必须记准:螺旋模型的每一周期都包括需求定义、风险分析、工程实现和评审 4 个阶段,由这 4 个阶段进行迭代,软件开发过程每迭代一次,软件开发就前进一个层次。注意「前进一个层次」这个说法——它解释了为什么叫螺旋而不是圆圈:圆圈是原地转,螺旋是转一圈上升一层。
明
阿明
那它跟瀑布的每一段是怎么接上的?
雅
小雅
螺旋模型的基本做法是:在「瀑布模型」的每一个开发阶段前,引入一个非常严格的风险识别、风险分析和风险控制。它把软件项目分解成一个个小项目,每个小项目都标识一个或多个主要风险,直到所有的主要风险因素都被确定。这段话里有个对应关系要听出来——分解出来的每个小项目,对应的正是要识别的风险。
雅
小雅
再说它适用谁。螺旋模型强调风险分析,使得开发人员和用户对每个演化层出现的风险都有所了解,继而做出应有的反应,因此特别适用于庞大而复杂、具有高风险的系统。考试爱问「适合采用螺旋模型的场景」,你就在选项里找两个关键词:庞大复杂、高风险。反过来,一个小工具项目用螺旋就是杀鸡用牛刀,选项里放「小型简单低风险系统」就是错项。
明
阿明
风险分析这个事听着就费钱,它自己没毛病吗?
雅
小雅
有,而且原文专门用「不能说螺旋模型绝对比其他模型优越」来铺垫。与瀑布模型相比,螺旋模型支持用户需求的动态变化,为用户参与软件开发的所有关键决策提供了方便,有助于提高目标软件的适应能力,为项目管理人员及时调整管理决策提供了便利,从而降低了软件开发风险——这串是它的优点,刚才那道题里「强调用户参与」为什么能当螺旋的干扰项、还有几分道理,就在这句「为用户参与关键决策提供方便」。但缺点两条:第一,采用螺旋模型需要具有相当丰富的风险评估经验和专业知识,在风险较大的项目开发中,如果未能及时标识风险,势必会造成重大损失;第二,过多的迭代次数会增加开发成本,延迟提交时间。
明
阿明
缺点就俩?好背:吃专家、吃时间。
雅
小雅
记成「需要丰富的风险评估经验」「过多迭代增加成本延迟提交」这两句原文表述最稳,判断题和「以下描述错误的是」都从这两句里挖。下面讲增量和原型,先记它们各自的前提,这是最容易考混的地方:增量模型适用于系统的技术架构成熟、风险较低的时候,采用增量的方式进行系统开发,这样可以提前进行集成测试和系统测试,缩短初始版本的发布周期,提高用户对系统的可见度。注意前提是「架构成熟、风险较低」——跟螺旋的「高风险」正好对着记。
明
阿明
架构成熟才能增量,有道理,地基没打好就往上加盖是要塌的。
雅
小雅
对。对于增量模型,通常有两种策略:一是增量发布的办法,二是原型法。增量发布是这样做的:首先做好系统的分析和设计工作,然后将系统划分为若干不同的版本,每一个版本都是一个完整的系统,后一版本以前一版本为基础进行开发,扩充前一版本的功能;第一版本往往是系统的核心功能,可以满足用户最基本的需求,随着增量的发布,系统功能逐步丰富、完善。用户在很短的时间内就可以得到系统的初始版本并进行试用,试用中的问题可以很快地反馈到后续开发中,从而降低了系统的风险。
明
阿明
每次发一个完整版本,这跟原型法有什么区别?原型好像也是快速给用户看东西。
雅
小雅
区别在「完整」两个字。原文给增量发布配了两条注意事项:第一,每一个版本都是一个完整的版本,虽然最初的几个增量不能完全地实现用户需求,但这些版本都是完整的、可用的;第二,版本间的增量要均匀,这一点很重要,如果第一个版本花费一个月的时间,而第二个版本需要花费 6 个月的时间,这种不均匀的分配会降低增量发布的意义,需要重新调整。这两条都出过题,尤其「每个版本都是完整可用」——不是半成品拼接。
明
阿明
原型法呢?什么前提下用它?
雅
小雅
原文的前提句直接背:当用户需求很不明确或技术架构中存在很多不可知因素的时候,可以采用原型法。跟增量发布的前提再对照一遍——增量发布是架构成熟风险低,原型法是需求不明确、架构有不可知因素。另外还有一个结构性的区别:同增量发布不同,原型法的每一次迭代都经过一个完整的生命周期。
雅
小雅
原型长什么样也要听准:在初始的原型中,针对一般性的用户需求进行快速实现,并不考虑算法的合理性或系统的稳定性;这个原型的主要目的是获得精确的用户需求,或验证架构的可用性。一般情况下,会在后面的开发中抛弃这个原型,重新实现完整的系统。
明
阿明
用完就扔?那前面写的代码不白瞎了?
雅
小雅
原型的价值不在代码,在于逼出真需求。判断题考法给你两句:「原型不考虑算法合理性和系统稳定性」——对;「原型在后续开发中通常被保留并直接扩展为正式系统」——错,一般情况下会抛弃原型重新实现。别拿生活经验做题,听原文的。
明
阿明
行,扔就扔。那这集最后一个模型,构件组装?
雅
小雅
构件组装模型是另一种思路,不迭代了,改搭积木。原文说,随着软构件技术的发展,人们开始尝试利用软构件进行搭积木式的开发,即构件组装模型。它的流程是:当经过需求分析定义出软件功能后,将对构件的组装结构进行设计,将系统划分成一组构件的集合,明确构件之间的关系;在确定了系统构件后,则将独立完成每一个构件——这时既可以开发软件构件,也可以重用已有的构件,当然也可以购买或选用第三方的构件。构件是独立的、自包容的,因此构件的开发也是独立的,构件之间通过接口相互协作。
明
阿明
自包容这个词反复出现,它到底什么意思?
雅
小雅
这个词在本章第 5 节还会正式定义,这里先记效果。构件组装模型的优点三条,逐条来:第一,构件的自包容性让系统的扩展变得更加容易;第二,设计良好的构件更容易被重用,降低软件开发成本;第三,构件的粒度较整个系统更小,因此安排开发任务更加灵活,可以将开发团队分成若干组,并行地独立开发构件。
明
阿明
优点好记:好扩展、好重用、好分工。缺点呢?
雅
小雅
缺点四条,这道题考过原题,问「关于构件组装模型的缺点,以下描述错误的是」,四个选项里混一条优点进来当错误项。缺点原文是:第一,对构件的设计需要经验丰富的架构设计师,设计不良的构件难以实现构件的优点,降低构件组装模型的重用度;第二,在考虑软件的重用度时,往往会对其他方面做出让步,如性能等;第三,使用构件组装应用程序时,要求程序员熟练地掌握构件,增加了研发人员的学习成本;第四,第三方构件库的质量会最终影响到软件的质量,而第三方构件库的质量往往是开发团队难以控制的。
明
阿明
我数一下:吃架构师、为重用牺牲性能、学习成本高、第三方质量难控制——四个。那错误选项长什么样?
雅
小雅
那道真题的错误项就是「构件自包容性差,系统扩展困难」——注意,自包容性强、扩展容易恰恰是构件组装模型的优点第一条。出题人把优点反过来写、披上「缺点」的外衣塞进选项,这就是这题唯一的杀招。看到「自包容」往优点上想就破。
雅
小雅
顺便防一手:优缺点还经常换方向考,「以下属于构件组装模型优点的是」——正确选项常见两种写法:「构件的自包容性让系统的扩展变得更加容易」或「构件粒度小,可分若干组并行独立开发」;错误选项就把四条缺点里的任何一条搬过来。优缺点八个句子都眼熟,怎么配都不慌。
明
阿明
五个模型都在了。给我拉个对照表呗?
雅
小雅
用嘴拉。瀑布:文档驱动、需求稳定、重载;演化:瀑布的若干次迭代,派生螺旋、增量、原型;螺旋:瀑布加演化的结合、每一周期需求定义、风险分析、工程实现、评审四阶段、适用庞大复杂高风险、缺点是要风险评估经验和迭代费钱;增量:架构成熟风险低、每版本完整可用、增量要均匀;原型:需求不明确或架构有不可知因素、不考虑算法合理性和稳定性、用完一般抛弃;构件组装:搭积木、自包容好扩展、缺点四条。
明
阿明
等下,螺旋那四阶段我复述一遍你别拦我:需求定义、风险分析、工程实现、评审——对吧?
雅
小雅
对,一字不差。再补个易混点:题干问「螺旋模型每一周期包括几个阶段」,有人答三个漏了评审,有人答四个但把评审换成测试——都不对,第四个是评审。四个词里「风险分析」永远排第二位。
明
阿明
记住了。这集完了该讲 UP 了吧,那个二维的模型我一直没搞懂。
雅
小雅
本集必背清单:演化模型是若干次瀑布模型的迭代,可演变为螺旋、增量、原型法;螺旋是瀑布加演化的结合、最突出特点是强调风险分析、每周期含需求定义、风险分析、工程实现、评审四阶段、适用庞大复杂高风险系统、缺点是依赖风险评估经验和过多迭代增成本延迟交付;增量发布前提是架构成熟风险低、每版本完整可用、版本间增量要均匀;原型法前提是需求很不明确或架构有大量不可知因素、不考虑算法合理性与稳定性、目的获精确需求或验证架构、一般用完抛弃;构件组装优点三条缺点四条,自包容让扩展更容易是优点不是缺点。下一集讲统一过程 UP——它凭什么是个二维模型、四个里程碑各对应哪个阶段,还有那道「UP 是不是敏捷」的送分兼送命题。
明
阿明
四个里程碑那个我预习时看了一眼,目标、架构、能力、发布——名字倒是挺吉利。
雅
小雅
名字记住了只是入门,关键是每个里程碑挂在哪个阶段末尾、达成条件是什么,下集拆开讲。