新工作第一周,或者接手一个别人离职留下的项目,又或者你想给某个开源仓库提第一个 PR。克隆下来,打开,几千个文件、层层嵌套的目录、看不懂的命名,还有那种很具体的下沉感:我本该在这里产出点什么,可我连应用从哪启动都找不到。

这种感觉我经历过太多次,而且我以前总把它搞得比实际难得多。我会随机打开文件,从上到下读,好像只要盯得够久,理解就会自己累积起来。不会的。你只会淹死。

打开网易新闻 查看精彩图片

有个没人明说的事实:大多数人学代码库的方向是反的。有一条快得多的路,它不靠你更聪明,也不靠你读得更快,而是靠你按代码库真正运转的方式去学——用它、追它、改它,而不是像读小说那样读它。

这是一份生存指南。只要方法够刻意,一周时间足够。

先换脑子:别想着把它读完

这个转变是后面所有方法生效的前提,所以从这里开始。

你没法像读书一样读一个大型代码库,你也不需要。没有人能把整个代码库装进脑子里,写它的人也不行。他们手里有的是一张好地图:知道整体形状、知道东西都住在哪、知道关键路径怎么流动。那张地图才是目标。不是"我读完了每一个文件",而是"我知道这东西是怎么拼起来的,也知道该去哪找"。

一旦你不再试图吸收一切,转而开始画地图,那种压迫感会立刻下降。你不是在一条街一条街地背一座城市,你是在认识它的片区和主干道。

先让它跑起来,再读第一行代码

这是杠杆率最高的第一步,也是最多人跳过的一步,因为它感觉像在搭环境,不像在推进。它不是。它是最重要的一步。

克隆下来,在本地跑起来,真的去用这个应用。点按钮,登录,让它做点事。你没法理解一个你从没见它动过的代码。跑起来的应用给了你真实的行为,之后你可以把代码挂到这些行为上。等你终于去读登录逻辑时,它是有意义的,因为你亲眼看着自己登录过。

还有个隐藏福利:把它跑起来的过程,会教你配置、依赖、环境上的各种怪癖,以及摩擦点在哪。这是任何团队里一半的口口相传的知识,而你第一天就拿到了。

每个代码库都有一个执行开始的地方——主函数、服务启动入口、路由、应用入口文件。找到它。那是你之后牵动一切的那根线头。

一旦你知道东西从哪里开始,你就可以有意识地向外追踪,而不是随机游走进某个文件然后祈祷。入口点是你的锚。如果你不确定它在哪,package.json 里的脚本、Dockerfile 或者 README 通常会指向它,从那里开始。

把一条真实功能从头追到尾

这是你能做的最有效的一件事,所以给它最多的时间。

挑一件应用会做的事——一次登录、一次按钮点击、一个 API 调用——然后跟着它一路穿过代码。从界面,到处理它的路由,到真正干活的逻辑,到数据库,再回到响应。一个完整的纵向切片。

为什么这比别的都强:横着读五十个文件,你学到的是五十个互不相连的碎片。纵向追一条功能穿过代码库,你学到的是这个项目里各层到底怎么连——它们怎么路由、逻辑住在哪、怎么和数据说话、命名习惯是什么。追两三条功能,整个架构会自己悄悄浮现出来,因为你已经见过这个应用反复使用的那个模式。

具体怎么做:找到"登录"在界面上的起点,跟着请求走到它的处理函数,跟着处理函数进入鉴权逻辑,再跟着它走到检查数据库的地方,最后跟着结果一路返回。把每一跳记下来。这一次追踪,抵得上读一天代码。

在扎进任何实现之前,先拉远看架构。

文件夹是怎么组织的?顶层模块有哪些?用户看到的部分(界面)、应用做的事(逻辑)、数据住的地方,这三者的边界在哪?你在这里读的不是代码,是这个团队怎么想这个应用。结构就是他们心智模型的地图,一旦你拿到它,单个文件就不再显得随机,因为你知道它属于哪个片区。

花二十分钟只看目录树和命名,出声说出你认为每一部分是干什么的。你猜对的次数会比你预期的多,而猜错的那几处,恰恰是最值得去问的地方。

这里有个能让你极快找到方向的捷径:找到数据模型、数据库 schema、核心类型。

大多数代码,说到底只是在搬动少数几个核心实体——User、Order、Project,或者这个应用真正在意的那个东西。一旦你理解了这些核心实体是什么、彼此怎么关联,大量代码会突然变得可读,因为你能看出它在对什么做什么。数据结构是骨架,其他一切都挂在上面。找到骨架,身体就说得通了。

靠改动来学,而不是只靠读

读是被动的,改是主动的。而一周之内真正能建立起来的理解,来自主动。

修一个小 bug。加一行日志,看它在哪触发、打印出什么。做一个小而安全的改动,看什么坏了——然后再看还有什么跟着坏了,因为这会教给你任何单个文件都不会暴露的隐藏耦合。挑一个真正小的入门任务,把它交付出去。

当你改动系统并观察结果的那一刻,你会学到阅读永远教不了的东西:真实的行为、意外的连接、那种"哦——原来它连到那儿"的瞬间。

一周的时间,不是用来把代码库读完的。是用来画出一张足够用的地图,让你能开始干活,并且在干活的过程中继续把地图补全。