一个普通的技术债能有多老?我见过一份appsettings.json,47个配置键里藏着2019年的Jira工单号,而那家公司在2021年就换了项目管理系统。

写这些注释的工程师,有的升职,有的跳槽,有的可能连GitHub账号都注销了。但配置还在,像年轮一样一圈一圈长在那里,没人敢动。

树轮年代学教我的事

树轮年代学教我的事

巨杉的横截面像一张黑胶唱片。几百道同心圆,每一道都是一年的生命。树木年代学家指着一道细窄的深色环说:1580年,火山冬天。一道宽浅的环:雨水丰沛,光照充足。一道带疤的断裂:山火,活下来了。

上个月我对着那份配置文件,突然意识到自己在看同一种东西。

三层嵌套结构,47个键值对,注释里埋着废弃系统的工单号——每个条目都是一道年轮,标记着它诞生的年份和当时承受的压力。

树木年代学家不只是数年轮。他们读年轮。间距告诉你干旱程度,密度告诉你温度变化,化学成分告诉你土壤状况。一道横截面就是跨越数百年的气候档案,用纤维素写就。

配置文件也一样。只是没人教过我们怎么读。

技术考古现场

技术考古现场

我按时间顺序重排了那47个键。2019年的部分全是布尔开关,feature flag(功能开关)的蛮荒时代,每个新功能都要在配置里埋一个生死开关。2020年出现了连接字符串,数据库开始拆分。2021年突然冒出一堆加密密钥,应该是某次安全审计后的应急补丁。

最诡异的是2022年的区块。整整一年,只增加了一个键:EnableLegacyCompatibilityMode(启用遗留兼容模式)。注释写着"DO NOT REMOVE - See JIRA-8847"。

JIRA-8847。我查了,系统里不存在。

但那个键值设为true。整个2023年和2024年,没人敢碰它。就像巨杉树干里嵌着的一颗子弹——你知道它怎么来的,但你不知道取出来会不会把树弄死。

配置文件的密度变化比树木更剧烈。好年景是连续重构,坏年景是紧急热修复。2020年3月的提交记录显示,有人在24小时内加了11个临时配置,全部带Temp前缀。四年过去,9个Temp还在,前缀成了永久性命名。

为什么没人敢砍这些老树

为什么没人敢砍这些老树

我找到一位2021年离职的工程师,他在LinkedIn上回复了我的私信。「那个JIRA-8847?」他说,「应该是支付网关的TLS版本问题。当时为了兼容一个印尼的老商户系统,我们开了那个开关。」

那个印尼商户还在用吗?

「不知道。我走的时候还在。后来的人应该也没人敢查。」

这就是配置文件的恐怖之处。树木的年轮是只读的,但技术债是可写的——只是没人写。删除一个键的成本不是零,是未知。你需要知道:谁在依赖它?什么系统会崩溃?有没有监控会报警?

更麻烦的是,配置没有单元测试。你删了一行,编译通过,部署上线,三周后某个边缘Case在凌晨三点炸掉,值班的人对着PagerDuty(告警系统)一脸茫然。

所以配置只会膨胀。47个键变成74个,再变成120个。新工程师入职,导师说:别动那些老的,在下面加你的。

树木有真菌和昆虫帮忙分解枯木。配置文件没有清道夫。

怎么读你自己的年轮

怎么读你自己的年轮

我开始用树轮年代学的方法审计代码库。不是看功能,看压力痕迹。

提交频率骤增的月份,对应着季度末的deadline(截止日期)或融资节点。突然出现的硬编码IP地址,是某次云迁移的临时桥梁,后来忘了拆。命名风格的变化标记着团队换血——camelCase(驼峰命名)变成snake_case(蛇形命名),再变成公司的内部缩写体系。

最有趣的是注释的演变。2019年的注释解释"是什么",2021年开始解释"为什么不要动",2023年的注释几乎都在道歉。

「// 我知道这很烂,但支付团队说Q2再重构」

「// 临时方案,已评审通过,TODO: 移除」

TODO后面的日期是2022年5月。

如果你把配置文件按时间轴可视化,会得到一幅技术组织的心电图。峰值是危机,平谷是稳定,突然归零可能是大规模重构——也可能是团队解散。

我见过一份配置文件在2020年4月突然停止增长,整整八个月。后来得知,那家公司的核心工程师全部离职,新人花了大半年才敢碰基础设施。

年轮有宽有窄,但从不撒谎。

写给下一个读年轮的人

写给下一个读年轮的人

那位回复我LinkedIn私信的前工程师,最后说了一段话。我原样抄在这里:

「我们当时写那些注释,是真心觉得下一个人会去看JIRA。现在我知道,下一个人只会看到注释本身。JIRA会死,Slack频道会归档,但那个'See JIRA-8847'会永远留在那里,像墓碑上的铭文,没人知道埋的是谁。」

他停顿了很久,又发了一条:

「但你们至少还在读。我离开上一家公司的时候,他们的核心配置已经五年没人完整看过了。不是不想,是不敢。那棵树太老,老到没人知道哪些根还活着。」

我回去重新数了一遍那47个键。按最后修改时间排序,最年轻的是三个月前加的,最老的是2019年。中间隔着五年,五个不同的技术负责人,三种完全不同的架构理念。

它们共存于同一个JSON文件里,像一片被反复焚烧又重生的森林,每一代树木都挤在上一代留下的空隙里生长。

那个EnableLegacyCompatibilityMode还在。我查了最近的日志,上周还有调用记录。来源IP指向雅加达。

所以那个印尼商户还活着。或者他们的系统还活着,而人可能已经换了好几轮。技术债就是这样跨越代际的——不是通过文档,而是通过一个没人敢关的布尔值。

你最后一次完整读你们家的appsettings.json是什么时候?不是找某个键,是从头到尾,按时间顺序,像读一棵树那样读它。