凌晨三点的北京地下室,显示器蓝光把墙面霉斑照得像幅抽象地图。我盯着那段Legacy Code,突然意识到这堆 spaghetti code 和五百年前文渊阁里的史官面对的困境没什么本质区别——都是在一堆残缺不全的log里试图重构系统崩溃前的真实状态。
弘治朝,1488到1505,明朝中期的系统维护期。朱佑樘这个皇帝就像个勤勉的SRE(站点可靠性工程师),接手了他爹宪宗留下的内存泄漏现场。史书上说他"恭俭有制,勤政爱民",翻译成现代术语就是:代码review严格,定期清理技术债,不轻易上feature。
但问题在于,这个系统的日志记录质量极差。《明孝宗实录》二百二十四卷,编纂于弘治十八年冬到正德四年夏,历时六年。想象一下,你的系统挂了,你得靠事后回忆和零散的syslog去重建崩溃现场,还要让CTO(也就是继位的武宗)满意。史官们面对的就是这种噩梦。
最近看Mallara在米兰档案馆找到伽利略手稿的新闻,深有同感。史学研究就是个不断打patch的过程。其实弘治朝的史料尤其如此——那个时代的"数据颗粒度"粗糙得令人发指。比如你想知道弘治十四年那场户部改革的具体参数,你会发现《实录》里的记载就像个写死的hard code:改了,但为什么改,阻力在哪,回滚机制是什么?一概欠奉。
我在地下室啃泡面时常想,要是能给弘治朝上个监控就好了。看那些文官在奏折里互撕,就像看两个程序员在code review时互相甩锅。刘健、李东阳、谢迁,这内阁三人组就是当时的core maintainer。他们留下的《文集》和《奏议》其实是side log,是主日志之外的冗余备份。真正有价值的往往是那些"非正式提交"——私人信札、地方志里的只言片语、甚至墓碑上的铭文。
去年在国图查资料,看到一份弘治年间的赋役黄册残页。纸张脆得像个过期的cookie,上面的墨字被虫蛀出一个个黑洞。那一刻我突然get到了debug的终极形态:你面对的是一个不可逆的legacy system,没有单元测试,没有文档,甚至连源代码都散佚了,只有编译后的二进制(也就是现存史书)和一些core dump(考古发现)。
但正是这种残缺给了历史研究以尊严。就像我在地下室里,从一行行error message里反推出整个架构的设计缺陷。弘治朝最迷人的不是那个"中兴"的表象,而是系统内部的张力。皇权与文官集团的API调用冲突,江南商帮与北方军户的数据流不兼容,卫所制度的栈溢出……这些都是藏在"弘治中兴"这个friendly name下的critical bugs。
史家常常陷入一个误区,以为历史是确定的commit history。实际上它更像是git rebase过的分支,被胜利者force push了无数次。我们能做的,就是像Ivan Mallara那样,在犄角旮旯里找那些没被gc(垃圾回收)的objects。一块墓志铭,半片账簿,甚至只是某本笔记里随手记下的天气——这些才是真实的system trace。
凌晨五点,我终于定位了那个memory leak。窗外的北京开始泛白,地下室依旧潮湿。但我知道,无论是五百年前紫禁城文华殿里的烛光,还是此刻屏幕前的蓝光,本质上都是人类试图在混沌中建立秩序的执念。History is not a narrative, it’s a heap of corrupted logs waiting for grep。其实
Talk is cheap, show me the code.