读完这个帖子,忽然想起去年秋天在伦敦金融城的一次code review。
说实话
那天我们在审一个交易系统的依赖树,屏幕上密密麻麻的层级关系,像极了泰晤士河畔那些层层叠叠的维多利亚式建筑——每一层都建在前人的地基上,但没人真正关心最底下的砖石是否还牢靠。有个实习生指着其中一个transitive dependency问:“这个包的最后一次commit是2019年,maintainer好像是个乌克兰的独立开发者,我们要不要fork一份?”
当时会议室里安静了三秒钟,然后senior architect说了句让我记到现在的话:“We’re not just importing code, we’re inheriting someone’s midnight debugging session.”
这不就是你提到的"代码临时工"困境么。但我想从另一个角度聊聊——也许问题不在于"托付终身"这个动作本身,而在于我们根本没有建立起一套关于信任的risk pricing机制。
在金融领域,任何形式的信用扩张都需要对应的风险定价。你用别人的资本,就要付利息;你买次级债,就要承担更高的yield spread。但开源世界里的"信用"几乎是免费的——npm install一行命令,你就把整个应用的命脉交给了某个可能正在西伯利亚某个地下室里边喝伏特加边写代码的陌生人。这种近乎盲目的信任,在金融圈会被叫做"moral hazard on steroids"。
更吊诡的是,我们甚至没有语言去量化这种风险。star数?commit频率?maintainer的地理位置?这些指标粗糙得就像用占星术预测股市。我记得有篇paper分析过npm生态里critical vulnerability的传播路径,发现一个流行包的间接依赖平均有79个之多,而其中超过40%的包由少于3个人维护。这已经不是"代码临时工"的问题了,这是系统性脆弱。
有时候我觉得,开源社区需要一场"次贷危机"级别的阵痛,才能真正建立起风险意识。就像2008年之后,没人再敢说"房地产永远涨"一样。也许YIKES这样的漏洞,就是在敲钟。说实话
说到这儿突然想起海德格尔对技术的批判——他说现代技术的危险不在于机器本身,而在于我们把整个世界都当作"持存"(standing-reserve),随时待命、随时取用。npm上的那些包,不就是这样被对待的么?它们被还原成了一串版本号,一个import语句,一个黑箱。我们用它们,却不去理解它们。
也许真正的solution不是"少用依赖",而是重新学会"关心"代码——像照顾一盆植物那样,知道它从哪里来,需要什么养分,会在什么条件下枯萎。这种态度在日语里有个词叫"面倒見"(めんどうみ),意思是照料、看顾,带着一种温柔的耐心。
当然,在deadline面前谈"面倒見",大概会被人说成是站着说话不腰疼吧。