公众号首发:https://mp.weixin.qq.com/s/qzsn-hKkEdTX8pDqDVuI_g
目录
目录
说明
一:摆正认识
二:找到入口
三:梳理目录
四:逐行阅读
Go项目的一些阅读技巧
技巧1:忽视真正入口之前的代码
技巧2:接口的实现一般就在接口定义的下方
技巧3:见到了类似于「类」的结构,要感动地想哭
技巧4:发现套路(代码框架)
说明之前在阅读代码方面存在认知误区,一开始就从入口开始阅读,并不停地跳转,试图理清每一个细节。这种方式会让阅读代码的过程比较煎熬,耗费时间长效果却不好,不是正确的做法。正确的做法是先看森林再观树木,即先对整个项目的代码结构有基本认知,摸清项目代码的实现套路,然后按需逐行阅读。
一:摆正认识摆正认识,对阅读代码这件事有正确的认识很重要,核心思想指导行动,方法构建在核心思想之上,如果核心思想不正确,方法就不可靠。核心思想用比较现代的语言表述就是:元认知。
我们要阅读的代码不是一堆杂乱文件和字符,而是经过深思熟虑、精心安排好的,是有内在规律的,越是庞大成熟、被广泛使用的项目越是如此,这一认识是后续方法的基本盘:
要相信有几十年发展历史的软件工程是有料的,我们现在能看到重要项目不会是杂乱无序的;
要相信前辈大牛们创造的各种编程技术是在降低编码阅读难度的;
要相信重要开源项目的核心开发人员的水平是很高的,他们在方法论方面的认识和水准超过绝大多数人;
要相信技术水平高的人是喜欢制定并遵循套路的,这些套路会让工作更简单,阅读开发代码的过程更轻松。
在初次阅读代码的时候,首要目标就是找到「套路」,并时刻保持清醒,避免过早陷入细节而忘记了首要目标。
二:找到入口万事开头难,刚刚开始接触一个全新的陌生项目时,是最难受的,因为一无所知。这时候如果自己能够把代码编译成可执行的文件,并知道了程序的入口位置,内心的焦躁就会大幅减少,因为剩下的就是时间问题了。
除非是构建过程特别复杂的项目,否则一定要自己编译一遍,并阅读 makefile 或者编译脚本,大概了解作者维护这套代码的方式。大部分开源项目都会在 README.md、Install 等文档中详细介绍编译、部署的方法,通常是2~3个命令,无脑执行即可,但有时候会遇到比较烦恼的挫折。
第一个常见挫折是因为国内特殊的网络环境,一些需要从网上获取的资源被卡住,导致构建不通过,这个挫折除了找一个全局代理的「维劈N」似乎没有其它的破解方法了。
第二个常见挫折是有些项目的构建过程本身就很复杂,并且大量运用 makefile 和 shell 的特性,为寻找程序入口增加了重重障碍。这个挫折除了硬着头皮去看或者直接找人问,似乎也没有其它破解方法了。
另外现在比较流行用 docker 做环境编译,这种方式使构建环境统一带来不少益处,但对于要掌握构建过程的人来说,在 makefile 和 shell 之外又需要掌握一套工具,对于完全不了解 docker,特别是对一些经验尚浅的在校生来说,是个不小的障碍。
有些项目还用到了其它比较小众的构建工具…没有什么好办法,多看多学,见多了就熟了!
三:梳理目录找到程序入口之后,不用着急从入口阅读代码,先把所有的目录看一下,大概了解目录的层次结构和用途,这样会事半功倍。如果没有搞清楚目录结构,就从入口开始阅读代码,每次跳转都进入一个完全陌生的目录或文件中,连续跳转几次就完全陷入到具体目录中,找不回主线了。
在梳理目录的时候,如果目录下有说明文件一定要仔细阅读,然后快速扫视目录中每个文件的内容。文件开头的注释要认真看,文件中比较复杂的结构体、类、函数或方法列表等要关注,通过快速扫视对每个目录的用途有一个大概的判断。
这个阶段酌情了解一下函数或者方法的实现即可,一般情况下只要看一下函数或方法的名字,就能大概猜到这个目录中代码的用途。
即使完全判断不出某个目录的用途也不要紧,提前扫视一遍至少眼熟,在后面逐行阅读代码时,没准就串联起来并瞬间想通了。随着了解的目录越来越多,对整个项目的代码结构的认识越来越清晰,最终完成了从0到1的认知构建。
认知构建的过程是比较不愉快的,因为要在完全陌生的内容里折腾,贵在坚持,「眼熟」了,就顺畅了,最后如鱼得水、酣畅淋漓。有一个技巧可以应用,扫视的时候在心里不停地问,这段代码是在干嘛?逼迫自己从更高的维度去看和想,而不是只见树木不见森林的陷入到细节中。
四:逐行阅读对项目的目录结构有了基本认知之后,接下来就是最后一步:从程序入口开始逐行阅读。