选择无聊的技术(2015)

查看原文 HN 讨论

文章摘要

Dan McKinley 写于 2015 年 3 月的这篇文章,十一年后再次登上 HN 首页并拿到 426 分。作者说这是他从 Etsy 时期的上司 Kellan 那里学到的技术决策哲学的提炼。

拥抱无聊。 文章最著名的概念是”创新代币”(innovation tokens):假设每家公司大约有三枚创新代币,你可以随便花,但在很长一段时间里供给是固定的;达到一定的稳定度和成熟度后也许能再拿到几枚,但人们普遍高估自己钱包里的存货。选择用 NodeJS 写网站,花掉一枚;选择 MongoDB,花掉一枚;选择存在不到一年的服务发现技术,花掉一枚;选择自己写数据库——那你麻烦大了。这些选择对一家 JavaScript 咨询公司或数据库公司都可能是合理的,但你大概率不是。你多半在一家至少号称要重新思考全球商业或重新发明网络支付的公司,在那个语境下,把有限的注意力花在创新 ssh 上是失败的绝佳途径,最好的情况下也只是推迟成功。

什么算无聊? 作者强调”无聊”不等于”糟糕”——世上确实存在既无聊又糟糕的技术(他打趣说我们通常随口称之为”企业软件”,虽然这个用词可能不够精确),那些不要用。但也有大量既无聊又好用、或至少够用的选择:MySQL、Postgres、PHP、Python、Memcached、Squid、cron 都是无聊的。无聊的好处在于这些东西的能力被充分理解,但更重要的是它们的失效模式被充分理解。他借用拉姆斯菲尔德那句关于”已知的未知”和”未知的未知”的名言(同时加了一句”说清楚,去他的这家伙”):已知的未知是”我们不知道这个数据库跑到 100% CPU 会怎样”,未知的未知则是”我们压根没想到写统计数据会导致 GC 停顿”。两个集合通常都非空,即便对存在了几十年的技术也是如此,但对于闪亮的新技术,未知的未知的量级要大得多。

全局优化。 技术选择不是孤立发生的,它的作用域触及你的整个团队、组织,以及由你所有选择的总和涌现出来的系统。给公司增加技术是有成本的。作为抽象陈述这很显然:如果我们已经在用 Ruby,再加 Python 就不合理,因为由此产生的复杂度会超过 Python 的边际效用。但不知为何,当话题变成 Python 和 Scala、或 MySQL 和 Redis 时,人们就失去理智、抛弃一切约束,开始高谈”用最适合这份工作的工具”。作者的反驳很直接:“最适合工作的工具”这种思维对”最好”和”工作”两个词的理解都太短视了。你的工作是让公司活下去,见鬼。而”最好”的工具,是对尽可能多的问题占据”最不糟糕”位置的那一个。 他把这些额外负担称为”运维”,以及次一级的”认知开销”——你得监控它,得琢磨单元测试怎么写,得懂点皮毛才能改它,得写 init 脚本,这些加起来非常快。文章给出的判断是:长期保持系统可靠运行的成本,基本总是远远超过你在构建过程中遇到的任何不便;成熟且高产的开发者明白这一点。

有时也要选新技术。 把这个推理推到荒谬的极致就是只用 Java 且不用别的任何东西来实现网站,那当然很疯狂。所以你需要一套往工具箱里加东西的机制。第一步是承认这是一个过程和一场对话——新技术最终会产生全公司范围的影响,所以引入技术是需要全公司可见度的决策。他推荐的最有价值的练习是:先考虑如何在不引入任何新东西的前提下解决当下的问题。 这个提问首先能检测出”问题其实是某人特别想用某个技术”的情况——如果是这样,应当立即中止。实践中这个问题的答案几乎从来不是”我们做不到”,而通常落在”我们能做,但会太难”这个光谱的某处。如果你觉得用现有的东西达不成目标,你多半只是想得不够有创意。接着要把”当前技术栈中究竟是什么让解决这个问题贵得离谱”写下来。如果新技术与现有技术重叠或替代,就要对迁移设定清晰预期,政策通常应该是”我们承诺迁移”并附一个时间表,目的是把残骸控制在可管理的水平,避免局部最优解泛滥。作者认为这套流程并不吓人也不麻烦——几个当作作业填的问题,加上一次讨论会而已。

只管发货。 多语言编程(polyglot programming)的推销话术是:让开发者完全自由地选择自己的工具会让他们更有效地解决问题。作者认为这往好了说是对问题的天真定义,往坏了说是动机性推理——它制造的日常运维苦役的重量会把你压死。审慎的技术选择才给工程师头脑真正的自由:思考更大问题的自由。为技术而技术是蛇油。

文末的脚注里有 Etsy 的真实案例。Etsy 早年在这方面吃过大亏:招了一堆 Python 程序员,然后决定得给他们找点 Python 的活干,唯一想到的就是造一个毫无意义的中间层,后来花了好几年才切掉;与此同时搜索的 90 分位延迟大约是两分钟。Etsy 没有失败,但有好几年什么都没发出去。另一个正面案例是 Etsy 的动态信息流(activity feeds):当时团队正在努力把大部分 Etsy 收拢到 PHP、MySQL、Memcached 和 Gearman 上,用这套栈实现这个功能比用 Redis 之类复杂得多,但确实可行。结果是——他们的注意力转向别处好几年,在这期间动态信息流规模涨了 20 倍而没人盯着它,他们没有为动态信息流做过任何针对性改动,一切都平稳运行,因为用的是共享平台。作者说这就是技术选择上的克制所带来的长期收益的缩影。(他也声明这不是绝对主义立场:把动态信息流放 memcached 被判定为可行,但用原生 PHP 实现带分面的全文搜索就不可行,所以 Etsy 用了 Solr。)

HN 评论精华

(原文抓取成功。)