一、从瀑布到敏捷——漫画解读软件开发模式变迁史
1913 年,美利坚工业之神——亨利福特,发明了世界上第一条流水线,汽车工业从此进入了大规模生产的时代。丰田公司提出的丰田生产系统(Toyota Production System)又为汽车工业带来了很多先进的生产和管理理念。
先进的生产和管理理念是一个行业从小作坊走向规模化的必经之路,软件工业虽然诞生较晚,但是发展却非常迅速,这也同样得益于软件工业开发和管理理念的发展。这其中就从汽车工业吸收了很多成熟的理念。
下面,就让我们通过这张出自 Toggle 的漫画,来了解软件开发模式的变迁史。
从图中,可以大致分为五个阶段,对应五个房间分别是瀑布模型(waterfall),敏捷开发(agile),看板(KANBAN),SCRUM 和精益软件开发(lean)。
瀑布模型(waterfall):软件开发是按照一定的传统线性生产流程 (Traditional,linear production flow)展开的。大致分为:需求 → 设计 → 制造 → 测试,四个阶段。
而在这些阶段中,客户是无法直接参与的,只能通过从需求的接口人那里向系统输入需求(Client places order)。所以总会出现客户无法理解生产所需的费用以及交付不是一起进行的,导致一些笑话产生,例如“客户希望你造一辆汽车,却只愿意支付一辆自行车的开发成本。”
敏捷开发(agile):敏捷开发以客户的需求进化为核心,采用迭代、循序渐进的方法进行软件开发。敏捷开发的一个前提假设是:用户不可能在产品开发之前,设计之初就完整、明确的提出需求。期望用户在开发过程中不变更需求是不现实的。用户在开发前提出的需求,可能并不是它们最终希望得到的。
正因如此,它的模式决定了越来越多的客户参与了进来,整个开发过程不再是一堵不透风的墙,透明是关键(TRANSPARENCY IS KEY)。这带来另一个重要概念:迭代,就是不断对产品进行细微的、渐进式的改进(Small incremental changes)。
看板(KANBAN):KANBAN,不是汉语拼音,更不是英文缩写,它来自日语“看板”,カンバン的罗马拼写:Kanban;看板管理,常作“Kanban管理”,是丰田生产模式中的重要概念,指为了达到及时生产(JIT)方式控制现场生产流程的工具。及时生产方式中的拉式(Pull)生产系统可以使信息的流程缩短,并配合定量、固定装货容器等方式,而使生产过程中的物料流动顺畅。
精益软件开发(lean):精益生产的思想, 简单来说就是Just In Time(JIT),也就是说,只在必要的时候,按照需求的量,仅生产必要的产品,杜绝浪费。
精益软件开发不再像传统的软件开发一样,耗时几年才向客户交付完整的软件。取而代之的是,优先建立一个最简可用的原型产品投放市场或交付到客户手中。
所有不必的东西(ALL NON-ESSENTIALS ARE THROWN OUT)都不能应用到当前的最小可用产品。
以上的都是我根据一些资料结合自己理解的一些看法,也希望对各位有一些帮助。
二、有人负责,才有质量:写给在集市中迷失的一代
(http://www.ituring.com.cn/article/9363)
所谓质量,只有在某人对它负责时才有意义,而这个“某人”只能是一个人,不能是几个人——二重奏除外。
互联网时代的到来使很多的知识和技术,得到广泛的传播。人们所掌握的大多只是表层的东西,而没有形成深入的、系统化的知识理论体系。在制作一个东西的时候可以借鉴别人已有的东西,但是必须得根据自身的实际是否做出适当的修改、维护,然后才会成为一个有质量的东西。而Unix是在他们没有系统地胡乱堆砌出来的闹市,商品繁多,摆放杂乱,采购方式复杂,最终走向灭亡。究其原因是它没有人负责管理和把控,没有人管理规划所以摆放杂乱,没有人把控导致使用复杂,质量良莠不齐。Unix的消失也警告着我们在软件开发的过程中,要有人对它负责,要有统一的方案与指导,要对它进行规划与管理,进而开发出质量更好,操作更简单,用户体验更佳的软件。
三、软件工程方法论对我们经软件开发有多大用处
通常把在软件生命周期全过程中使用的一整套技术方法的集合称为方法学(methodology),也称为范型(paradigm) 。在软件工程领域中,这两个术语的含义基本相同。
软件工程方法学包含3个要素:方法、工具和过程。其中,方法是完成软件开发的各项任务的技术方法,回答“怎样做”的问题;工具是为运用方法而提供的自动的或半自动的软件工程支撑环境;过程是为了获得高质量的软件所需要完成的一系列任务的框架,它规定了完成各项任务的工作步骤。
目前使用得最广泛的软件工程方法学,分别是传统方法学和面向对象方法学。
在软件开发过程中,从我们遇到问题到最终得到解决方法中间必定会经历一个过程,那么软件工程方法论就是这个中间过程。它的意义在于,它以实际解决问题为导向,有一套完整的知识体系,当我们遇到具体问题时,能够从这套知识体系中产出具体的行动方法,指导我们解决出现的实际问题。