建立快速响应软件开发的四个关键 - Andy Hunt


这是成功的现代软件开发策略的四个基本部分。

  1. 无可挑剔,可靠,自动化的构建和部署系统
  2. 有效,低摩擦的协作
  3. 不断学习和提高技能
  4. 可更换的一次性软件的设计

无可挑剔,可靠,自动化的构建和部署系统
您,您的团队以及您的组织必须依赖并依赖于连续,自动化的构建和部署。
无论您如何熟练地与用户合作,创造出令人敬畏的新界面,提出出色的创意,优雅的设计和架构等等 - 如果您无法可靠地构建和部署您正在编写的软件,那么您可能也是如此根本不打算写它。
通过推广“DevOps”和更好的工具,大多数团队都会声称他们手头有这样的问题:版本控制,构建,测试和部署。但你真的能够连续构建吗?看看这些相关实践的评估部分:

细节很重要,这就是我们开始尝试为这些基本活动提出具体评估的原因。您可能认为您的团队已准备好进行持续开发,但也许您正在做的一些实践阻碍了您。例如,如果你有长期运行的功能分支,必须在将来某个时候重新集成到Master,那么恭喜你!您刚刚重新发明了“瀑布”。您可能希望在生产中使用功能开关。

有效,低摩擦的协作
在这种情况下,“我们”是参与项目的每个人:团队,高管,用户。我们都必须找到一种合作的方式,这可能很难,因为我们所有人都有不同的议程,不同的要求,不同的技能组合,不同的价值观和不同的观点。
无论在技术,进度,人员配置等方面存在任何分歧的细节,首先要问的问题是“有什么意义?”。
换句话说,我们努力服务的最终企业愿景是什么?我们甚至知道吗?如果没有,我们如何在面对低水平,每天的问题时做出正确的决定?“有效协作”的一个方面是每个人 - 从高管到开发人员 - 需要知道什么是重点?。你不可能希望让组织指向同一个方向,直到每个人都知道这个方向是什么,以及为什么我们这样做。
合作的另一个重要方面是一个通常被称为“心理安全”的想法。这意味着你有一个人们可以安全地承担个人风险的环境:安全地表达想法和意见; 可以安全地尝试替代设计,不同的方法。如果团队成员害怕被嘲笑,或者失去地位甚至失去职位,那么您的环境就不安全,您将无法达到任何有意义的协作水平。
您的组织中是否有足够的心理安全水平?查看这些相关实践中的评估,并查看:


不断学习和技能提升
对不断变化的唯一防御是不断学习。
不断学习是任何技术领域生活的基本要求。但是,除了将API填入最新的JavaScript框架之外,还有更多的“学习”。
你必须“学会”几乎和你学到的一样。
这是让人们尝试学习新的开发方法,或学习新的编程语言范例(例如,从程序到面向对象到功能)的事情之一。你必须摆脱旧的习惯,旧的心理地图,解决旧问题的方法,因为现在所有这些都是不同的。
是的,它是不变的。没完没了。它也不仅限于新兴技术。改变来自各地:
  • 观众和市场
  • 正在建设的不断发展的系统
  • 用户不断增长的实现他们的需求和要求,他们学习他们
  • 技术细节(这个框架与那个)
  • 范例(SQL vs NoSQL,OO vs FP,MVC和变体)
  • 提高自己的技能和能力

任何现代“方法论”都应该包括团队和个人的学习实践。这不是你可以忽视或降低到企业一年一度的“羊圈”训练的东西。以下是您应该做的一些学习型实践:

设计可更换软件
你需要能够轻松地尝试一下。软件开发的一个谬论是,你可以提前以某种方式“解决问题”,缺乏背景,缺乏经验。它通常不起作用; 相反,获得答案的最有效方法是尝试:在当前环境中尝试实际,以获得真实的反馈。
没有实验会失败,除非它根本没有给出任何反馈 - 在这种情况下你不知道它是否有效。许多实验都会产生负面反馈:它没有按预期工作。在开发环境而不是生产环境中找到它是很好的,但这意味着必须进行更改。
关于如何使软件保持柔软并且能够随着时间的推移容易地改变,已经花费了大量精力,研究和墨水。但是,正如经验告诉我们的那样,将软件设计为“可维护”或“可扩展”的几乎所有时间都是浪费。

不要使软件“可维护”或“可扩展”; 让它可以替换

设计软件部件可以轻松更换,而不是浪费时间去预测永远不会发生的未来。
函数编程(FP)语言和方法可以帮助实现这一想法。
面向对象编程(OOP)在当时听起来像一个好主意,也许纯粹可能已经实现过,但是通常采用我们做了一件非常糟糕的事情。可变状态,在整个系统中暂时耦合和扩散,在一个纠结的意大利面碗泥 - 与面向对象的肉丸。尽管我们有最好的意图,但这些系统通常会变得脆弱。在许多面向对象的程序中,每个对象都像一个复仇的前配偶一样坐在那里,有着长久的记忆和对系统的隐藏怨恨,随时准备突袭并在你最不期望的时候肆虐。
将系统视为数据的一系列变换(如管道),而不是纠结的,错综复杂的OO设计。每个步骤 - 每个函数 - 都是无状态的,没有隐藏的时间弹或惊喜。
通过一系列转换,可以更轻松地测试和推断软件正在做什么,更重要的是,当出现问题时会出现什么情况。找出问题的位置并解决问题要容易得多。但它不只是关于测试,而是关于可替换性:它是关于一次性软件。
当一个组件 - 一个管道的一个步骤,一个功能 - 突然和意外的过时,它应该很容易撕掉并替换为其他东西。管道方法可以让您轻松完成。

安迪的设计定律:如果你不能轻易地撕掉每件作品,那么设计很糟糕。

Tracer Bullet Development,我们自实用程序员以来就提出过这个想法。使您的初始跟踪器成为管道:无状态,不可变。从那里发展到不可变的基础设施。现在,您可以轻松更换任何需要更换的东西,并且可靠,通过测试进行备份,无需时间炸弹或意外。
有关Tracer Bullet开发和相关实践的更多信息,请参阅: