【译文】追求生产极简主义

猪小花1号2018-12-04 09:42

翻译 :丁兴华

欢迎访问网易云社区,了解更多网易技术产品运营经验。 


有报道称Kelly Johnson在冷战期间的洛克希德公司工作时,创造了KISS('keep it simple, stupid')这个原则:建议系统应该设计的尽量简单。

虽然复杂度从来不是任何项目的明智设计目的,但是它在追求新特性和新组件时会自然产生。KISS原则鼓励设计者通过制定简单的目标来主动抵抗这种诱惑,这样制造出来的产品才能保证更好的可维护性、健壮性和灵活性。比如在喷气式战斗机中,这或许意味着一架飞机可以在激战的战场上用少量工具即可维修。

在他任职期间,洛克希德的臭鼬工厂准备生产U2和SR-71飞机,他们优秀的工程学留下的遗产至今影响着我们。


著名的SR-71,臭鼬工厂的一款旗舰机型。虽然没有特别简易但速度极快。

科技中的极简主义

我们中有许多人因为求知欲立志在工程领域工作。技术本身很酷,新技术更甚。我们想使用被大家热议的东西。

我们的新闻,聚会,会议甚至对话都倾向于那些被积极开发和大力推广的闪耀的新技术,旧组件默默的运行后在消逝的幕后。

随着时间流逝,技术不断累加却很少移除。任其发展,产品不断堆积后变成一堆由杂乱补丁联结起来的庞大东西。这种影响相当危险:

  • 更多的组成部分意味着认知上的复杂。如果一套系统变得难于理解,那么开发者如果没有理解所有错综复杂的关系则在修改时很容易引起漏洞或者误操作。

  • 在产品中的任何操作都不是完美的。技术栈中的每个组件都可能失败, 而且在足够大的规模下,某些部分会一直出错。

  • 随之而来更多的工程师会趋向于万金油型,而不是精通某一方面。如果遇到一个极其恶性的问题,由于缺少深入了解的专家造成更难去分析诊断和修复了

即便了解这些,扩展工具的本能也很难被抑制。一般情况下,说服力是我们工作的核心能力之一,并且我也能用它来说服我们自己而且我们的同事也觉得把新技术引入现有技术栈至关重要。一个基于Go语言的高可用性键值对存储将会把我们现有的正常运行时间和故障恢复提高到一个新的高度。这个实时事件流会把一个不可变分类账变成整个平台的基石。这优秀的新容器运维系统会把开发和扩展的简易程度上升到新的高度。大多数情况下,退一步冷静客观的思考会揭示他们的用法后可能会先暂缓,直到他们被确保严格审查过之后,并且十分了解他们将要如何融入到现有体系结构中(以及将要被替换的部分)。

通过少费多用

R.巴克明斯特.富勒在他1938年出版的书《去往月球的九个步骤》中描述了“少费多用”这个想法。

在越来越少的东西上做越来越多的事情,直到你可以不依赖任何东西做完成一切

这个想法建议在输入相同的前提下通过持续提高系统效率来提升生产力。应用在科技上则意味着在人力和基础设施支持度不变的前提下建立可扩展支持更多更活跃用户的技术栈。可以通过构建更稳定、更自动化和更少故障的系统来达到这个目标,因为它们在复杂度上升的趋势中固有的部分已经被理解、利用甚至逆转转。

Heroku的很长一段时间里,我们有一个非常雄伟并充满抱负的少费多用目标。我们了解的正常应用平台都是指“用户空间”,而内部基础设施被称为“核心空间”。我们想打破核心的嵌套,把核心逐步迁移到可支持的用户空间,重构之后Heroku可以在Heroku里运行。少费多用的最终表现是:核心会减少体积直至完全消失。它包含的特殊组件也将会废弃,形成一个简单的完美统一的技术栈。

实践中

在Heroku的历史中有几个实践极简和少费多用的例子:

  • 用来追踪所有应用,用户,版本和配置等等的核心数据库。曾经是被托管在一台定制版的AWS实例上的snowflake。最终被简化为Heroku的Postgres数据库,而且只是成为与其它用户数据库一同被管理的另一个结点而已。

  • 整个产品中能被废弃的部分都废弃了。举个例子,ssl:ip插件(为应用提供SSL/TLS终端)之前由一台独立提供的服务器运行,被更好(也更便宜)的亚马逊SSL服务完全终结。随着SNI支持的广泛应用,ssl:endpoint终将接替。

  • 所有非暂时数据会被移除Redis,这样Postgres可以只用来为内部应用存储和操作长期数据。这使得技术栈拥有在Redis宕机的情况下也能正常在线的附加优势。

  • 在误用多语言开发产品之后,最后一个用Scala编写的组件也被废弃。用更少的程序语言种类意味着整个系统可以被被更多的工程师更容易的操作。

  • 处理Heroku组织的组件原本在它自己的微服务内运行。一段时间后我们微服务扩张的有点过大,所以为了简化操作,我们把一部分微服务移回核心部分。

为了认清移除或者替换旧技术的影响,我们创造了一个仪式,象征性的把废弃的组件喂给叫“燃烧派对”的火焰。原本消耗在这些项目上的时间与精力会在新产品上发挥得一样好,甚至更好。


 在Heroku,我们定期举办“燃烧派对”去体现废弃旧产品与技术的影响

思想上

在生产中实践极简主义大多数情况下是为了了解现有问题。达到这个目的后,缓解措施显而易见:

  • 废弃旧技术。有引入什么新东西吗?找机会废弃大致相当的老旧技术。如果你准备引入Kafka,可能你就要舍弃Rabbit或者NSQ。

  • 建立通用服务约定。在数据库、编程语言/运行环境、任务队列、网页服务,反向代理等等方面统一标准。如果不能统一,则尽量标准化。

  • 倾向于简洁性且减少可变动部分。尝试去保持系统内容尽量少以方便理解与操作。虽然在一些情况下可能有更合适的技术但由于与任务不太匹配导致妥协。

  • 不要在新技术刚发布的当天,甚至那年就使用它。通过它人的审查,找问题还有稳定它来节省你的时间与精力。如果它没有得到著名社区的长期支持,永远避免使用它。

  • 避免定制化技术。你编写的软件必须要你维护。当已经有良好支持且刚好适合(或者基本适合)你的公用解决方案时不要自己做。(原文succumb to NIH应为succumb to NHH)

  • 使用服务。你安装的软件需要你去操作,从它激活那一刻起。总有人要抽出固定时间去维护它们,解决问题,安装更新。当有一个好用的公用服务时不要自己再做一份。

不是说新技术永远不该被引入,而是说应该理智防御性的去做这件事,用批判的眼光去思考它是否适合与时俱进(希望是更加先进)的架构。

无可增减

一个法国诗人同时也是飞行员先锋安托万·德·圣埃克苏佩里说过:

当它无可增减的时候,似乎就达成了完美。

无可增减

我们中的大多数人都能从更简单,更保守,更直接的体系结构中受益,只有通过构建一个稳定而近乎可完美操作的极简技术栈,我们才能尽情推动新产品与想法。

 

原文:https://brandur.org/minimalism


免费领取验证码、内容安全、短信发送、直播点播体验包及云服务器等套餐

更多网易技术、产品、运营经验分享请点击