第6章 · 趣味学习

开发方法:从"瀑布"到"敏捷"的进化史

饿了么么团队从"手工作坊"升级到"现代工厂"后,单量突破了日均一万。但小明发现一个尴尬的问题:团队用着Scrum的站会,却搞不清软件从需求到上线到底该走多少个阶段;新人问"我们用的是什么开发模型",老王答"反正就是写代码呗"。更糟的是,有个紧急项目需求不明就开干,结果做到一半发现方向全错,白烧了三周的人天。

小明痛定思痛:光有工程化管理不够,还得选对开发方法。于是他打开《系统架构设计师教程》第6章,开始研究从瀑布到敏捷的完整谱系……

🔄 6.1 软件生命周期:软件的"生老病死"

软件和人一样,有诞生也有消亡。GB8566-88把软件的一生分成8个阶段

# 阶段 一句话 产出物
1可行性研究与计划值不值得做?可行性报告+开发计划
2需求分析做成什么样?需求规格说明书
3概要设计画技术蓝图架构+模块关系+接口
4详细设计细化到类类设计(小项目可省)
5实现写代码+单元测试源代码
6集成测试拼到一起测集成测试报告
7确认测试对照需求验收确认测试报告
8使用和维护上线后修bug加功能维护记录
💡 秒懂技巧:软件生命周期就像盖楼——先看值不值得盖(可行性)→确定几层几间(需求)→画结构图(概要设计)→画施工详图(详细设计)→砌砖浇混凝土(实现)→检查各层连不连通(集成测试)→整体验收(确认测试)→入住后修修补补(维护)。需求分析是最关键的一环——方向错了,后面越努力越偏。

🌊 6.2.1 瀑布模型:一条道走到黑

瀑布模型就像瀑布一样,从一个阶段单向流向下一个阶段。每个阶段结束有固定的文档流入下一阶段,所以也叫面向文档的开发模型。

瀑布V模型是瀑布的变体——编码后那段弯成V形:需求分析↔系统测试,概要设计↔集成测试,详细设计↔单元测试。左设计右测试,对称呼应,更强调验证。

老王
瀑布模型挺好的啊,一步一步来,多规范。
小明
问题是:用户自己都说不清要啥,需求分析怎么可能一次定死?等测试阶段才发现需求错了——返工代价是指数级的。而且所有阶段走完才交付,用户等几个月才看到东西,一看发现根本不是想要的。还有那一堆文档,大部分对客户毫无意义。这就是瀑布四大缺陷。
🎮 实战场景:饿了么么做支付对接——银行接口文档齐全、需求明确不会变,用瀑布按部就班就很合适。但做用户端外卖APP——需求天天变,用瀑布就是找死。

🌀 6.2.2-6.2.3 演化模型与螺旋模型:做两次肯定更好

演化模型核心信念:人的认知是渐进的,不可能一次理解所有需求。所以把瀑布跑多轮,每轮迭代完善。

螺旋模型=瀑布+演化+风险分析。每圈四步:需求定义→风险分析→工程实现→评审。最大特色是在每个阶段前做严格的风险识别、分析和控制。

维度 螺旋模型 瀑布模型
需求变化✅ 支持动态变化❌ 难以适应
风险分析✅ 每圈必做❌ 没有
适用庞大复杂、高风险需求明确稳定
缺点需丰富风险评估经验,迭代多成本高后期才暴露缺陷,修改代价大

📦 6.2.4 增量模型:先上核心,逐步加料

增量模型两种策略:

  • 增量发布:先做好整体分析设计,然后分版本发布。V1=核心功能,V2=扩展...每个版本都是完整的、可用的。增量要均匀——V1一个月V2六个月就失去意义了。
  • 原型法:需求不明或技术架构不确定时,先快速搭原型验证,一般会抛弃原型重做。重点是获取精确需求或验证架构可用性。
增量发布像"装修分批入住"——先装好卧室卫生间就能住进去(V1),再装厨房(V2),再装客厅(V3)。每批完成都是能住的完整状态。原型法像"先搭纸板房"——不追求质量,只为看效果,确认满意后拆掉纸板房真装修

🧩 6.2.5 构件组装模型:搭积木式开发

构件组装模型=搭积木。需求分析后把系统划分为一组构件集合,每个构件独立、自包容,通过接口协作。构件可自己开发、重用已有的、或买第三方的。

优点:扩展容易、可重用降低成本、可并行开发。
缺点:需要经验丰富的架构师、可能为重用牺牲性能、学习成本高、第三方构件质量不可控。

🏗️ 6.3 统一过程(UP):二维开发的大管家

UP(Unified Process)由Rational公司开发,是迭代的二维开发模型

横轴(时间)=4个阶段

  • 📡 初始:界定范围、明确目标。业务建模和需求是重头戏。
  • 📋 细化:抽象逻辑模型、设计架构。分析设计是主要活动。
  • 🔨 构建:基本完成系统构建。实施和测试是主要活动。
  • 📦 交付:产品化、重构、修改、测试、部署。

纵轴(工作流)=9个核心工作流:业务建模、需求、分析设计、实施、测试、部署(6个工程活动)+ 配置与变更管理、项目管理、环境(3个管理/支持活动)。

4个里程碑:目标(初始结束)→架构(细化结束)→能力(Alpha测试后)→发布(测试完成、发布培训后)。

架构设计师在UP中至关重要——建立架构模型、细化架构、保持概念完整性、定义设计方法/指南/编码指南/评审设计,所以UP也被称为以架构为中心的开发模型。

UP像"装修大管家"。横轴=时间表(量房→出图纸→施工→验收),纵轴=工种表(水电木瓦漆…+监理+后勤)。每个阶段不是一锤定音而是螺旋上升。注意:未经裁剪的UP是重载过程,不属于敏捷方法。但裁剪后可适应各种规模的团队。"环境"工作流=为开发准备"米"——工具、指南、规范、模板,别以为给台电脑就万事大吉了。

🏃 6.4.1 极限编程(XP):12个最佳实践的"组合拳"

2001年2月,17位"无政府主义者"在犹他州发表《敏捷软件开发宣言》。XP是其中最鲜艳的旗帜。

XP四大价值观

  • 🗣️ 沟通:程序员不善言谈?用结对编程逼你开口
  • 🧘 简单:够用即好,不考虑明天
  • 🔁 反馈:开发过程不是黑盒,持续反馈暴露问题
  • 💪 勇气:应对变化,敢于重构

四大价值观之下,隐藏着更深刻的东西:尊重

12个最佳实践:计划游戏、小型发布、隐喻、简单设计、测试先行、重构、结对编程、集体代码所有制、持续集成、每周40小时、现场客户、编码标准。

小明
Kent Beck说"1+1>2"——12个实践单用没意义,融会贯通才叫XP。结对编程降低沟通成本→集体代码所有制让结对可行→持续集成是它们的基础支撑→每周40小时保证团队不垮。每个实践互相支撑。
老王
每周40小时我最喜欢!加班扼杀积极性!
💡 秒懂技巧:XP的12个实践像"十二道工序"——单做一道不叫XP,全用上才算。就像寿司——醋饭+鱼生+手卷+芥末+酱油,每一样都老古董了,但组合在一起才是寿司,少一样味道就不对。

🎯 6.4.2 特征驱动开发(FDD):几页纸的过程

FDD来自一个新加坡银行项目。Jeff De Luca和Peter Coad接手时客户刚经历了一次项目失败,团队士气低落。最终用特征驱动+彩色建模获得了巨大成功。

6种角色:项目经理(保护伞)、首席架构设计师、开发经理、主程序员、程序员、领域专家。

5个核心过程:开发整体对象模型→构造特征列表→计划特征开发→特征设计→特征构建。设计和构建合并起来反复迭代。

FDD最有特色:类的个体所有——代码分配给特定的人维护,不像其他模型代码共有。优点是概念完整、最熟悉的人维护、有自豪感;缺点是依赖关系增强、A等B修改才能用。另一个特色:审查——作为最佳实践明确提出,发现测试发现不了的缺陷(建模、需求和设计期的缺陷)。

📊 6.4.3 Scrum:短迭代的"冲刺者"

Scrum是增量、迭代的开发框架。整个开发由若干短迭代(Sprint)组成,每个Sprint建议2-4周。

5个活动

  • 📝 产品待办事项列表梳理:持续维护需求列表,排序、分解、合并、估算
  • 🗓️ Sprint计划会议:选哪些做、怎么做。时长=Sprint每周对应2小时
  • 每日Scrum:15分钟站会。三问:昨天干啥、今天干啥、有啥阻碍。不是向管理层汇报,是团队内部沟通
  • 👀 Sprint评审会议:展示产品增量,调整Backlog
  • 🔄 Sprint回顾会议:反思流程、工具、人际关系,制定改进计划

5大价值观:承诺、专注、开放、尊重、勇气。

🎮 实战场景:饿了么么用Scrum——产品Backlog是老王维护的需求清单(按商业价值排序)。每两周一个Sprint,开始时开会选要做的需求。每天早上15分钟站会,小明说"昨天搞完登录接口,今天做支付对接,卡在银行文档不全"。Sprint结束演示成果,调整下一步计划。

