通过养成阅读代码的例程和习惯来成为更好的程序员
这是我偶尔写的系列文章“ 给年轻软件工程师的笔记”中 的帖子 。 在 这里 注册 。
如果您有一天决心成为一名出色的作家而醒来,您会听到两个简单的反馈:写很多东西,读更多东西。
在软件中,很多人都在编写代码,但很少有人花时间阅读它们,尤其是在日常工作之外的代码。 那是一个错误。 在您职业生涯的早期,扮演有抱负的作家,并喜欢阅读各种代码。
广泛阅读并经常阅读。 成为一名出色的软件工程师与成为一名出色的软件工程师之间可能有所不同。
为什么要阅读代码?
伟大的作家是他们读过的作家的功能。 想想琼·迪迪翁(Joan Didion),他在16岁时键入海明威的句子 ,以便她可以学习句子的工作原理。 或想想亚伯拉罕·林肯(Abraham Lincoln),他后来的抒情诗源于他心爱的《国王詹姆斯圣经》。
同样,看到各种编码实践后,您就可以在编写自己的代码时扩展调色板。 阅读他人的代码会使您接触到新的语言功能和不同的编码样式。
阅读您的依赖关系将使您成为一个更有效率的程序员。 您将了解依赖项提供的全部功能。 您将确切地知道它们的工作方式以及正在做出的权衡。 出现问题时,您将知道在哪里进行调试。
习惯阅读代码还可以减少过度偏爱代码的可能性。 阅读的内容越多,增加别人的代码而不是自己编写代码就越自在。 此更改将减少您被“此处未发明”综合症所困扰的可能性。
无论您是Web开发人员,数据工程师还是密码学家,培养日常阅读都将教给您不同于您日常工作的工具和产品。
作为Web前端工程师,阅读raytracer代码库的一小部分将使您面临完全不同的约束集。 作为数据库工程师,阅读高抽象度的Web代码可以向您展示用户的想法。 对于所有工程师来说,您会发现,定期阅读日常工作之外的其他语言会有价值。
正如Donald Knuth 所说 ,“ [阅读代码]真正值得您在大脑中构建。 您学会阅读别人的东西越多,将来就越有能力发明自己的东西……”
这是使代码阅读尽可能轻松高效的方法。
我应该如何“阅读”代码?
像您读一本典型的书一样,从头到尾地阅读代码库,都是失败的秘诀 (尽管,具有讽刺意味的是,这是计算机自己读取代码的方式)。
从头开始阅读意味着忽略重要的上下文,对即将出现的结构毫无意义。 被动阅读(您不编写测试或修正错误)将阻止您真正地内部化代码。
与书不一样,几乎所有我的朋友都在努力阅读代码时没有想到特定的目标。 在阅读新的代码库之前,请确保您有一个要实现的目标。 这将使代码库看起来更易于管理,并在旅途难免困难时提供动力。
我使用四方策略来处理任何复杂的代码库(简称RSDW):
- (R)un :编译,运行并了解代码应执行的操作。
- 检查(S)结构 :了解高级结构并审查关键的集成测试。
- (D)ive in :遵循关键流程并读取重要的数据结构。
- (W)rite测试 :编写测试并确定简单功能和错误修复的优先级。
RSDW方法是一个起点,但是随着时间的流逝,您应该根据自己的需要对其进行自定义。 有些人发誓要编写测试和修复错误,而另一些人总是喜欢从复习集成测试开始。
不过,首先要从RSDW方法开始。
1.运行
读取代码的第一步不是实际读取代码。 是要使用软件。
仅在了解该软件提供的功能之后,才能阅读代码。 在此阶段,您应该能够对代码进行总结并了解输入和输出是什么。
使用该软件会迫使您使其运行。 这意味着要跟踪依赖关系,并使用某些语言来编译代码。 对于库,这意味着调用一些常用函数。 这是运行测试和查看输出消息的时间。
如果您在首次运行时遇到问题,现在是向其他人记录运行软件实际所需时间的最佳时机。
2.结构
接下来,确定代码中最关键的部分。 这个过程是与读书最不同的部分。 不必从头开始,而必须跳来跳去找出代码中的关键联系。
首先了解代码的结构。 至少要运行一些自动化工具(例如tree和cloc)来找出代码库的语言和文件。
要确定关键文件,请查看修改最多的文件,然后使用任何其他高级工具 。 查看最重要的集成测试,列出所调用的功能。 标记这些测试以供以后使用。
也有一种简单的方法可以缩短此过程:找到以前在代码上工作过的人。 了解结构是白板会议的首要任务。
3.深潜
一旦您拥有一块土地,那就挖吧。
读取代码时,应查看代码流(查看正在创建的动作),并查看数据结构/对象(存储动作结果的位置)。
从关键集成测试,重要PR或您对源文件的检查中找到3至5个关键流程。 然后再深入。 从特定操作的顶部开始并跟踪代码。 一些开发人员对调试器发誓,让您逐步完成。 其他人则喜欢构建统一建模语言 (UML)图或火焰图 。
资料来源: FlameGraph资料库
资料来源:Wikimedia
其他时候,我会在重要功能的中间停在断点smb dab上,然后逐步遍历堆栈以了解我是如何到达那里的。 如果决定手动遵循代码,请确保已设置编辑器,以使您可以使用“转到定义”和“查找所有引用”来进行快速导航。
对于数据结构,请检查数据类型以及何时设置关键变量。 在关键时刻使用调试器查询这些数据结构。
除了集成测试之外, 查看重要的请求请求也是一种处理新代码库的有效方法。 PR封装了一个隔离的功能,因此通常更易于理解。 PR还提供了为何添加代码以及如何添加代码之外的叙述背景。
在这些深入研究期间,我将打开两个markdown文档。 第一个是“升级我的编码”文档,其中列出了我正在查看的新语法和对我自己的学习感兴趣的代码模式(其他人将此称为词汇表 )。 第二个文档列出了我对代码库开发人员的关键问题。 在这一阶段,当我发现差距时,我还会添加文档。
与了解密码的人一起使用时,深度潜水特别强大。 如果我在项目上与开发人员的时间有限,那么我总是让他们通过一些关键流程来跟踪我。 一旦我对一些关键流程有了基本的了解,就可以更轻松地自行挖掘。
4.编写代码
与文学不同,在文学中阅读和写作是分开的工作,“阅读”代码的关键部分实际上是编写代码。 不编写代码,几乎不可能内部化代码库。 两种简单的开始方法是编写测试和解决简单的功能/错误。
写作测试是一种活跃的阅读方式,它迫使您注意特定交互的实际输入和输出。 编写测试以一种无法单独阅读的方式将代码印在您的内存中。
对我来说,单元测试是一个简单的开始。 一旦掌握了基础知识,我便开始进行集成测试,这些测试迫使我理解越来越多的代码库部分。 有时,我什至会重写现有的集成测试,以测试我对关键呼叫如何工作的理解。
另一种简单的方法是编写简单的功能或解决简单的错误。 这两项任务都不需要完整的代码库知识,但是仍然迫使您面对代码。 提供错误修复程序和文档也是返回依赖项的简便方法。
这些方法可以在您最需要的时候快速取胜。 通过增加一些更广泛的课程来扩展RSDW,阅读代码将不再那么困难。
阅读技巧
RSDW流程不是教条式的。 工程师不可避免地会想出自己喜欢的方式来挖掘新的代码库(该过程也会因语言,可用的工具以及您面前的代码库类型而异)。
尽管如此,当您看到新代码时,RSDW流程确实主张采用系统方法。 它还鼓励对代码进行主动自省,无论是编写测试还是主动使用调试器询问数据结构。 阅读代码的过程与阅读书籍的被动过程大不相同。
您还会发现阅读新的代码已经筋疲力尽。 您正在复杂地跟踪代码流,并试图同时保留数十个新数据结构和函数。 在接近新的代码库时,请积极休息。 当我开始使用新的代码库时,每天需要花几个小时才能感到高效。
培养良好的阅读技能至关重要,但考虑到阅读内容也同样重要。
您应该阅读什么代码?
在您职业生涯的早期,我相信您60%的时间应该花在阅读代码上。 也许其中三分之一应该是您实际构建的直接代码库之外的代码。 那是非常大量的时间,所以您应该阅读什么?
开始阅读且获得最高投资回报率的最简单方法是学习依赖项。 内部化依赖项的工作方式使您可以更轻松地在整个系统中进行调试和推理。
另一个高投资回报率的途径是在您的公司中选择一个重要的系统作为您的接口,并仔细阅读它。 这不仅对您的工作有价值,而且专业的代码库与开放源代码库不同。
除了与您互动的直接系统之外,还可以培养广泛阅读的开放性。 在职业生涯的早期,我建议您在早上或晚上留出一个小时的时间来阅读日常工作以外的代码。 经过一天的辛苦工作,这听起来很痛苦,但是选择一个令您兴奋的代码库,并尝试一个星期。
例如, Redis是C语言中流行的起点。对于可读性差,复杂的代码库,一种简单的启动方法是读取特定的子系统。
辅助项目是一种强大的阅读方式,因为它们会迫使您学习不同的世界。 您需要阅读新的依赖关系,并探索要构建的内容的不同代码库。 尽管它看起来并不像阅读,但它是一个迫使您积极阅读所用内容的项目。
在户外工作,您应该阅读与日常工作大不相同的工具。 如果您习惯了高层次的抽象,请学习一个(或三个)抽象级别。 如果您使用一种语言,请选择另一种语言以在空闲时间阅读。 如果您始终必须考虑一个约束条件(例如,图形编程中下一次屏幕刷新的时间),请找到另一个约束条件(例如,在移动编程中节省电池寿命)。
读取代码的另一个好方法是读取和重写您所尊重的编码器。 年轻的迪迪翁(Didion)写下海明威(Hemingway)的地方或亨特·汤普森(Hunter Thompson) 键入“伟大的盖茨比”(Great Gatsby)的地方 ,从一个简单的库开始写出安提尔兹(antirez)或盖earon(gaearon)或mrdoob的代码。 阅读他们的其他代码库。 保持最新的工作。
斯蒂芬·金(Stephen King)告诫作家:“如果没有时间阅读,就没有时间(或工具)写作。 就那么简单。” 同样,对于软件工程师来说,编写新鲜的代码可能是最有趣的,但是(积极地)阅读代码可以使您与众不同。
这是我偶尔写的系列文章《 给年轻软件工程师的笔记》 。 在 这里 注册 或 关注RSS feed 。 本系列的所有文章均以草稿形式发布,并纳入了相关的社区反馈。 感谢 Brandur Leach , Jake Craige 和 Breck Stodghill 的反映和反馈。
链接
阅读代码的文章
- 询问黑客新闻:您如何熟悉新的代码库
- 询问黑客新闻:如何理解开源项目的大型代码库?
- 在不熟悉的代码库中快速提高生产力的策略
- 熟悉大型代码库的最佳方法是什么?
- 阅读代码的提示
- 软件工程电台:Dave Thomas的软件考古学 (播客)
图书
阅读的代码库
From: https://hackernoon.com/one-secret-to-becoming-a-great-software-engineer-read-code-467e31f243b0