21 世纪初,戴维·法利去了一家大型汽车公司的 IT 部门工作,他们非常热衷于“软件工程”,而当时流行的就是瀑布式(waterfall)开发。戴维就是在这里第一次看到甘特图(Gantt chart),也是在这里,他第一次体验到了瀑布式开发。彼时戴维就发现,这个软件开发团队花费了大量的时间和精力在需求收集和设计阶段的工作上,而真正在编码上花费的时间却少得可怜,于是测试的时间又被占用了,导致完全没有时间做测试了。这似乎是在告诉我们,“软件工程”实际上阻碍了创建对客户有用的高质量应用程序。关于这个问题,持续交付先驱戴维·法利(David Farley)在他所著的《现代软件工程:如何高效构建软件》一书中,深入系统地探讨了软件工程的真正含义,并结合自己成功研发大型软件的经验,提出了诸多富有洞见的原则和建议。
先来看看戴维·法利会告诉我们一个如何不同的软件工程吧。在工业时代,泰勒的“科学管理”理论大大提高了生产效率,使得商品生产是可预测且质量可控的。在人类进入信息化时代,需要大量软件时,工业化的管理方式自然成为借鉴思想。于是,传统软件工程将开发软件的过程按生命周期分为分析、设计、编码、测试、部署等几个步骤,每一步完成之后就进入下一个步骤,形成一条瀑布式的流水线。这个过程看起来优美且符合逻辑,但存在一个难以克服的缺陷,就是要求每个步骤要正确完成所有的事。软件工程是对经验主义的、科学方法的应用,目的是为软件中的实际问题找到高效的、经济的解决方案。
戴维·法利推崇敏捷开发中的方法和原则,但其实都是对应用经验主义、科学方法,以及对高效的追求,并不是将软件工程等同于敏捷开发理论。
他认为要实施好软件工程,人的因素是最重要的,因此软件开发者要成为学习专家与管理复杂性的专家。对这两类专家,戴维·法利分别给出了5条原则,我们先来看如何成为学习专家。在戴维·法利看来,软件开发就是一个学习的过程,需要开发者理解业务、寻找工具、构建并测试,然后才能交付可用的产品。因此,实施软件工程有5条学习原则:迭代、反馈、增量主义、经验主义、实验。
相对于把一切事情计划好了再去做,迭代式的工作并不需要一个完备的计划。我们虽然有一个目标,但也承认自己有不知道的地方,也会犯错误。那我们可以从一个轮廓开始,每次迭代都完善一部分,在小步前进的过程中积累经验与信心,最终达成目标。要如何确定迭代的每一步都是正确的?反馈原则决定了前进的方向。在软件开发活动中,代码能否工作要通过自动化测试来反馈;功能实现是否正确要通过客户的使用来反馈。确保反馈都能得到及时有效的处理,软件开发也就走在了正确的道路上。持续交付中的迭代
在具体实践中,Scrum 活动是迭代式工作的典范,而测试驱动开发是反馈原则的极佳应用。增量主义是将大的系统模块化,然后将工作分解,逐步交付价值的过程。因为增量也是递进的过程,所以与迭代有相似之处,但二者还是存在差别。迭代是自顶向下,先整体再局部;增量是自底向上,先局部再整体。书中用一幅绘制蒙娜丽莎的趣图对比了迭代与增量的区别。迭代式与增量式的对比
经验主义就是科学方法中讲求实证的精神。在软件开发活动中,“拍脑门”做决策的现象并不少见,这往往会造成无谓的损失。例如,技术选型失败、估算工期过于乐观、过度设计等。实践经验主义,就意味着在做决策之前要立足于现实进行细致分析,通过实证建立假设,然后用实验进行验证,力求做出最合适的决策。实验活动具备4个特征,分别是:反馈、假设、度量、控制变量。实践上述5条原则,成为学习专家,就能可控地推进软件开发的过程,同时有力保障软件产品的质量。软件,从本质上说是由指令与数据构成的复杂的组合体。软件开发者要做的就是设计出高可用、可伸缩的系统架构,编写易于阅读与维护的代码,持续稳定地交付可用的软件产品。要做到这一切,软件开发者要具备管理复杂性的能力,戴维·法利为此也提出了5项原则:模块化、内聚力、关注点分离、抽象、松耦合。模块化原则,就是将系统按功能切分成各个独立的部分,模块之间通过传递消息或者 API 调用的方式形成整体系统。那如何合理地设计一个模块呢?实现内聚力是模块的目标,这包括:功能是否单一;可复用程度是不是高;模块对内部的变量与函数的作用域是否有控制。这使得模块易于维护,大大降低系统的复杂度。简单概括,关注点分离原则就是一次只做一件事,并且做到极致。这和 UNIX 系统的设计哲学一脉相承,它总是要求程序员思考当前最重要的事情,而不是陷在各种细节里。很明显,抽象原则可以很好地实现关注点分离,它将系统以不同抽象度分层,上层不必关心下层的细节,只需要专注于实现本层的功能逻辑即可。这样构建的系统层次分明,易理解、易调整。松耦合的原则,是要求软件系统内的模块彼此独立,修改一处不会影响其他部分。程序员要对紧耦合的代码时刻保持警惕,一旦发现就要及时做出调整。其实将模块化、内聚力、关注点分离与抽象这4条原则做好,自然就实现了松耦合。这也是戴维·法利在书中所强调的,这些原则之间并非孤立的存在,而是互相促进的。软件开发者应当通晓这些原则,将其应用在工作中,从而实现对复杂性的有效管理。约翰逊所采用的敏捷方法论,例如迭代与反馈、关注点分离与抽象,都可以在《现代软件工程:如何高效构建软件》一书中找到对应的原则。优秀的方法都是相通的,这就是戴维·法利将其总结出来的意义。
所以,戴维·法利在自己的软件工程方法论之前加上了“现代”二字,就是表明软件开发方法应当要有革新,才能适应新的变化。
我们不必去争论 Scrum、测试驱动开发、微服务这些理念的好与坏,而应该试着让自己成为学习专家与管理复杂性的专家,在实践中找到最合适的方法,实现高效构建软件的目标。 《现代软件工程:如何高效构建软件》
▲点击卡片回复「抽奖」参与
活动截止时间:2023年7月20日 10:00
还没有评论,来说两句吧...