💎 6.4.4 水晶方法与6.4.5 其他敏捷

水晶方法(Crystal)由Cockburn建立,是一组方法家族:Crystal Clear(≤6人)、Yellow、Orange、Red。最常用的是Crystal Clear。

透明水晶七大体系特征:① 经常交付 ② 反思改进 ③ 渗透式交流(同屋工作,背景听觉获取信息)④ 个人安全(指出问题不怕报复)⑤ 焦点(清楚最重要任务,有时间做)⑥ 与专家用户方便联系 ⑦ 自动测试+配置管理+经常集成的技术环境。

其他敏捷方法

  • 🔓 开放式源码:开发人员地域分散,靠"补丁"并行排错——与其他敏捷强调同地工作不同
  • 🔄 ASD方法:Jim Highsmith提出,三个非线性阶段——猜测、合作与学习

♻️ 6.5 软件重用与构件技术

软件一旦产生就可以无限复制,重用意义重大。7种重用形式

重用形式 说明 饿了么么的例子
源代码重用最简单最常见复制粘贴工具类
架构重用架构风格和设计模式微服务架构复用到多个项目
应用框架重用如Spring用Spring Boot做后端
业务建模重用领域模型餐饮领域模型复用
文档及过程重用文档模板、流程需求文档模板
软构件重用自包容可复用程序集支付构件
软件服务重用Web服务、SOA调用地图API

构件=自包容+可重用的程序集。两大特性:自包容(功能完整、内外界限清晰)+ 可重用。三大构件标准:CORBA、Java Bean/EJB、COM/DCOM。1968年NATO会议就提出了"软件组装生产线"的梦想。

📐 6.6 基于架构的软件设计(ABSD)

ABSD是架构驱动方法,三个基础:① 功能分解(内聚耦合技术)② 选择架构风格实现质量和业务需求 ③ 软件模板的使用。ABSD是递归的、迭代的,每步清晰定义,不管设计是否完成架构总是清晰的——降低随意性。

ABSD的输入:抽象功能需求(含变化需求)、用例、抽象的质量和业务需求、质量因素、架构选项、约束。

基于架构的软件开发模型(ABSDM)=6个子过程

# 子过程 核心工作
1架构需求获取需求→标识构件(类图→分组→打包成构件)→需求评审
2架构设计提出架构模型→映射构件→分析相互作用→产生架构→设计评审
3架构文档化产出需求规格说明+质量设计说明书
4架构复审外部人员参加,标识风险和缺陷
5架构实现查找/开发构件→组装→测试
6架构演化需求变动归类→演化计划→修改/增加/删除构件→更新交互→组装测试→技术评审→产生演化后架构
ABSD像"建楼盘"——先确定要建几栋楼什么结构(需求),再画建筑设计图(设计),然后写成施工图纸(文档化),请第三方审图(复审),施工队按图施工(实现),以后加建改建(演化)。架构演化7步和架构实现是镜像的——都是"归类变动→计划→改构件→更新交互→组装测试→评审→产出"。

🔢 6.7 形式化方法:用数学证明"没错"

形式化方法=用严格的数学方法+形式化规约语言精确定义软件系统。非形式化用自然语言/图形/表格,形式化用数学。

两部分:形式化描述(解决"做什么")+ 形式化验证(验证程序是否满足描述)。形式化描述两类:① 建立计算模型描述行为 ② 定义系统必须满足的属性。

小明
巴黎地铁14号线和Roissy机场穿梭车用了形式化方法——连单元测试都没做就上线了!非形式化开发这类关键系统,单元测试和集成测试要付出高昂代价,形式化方法直接省了。
老王
那我们饿了么么也用形式化方法?
小明
想多了。形式化方法适用于高可靠性的关键应用——航天、核电、医疗。外卖系统用不上,成本太高。但知道有这把"终极武器"很重要。
🎬 故事结局:小明终于搞清了开发方法谱系——从瀑布到螺旋到增量,从UP到敏捷(XP/FDD/Scrum/水晶),从构件组装到ABSD,最后到形式化方法。他给饿了么么选了Scrum+增量发布的组合:核心功能先上、每两周迭代、持续交付。老王感慨:"原来写代码只是冰山一角,选对开发方法才是定海神针。"

但系统越来越大,小明隐隐感到:光有开发方法还不够,做之前还得想清楚——这个项目到底值不值得做?怎么规划? 第7章的系统规划在等着他。