软件生命周期——一个软件“从摇篮到坟墓“的一生
引子软件也有它的人生我们每个人都会经历这样的一生在母亲的孕育中诞生呱呱坠地来到这个世界然后慢慢长大、上学、工作、成家立业步入中年后日渐成熟、不断完善自己最后步入晚年直至生命的终点。从孕育到出生到成长到成熟再到老去——这就是一个人完整的生命周期。有意思的是软件也有它自己的一生。一款软件并不是程序员啪地一下敲完代码就凭空出现用一段时间就消失的。它同样要经历一个完整的过程从最初一个模糊的想法被孕育到被设计、被开发出来呱呱坠地,再到上线运行、服务用户、不断更新完善最后随着时代变迁被淘汰、“寿终正寝”。这个软件从摇篮到坟墓、从孕育到消亡的全过程就叫做软件生命周期Software Life Cycle。理解软件生命周期对学习软件工程至关重要。因为它就像一张地图清晰地告诉我们开发一个软件到底要经历哪些阶段每个阶段该干什么整个过程是怎样有条不紊地推进的今天我们就来生动地聊一聊软件的一生,到底是怎样走过的。第一部分为什么要把软件开发分成阶段在正式介绍软件生命周期的各个阶段之前我们先要回答一个根本问题为什么要把软件开发划分成一个个清晰的阶段直接埋头写代码不行吗答案是不行而且会出大问题。我们在讲软件危机时说过早期那种凭感觉、想到哪写到哪的手工作坊式开发导致了大量项目的超期、超支和失败。而把开发过程划分成清晰的阶段正是软件工程对抗混乱、驯服复杂的一大法宝。它的好处显而易见第一化繁为简分而治之。软件开发是一项极其复杂的工程。把它拆分成需求、设计、编码、测试等一个个阶段每个阶段只专注解决一类问题就把一个巨大的难题分解成了若干个可以逐一攻克的小难题。这正是分而治之的智慧。第二有章可循便于管理。分了阶段整个项目就有了清晰的路线图。先做什么、后做什么每个阶段的目标是什么、要交出什么成果都一清二楚。这让项目的管理、进度的把控、人员的协作都变得有条不紊。第三及早发现问题降低损失。每个阶段结束时都可以检查、评审一下“对一对答案”。这样就能尽早发现错误。还记得那条铁律吗——错误发现得越晚修复的代价越大。分阶段管理正是把错误尽可能地扼杀在摇篮里。所以把软件的一生划分成清晰的阶段是一种科学、高效、可控的做法。下面我们就跟随一个软件的脚步一步步走完它精彩的一生。第二部分软件生命周期的各个阶段——一个软件的成长记一个完整的软件生命周期通常包含以下几个主要阶段。让我们把它想象成一个孩子的成长历程一一道来。第一阶段问题定义与可行性研究——“该不该把这个孩子生下来”一切的起点是有人产生了一个想法“我想做一个这样的软件。”但是先别急着动手。在投入大量人力物力之前要先冷静地想清楚两个问题第一问题定义——我们到底要解决什么问题这个软件存在的意义是什么第二可行性研究——这个软件到底值不值得做、能不能做成具体要研究几个方面的可行性技术上能不能实现以现有的技术做得出来吗经济上划不划算投入和回报成正比吗会不会亏本时间上来不来得及能在期限内完成吗这个阶段就像一对父母在决定该不该把这个孩子生下来。要充分考虑自身的条件和未来的前景做出一个理性的判断。如果研究下来发现根本不可行——技术做不到、或者注定要亏钱——那就应该果断放弃这一放弃,反而避免了更大的损失。这是整个生命周期中第一个、也是非常关键的决策。第二阶段需求分析——“搞清楚要养一个怎样的孩子”如果决定要做那么下一步就是搞清楚——这个软件到底要做成什么样用户到底想要什么这就是需求分析阶段。我们在前面专门讲过需求分析。它的核心是深入地和用户、客户沟通听懂他们话里话外的真实意图挖掘出他们真正的需求然后清清楚楚地记录下来形成需求文档。这个阶段回答的是**“做什么What”**的问题。它是整个软件开发的地基中的地基。如果这一步搞错了——把用户想要的汽车理解成了更快的马,那么后面盖得再漂亮都是错的。这个阶段就像父母在规划要把孩子培养成一个怎样的人。是要全面发展还是要专精一艺方向必须先搞清楚。方向比努力更重要搞清楚做什么,永远是第一位的。第三阶段软件设计——“画出孩子的成长蓝图”需求搞清楚了接下来就要规划这个软件具体该怎么实现这就是软件设计阶段它回答的是**“怎么做How”**的问题。设计通常又分为两个层次概要设计架构设计搭建软件的整体骨架。整个系统分成哪几大模块数据怎么存放、怎么组织各部分之间如何配合——这就像盖楼前的总体结构设计决定了软件的底子牢不牢、好不好扩展。详细设计把每一个模块、每一个功能的实现细节都规划得清清楚楚细到程序员几乎可以照着做就能写出代码。——这就像每个房间的具体施工图。设计阶段的成果是一套完整的设计文档也就是软件的图纸。这个阶段就像在为孩子规划详细的成长蓝图。上什么学校、学什么特长、走什么路线都设计得明明白白。好的设计蓝图已经决定了一个软件成败的一半。第四阶段编码软件实现——“十月怀胎一朝分娩”蓝图画好了终于到了激动人心的时刻——真正地写代码把软件造出来这就是编码阶段也叫软件实现。程序员们依据设计文档用编程语言一行行地把代码写出来让软件从纸上的图纸,变成能真正运行的产品。这个阶段是软件从虚到实的关键一跃是软件真正诞生的时刻。不过要特别注意编码绝不是软件开发的全部它通常只占整个生命周期一小部分的工作量。很多新手误以为软件开发写代码,这是天大的误解。前面的需求、设计后面的测试、维护每一个都同样重要甚至更重要。这个阶段就像十月怀胎一朝分娩——经历了前面漫长的孕育和准备孩子终于呱呱坠地来到了这个世界。但要记住孩子出生仅仅是漫长人生的开始而已。第五阶段软件测试——“给新生儿做全面体检”代码写完了软件能不能直接交给用户用绝对不行必须先经过严格的检验——这就是软件测试阶段。刚写出来的软件几乎不可避免地存在各种各样的错误bug。测试就是要想方设法地把这些隐藏的错误一个个找出来、改掉确保软件功能正确、运行稳定、质量过关。测试通常也分好几个层次先测试一个个小模块单元测试再测试模块组装到一起好不好用集成测试然后测试整个系统系统测试最后让用户来验收验收测试。这个阶段就像给一个新生儿做全面的体检。要仔仔细细地检查每一项指标确保健健康康、没有毛病才能放心地让他去面对这个世界。测试是软件质量的最后一道、也是至关重要的一道防线。第六阶段部署与运行——“孩子长大走上社会”软件通过了测试质量合格了终于可以正式交付给用户使用了把软件安装、配置到实际的运行环境中正式上线开始服务于千千万万的用户——这就是部署与运行阶段。到了这一步软件才算真正实现了它的价值开始发挥作用、创造效益。这个阶段就像孩子终于长大成人走上社会开始独立生活、贡献力量。这是软件一生中最辉煌、最有价值的时期——它在为用户、为社会实实在在地服务着。第七阶段软件维护——“步入中年不断完善”软件上线了是不是就万事大吉、可以撒手不管了远远没有软件上线后还有一个非常漫长、非常重要的阶段——软件维护。软件在运行过程中会不断遇到新情况发现了之前没找出来的漏洞要修复用户提出了新的功能需求要增加运行环境变了比如操作系统升级了软件要去适应……所有这些上线之后对软件的修改和完善工作统称为维护。这里要强调一个常常令人吃惊的事实软件维护的成本往往占到整个软件生命周期总成本的一大半甚至更多维护的时间也常常比开发的时间长得多。这个阶段就像一个人步入中年之后仍要不断地学习新知识、适应新环境、完善自己。一个软件能不能长寿、能不能持续地服务好用户很大程度上就取决于它好不好维护。这也正是为什么我们前面反复强调可维护性如此重要——因为软件的大半生都在维护中度过。第八阶段退役淘汰——“寿终正寝回归尘土”天下没有不散的筵席软件也有它的终点。随着时间推移当一个软件变得太过陈旧、技术严重落后、维护成本高得不划算、或者已经有了更好的替代品时它就会被停止使用、正式淘汰。这就是软件的退役阶段。老软件退役了往往会有新的软件来接替它的工作于是一个新的软件生命周期又重新开始了……如此生生不息、循环往复。这个阶段就像一个人走完了精彩的一生寿终正寝、回归尘土。但他的精神和贡献会传承下去他未竟的事业会由后人接续。软件亦是如此。第三部分从生命周期到开发模型走完了软件从摇篮到坟墓的一生我们还要补充一点重要的认识。上面介绍的这些阶段只是软件生命周期最经典、最基本的划分方式。在实际的软件开发中人们会根据不同的项目特点把这些阶段以不同的方式组织、串联起来从而形成各种各样的**“软件开发模型”**。比如有的模型让各阶段像瀑布一样一个接一个、顺次往下走前一个阶段完成了才进入下一个这叫**“瀑布模型”**——它清晰、规范但不够灵活。有的模型先快速做一个简单的样品给用户看根据反馈再不断完善这叫**“原型模型”**。有的模型把软件分成一小块一小块做完一块上线一块、逐步累加这叫**“增量模型”**。还有现在非常流行的**“敏捷开发”**它主张小步快跑、快速迭代、拥抱变化把大的开发过程切分成一个个短小的循环……这些五花八门的开发模型本质上都是对软件生命周期各个阶段的不同排列组合。它们就像是走完软件一生的不同走法——有的稳扎稳打有的灵活机变各有各的适用场景。但万变不离其宗它们背后都是软件生命周期这条主线。结语理解一生,方能善待一生让我们回到开头那个比喻——软件也有它从摇篮到坟墓的一生。我们一路走来看着一个软件在可行性研究中被慎重地孕育在需求分析中明确了人生的方向在软件设计中绘就了成长的蓝图在编码中呱呱坠地、来到世间在测试中经历严格的体检在部署运行中长大成人、服务社会在维护中步入中年、不断完善最终在退役中寿终正寝、薪火相传。这就是软件完整而精彩的一生。理解软件生命周期给我们带来了至少三点深刻的启示第一软件开发远不止写代码那么简单。编码只是漫长一生中短短的一程。需求、设计、测试、维护每一个阶段都不可或缺甚至比编码更加重要。轻视任何一个环节都可能酿成大错。第二每一个阶段都要认认真真地走好。软件开发是一环扣一环的前一个阶段的质量直接决定了后一个阶段的成败。地基没打好楼必然盖不高。唯有步步为营、扎扎实实才能造出好的软件。第三要用全生命周期的眼光看待软件。一个好的软件不仅要生得好开发得好更要活得久维护得好。从一开始我们就要为它的整个一生着想——尤其是为它漫长的中年维护期着想把它的底子打牢、结构理顺。软件是有生命的。理解了它的一生我们才能真正心怀敬畏在它生命的每一个阶段都给予应有的重视和呵护从而陪伴它走过一段又一段精彩、长久而有价值的旅程。这正是软件生命周期这张人生地图,教给每一个软件人的最朴素也最深刻的道理。