ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

软件开发模型怎么选?从瀑布到敏捷的真实落地经验

软件开发模型怎么选?从瀑布到敏捷的真实落地经验 1. 开发模型不是教科书概念它是项目里最现实的约束1.1 我为什么想写这个话题做软件开发这行超过十年带过的团队、参与过的项目两只手数不过来。有件事一直让我觉得挺有意思每次招聘面试问候选人“常见的软件开发模型有哪些”几乎人人都能背出瀑布、迭代、增量、敏捷、螺旋、V模型这一串名字。可真到了项目里能说清楚“我们团队现在用的是什么模型为什么这么选什么时候应该切换”的人十个里面未必有一个。不是大家不懂概念而是概念和现实之间缺了一层“怎么用”的连接。软件开发模型这个名词听起来像软件工程课的考点实际上它是每个项目组每天都在经历的决策规则需求怎么拆、任务怎么排、什么时候能验收、需求变了怎么办、文档写到什么程度。你嘴上可以不提“模型”两个字但你的工作方式一定落在某个模型里。所以这篇文章我想换个写法不按教科书顺序讲模型定义而是以这十年的实战视角聊聊开发模型到底是什么它解决了什么问题以及最关键的——面对一个具体项目时怎么判断自己该用哪种模型。1.2 模型的本质是风险管理和沟通机制理解软件开发模型关键是先丢掉“流程模板”这个印象。瀑布模型、迭代模型、敏捷模型看上去是几条不同的作业流程本质上它们回答的是两个问题第一你打算怎么控制不确定性第二你打算用什么节奏让各方对项目状态达成一致。控制不确定性说白了就是风险策略。瀑布模型赌的是“需求前期可以想清楚”所以把需求分析放到最前面后面所有环节都围绕这个前提展开。迭代模型赌的是“一次想不清楚但可以分几次想”所以把开发切成多个轮次每轮都从需求走到交付。敏捷把赌注押在“需求一定会变”上所以干脆不追求长期计划只保短期交付和快速反馈。沟通机制则决定了相关方什么时候能知道项目真实进展。瀑布里沟通的锚点是文档和里程碑敏捷里沟通的锚点是迭代评审和每日站会。选模型本质上是在选一套沟通节奏让产品、开发、测试、管理层对“现在做到哪了”有共同认知。把这两点想清楚后面看任何一个模型都会容易很多。你看到的不是流程图上的方框和箭头而是一套面对不确定性的应对策略。1.3 不选模型的后果团队会默认出最差的模型我在咨询和带团队的过程中见过不少“没有模型”的项目组。组织者觉得模型是形式主义不定义流程让大家自由发挥。结果不出意外地走向同一个结局需求不经过评审就开始开发开发做到一半需求方又觉得不对测试在交付前一周才拿到系统发现一堆问题又没时间修。这其实也是一种模型叫“无流程驱动模型”也就是黑灯瞎火摸着走做得出来算运气做不出来是常态。这种状态比选错模型更危险。选错模型至少还有调整方向的可能“没有模型”会让所有问题都变成突发状况。出了问题找不到决策链条因为压根没有定义过谁在哪个节点负责什么。所以我常跟团队说开发模型的意义不在于流程本身而在于它给项目提供了一个“默认动作”和“兜底方式”。遇到需求变更你知道该不该接、跟谁确认、影响哪些节奏。进度落后了你知道是加人、砍范围还是延迭代。这些动作不必完美但必须事先有共识。这就是模型的价值。2. 经典模型不是过时古董它们各自解决过一个真实问题2.1 瀑布模型老而不死是因为它的假设很诚实瀑布模型是提到开发模型时永远绕不开的起点。上世纪70年代温斯顿·罗伊斯提出这种模型的时候软件开发还多依附于硬件工程项目场景是需求相对明确、交付周期以年计、变更成本极高的系统比如航天、军事、大型基建配套软件。当时的“软件危机”本质是项目复杂度超过了管理者大脑能掌控的边界瀑布的价值是用阶段划分强行制造可控性需求-设计-编码-测试-维护每个阶段有明确产出物和评审点阶段之间层层递进。到今天依然有人把瀑布说得一无是处说它僵化、落后、不贴近用户这其实是对瀑布的误读。瀑布模型真正适用的默认假设是“需求可以在一开始被充分理解和确认”它并没有承诺过程中不允许任何变更而是把变更成本设定得非常高高到不鼓励你变更。当一个项目满足这种假设时瀑布反而是效率最高、最容易管理的方式。举一个我经历过的例子。给一家金融机构做内部报表系统需求是监管模板锁定的字段、口径、上报时间点全是硬约束业务方没有任何自由发挥空间。这种情况下我们用类似瀑布的阶段推进需求文档确认后后续开发和测试几乎没有返工整体节奏非常顺畅。后来团队里有人提议“要不我们改成敏捷”我反问了一句敏捷要解决的需求不确定性在哪里需求方自己都说不出来要变什么。大家想了想确实没有必要。瀑布的适用边界很清晰需求稳定、目标明确、交付周期可预期、变更成本高。这种项目放弃瀑布反而是种浪费。2.2 V模型给测试留一席之地的瀑布学软件开发模型的时候V模型往往是被一句话带过的说它是瀑布的变体左边是开发阶段右边是测试阶段中间有对应关系。教科书讲到这里就停了实战中它的价值远不止于此。V模型最大的贡献在于建立起了“验证与开发的映射关系”。需求分析对应验收测试概要设计对应系统测试详细设计对应集成测试编码对应单元测试。这个对应关系意味着测试不是编码完成之后才开始的“终审”而是每个开发阶段都要提前想清楚“我怎么证明这个阶段的产出是对的”。我见过很多功能能做出来但质量一塌糊涂的项目根因几乎都是测试意识和开发环节脱节。开发写完代码才丢给测试测试拿到一个黑盒开始摸索逻辑漏洞、边界问题、异常处理全在最后阶段集中爆发。V模型强迫你从项目一开始就思考验证手段这种思维方式即使不做严格V模型流程的项目也值得借鉴。当年我在一个嵌入式项目里团队用类似V模型的方式管理测试设计需求评审阶段就让测试负责人介入每个需求点后面跟着一条验收场景开发完成一个模块测试立刻能拿验收场景来验证而不是攒到最后一股脑做。这种做法的直接好处是每一层产物的缺陷都在当层被发现和修复越早修复成本越低整个项目的质量曲线比之前顺滑得多。2.3 螺旋模型与风险驱动为高风险项目准备的“保险丝”螺旋模型是很多人容易忽略的一个但它背后的思维值得单独拿出来讲。巴里·伯姆提出螺旋模型的核心是“风险驱动”每一轮迭代都包含四个阶段确定目标、识别风险、开发验证、评估下一步。像一条螺旋线反复盘旋每转一圈就消除一批主要风险。这个模型在教科书里的存在感不高因为大部分软件项目用不上它那种强度。但它把一件非常重要的事摆到了台面上——开发模型要为项目中的不确定性风险做预案。螺旋模型的每一圈都先识别风险再开发相当于给项目上了多道保险丝哪个保险丝断了你知道是哪一段出了问题而不是整个项目彻底崩盘。现实中很多项目不会完整采用螺旋模型但“风险驱动”的思路完全可以融合进其他模型中。我在面向传统企业客户做系统集成时经常遇到这样的场景客户需求描述得不是很清晰又要求我们必须在某个时间点上线一个核心功能。这时候我不会直接定死瀑布计划而是先组织技术预研和PoC用一到两周验证核心技术路线是否成立再进入正式开发。这个PoC环节就是借用了螺旋模型里“处理高风险先行”的做法。2.4 迭代、增量与敏捷从“一次猜对”到“小步试错”迭代模型和增量模型经常被混在一起说它们其实是两套逻辑。迭代模型强调的是轮次递进每一轮是完整的小型开发周期系统在一次次的迭代中逐步完善。增量模型强调的是按功能切片交付第一个增量就有核心可用功能后续增量不断往上叠加。敏捷开发吸收了这两种思想把它变成了工程实践。Scrum基于迭代每轮sprint产出可交付的增量看板则更偏向持续流动按价值切分任务追求连续交付。敏捷真正改变的不是开发环节而是把需求管理、优先级排序和用户反馈放到了循环的正中心让产品方向可以随时校正。但敏捷对团队的要求其实不低。高级别的敏捷要求团队有强的自组织能力产品负责人能拍板测试能跟上节奏业务方能高频参与评审。任何一个条件不满足敏捷就会空转。我有个朋友所在团队号称敏捷转型两年实际效果却很差每天早上站会变成进度汇报迭代评审变成演示会需求变更依然随时从天而降。这种状态比传统瀑布更容易让团队崩溃。2.5 DevOps把交付的上半场和下半场打通严格来说DevOps不是传统意义上的软件开发模型它解决的是“开发完成之后到上线运营”这段链路的问题。但它现在对模型选择影响很大放在这里一起聊。过去开发模型只管到“代码提交测试通过”为止之后怎么部署、怎么配置环境、怎么监控是另一个团队的事。DevOps用自动化工具链把构建、测试、部署、监控拉通让每个迭代的产出能更快地到达用户手里。它的实质是把软件模型的应用边界从“编码测试”扩展到了“持续交付”和“持续运营”。现在很多团队选型时会面临一个关联选择如果采用敏捷迭代却没搭好持续集成和自动化部署那每轮迭代结束意味着大量手工发布工作迭代周期被发布环节拖长敏捷的优势就打了折扣。反过来说如果项目部署环境非常简单也没有多环境频繁发布的诉求盲目上DevOps工具链反而是给自己找活干。2.6 各模型适用场景速查模型核心特点适用场景关键风险瀑布阶段线性推进文档驱动需求稳定、变更成本高、合规要求严格需求理解错误会传导至末端V模型开发与测试阶段一一对应质量要求高、测试可提前设计过度强调流程灵活性弱螺旋风险驱动多轮评估高风险、创新型、大型复杂项目流程重推进慢迭代每轮完整开发周期逐步完善需求大致清楚但细节需逐步明确迭代目标不清变相瀑布增量按功能切片交付尽早可用需要快速上线核心功能的项目架构设计不足增量整合困难敏捷短迭代、持续反馈、拥抱变化需求不确定、团队自组织能力强假敏捷、需求失控、技术债累积DevOps开发与运维一体化持续交付需要频繁发布、多环境部署工具链复杂度过高反噬效率这张表不是让你照着选而是提醒你每个模型都是被某个真实问题逼出来的理解它背后的困境比记住它的流程重要得多。3. 实际选型时我只看这五个问题3.1 需求能冻结吗选型第一个要问的不是团队偏好而是需求本身的性质。我接触过两类极端情况一类是银行、医疗、政务类项目需求被法规或合同条款锁死变更走正式审批流程这种场景用瀑布或V模型能最大程度保证可控性和合规性。另一类是互联网产品探索期的新功能需求每天都被用户数据挑战这种场景下追求需求冻结既不现实也没必要敏捷和迭代才是正经选择。有一个判断技巧可以分享如果需求方能在项目启动前用一页纸把目标用户、核心场景、成功标准写清楚而且写完之后三个月不用改那瀑布模型的第一阶段风险基本可控。如果需求方只能说出“大概要做一个什么东西”但说不出具体规则和边界那你需要的是快速验证和迭代反馈而不是厚厚一叠需求文档。3.2 团队结构支持哪种节奏开发模型不是项目经理一个人的决策它需要整个团队的执行能力作为支撑。敏捷开发对团队成员的要求是端到端能力每个人都要能从需求沟通到编码测试至少具备跨环节协作的意愿。如果团队里角色分明、边界清晰、大家都在自己的职能条线上汇报强行推敏捷会遇到特别多摩擦。我见过一个传统外包团队硬推敏捷失败的案例。团队里开发和测试分属两个部门供应商和客户也是两个主体每天站会开完问题清单拉出来开发说等需求确认测试说等开发交付产品说等客户审批。每个人都在等别人敏捷站会变成“等会”。后来项目调整成瀑布加周报节奏反而顺畅了很多因为这种组织架构天然适合阶段式推进。反过来小型创业团队可能只有五六个人产品、开发、测试身兼数职这种结构用轻量敏捷或者看板法就够了走正规瀑布流程反而是负担光评审会就能把有限的时间消耗掉。3.3 业务方对交付节奏的预期是什么开发模型的节奏需要和业务方的心理预期匹配。如果业务方期待的是“三个月后给我们看一个完整系统”那迭代模型容易让他们在中间阶段产生焦虑因为前几轮交付的东西在他们眼里是半成品。如果业务方期待的是“每两周看到可用的功能并反馈意见”那瀑布模型的长时间无交付会让他们怀疑项目是否在推进。初始的期望管理比模型本身更重要。我曾经做过一个企业数据平台项目客户签约时习惯了传统外包的交付方式约定一个总验收节点。我们内部用了迭代开发每两到三周给客户演示进展一开始客户觉得演示版本功能不完整差点产生误会。后来我们把迭代演示改成了“内部验证月度里程碑展示”既保留迭代开发的好处又契合了客户对里程碑的预期。这件事让我意识到对外沟通节奏和内部开发节奏有时候需要分开设计。3.4 你更怕需求变更还是更怕错误发现得太晚这是一个典型的“两害相权取其轻”问题。瀑布模型对需求变更极度敏感但在需求明确的前提下阶段评审能让错误在早期暴露。敏捷模型欢迎需求变更但如果测试不够充分问题可能累积到生产环境才爆发那时候修复成本依然很高。判断方法很简单如果你的项目出了错代价是资金损失、安全事故或者法律风险那应该倾向于较早做验证哪怕牺牲一些灵活性。如果你的项目出了错代价是用户不满意、转化率下降那就倾向于快速试错让用户反馈来修正方向。3.5 有多少人可以支撑流程开销这是很多技术负责人容易忽略的一点。每个开发模型都有流程开销瀑布要写全套文档、开评审会敏捷要开站会、迭代计划会、评审会和回顾会螺旋模型每一轮都有风险评估和复盘。这些开销需要人来承担如果你组建的项目组一共就三个人同时铺开一整套流程那几乎不可能有精力写代码。不是说人少就不能用规范模型而是要裁剪。我见过一个两个开发加一个产品的极小型项目把敏捷流程简化到只需维护一张任务看板和每周一次需求对齐效果非常好。模型可以裁剪但核心机制不能被破坏。裁剪时抓住根本目标让信息透明、让错误及时暴露、让方向及时修正。这三样做到了流程简化一些也问题不大。4. 真实项目里踩过的坑模型不是贴标签而是要落地4.1 槽点最多的“假敏捷”要说这些年看到过最多的坑不是选错模型而是名义上选了敏捷实际却做得四不像。现象有两种一种是管理上觉得敏捷就是缩短周期快点交付于是把瀑布每一阶段压缩成两周一个周期阶段还是那条瀑布名字却叫迭代。另一种是只引进了Scrum的仪式每天站会、两周一次复盘但需求变更流程、测试策略、产品优先级排序完全没有变站会成了汇报会回顾会成了吐槽会。这种假敏捷比传统瀑布还伤人。瀑布至少阶段边界清楚每个环节的交付物明确。假敏捷里迭代边界存在但没人认真对待迭代计划拍脑袋定迭代目标没人负责做完做不完都不影响下个迭代的排期。团队一边被流程消耗精力另一边还是按老方式推进工作双重负担压下来士气很快就崩。想避开这个坑核心是盯住敏捷的交付承诺。每一个迭代结束时必须有一个可交付的、经过验证的功能增量。如果做不到这一点不管站会开得多标准迭代计划写得多漂亮那都不是敏捷。4.2 瀑布模型死在不遵守“需求冻结”的约定瀑布模型被骂僵化但很多时候不是模型僵化而是执行的人没有守住模型的边界。曾经接过一个系统改造项目项目启动时和客户约定了需求冻结的时间节点计划在需求审核通过后进入设计阶段。结果进入开发后客户每隔一两周就提一个“小优化”每次都觉得改动不大开发顺手就做了。这些“小优化”看似无害实际上破坏的是瀑布模型赖以生存的基础——阶段之间传递信息的稳定性。需求改一点设计文档要改代码要改测试用例要改改来改去项目进度悄悄落后质量也开始出问题。等到交付节点临近团队才发现大量需求属于未评审变更测试覆盖严重不足但为时已晚。那次之后我做了一个改变所有项目不管用什么模型都要设一个变更控制节点。需求变更可以提但要经过统一评审确定影响范围、工期和成本之后由双方确认。这么做不是拒绝变更而是让变更进入受控通道防止它在项目里无声无息地累积。4.3 迭代周期长短不是拍脑袋定的很多团队定迭代周期时习惯于直接抄两周理由是“Scrum 推荐”。两周确实是个常见值但不一定适合所有项目。迭代周期的长度应该考虑两个因素一是形成“可交付增量”需要多长时间二是业务方多久能给出有效反馈。我做过一个系统集成项目每轮迭代结束需要出集成测试报告、更新接口文档、同步第三方依赖版本这些收尾动作本身就需要四五天。两个礼拜的迭代实际有效开发时间只有一周出头很多功能才写到一半就被迫收尾进入发布流程反而导致交付质量下降。后来把迭代周期拉长到三周给了开发充足的时间完成模块测试也来得及做完整验证整体效率反而提升了。反过来如果团队有成熟的自动化测试和部署流水线业务方也习惯了快速反馈两周甚至一周的迭代都没问题。判断标准只有一个迭代结束时是否真的能拿出一份经过验证的可用交付物。能拿出来周期就是合适的拿不出来再标准的周期也白搭。4.4 混合模型的边界到底应该设在哪里实际做项目的时候很少有人会100%套用单一模型大家普遍用的是混合模式比如瀑布式合同流程加敏捷内部迭代或者产品探索阶段用敏捷、进入实施阶段转瀑布。混合模式本身没问题但它要求你清楚每个环节的边界和转换条件。最常见的问题是前期探索和后期开发的交接。产品团队用敏捷方式跑了一堆原型验证了需求交付给开发团队时文档只有几页关键记录。开发团队想按迭代方式继续推进但原型里的很多临时方案经不起工程化推敲一边开发一边返工。这本质上是因为两个阶段的目标不同前期追求快速验证后期追求稳定交付切换时缺少一个“工程化交接”的缓冲动作。现在我在混合模式项目里会刻意加入一个“阶段转换评审”动作无论从哪个模型转到哪个模型都要明确当前产物的成熟度、遗留风险和接手方需要补充的信息。这个评审不需要拖很长时间但它能有效避免两个模型之间的责任空档让切换过程变得可控。5. 我的最终建议让模型成为团队共同语言而不是管理者的控制手段做软件开发这些年我对模型的态度经历了三个阶段。刚入行时觉得模型是走形式浪费时间代码写得好比什么都强。后来做了技术管理发现没有模型团队就像一盘散沙每次开会都在讨论同样的问题却始终没有结论。现在做了多年项目负责人之后我更倾向于把模型当成团队的共同语言是大家协作时默认遵守的共识。一个好的模型执行效果外在表现应该是团队每个人都能回答这几个问题我们这轮要交付什么什么是“完成”遇到需求变更该找谁测试验证的标准是什么。模型不是贴在墙上的制度也不是项目管理工具里的一个流程模板它是回答这些问题的依据。如果团队遇到争议时能回到模型层面来对齐比如“这个需求能不能进本迭代要看它是否满足验收标准”那说明模型已经真正内化成了协作语言。最后再分享一个这些年最深的体会开发模型没有绝对最优只有相对合适。合适与否要看项目阶段、团队成熟度、业务约束和风险偏好。而且模型不是一成不变的一个项目从零到一再到持续运营完全可以经历从敏捷到瀑布再到DevOps的演进。真正重要的不是选一个“正确”的模型而是保持对项目状态的敏感——当错位出现时勇于调整模型本身而不是让团队硬扛着继续运行。这一点远比分清瀑布和敏捷的定义重要得多。
返回列表