从源码中学习
译文地址:从源码中学习
关于阅读代码技巧的摘要
结合上下文阅读代码
当你阅读代码时,请持续提出问题。 例如,如果一个应用有缓存策略,一个好问题就是:如果键无效了会怎样?缓存中的值如何更新? 带着这些问题阅读代码,就是结合上下文。或者说因为你有了一个目标,你会变得享受阅读的过程。 你甚至可以自己做一些假设,然后在代码中寻找验证。
把实例跑起来并与之交互
源码就像乐高积木,只是已经组装好了。 如果你想了解它们是怎么组装在一起的,你需要和它交互,有时甚至要把它拆开。
Debug 是另一种与代码交互的方式。试着在代码中加一些断点(或打印一些变量值), 然后弄明白打印到控制台中的所有输出。
试着对代码做一些修改,重新 build 并把它跑起来。 最简单的方式是试着调整配置项,去看不同配置的运行结果。
也可以试着添加一些细微的特性,如果这些特性对其他人也有用,你就可以把代码贡献到上游。
了解数据结构间的关系
数据结构是一个程序中最重要的元素。用笔或者你喜欢的其他工具画出数据结构间的关系。 这个图就是源码的映射。
了解模块间的依赖关系与边界
大项目中会包含许多模块,一个模块经常只拥有单一职责。 这有助于我们减少代码复杂度,在适当的层级上做抽象。 模块的接口是抽象的边界,我们可以一个接一个地阅读模块。 如果你在阅读一个使用 Make 构建的C/C++项目,Makefile 是了解模块间如何组织的好切入点。
边界本身也很有用。优秀的代码组织得很好,变量名与函数名的命名风格体现着可读性。 你不需要阅读全部源文件,你可以忽略不重要的或你熟悉的部分。
使用测试用例
测试用例也是帮助代码理解的一个很好的补充。测试用例就是文档。 当你在阅读一个类时,试着把对应的测试代码一起读了。 测试用例能帮你弄清一个类的接口,和该类的典型用法。 集成测试用例可以让你顺着走过程序的整体流程,适合输入一些特殊值并 debug 运行。