微信号:jisuanke

介绍:计蒜客——新型在线计算教育的倡导者.用独有的伴随式的技术带着同学们亲身参与到计算机学科知识的学习中.让每一个参与学习的同学能感受到更有味的学习过程!

如何更好地阅读别人的代码?

2018-02-11 22:44 计蒜客

“我讨厌阅读别人的代码”是所有经验层级上的软件开发人员之间普遍存在的问题。然而,这又是一个必要的技能,特别是对于开发人员进入到现有的代码库中的时候,如果你以正确的角度和正确的工具来处理它,这可能是一个愉快和有启发性的体验。


我们讨厌阅读别人的代码的原因是因为代码不是我们自己写的。这不是因为我们认为自己是地球上最好的编码人员,没有人可以像我们这样编写好的代码。而是因为在创建代码时有一个积极的思维过程,而被动的阅读者并没有获得这种亲身体验的益处。


你在屏幕上看到的代码可能涉及多个人。它可能涉及辩论和协作。它可能需要几个星期才能完成符合只在原作家头脑中的一些未文档化的限制的版本——但是你对此却不可得知。


作为读者,你看到的所有产品都是成品,除非你做一点挖掘,否则你唯一得到的就是屏幕上的其他单词。


1. 学会深挖

当你第一次深入成熟的代码库时,你可能感觉自己不像开发人员。你可能更像是考古学家、私人调查员或圣经学者。这很好,因为你有一大堆事情需要处理。


如果你有幸能够从一开始就接触使用版本控制的代码库,那么就该庆祝一下。你可以访问丰富的元数据,这将使你理解的不仅仅是代码,还包括上下文,都会容易很多。我会假设你使用 Git ,但是如果你使用 SVN ,那么这个想法也是同样适用的。


你可以在文件上使用 git blame 来获取每一行的提交名、上次修改日期和提交哈希值。熟悉这些提交者。如果你足够幸运的话,可能只有其中的一些,他们可能还在和你在一起工作,所以你可以把他们当做资源。如果你很不幸,可能有几十个你以前从未听说过的提交者。


无论如何,尝试了解主要贡献者是谁。如果你遇到一个奇怪的功能,并且你不能搞明白,请使用 git blame 找出提交者,找到他或她去询问。


使用 git log 查看整个代码仓库的提交历史记录。此命令将打印提交消息,因此,如果要执行类似搜索提交消息中引用 someFunction 的提交,请勿忘记使用 grep 命令:git log | grep someFunction -C 3(-C 3将显示匹配到的上下文三行内容)。


git log 还可以显示具有 -p 标志的单个文件的历史记录:git log -p index.js。 注意最近一直在修改代码的人,这样你就能知道在出现问题时找谁咨询了。


2. Go Back in Time

你可以查看任何所需的提交,并将其运行,就像它是项目中最近提交的一样。你可能在遇到一些想难以追踪的错误出现时查看最后一次已知的正确的提交,或者你可能会觉得无聊和有心情探索下在你进该项目之前几年里该项目的历史更新情况。


如果你的项目托管在 GitHub 或类似的网站上,你可以通过阅读问题、pull 请求和代码复审来获得大量的信息。格外留意产生最大讨论的问题。这些可能是你最终会遇到的痛点,你会提前知道如何处理它们。


3. 阅读规范

规范是新的注释。 阅读单元规范,以确定什么功能和模块是被支持的以及哪些边界情况要被处理。 阅读集成规范,以了解用户如何与应用程序进行交互,以及应用程序支持哪些工作流程。


4. 将评论视为提示

如果您遇到一个令人困惑的功能,然后阅读了一个相关的评论,却使您更加困惑,请考虑该评论过时且未被维护的可能性。 程序员的眼睛有一种跳过绿色线条文本的方法,这个没有其他人注意到的评论可能是在说明这几个月(或几年)内不存在的迭代功能。


5.查看 Main 文档

这可能看起来是很明显,但请确保您知道代码开始执行的位置以及如何设置。查看这里包含的文件,正在实例化的类和正在设置的配置选项。


你可能会在代码库的其余部分看到它们。这里的一些模块可能非常通用,并与其他代码分离。它们代表更小,更易消化的功能,您应该在尝试解决大型应用之前熟悉这些功能。


在这个文件上运行一个 git blame 命令,看看它最近有哪些部分被改变了。近期更改的一大堆代码可能会告诉您最近几周开发团队面临的一些挑战,也许他们已经推出了一个新的库,也许他们一直在努力地配置一个运行不太好的库,或者也许只需要定期更新的样板代码。


尝试在某些其他源代码中查找对这些模块的引用,以感受一下这些模块是如何被使用的。这可以帮助您了解如何适应整个应用程序。


6.关注代码风格

你正在学习这个应用程序的原因,是由于你最终要为它编写代码,所以要注意代码风格。当然,这包括表面的东西,如命名约定、间距约定和大括号放置,但这些都也包括代码约定中。


一般的抽象层次是什么?如果它是具有很多层次的高度抽象代码,那么你应该也希望编写同样的代码。


如果你挖掘足够多的代码历史版本,你可以找到一个确切的时间点,选择其中一个开发人员一段代码查看。查看以前这段代码原来看起来是怎么样,以后怎么样?在编写代码时,尝试遵循共同的约定。


在更微观层面上,其他团队成员使用什么样的代码来完成任务?如果开发人员倾向于使用 map 的 for 循环,那么您也应该倾向使用 map 的 for 循环。


如果你遇到一个你不喜欢的约定,请告诉你的团队关于未来可能会改变约定,但不要在同一个文件中混合和堆砌一堆不同的样式。让一个文件看起来像一个人写的越多越好。代码风格一致性是比好看更重要的。


7. 期待找出无用的代码

你可能会发现一些永远不会使用的函数,或者你可能会发现从未使用过的整个文件。 你可能会发现在几年来没有被碰过的注释掉的代码(git blame)。 不要迟疑,不要花太多时间去思考,不要害怕去掉这些东西。


如果代码是由于某种原因出现的,会有人在代码评审中标记该代码。你的行为还会减少下一个读者的心理开销。


8. 不要迷失

记住这些事情,当你发现自己周围一片荒芜时,不要感到不舒服。不要指望它是一个线性过程,并且不要期望理解全部的 100%。注意重要的细节,知道如何挖掘你的问题的答案,你会发现自己能很快理解。


摘自开源中国,译者Tocy, 亚林瓜子, 总长

英文原文:How to Read Code (Eight Things to Remember)

 
计蒜客 更多文章 TIOBE 2 月编程语言排行榜:老牌语言的回归,VB 连续两月上涨 给迷茫的开发者的 18 个建议 简洁代码书写法则 折扣日 | 轮子哥带你学《面向对象的程序设计(C++)》 为什么学 Python?有这 7 个理由就够了
猜您喜欢 大数据技术栈 告诉你一个将 footer 保持在底部的最好方法 Web 安全工具篇:Burp Suite 使用指南 送书之《Angular权威教程》 PPT:大数据时代的设计特点——不了解这个你做不了今天的设计