这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)

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

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Rainbond开源「容器云平台」

微服务的误读与误解

1525
来自专栏技术翻译

Kubernetes,Kafka事件采购架构模式和用例示例

随着当今业务和技术的快速变化,开发人员,数据科学家和IT运营部门正在共同构建具有新技术和动态架构的智能应用程序,因为它们具有灵活性,交付速度和可维护性。这篇文章...

1822
来自专栏腾讯大数据的专栏

HBase在腾讯大数据的应用实践

前言随着腾讯产品与技术的发展,几乎任何一个与用户相关的在线业务的数据量都在亿级别,每日系统调用次数从亿到百亿,对海量数据的高效插入和快速读取变得越来越重要。而传...

3296
来自专栏月色的自留地

OpenProject基础使用介绍

        所有的活动都可以看做一个项目来管理。在企业中更是这样。   所以项目管理平台,对于任何一个高科技企业来讲都是必不可少的。   OpenP...

7043
来自专栏北京马哥教育

大神分享美团外卖订单中心演进之路

? 作者:何轼 来源: http://tech.meituan.com/mt_waimai_order_evolution.html 前言 美团外卖从20...

4607
来自专栏互联网高可用架构

互联网性能与容量评估的方法论和典型案例5 性能评估参考标准

4724
来自专栏FreeBuf

2016 黑客必备的Android应用都有哪些?

免责声明:本人所发布的此份清单仅供学习之用。我们不支持读者利用其中的任何工具进行任何不道德的恶意攻击行为。 ? 根据业界的一系列评测以及亲身经验,我们整理出了...

2098
来自专栏互联网研发闲思录

手机QQ公众号亿级消息实时群发架构

编者按:高可用架构分享及传播在架构领域具有典型意义的文章,本文由孙子荀分享。转载请注明来自高可用架构公众号 ArchNotes。

2154
来自专栏ArrayZoneYour的专栏

如何偷懒地用 PHP 搭建一个班级网站

一名网站开发的萌新,在大一上半学期,就想做一个我们班级专属的网站,方便同学们(方便我这个学委偷懒)。下面放出我的网站信息架构、技术组合和从一个小白成长到现在一个...

2.6K0
来自专栏云计算D1net

亚马逊云平台的迁移过程

最近3个月变化很多,离开呆了5年多的北京,开始英国的工作和生活。到这之后基本在做系统向亚马逊云平台的迁移,踩了不少坑,收获也很多。由于系统的迁移涉及各个常见的架...

3849

扫码关注云+社区