温故知新-软件生存周期和过程模型
在《温故知新-什么是软件工程》中,我发起了一个投票:word、excel基于软件功能的划分来看属于什么软件?从结果来看,77%的朋友选择了【应用软件-个人计算机软件】。这个选项在大学考试时选它一定没错。
但是剩下选【支撑软件】的朋友并不意味着选择了一个错误的答案。软件=程序+文档+数据。支撑软件是协助软件开发的工具性软件。开发文档用word、excel有什么不行吗?
软件生存周期
软件生存周期也叫软件生命周期。是软件的产生直到报废或停止使用的生命周期。在国标,也就是国内标准中,被分成了下面8个阶段。
这些阶段咱们大家在平时工作中都在用,不再赘述,重点说一下可行性研究与计划。不具备可行性不代表不能做,有可能是成本不可接受。
之前贾跃亭贾总为了制造智能汽车,几乎赔上了整个乐视。其实那段时间想做智能汽车的不只是贾总,很多人都想做。但是其他人在可行性研究与计划阶段,估算出其成本远高于收益,所以在可行性研究与计划阶段就放弃了。我个人因为之前也在乐视工作其实蒙受了不小的经济损失,乐视现在还欠我十几万的专利费,当时还是我们总监出面帮我要回来一部分。其实我对贾总追求梦想的精神上还是很钦佩的。但是在可行性研究与计划阶段,我不赞同其为了自己的梦想放弃公司整体利益的行为。
常用的软件过程模型
软件过程模型是将软件生存周期的各个阶段组合的过程。就好像是各个阶段是不同的菜,软件过程模型是套餐,是一种组合方式。
瀑布模型
瀑布模型是将软件生存周期的各项活动规定为按固定顺序而连接的若干阶段工作,形如瀑布流水,最终得到软件产品。在瀑布模型之前,没有模型的指导,开发是比较混乱的。
但是瀑布模型具有顺序性和依赖性,必须等前一个阶段完成才能进行下一个阶段,前一个阶段的输出是下一个阶段的输入。所以,人们就提出推迟实现的思想,就是把程序物理实现推迟到最后,保证前期工作的扎实。相信,这也是实际工作中,很多团队都反复强调的一点。
快速原型模型
快速原型模型是说要快速建立反映用户主要需求的原型系统,反复由用户评价修正,开发出最终产品。快速原型模型在确定需求上优于瀑布模型。
这种模型非常适用于非自主研发的、或者初创期的产品。比如一个初创公司要去拉投资,除了一堆设计理念的文档,很多潜在的投资人都愿意看到产品的初始模型,再决定是否进行投资。
但是这种开发方式也有明显的缺点:初期可能由于时间问题,代码和设计底层都很粗糙,后期稳定性和架构优化会有很大的阻力。
增量模型
增量模型又叫渐增模型,将软件产品作为一系列的增量构件进行设计、编码、集成和测试。区别于瀑布模型和快速原型模型,增量模型是分批的而不是一次性将全部产品交付给用户。
现在很多互联网产品都是采用这种形式,开始时只提供基础的功能,后期又不断丰富。比如微信,刚开始只是一个IM即时通信工具。后来又开放了朋友圈、红包、搜一搜等功能。
增量模型可以在较短的时间提供给用户一个功能性产品,还给了用户充裕的时间学习适应产品。但是增量模型对扩展性有很高的要求。
螺旋模型
螺旋模型基本的做法是在“瀑布模型”的每一个开发阶段之前,引入非常严格的风险识别、风险分析和风险控制。直到采取了消除风险的措施之后,才开始计划下一阶段的开发工作。否则,项目就很可能被取消。
螺旋模型沿着螺线进行若干次迭代,图中的四个象限代表了以下活动:
(1) 制定计划:确定软件目标,选定实施方案,弄清项目开发的限制条件;
(2) 风险分析:分析评估所选方案,考虑如何识别和消除风险;
(3) 实施工程:实施软件开发和验证;
(4) 客户评估:评价开发工作,提出修正建议,制定下一步计划。
螺旋模型由风险驱动,强调可选方案和约束条件从而支持软件的重用,有助于将软件质量作为特殊目标融入产品开发之中。但是,螺旋模型也有一定的限制条件,具体如下:
(1) 螺旋模型强调风险分析,但要求许多客户接受和相信这种分析,并做出相关反应是不容易的,因此,这种模型往往适应于内部的大规模软件开发。
(2) 如果执行风险分析将大大影响项目的利润,那么进行风险分析毫无意义,因此,螺旋模型只适合于大规模软件项目。
(3) 软件开发人员应该擅长寻找可能的风险,准确地分析风险,否则将会带来更大的风险
使用螺旋模型的代表是联想文化,联想文化的螺旋发展模型脱胎于竞争性文化价值模型。在联想文化整理的过程中,对竞争性文化价值模型进行了改进和完善,逐渐形成了适合联想文化的企业文化螺旋发展模型。
在我15年从业经验中,对软件产品的开发采用螺旋模型的,我并没有见过。
敏捷过程模型
敏捷过程模型是指基于迭代开发的软件开发方法。敏捷方法将任务分解为较小的迭代, 或者部分不直接涉及长期计划。在开发过程的开始就确定了项目范围和要求。事先明确定义了有关迭代次数, 每次迭代的持续时间和范围的计划。
每次迭代都被视为敏捷流程模型中的短时间”框架”, 通常持续一到四个星期。将整个项目分成较小的部分有助于最大程度地降低项目风险, 并减少总体项目交付时间要求。每次迭代都涉及一个团队, 在整个软件开发生命周期中进行工作, 包括计划, 需求分析, 设计, 编码和测试, 然后再向客户展示有效产品。
敏捷开发应该在咱们平时工作中常用,一般项目制的产品经常采用这种过程模型。