老文新读:
《迁移:技术债唯一可扩展的解药》
---
Migrations: the sole scalable fix to tech debt
作者:Will Larson(前 Uber 工程副总裁,Staff Engineer 作者)
我参与过的最有意思的迁移,是 Uber 从 Puppet 管理的服务迁移到完全自助的供给模型——公司里任何工程师都能两下点击起一个新服务。他们不仅做到了,而且做到了:迁移完成时,每天都有多个服务被创建,每个新入职的工程师第一天就能从零拉起一个服务。
这次迁移之所以有意思,在于它的体量。我们开始时,起一个新服务大约需要两周的日历时间和两天的工程时间,而且我们每一天都在落后更多。当时这是有点压力的,但它也是一个完美的实验室,让我学习如何运行大规模软件迁移:规模大得足以看清微小变化,时间长得足以让我们尝试各种方法。
随着代码库老化和业务增长,迁移既是必要的,又频繁得令人沮丧:大多数工具和流程只支持约一个数量级的增长就失效,所以快速增长让它们成为一种生活方式。这不是因为它们是坏流程或差工具——恰恰相反:某样东西在规模显著增大时失效,正说明它被设计得适合之前的约束,而不是过度设计。
因此你会经常换工具,而你迁移到新软件的能力,很容易成为你整体速度的决定性约束。鉴于它们的重要性,我们却很少谈论如何运行迁移——让我们来弥补这一点!
为什么迁移重要
迁移之所以重要,是因为它们通常是就技术债取得有意义进展的唯一可用途径。
工程师讨厌技术债。如果有一个他们个人能做的简单项目来减债,他们会自己接手。工程经理也讨厌技术债。如果有一个团队能独立执行的简单项目,他们会排期。总体上,这导致一个动态:几乎没有什么低垂的果实能减少技术债,剩下的大多数选项需要许多团队协同实现——那就是迁移。
每次迁移的目标是创造技术杠杆("你的索引不再需要放进单一台服务器!")或减少技术债("你确认的写入在主机故障切换后保证持久")。它们占据一个尴尬的地位:今天减少直接贡献,换取明天更多能力。这让它们难以排期,而且随着系统变大,它们变得更贵。
传说中 Google 人有一句话:"Running to stand still"(原地奔跑),用来形容一个团队的全部能力都消耗在升级依赖和模式上,以至于无法在他们负责的产品/系统上取得进展。把全部时间花在迁移上是极端的,但每个中型公司都有一长串无法配备人手的迁移队列:从 VM 到容器、推出熔断、换到新构建工具;这个清单可以轻松延伸到日落。
迁移是公司成长和代码增长时有效管理技术债的唯一机制。如果你不擅长软件和系统迁移,你就会困在技术债里。(而且以后仍然得做一次,只不过那可能是一次彻底重写。)
如何运行好迁移
好消息是:虽然迁移很难,但有一个相当标准、效果显著的剧本——去风险,赋能,然后完成。
第一阶段:去风险
迁移的第一阶段是消除它的风险,尽可能快、尽可能便宜地做。写一份设计文档,拿给你认为最难迁移的团队看。迭代。拿给有异型模式和边缘情况的团队看。迭代。拿给未来六到十二个月的路线图测试。迭代。
方案进化之后,下一步是嵌入到最有挑战的一两个团队,与这些团队并肩工作,一起构建、演进并迁移到新系统。不要从最简单的迁移开始——那会带来虚假的安全感。
有效的去风险至关重要,因为每个认可迁移的团队都相当于在你身上下注:赌你会把这件事干完,而不是留给他们一个迁到废弃系统的迁移、还得回滚。如果你留下一个半成的迁移,人们会极其怀疑是否参与下一个。
第二阶段:赋能
一旦你验证解决方案能解决预期问题,就该开始磨工具了。很多人一开始就为团队生成追踪工单,但更好的做法是放慢速度,构建工具来程序化地迁移"容易的百分九十"。这极大地降低迁移对整个组织的成本,从而提高他们的成功率,并创造更多未来的迁移机会。
在处理完尽可能多的程序化迁移后,想想你能提供哪些自助工具和文档,让人们在不卡住的情况下完成必要变更。最好的迁移工具是增量且可逆的:如果出了错,人们应该能立即回到之前的行为,并且有必要的表现力来消除他们特定迁移路径的风险。
文档和自助工具是产品,在同样的机制下蓬勃发展:坐下来和一些团队一起观察他们按照你的说明走,然后改进。找另一个团队,重复。在大迁移中特意多花两天让文档干净、工具直观,可以节省数年。做!
第三阶段:完成
迁移的最后一个阶段是废弃你已经替换的遗留系统。这需要达到百分之百的采用率,而这可能相当有挑战性。
从止血开始:确保所有新写的代码都使用新方法。这可以是在你的 linter 里装一个棘轮,或者更新你的文档和自助工具。这永远是第一步,因为它让时间成为你的朋友。你不再默认地落后,而是默认地在进步。
好,现在你应该开始生成追踪工单,以及一个把迁移状态推送给需要迁移的团队和总体管理结构的机制。给更广泛的管理层迁移上下文很重要,因为他们是需要为迁移排优先级的人;如果一个团队没有在做迁移,通常是因为他们的领导没有优先安排它。
这时你离完成很近了,但还有怪异的或无人手的长尾。你现在的工具是:自己收尾。这未必有趣,但达到百分之百需要领导迁移的团队自己钻进犄角旮旯。
我最后一个关于完成迁移的建议是关于认可。在迁移进行中庆祝很重要,但大部分的庆祝和认可应该留给它的成功完成。特别是,开始但未完成的迁移往往背上大量技术债,所以你的激励和认可结构要小心避免反向激励。
你见过什么让迁移更有效的做法?你经历过哪些反模式?
感谢 Ingrid、Jorge 和 Julia 塑造了这篇文章。
原文:
lethain.com