翻译 :丁兴华html
欢迎访问网易云社区,了解更多网易技术产品运营经验。 git
有报道称Kelly Johnson在冷战期间的洛克希德公司工做时,创造了KISS('keep it simple, stupid')这个原则:建议系统应该设计的尽可能简单。github
虽然复杂度历来不是任何项目的明智设计目的,可是它在追求新特性和新组件时会天然产生。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
免费领取验证码、内容安全、短信发送、直播点播体验包及云服务器等套餐
更多网易技术、产品、运营经验分享请点击。
相关文章:
【推荐】 网易云容器服务微服务化实践—微服务测试及镜像化提测全流程实践