A、从瀑布到敏捷——漫画解读软件开发模式变迁史:
网站:https://www. tapd .cn/forum/view/36971(以下图片来源)
这张图片从上向下,五个房间,分别是瀑布模型(waterfall),敏捷开发(agile),看板(KANBAN),SCRUM 和精益软件开发(lean)。
以下就来介绍两种模型:
一、 瀑布模型通过制定计划、需求分析、软件设计、程序编写、软件测试、运行维护等6个流程将整个软件生命周期衔接起来。这6个流程有着严格的先后次序之分,只有当前面的流程结束之后,下一个流程才能开始运转。这种自上而下的流程像极了瀑布的下落,因此得名瀑布模型。
我们可以发现,瀑布模型有很多优点:
- 有明确的交接点:不论是制定计划还是需求分析,甚至是软件测试,都有明确的起始点及开发流程——也就是在上一流程结束后再开始下一个流程;
- 责任明确:开发人员都各司其职,协作流程合理清晰;
- 发生问题能准确溯源:在开发过程中,如果发现有环节遗漏,负责人能够准确定位问题根源,并找出最优解决方案;
- 流程划分清晰:由于开发流程是环环相接,因此不会出现多个环节同时作业的情况;
- 及时反馈:在每个流程结束前都要对该流程完成的内容进行审核,以便及早发现软件开发过程中的错误,及时纠错。
但随着软件行业的快速发展,瀑布模型也逐渐暴露出许多缺点:
- 反馈结果单一:由于瀑布模型的反馈形式只针对于目前完成的阶段,无法对整个流程进行宏观反馈,因此各交接点处的反馈结果从整体来讲并不准确;
- 客户不参与开发过程:首先,客户在最初提出需求后,便不再被允许参与到开发流程之中,除非提出新的需求。其次,客户只能在开发过程的后期看到成果;
- 新需求的增加会打乱整个发布节奏:前文也说到瀑布模型有着严格的先后次序之分,只有前一个阶段完成后,才能进入下一阶段。因此在整个流程中,新需求的增加会导致当前任务停工,并返回需求分析、软件设计等阶段,且后面的流程都需要重新进行;
- 造成人力资源浪费:瀑布模型要求流程是环环相接的,因此软件开发还停留在前一阶段时,后面流程的人都处于无可事事的状态。又因为瀑布式开发中要求人员各司其职,因此当某一阶段缺人手时,只能延长时间,导致有些人工作量过于饱和,有些人又过于清闲;
- 周期长,不适合急需交付的项目:这一软件开发模式各阶段呈现按部就班的状态,因此不适合急需交付的项目;
- 标准化模式导 致流程僵化、死板:管理人员通过规定各阶段完成时间以及交接点来控制过程状态,这种标准化模式不加一点变通,最终导致流程的僵化、死板。
二、敏捷开发采用“迭代开发”,将软件项目需求分成多个迭代,且每个迭代成果在完成开发、测试、反馈等环节后都可以进行交付。也就是说,在将软件交付到客户手中之前,开发过程中的任何经过测试的子项目都能够独立运行。
敏捷开发成功地弥补了瀑布式开发的不足,有很大的优势:
- 强调“响应变化”:在做出开发计划后,计划并不是需要唯一遵循的指南。开发过程会因客户需求的改变而出现改变,这时就需要产品经理不断更新产品需求,开发团队中的成员主动配合,使迭代过程可以根据需求变化灵活调整;
- 使资源利用最大化:瀑布式开发要求每个人各司其职,但敏捷开发要求大家能够互相信任、互相帮助,合作开发。在某一位置出现空缺时,其他人可以暂时代工,这一现象有效地使资源利用效率最大化;
- 反馈及时:与瀑布式开发在整个生命周期后期才能得到反馈的状态相比,敏捷开发在每个迭代后都能交付可独立运行的成果。不论是团队对迭代成果进行测试,还是从客户那里,都能得到及时的反馈;
- 短周期:每一个迭代就是一个周期,因此交付成果的效率得到显著提高;
- 客户参与:在每个迭代结束后都能将迭代的成果交付到客户手中,客户可以及时跟踪到最新的产品状态,且参与到产品开发中去。
与此同时,也有一些相应的缺点表现了出来:
- 忽视文档的重要性:敏捷开发认为工作的软件高于详尽的文档,在注重成员之间沟通的同时,过于忽视文档的重要性,这会在团队中增添新人时产生一些不必要的、繁琐的沟通环节;
- 开发成本:由于敏捷开发是迭代式开发,在每个迭代中都有一个小型的、完整的开发流程,因此开发成本高;
- 需求分析失误:在需求分析阶段,一旦需求分析出现问题,会导致接下来的工作及开发流程都会出现方向上的偏差。
B、有人负责,才有质量,写给在集市中迷失的一代;
网站:图灵社区
简单引用一句:代码越重用,浪费越严重。
C、软件工程方法论对我们经软件开发有多大用处?谈谈你的看法。
软件工程方法论是指在软件开发的过程中必须遵循的普遍行为和规则。当我们开发软件的时候就需要用到软件工程方法论。软件工程方法论对我们开发一个软件有着至关重要的作用。采用软件工程方法论开发软件的时候,从对问题的抽象逻辑分析开始,一个阶段一个阶段的顺序进行开发。前一个阶段任务的完成是开始进行后一个阶段工作的前提和基础而后一阶段任务的完成通常是前一阶段提出的解法更进一步具体化,加进了更多的实现细节。教会我们有计划的一步一步设计软件,以及用什么方法设计最合理,减少资金和人员的浪费。但应用它产生的结果因人而议。