1. 敏捷方法和传统的计划驱动方法的两个主要区别
(1)预测性计划(Predictive Planning)和自适应计划(Adaptive Planning)
计划驱动方法首先计划要做的工作(plan your work),然后着手工作以完成计划(work your plan)。这是一种带有预测性质的方法,其衡量项目成功的标准则是我们是否按计划、按时、按预算完成了工作。这种方法在很多领域里是适用的。但是对于软 件开发而言,如果我们的需求没有办法做到不变更的话,我们就无法保证我们的计划以及其后的工作是不会变更的。Martin Fowler 向现场观众提出了一个问题,大意是你们当中有多少人的软件开发项目的需求是一成不变的,结果没有一位观众举手。因此,敏捷方法引入了自适应计划的概念,既 然我们无法保证需求不变更,那么就让我们随时准备接受变更,接受挑战吧。自适应计划将计划驱动的流程缩短为以数周为单位的循环周期,在每一个周期中,我们 根据当前的情况不断地调整计划以及计划的执行过程,同时不断地产生能够工作的代码,并且不断地将代码部署到应用环境中去。当然要实现这个目标我们需要一些 具体方法的支持,如:自测试代码(Self-Testing Code),持续集成(Continuous Integration),重构(Refactoring),和简洁设计(Simple Design)等等这些技术层面上的方法。Martin Fowler 指出,一些公司和项目之所以受困于敏捷方法,原因之一是他们忽略了这些技术层面的方法,而仅仅实施了项目管理层面的方法。
(2)以流程为本(Process First)和以人为本(People First)
在传统的方法论中,我们总是需要事先定义好工作的方法和流程,然后“工人们”被要求遵照这些 方法和流程来工作。在软件开发领域,很多人把软件开发过程等同于软件本身,也就是说,软件开发的过程也如同软件程序般象机器一样运行,组件之间环环相扣, 严密地协同工作。问题是软件开发的核心是人,人相对于机器零件和流水线而言,是相对不可预测的和不那么精密的。所以敏捷方法反其道而行之,提倡将“首先定 义流程,然后要求软件开发人员遵照流程工作”变为“让参与软件开发的人员自己来定义和选择适合他们的流程”。简单来说就是以人为本,不把人当螺丝钉,发挥 人的主观能动性,当然前提是需要团队成员有较高的平均素质。
2. 沟通(Communication)
Neal Ford 让我们回顾或想象一下失败的软件开发项目,它们的失败是由于技术因素还是人的因素呢?《人件》的作者认为都是人的因素。人类的社会性决定了沟通的重要。 Neal 举了几个有趣的例子,如:监狱里的犯人宁愿和其他人渣待在一起也不愿被关禁闭。很多国家禁止驾驶员驾驶时打移动电话,那为什么和乘客聊天就没有问题呢?原 因是直接对话是最为有效和便捷的沟通方式,信息的传递在对话过程中非常顺畅和完整。虽然现在的移动通讯已经非常先进,信号质量也很高,但是我们的通话过程 仍然是有损的,我们的大脑这个时候就需要努力地试图将通话信息拼凑得更完整以便能够理解对方的意思,因此才会分散驾驶的注意力。随后,Martin Fowler 举了另一个例子,拿他做水果蛋糕的方法和他在酒店的浴室中冲凉的方法来进行比较。因为做水果蛋糕的整个流程和配料都是非常固定的,所以他只需要按步照搬地 烹饪即可做出味道非常一致(地好或者差)的水果蛋糕。而在酒店中冲凉就有些不同,因为每一个酒店浴室的开关设计几乎都是不一样的,所以他需要不断地调整开 关来获得一个理想的水温,也就是需要不断地重复“调整开关”(输入),“用手
试温”(输出)这个过程。相对于做水果蛋糕,在酒店浴室冲凉更好地反应了软件 开发的特征,这就是在软件开发领域中,如果我们善于根据用户反馈的信息来做出新的判断和调整,就有可能提高产品的质量和用户的满意度。
沟通的确是一个非常重要的环节,它是敏捷方法的核心。在敏捷方法中,单元测试是程序员和代码 组件的沟通,功能测试是程序员以及QA和系统的沟通,故事墙(Story Wall)和回顾(Retrospective)是团队和成员之间的沟通,功能演示(Showcase 或者 Demo)是团队通过产品和最终用户的沟通,持续集成(Continuous Integration)是产品和企业计算环境的沟通。沟通好了,什么事情都可以妥善解决,沟通得不好,好事也会变坏事。和广大技术爱好者交流沟通也是酷 壳存在的目的和意义。