专栏首页顶级程序员这8点能教你如何更好地阅读代码

这8点能教你如何更好地阅读代码

译者:Tocy, 亚林瓜子, 总长 出处:开源中国 链接:https://www.oschina.net/translate/how-to-read-code

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

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

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

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

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%。注意重要的细节,知道如何挖掘你的问题的答案,你会发现自己能很快理解。

本文分享自微信公众号 - 顶级程序员(TopCoding)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-08-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 顶尖程序员的五种思维模式,你具备吗?

    转自:程序人生(coder_life) 《THe Effective Engineer》的作者Edmond Lau采访了很多硅谷顶级科技公司的顶尖软件工程师。...

    顶级程序员
  • 谷歌工程师写的这段代码什么水平?

    代码,正在改变世界。正是因为有了代码的存在,才有了阿里巴巴、百度、京东、天猫等的存在。

    顶级程序员
  • 程序员必须遵守的8大准则

    再确认测试代码前,先找别人帮你检查下是否无误。在别人做之前尽量检查出bug并且将其处理好。代码审查最重要规则是对即将提交的代码中查找问题——你需要做的就是确认代...

    顶级程序员
  • 支招 | 手把手教你应对这15种“烂代码”

    你已经在某个项目的一部分中拖延了很久。推迟了一周以后,今天是你计划打开遗留代码库并查看已完成的内容的时候。你一想到这代码库就害怕。因为你知道离岸软件开发团队已经...

    AI研习社
  • 手把手教你应对这15种“烂代码”

    你已经在某个项目的一部分中拖延了很久。推迟了一周以后,今天是你计划打开遗留代码库并查看已完成的内容的时候。你一想到这代码库就害怕。因为你知道离岸软件开发团队已经...

    昱良
  • 手把手教你应对这 15 种“烂代码”

    推迟了一周以后,今天是你计划打开遗留代码库并查看已完成的内容的时候。你一想到这代码库就害怕。

    良月柒
  • 为什么开源可以提高程序员的编程技能?

    我已经写了很多年的软件。最近我意识到,我越涉及(致力于,结合于等)开源技术,我写出来的代码就更好。这不由地让我疑惑起来:难道里面有什么相关性或因果关系吗?

    哲洛不闹
  • Dead Code为什么能在代码库中永生?

    在一些遗留系统中,经常会看到大片大片灰掉的代码(被注释掉了),这种代码是死代码吗?如果要我下定义,我认为这些不是死代码,因为它们连代码都称不上,如何又能叫死代码...

    袁慎建@ThoughtWorks
  • JS逆向时碰到了恶心的死代码怎么办?手把手教你解决!

    你是否也曾有过「跟着代码跳了很久之后,才发现那一大坨代码其实没有任何作用」的惨痛经历?

    青南
  • JS逆向时碰到了恶心的死代码怎么办?手把手教你解决!

    你是否也曾有过「跟着代码跳了很久之后,才发现那一大坨代码其实没有任何作用」的惨痛经历?

    崔庆才

扫码关注云+社区

领取腾讯云代金券