一天要问几次“这个函数到底谁在调”?我自己的答案大概是十几次。改一个方法之前先搜一遍调用方,改完之后再搜一遍,有时候一个名字搜出四五个同名不同库的,还得点进去一条条看。烦的不是搜,是每次都要重新从零建立一遍“这坨代码长什么样”。
前阵子看到一篇论文,arXiv 2610.30016,CSME——不对,ICSME 那届,收了。作者在 OpenCV 和一个五百万行的私有库上都跑了实验,把分层文档当监督信号去提升文本到代码的检索,两个仓库上表现一致。论文的诚实度还行,至少没只拿开源库刷一遍就完事。
其中最让我在意的其实不是检索准确率那部分,是它把“分层文档”绑到了调用图上:让模型顺着仓库的调用链一层层往上写,父级、兄弟级上下文一起塞进去。这跟我之前贴文档的毛病正好反过来——我以前给 CLAUDE.md 写的东西全是“这个模块负责什么”,写得跟产品介绍似的,一句能用的关系都没有。
后来我把写模块说明的模板砍成了三行,塞在 CLAUDE.md 里:
## modules/parser
- 上游:gateway.process() 调用 parse(),错误码原样往上抛
- 下游:只依赖 utils/tokenize,不碰 db
- 被谁调用:gateway(主路径)、batch_worker(重试路径)
就这三行。⚡我从一张功能清单改写成一串“沿着调用链往上写”的坐标之后,模型终于能自己判断改动会影响谁,不用我每次手动把调用方一起喂进去。
注意第二行那个“不碰 db”——这句是我写了两版才补上的。之前我写模板的时候总觉得“依赖什么”这句话可有可无,后来发现模型真的会因为旁边有个 db.py 就假设这里能直接查库,然后给我编一段不存在的调用。
三行看着少,但写起来的成本比想象中高,因为得真的去看一遍调用方。我一开始为这个纠结了半下午,坐在那儿想“就为了省三秒钟,研究了五个小时,值吗”。后来发现不值的是我纠结那半下午,模板本身十分钟写完一个模块。
这周用下来,坦白说体感是省了不少,但我没掐表,只能说以前每次改方法前都要来回搜三四遍,现在大多数时候模型会先问我一句“这个改动 gateway 那边要同步吗”。顺了。
顺带一提,我在论文里看到另一个细节,说是更丰富的文本监督形式——分层文档、父级兄弟上下文、还有模型自己生成的合成问题——在两个仓库上都带来一致的提升。合成问题那段我看了两遍没太看明白具体怎么生成的,作者好像还在赶下一版,等它更新了我再回来补。这块先别当定论。
老实说这招有边界:如果你那个仓库本来就没什么调用嵌套,三行模板写不写差别不大,别硬往上套。还有一点——我上个月试着把所有模块一次性全写了,写到第七个就发现自己其实根本不知道某个老模块到底被谁调,只能写句“不确定”,那还不如空着。
你要是有更省事的写法,或者干脆是脚本扫出来的,教教我。
