戴维 ·法利 (David Farley) 是持续交付的先驱、思想领袖, 也是持续交付、 DevOps、 测试驱动开发和软件开发领域的专家。
从现代计算的早期开始,戴维曾担任过程序员、软件工程师、系统架构师和成功团 队的领导者,他掌握了计算机和软件开发的基本原理,并形成了开创性的方法,改变了 开发人员和团队的工作方式。他挑战了传统的思维方式, 带领团队开发了世界级的软件。
戴维是获得 Jolt 大奖的《持续交付:发布可靠软件的系统方法》一书的作者之一, 是一位受欢迎的会议演讲者, 并在 YouTube 上运营着广受欢迎的“持续交付”频道, 主 题是软件工程。他建立了世界上速度最快的金融交易所之一,是行为驱动开发的先驱, 是《反应式宣言》 (The Reactive Manifesto) 的作者之一, 并凭借 LMAX Disruptor 获得了 杜克开源软件奖。
戴维热衷于通过咨询、 YouTube 频道和培训课程分享他的专业知识,帮助世界各地 的开发团队改进软件的设计,提高软件的质量和可靠性。
戴维 ·法利 (David Farley)新书:现代软件工程:如何高效构建软件
本书探讨了软件工程的真正含义,汇集了一些重要的软件开发基本原则,将它们紧 密结合成一个一致的模型,旨在帮助读者有效、快速地构建软件。全书共 4 个部分:第 1 部分探讨软件工程的真正含义, 以及如何将工程的原则和原理应用到软件开发中; 第 2 部分讲述运用科学思想优化软件开发过程的方法,包括迭代式、增量式工作,获得并利 用快速、高质量的反馈,采用实验性和经验主义的科学方法;第 3 部分介绍管理软件复 杂性的方法,深入探讨模块化、内聚力、关注点分离、信息隐藏和抽象、管理耦合等原 则;第 4 部分介绍支持软件工程的工具,以及一些贯穿本书的软件开发理念,包括可测 试性、可部署性、速度、控制变量、持续交付等。
本书适合对软件工程和软件开发团队管理感兴趣的人士阅读,也可作为软件工程相 关课程的参考教材。
这本书包含开发代码的混乱现实,或者应该说是软件工程的混乱现实:没有单一的 正确答案。没有什么东西是一成不变的。在某个时间点上正确的事情,有时甚至在很短 的时间之后,就会变得非常错误。
这本书的前半部分为我们提供了切实可行的解决方案,我们不仅可以在这样的混乱现实中存活下来,而且可以在其中得到发展。 后半部分讨论了可能被一些人认为抽象或者学术性的话题,并展示了如何应用它们来设计更好的代码(例如,更健壮、更可维护 或具有其他“更好的”特性的代码)。
在这里, 设计绝对不是指一页又一页地设计文档或 UML (统一建模语言) 图, 而是 简单得就像“在编写代码之前或编写过程中思考一下代码”一样。 (当我和戴维结对编程 时,我注意到一件事,他花在实际输入代码上的时间非常少。事实证明,在写之前先思 考一下我们要写的东西,可以帮我们节省很多时间和精力。)
戴维不会回避或者试图解释共同使用这些实践时出现的任何矛盾, 或可能由单个实践引 起的潜在混乱。相反, 因为他花时间讨论了权衡和常见的混淆领域, 我发现自己第一次明白, 正是这些平衡和冲突创造了“更好的”系统。 这关乎于理解, 这些平衡和冲突都可以作为参 考,了解它们的成本和收益,把它们当作“镜头”,时不时“调调焦”,来反复检视代码/ 设计/架构,而绝不是简单地以二元的、非黑即白的、或对或错的逻辑来理解它们。
——特丽莎 ·吉(Trisha Gee),开发技术推广工程师和 Java 拥护者
现代软件工程:如何高效构建软件 前言(摘选)
本书将工程重新引入软件工程。在书中,我将描述软件开发的一种实用方法,它使 用自觉的理性、严谨的思考方式来解决问题。 这些理念是过去几十年我们把从软件开发 中习得的心法持续应用的结果。
在本书中,我定义了一个模型,用来说明我们是如何组织自己来创建优秀的软件, 以及如何高效地做到的,而无论规模大小,不管是真正复杂的系统还是简单的系统。
总有一些人做了出色的工作。我们受益于创新先驱,他们向我们展示了什么是可能 的。然而,近年来,我们的行业已经学会了如何更好地解释什么是真正有效的。我们现 在更好地理解了哪些想法更通用,可以被更广泛地应用,我们有数据支持这一认知。
我们可以更可靠、更好、更快地构建软件,我们有数据证明这一点。我们可以解决 世界级难题,我们也有许多项目和公司的成功经验来说明这一点。
这种方法汇集了一系列重要的基本思想, 而且建立在之前工作的基础上。在某种程度上,就新的实践而言,其中并没有什么新东西,但是我所描述的方法会将重要的思想 和实践结合成一个连贯的整体,并为我们建立软件工程行为准则提供依据。
这并不是将完全不同的思想随机结合在一起,而是将这些思想紧密地交织在一起, 使之相辅相成。当将它们结合在一起,并一致地应用到我们的思考、组织、工作开展中 时,它们对工作的效率和质量有着重大的影响。尽管每一个孤立的思想可能都是我们熟 悉的,但是将之结合是一种从根本上完全不同的思考,思考我们究竟在做什么。当这些 思想结合在一起,并被用作软件决策的指导原则时,它们代表了一种新的开发范式。
作为软件工程师,我们理所当然地期待一个针对软件的工程学科,能够帮助我们以 更高的质量和更高的效率解决我们面临的问题。
这样的工程学科还会帮助我们解决那些我们尚未想到的问题。这样一个学科的概念 必定是通用的、持久的和普遍的。
本书试图定义一个紧密相关的思想集合。我的目标是将它们组合成一个连贯的东西, 我们可以将其视为一个方法,一个可以影响我们(软件开发人员和软件开发团队)所做 出的几乎所有决策的方法。
软件工程作为一个概念, 如果要说它有什么意义的话, 那一定是为我们提供了优势, 而不仅仅是采用新工具的机会。
并非所有的思想都有同等价值。有好的思想,也有坏的思想,那么我们该如何区分 它们呢?什么样的原则能够帮助我们评估软件和软件开发中出现的新思想的价值,并判 定它是好还是坏呢?
任何思想如果可以被合理地归类为解决软件问题的工程方法,那么它都是普遍适用 的,而且是基础性的。本书就是关于这些思想的。你应该用什么标准来选择你的工具? 你应该如何组织你的工作?你应该如何组织你构建的系统和你编写的代码,来增加你成 功创建它们的机会?
本书有什么?
第 1 部分“什么是软件工程?”,首先看看工程在软件环境中究竟意味着什么。这是 关于工程的原则和原理,以及我们如何将这些原则和原理应用到软件中。这是软件开发 的技术原理。
第 2 部分“优化学习”,着眼于我们如何组织工作, 让我们在小步骤中也能取得进展。 我们如何评估我们是取得了良好的进展,还是仅仅在今天创造了明天的遗留系统?
第 3 部分“优化管理复杂性”,探讨管理复杂性所需要的原则和技术。本部分更深入地探讨每一条原则,以及它们对于构建高质量软件的意义和适用性,而无论软件性 质如何。
第 4 部分“支持软件工程的工具”,描述一些思想和工作方法, 这些思想和工作方法 可最大限度地增加我们的学习机会,增强我们在小步骤中取得进展的能力,以及在系统 增长时管理系统复杂性的能力。
本书以加灰底的形式在全书中贯穿了关于软件工程的历史和原理以及思想发展的内 容。这些插入的内容为本书中的许多观点提供了有益的背景。