ARTICLE DETAIL

资讯详情

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

软件开发模型实战指南:从瀑布到DevOps的场景化选型

软件开发模型实战指南:从瀑布到DevOps的场景化选型 在团队里带队做软件交付这些年我越来越觉得“软件开发模型”这个东西听起来像是教科书里才有的概念实际上它每天都在决定我们团队的死活。很多项目做到一半推翻重来、交付延期、需求跑偏往回看根子往往不是某个人不给力而是从一开始整个团队对“过程怎么走”就没有一个统一的认识。简单说软件开发模型就是一套把想法变成软件的路线图它定义了什么时候做什么事、谁来做、做到什么程度才能进入下一环节以及出了问题从哪里回头。没这条路线团队就是一盘散沙有了它哪怕走得慢至少方向不会跑偏。这篇文章不打算给你复述一遍教材目录而是结合我这几年来在传统外包、互联网公司、以及咨询项目里实际用过的各种模型把它们拆开揉碎讲清楚每一个到底解决什么问题、适合什么场景、落到实操时有哪些坑。不管你是刚入行的新人、正在带项目的Leader还是想给团队做流程改进的人都能在里面找到可以直接拿去用的东西。1. 内容整体设计与思路拆解为什么开发模型不是一道选答题软件开发模型这个词听上去很理论但它解决的其实是一个非常具体的问题叫做过程失控。软件不像盖房子可以在图纸阶段就把所有细节敲定它是一个高度抽象的产物参与的人越多、周期越长大家脑子里想的“最终产品”就越不一致。没有模型团队就会陷入一种状态前端按自己的理解做界面后端按自己的理解定接口产品经理觉得需求早就说清楚了测试拿到的却是一个完全对不上的版本。最后谁都没错但项目就是要延期。所以选一个合适的模型本质上是给团队建立一个共同的“行为契约”。它不是约束反而是一种保护。它能让你在需求不明确的时候有一套应对机制而不是靠某个人随机应变的个人能力来硬扛项目风险。我个人在选型时最看重三个东西需求的稳定程度。是需求完全清楚还是边走边看这直接决定了你要不要用强流程的瀑布模型。交付的反馈速度。业务方多久能看到一个可用版本一个月还是半年这决定了模型的迭代粒度。团队的自动化水平。测试、部署能不能自动跑如果不能敏捷模型里的“可持续交付”就是空谈。说白了模型没有绝对的好坏只有匹配不匹配。匹配了它是项目成功的加速器不匹配它就是绑在团队身上的枷锁。2. 经典模型的逐个拆解瀑布、V字、增量、迭代、螺旋2.1 按阶段交付一步一个脚印的瀑布模型瀑布模型可能是最古老、也最被批评的模型但别急着否定它。整个流程非常简单清晰需求分析、概要设计、详细设计、编码、测试、维护每个阶段有明确的交付物上一阶段结束才能进入下一阶段。这个模型的核心假设是需求是可以在一开始就被完整、准确地获取的而且项目周期内不会发生大的变化。在现实中满足这个假设的场景其实比想象中要多。比如政企系统的固定报表、金融机构的合规系统、或者那种招标时已经把功能清单写得非常死的项目。这类项目大家关注的是“没做漏”而不是“做得巧”瀑布反而是低风险的选择。它的优点是好管理。每个阶段都是清晰的里程碑高层看进度非常直观出了问题也好定位是哪个阶段的锅。缺点是太脆。一旦需求发生变化就要沿着瀑布一层层往回退成本极高。我们做过一个外包系统客户一开始把界面交互说得极其详细结果原型评审的时候业务负责人换了整个交互逻辑全部推翻。那时候已经完成了详细设计返工成本直接翻了三倍项目勉强做完了但团队士气基本被打没了。所以用瀑布模型最关键的一条经验就是一定要把需求阶段做扎实并且把需求变更的审批流程卡死。没有需求冻结机制瀑布就是一场灾难。2.2 把测试提前到设计阶段V模型的真正价值在“尽早验证”V模型是瀑布模型的一个变种它的右边是从单元测试、集成测试、系统测试到验收测试的一整条验证路径左边是需求分析、概要设计、详细设计和编码。左右两边一一对应表示“每一层的开发产出都应该有对应层的验证方案”。我第一次用V模型是在一个嵌入式设备项目上。当时团队不大但硬件和软件绑定得很紧BUG越晚发现越难修。V模型的核心好处是逼着你在设计阶段就想清楚怎么测试。写需求的时候就要定义验收标准画架构的时候就要设计集成测试策略而不是等代码全写完了才招一个测试总监来想办法。这个东西对现在的启示特别大。你以为敏捷说的“测试左移”是敏捷的专利其实V模型几十年前就在讲这回事了。区别只是敏捷更强调用自动化来支撑测试左移而V模型更多是流程层面上的规划。用V模型的场景也很明确要求质量严苛的行业比如医疗、航空、汽车电子、安全仪表系统。这里的逻辑是每个开发阶段都要有明确的验证手段直接和合规审计挂钩。这种行业不能靠“发版后快速修”来兜底V模型是底线。2.3 模块化交付的增量模型先把地基打完再一层层盖增量模型和瀑布模型最大的不同在于它是把系统切成若干个可以独立开发、独立交付的模块先做一个核心模块的完整闭环再逐步增加其他模块。每次增加系统都是可用的。我用一个装修的类比来解释瀑布是你把房子全部盖完、内部全部装修完再让你入住增量是先把承重墙、水电管道这些最关键的部分搞定让你住进去再慢慢装修客房、书房。你住进去的这个动作就是增量模型里的“可交付增量”。增量模型最大的好处是用户能更早地用上系统后面每加一个模块都基于真实反馈来做调整。但它的陷阱也很隐蔽就是模块切分的粒度。模块边界切得不好后面每加一个功能都要改动已有模块增量就变成了“伪瀑布”比瀑布还累。切分的时候要尽可能遵循高内聚、低耦合的原则先确定核心的业务闭环再围绕它衍生边缘功能。2.4 不断逼近的迭代模型原型先行每次都比上一次更完整迭代模型经常和增量模型被混为一谈其实两者的底层逻辑完全不同。增量是“每次多一块”迭代是“每次精化一遍”。迭代模型的做法是先搭一个不完整的系统跑通核心场景然后每一轮迭代把系统的各个部分都给打磨得更完善。可以这样理解增量是做拼图一块一块拼出完整画面迭代是画画第一稿是草图第二稿上色第三稿细化细节。每一稿都是全局的但每一稿都比上一稿更接近最终成品。互联网产品里迭代模型的使用非常普遍。对无法预判用户到底喜欢什么的功能先用一个简化版本上线看数据表现再决定要不要继续投入这本身就是一种迭代思路。迭代模型的风险控制能力很强它不会让你陷在一堆不确定的需求里因为每一轮迭代结束你都能拿到一个可运行的版本可以及时纠偏。2.5 风险驱动的螺旋模型高风险项目的唯一理性选择螺旋模型的思想是从风险出发每一轮循环经历四个阶段确定目标、识别风险、开发验证、计划下一轮迭代。它跟其他模型最大的区别是它明确把“风险分析”列为每一轮的必要环节而不是靠老板拍脑袋来“感觉”风险。我现在敢说任何一个真正吃过项目失败亏的人看到螺旋模型都会觉得它有道理。很多项目挂掉的路径其实非常相似需求不明确、技术方案没验证、关键人员中途离开、预算缩水。螺旋模型逼着你在每一个周期开始前把这些风险捞出来并拿出具体的应对策略然后才进入正式的开发。但螺旋模型在实践里非常少见一个原因是它管理起来太重了。每个循环都要做风险评估、做原型、做评审对团队能力要求很高。另一个原因是它只在“高风险、大型、昂贵”项目里才划算。一般的业务系统用螺旋模型纯属杀鸡用牛刀。3. 敏捷、精益与DevOps时代开发模型被重新定义3.1 Scrum是框架不是流程落地靠的是“规则反馈”Scrum是当下最主流的敏捷框架它的核心结构用一个词概括就是固定节奏。把项目切成一到四周的固定周期Sprint每个周期内团队从产品待办列表里挑选一定数量的需求在周期末交付一个可运行、可验收的产品增量。Scrum之所以流行是因为它把原本一团乱麻的开发过程给流程化、周期化了。它定义了三个角色产品负责人PO负责“做什么”、Scrum Master负责“怎么做得更顺”、开发团队负责“做出来”三个工件产品待办列表、Sprint待办列表、产品增量五个活动Sprint计划会、每日站会、Sprint评审会、Sprint回顾会以及Sprint本身。但我要在这里泼一盆冷水。Scrum被“神化”太久了很多团队把站会开了、把Sprint切了就以为自己敏捷了。形式有了精髓完全没有。我见过不少团队Sprint计划会开半天PO啥都说不清每日站会上成员轮流汇报“昨天干了什么、今天干什么”活脱脱开成了领导汇报会Sprint评审会Demo演示草草了事业务方根本没参与。这样的Scrum不但没有提高效率反而把团队拖进了无穷的会议里。Scrum真正能落地的前提是你有一个真正想清楚的PO他真的知道这一期迭代要什么并且能随时配合团队澄清问题还要有一个敢于向流程叫板的Scrum Master他发现站会浪费时间就改发现Sprint粒度太大就调。我后来给团队定了一条规矩谁觉得当前的Scrum实践有问题直接在回顾会上提出来当场定行动计划不允许把问题带出会议室。3.2 看板方法限制在制品让价值流动起来看板Kanban来自精益生产丰田的制造体系。在软件开发里看板的精髓不是那块板子而是“限制在制品”和“显式化流程”这两件事。看板模型不强制固定长度的迭代它是连续流动的需求进入待办池团队按照一个持续、顺畅的节奏把需求拉进来做做完就交付。我在项目里用看板比较多的是那种需求响应型团队比如一个运维团队每天都会接到很多支持类、修补类的小任务不可能等攒够一个Sprint再开始动。这个时候看板比Scrum好用多了因为它不需要为每一个任务规划周期只需要把当前的任务数量控制住做完一个再从待办里拉一个进来。用看板的几个关键点看板上的每一列比如待办、开发中、测试中、已发布都要定义清楚“进入”和“完成”标准。WIP限制是最重要的规则比如开发中一列最多同时3个任务测试中最多2个。超了就说明团队当前负荷过载了要停下来解决瓶颈。看板不是用来汇报“我很忙”的它是用来暴露瓶颈的。如果测试列堆积了一堆任务说明测试资源不够这时候你的管理动作是去调配资源解决测试瓶颈而不是催开发写更多代码。3.3 从敏捷到DevOps把“交付”变成持续动作严格来说DevOps不只是软件开发模型它更像是一整套文化、原则和实践的组合目的是打通开发Development和运维Operations之间的墙。但放到模型体系里来看它其实是敏捷模型的延伸——敏捷要的是快速迭代但如果你每次迭代完要花一周时间发布那再敏捷也快不起来。DevOps的关键实践包括持续集成CI开发人员频繁地把代码合并到主干并自动触发构建和测试。持续交付/持续部署CD代码通过自动化测试后自动进入可部署的状态甚至自动部署到生产。基础设施即代码IaC用代码来管理服务器、网络、配置环境变成可版本化的资产。监控和日志中心化生产环境的状态变成团队随时可见的信息而不是运维手里的黑盒。我观察到一个很明显的趋势现在的软件开发模型边界越来越模糊了。敏捷也好、Scrum也好、精益也好最终都要落在持续交付这个能力上。如果一个团队能把需求到交付的链路缩短到一天以内并且质量稳定那它用的是什么模型其实已经不重要了。DevOps提供了一个基础设施层面的支撑让模型真正跑得起来。4. 场景化选型指南别再问哪个模型最好问你的项目最缺什么团队Leader常问的一个问题是“我们到底该用瀑布还是敏捷”这个问题本身是错的。你应该问的是“我的项目最怕什么哪个模型能帮我缓解这个风险”不同模型对风险的态度完全不同下面这张选型参考表是我这几年实践下来的经验总结模型核心假设适用场景主要风险团队要求瀑布需求可提前冻结政企平台、合规系统、外包项目需求变化成本极高文档能力强V模型每一层开发都有可验证的标准医疗、航空、汽车电子前期测试设计成本高开发和测试协作紧密增量系统可分解为独立模块平台型产品、集成类业务模块边界切错就翻车架构能力要求高迭代用户反馈能持续校准方向互联网业务、新产品探索对反馈闭环要求高否则反复空转数据分析能力强螺旋风险是过程的核心要素大型系统、关键任务系统管理成本高、进度难预估工程成熟度高Scrum需求持续变化但团队节奏稳定产品研发、创业项目只学形式不学精髓PO和SM都要给力看板工作流连续流动、任务类型多样运维类、支撑类团队WIP限制执行不严格团队执行力强DevOps交付是持续且自动化的云原生应用、互联网产品短期投入大、技术门槛高开发运维联动深入从这张表能看出来选型不是一个“选正确答案”的过程而是一个“权衡代价”的过程。你选择了一个模型就必须接受它带来的约束。没有一种模型可以同时解决需求不确定、进度不可控、质量没保障这三个问题你要做的是结合团队现状选出那个当前最值得承受的代价。选完模型之后还有一个经常被忽略的动作把模型的选择理由写进项目章程。我见过太多项目Leader心里默认用的是敏捷但团队成员还按瀑布的思维写文档业务方以为很快能看到东西结果开发闷头做了三个月。模型的共识必须达成否则它会成为项目里的暗雷。5. 常见问题与排查技巧实录当开发模型在实际项目中失灵5.1 项目已经乱了这时候换模型还来得及吗先说结论中期换模型等于项目重构代价极大但有时候是不得不做的事。我遇到过一个项目业务方每两周就要看到线上新功能但团队内部用的是瀑布需求评审完了才进入设计设计完了才开发一套流程走下来一个功能两个月才能上线。业务方等急了直接甩需求到开发群里让“先做出来”。团队Leader又不敢答应怕影响流程。最后两边僵持项目陷入泥潭。这种情况下我建议做一个最小程度的“混合切换”保留瀑布的文档严谨性但把开发阶段切成两周一个小迭代每次迭代交付一个小功能。这种打法在项目管理里叫“计划驱动的迭代”宏观计划还在但执行层面是按敏捷的粒度来交付。先让团队跑起来拿到反馈再逐步优化流程比硬生生宣布“我们从今天开始全体敏捷”要稳得多。5.2 敏捷项目没有文档真的可以吗“敏捷不写文档”是对敏捷最大的误解。敏捷宣言里说的是“工作的软件 高于 详尽的文档”换句话说它是在说“文档的多少以够用为准”不是让你当文盲。但现实里很多人只看到了“文档减少”的表象没有理解背后那套“高密度沟通自动化测试高质量代码”的组合逻辑。如果你把文档砍了却没有建立足够的沟通机制和测试覆盖那这个项目大概率会变成一个灾难。我的经验是敏捷项目至少要有三种文档一是系统架构决策记录二是接口API说明三是部署运维手册。这三种文档是不能砍的。其余的比如详细的需求说明、完整的设计文档可以用用户故事、测试用例和代码本身来代替。5.3 团队用Scrum跑得乱七八糟是框架的锅吗大概率不是。我观察到的几个常见通病Sprint计划会变成“估算大会”PO的需求没想清楚开发团队花半天估一个还没法拆解的需求最后估出来的数字全是拍脑袋。站会变成“进度汇报会”每个人在说“我昨天干嘛、今天干嘛”但没有人在讲“我现在卡在什么问题上”。回顾会变成“吐槽大会”问题说了一堆但散会后没有任何行动项。下次回顾会还是同样的问题。如果团队把Scrum跑成这样我的建议是先从“砍会议”开始。把Sprint计划会缩短到两小时内站会严格控制在15分钟内且只回答三个问题昨天我完成了什么、今天我要完成什么、有什么阻碍在挡我。回顾会必须有可执行的动作清单且每个动作必须有唯一负责人。5.4 模型选对了为什么项目还是失败这是最扎心的问题。很多时候模型没有错流程没有错但项目还是失败了。为什么因为开发模型管不到人的状态、团队的文化、沟通的机制。再好的流程也架不住人心涣散。我能给的建议就是把模型当成一个反馈系统而不是一个执行系统。你要时时刻刻观察流程本身有没有在替团队创造价值。如果Sprint里有一半时间在处理技术债、在救火、在跟业务方反复澄清需求那问题大概率不在敏捷或瀑布而在前置的需求梳理、技术方案的成熟度和团队的工程素养。这时候再去调模型没有丝毫意义。6. 一些经验性的总结帮你少走几步弯路让我用比较直白的方式做一个经验层面的收尾。我见过太多团队在选模型或推流程改革时犯的一个共同错误是试图找到一个“完美模型”然后所有人都往这个模型上去套。但软件开发这件事本质上充满了不确定性任何模型都是一种简化它只能管住过程的一部分管不住所有变量。我对模型的态度就一句话模型是下限的保障不是上限的推手。它保证团队在糟糕的情况下不会整个散架但真正让项目变得出色的始终是团队的判断力、沟通能力和工程能力。模型是框架框架的意义在于让你在框架内更自由地发挥而不是限制你的发挥。还有一点想特别提醒的是流程、模型、工具都要为团队服务而不是团队为流程服务。如果你发现某一条规则执行起来让所有人变得痛苦先别急着怪执行力不够认真想一想这条规则本身是不是合理。一个健康的团队应该有能力对流程本身提出质疑并且通过回顾、复盘持续调整它。软件开发的模型永远在演进你的团队对过程的理解也应该是活的。最后分享一个实操里的小习惯每次项目启动或者一次重要迭代开始时我会专门花半天时间把“这次我们为什么用这个模型、规则有哪些、什么时候可以调整”跟团队讲清楚。不要觉得这是浪费时间相信我这半天时间能换来后面几十天的顺畅。你的团队会因为你提前把规则的边界讲清楚而对你产生真正的信任。
返回列表