受新冠影响(我没感染),每天口罩捂得缺氧,停更了一大段时间….
最近,the boss 准备更新一套研发流程规范。
对此,本着笨鸟先飞的道理,我又重温了一遍比较常见的软件开发模式,并(冒着被打的风险)将个人见解展现给各位。
程序开发模式,是一种思想,并没有明确条框或实体模型;只有根据自身需求,结合最为舒适的开发模式,才能衍生出最终可视化的模型。这次会介绍 瀑布开发、 迭代开发 、 敏捷开发 、螺旋开发,共4种(衍生模型过于繁杂,不做介绍)。
瀑布式开发可以追溯到1970年,由 W.W.Royce 最初提出,是最典型的预见性的方法,从今看已显老旧。
瀑布式开发,要求严格遵循预先计划的需求、分析、设计、编码、测试的步骤顺序进行。其主要问题是极低的自由度。
举个例子,瀑布式开发就好比一企业接到某国字头甲方要求制作一款软件。甲方大大直接邮递来了一本上百页的需求文档,甚至每部分均经过了周密严谨的学术论证。企业根据该需求文案定义软件需求、设计各模块功能、逐个测试、后期维护……而这一整个流程的关键,在于甲方详细且稳定的需求。若需求发生变动,将会发生大规模设计回溯,代价高昂。
瀑布式开发,其实已经不太适用于当下的软件开发,而更偏向于工业或政府等环境下的工作。在需求不明,或者研发过程中存在需求突变的可能性,使用瀑布开发会大概率崩盘。
迭代式开发也被称作迭代增量式开发或迭代进化式开发,是一种与传统的瀑布式开发相反的软件开发过程,它弥补了传统开发方式中的一些弱点,具有更高的成功率和生产率。
迭代式开发,追求每次只设计和实现项目的一部分,并逐步完成。每次设计、实现、审核测试的线性阶段都可以叫做一个迭代,通过把项目开发分解成一堆短小的、周期性的小阶段,可称为一系列的迭代。
这里以一种非常生活化的方式来讲:我姐生了个孩子。我妈想给baby织一件毛衣。过段时间,领口织完了,结果孩子胖了,我妈就把领口改袖口了….最后毛衣做完,孩子一穿,挺合适(就是袖子有点松 XD )。
迭代式开发,可以在需求完整地确定之前开展研发工作,并在每次迭代中完成项目的一部分功能或逻辑,再根据客户后续的反馈,细化需求,开始新一轮迭代。这种开发模式,可以在早期得到用户的反馈,降低了设计风险,同时持续的测试和集成,也可提高项目代码块的复用性。
敏捷开发是一种从1990年代开始逐渐引起广泛关注的一些新型软件开发方法,是一种应对快速变化的需求的一种软件开发能力。它们的具体名称、理念、过程、术语都不尽相同,相对于“非敏捷”,更强调程序员团队与业务专家之间的紧密协作、面对面的沟通(认为比书面的文档更有效)、频繁交付新的软件版本、紧凑而自我组织型的团队、能够很好地适应需求变化的代码编写和团队组织方法,也更注重软件开发中人的作用。
听起来有一些绕,其实想一个硬件就能明白了——磁盘阵列卡。还是不懂?在来一个词,热插拔。我有一个带USB口的音响,那么我就可以根据我奶奶的需求,把广场舞、广播操、太极教学分别拷到不同的U盘里,即插即用。
敏捷开发中用到了迭代思想,但核心思想是灵活、快速响应。追求的理想环境,是一支善于沟通的全栈工程师小队,人员彼此高度信任、可以及时面对面沟通。然而,这种特点也限制了团队规模,随着规模扩大,面对面沟通就愈发困难,团队的快速响应也愈发乏力。总的来说,对于10人或更少的队伍,还是非常适用的。
螺旋式开发其实是一种演化种,在1988年由 Barry Boehm 发表,它兼顾了快速开发的迭代特征以及瀑布式开发的系统化与严格监控。而其最大特点,就是引入了风险分析,使软件在无法排除重大风险时有机会停止,以减小损失。
简单来说,就是执行了若干次附带风险分析的瀑布式开发的迭代。这在很大程度上是一种风险驱动的方法体系。如果说瀑布式开发是倾向项目经理的工作方式,那么螺旋式开发则更倾向于按照研发人员的方式工作(一句话,这样设计有Bug,不干!)。
螺旋式开发强调风险分析,但是让客户去接受并相信这种分析,并作出相关反应是不容易的,因此,这种开发方式更适用于内部大规模软件研发。而且,每个迭代环的风险分析也影响到了项目的利润,这对进行风险分析的员工要求很高(相当于每步都要收费的扫雷)。
传统的瀑布式开发,要求每一个开发阶段都要做到最好。特别是前期阶段,设计的越完美,提交后的成本损失就越少。
迭代式开发,不要求每一个阶段的任务做的都是最完美的,而是明明知道还有很多不足的地方,却偏偏不去完善它,而是把主要功能先搭建起来为目的,以最短的时间,最少的损失先完成一个“不完美的成果物”直至提交。然后再通过客户或用户的反馈信息,在这个“不完美的成果物”上逐步进行完善。
敏捷开发,相比迭代式开发两者都强调在较短的开发周期提交软件,但是,敏捷开发的周期可能更短,更加强调队伍中的高度协作,追求适应性而非预见性。
螺旋开发,很大程度上是一种风险驱动的方法体系,因为在每个阶段之前及经常发生的循环之前,都必须首先进行风险评估。