[知乎回答]如何提高阅读源代码的能力?

谢邀,这是一个非常好的问题,也正是我想要认真思考,然后回答的问题!

@johnniechau  推荐的《代码阅读方法和实践》,是一本好书,我只打算在这里简单的聊一聊自己的经验与思考。

我们先假设一种最恶劣的状况,你被迫接手一个遗留项目,原来做项目的家伙,全都四散逃亡了,不但没有任何说明文档,而且还找不到人,老板给你一段并不宽裕的时间,你得读懂他们的代码,然后接着维护……通常,这是噩梦的开始。

当然,从提高能力的角度而言,这是一个好机会。所以,@刘立  虽然只说了两个字“压力”,我认为的确正中要害!

我们可以用拼图这样的游戏,来做一个比喻。一地的碎片,你如何将他们尽快的拼在一起?

  1. 寻找边角的块(除了四边都是凹凸的块之外,其他有一到两条边是直线的块,会少得多,也更容易辨认与拼接。)
  2. 将碎块按大的色块分类,从一次查找,变成二次查找。
  3. 一开始碎块最多的时候,是最困难的时候,需要足够的耐心、细心,以及一点点的运气。
  4. 如果你的记忆力足够的好,碰到的碎块能够在脑子里留下一定的印象,那么有助于你快速找到匹配的碎块。
  5. 经验能够帮助你提高效率,熟能生巧。

回到代码阅读,我们来做一个类比:

  1. 寻找代码中最明显的入手处,比如main函数,core文件夹,model、view、controller的三种大类等等。
  2. 从理解文件夹、文件名开始,而不是一上来就埋头进入源代码之中。
  3. 一个好的全文搜索工具,能够帮你找到相关的代码与片段,渐渐的,看起来一团乱麻的代码,就会显现出各种可以被理解的关联出来。
  4. 记忆力总是有用的,在脑子里绘出整个系统的架构,并且补充越来越的,越来越清晰的细节。
  5. 一样是熟能生巧。
  6. 相比拼图,代码阅读还要容易一些,你不需要理解全部的代码,有一个大致的理解以后,就可以先放过一些不太重要的细节。

另外推荐阅读我目前正在写作的一份文档《借助开源项目,学习软件开发》——第五章:理解开源项目:link
引用较为相关的一段在下面,供参考:

5.5. 知其所以然
有一句俗语叫做:“知其然,更要知其所以然”。用在任何学习科目上,几乎都是恰当的。本章叫做《理解开源项目》,而之前的4个小节,可以说都是属于“知其然”的功夫。如何才能知其所以然呢?

所以然包括哪些内容?
往大了说,整个这份文档,希望帮助读者达到的,就是能够对于开源软件“知其所以然”。这样才算是真正提高了软件开发的能力。因此,我们可以将“架构决策”、“代码风格”、“领域知识”、“编程技巧”等等内容,都算作是所以然的一部分。
架构决策 通过深入阅读和分析源代码,理解整个项目,为何像这样,而不是那样做架构设计。其间蕴含着项目作者的经验和智慧,理解了这个,将是一种巨大的收获。
代码风格 每一种语言、每一个社区、每一个开发者群体,甚至每一个开源项目,都有其独特的代码风格,这种风格,有其背后的合理性,也有很多是来源于某种开发哲学的思 考。理解一种代码风格,就是理解一种思考的模式,一种思想的体系。能够多了解一些不同种类的代码风格,对于提高软件开发能力,将有很大的帮助。
领域知识 有些代码不容易看懂,很重要的一个原因,是这个项目所涉及的领域,我们没有什么深入的了解。多年的程序员经验告诉我,要做好某一个行业的软件,一定要成为 某一个行业的内行。甚至要比那个本行业的业内人士,更加精通。因此,一个优秀的程序员,通常是能够跟你聊多个不同行业的话题的。强大到你几乎无法分别他的 是不是业内人士。因此,通过理解开源项目,进而理解相关的领域知识,会有很多收获。
编程技巧 阅读优秀的开源项目的代码,有时候很像是看一本好书。细细品味,慢慢的体会。我们会发现一点一滴的“妙处”。这些妙处凝聚了程序员的巧思妙想,能够体会得越多,对我们的帮助也就越大。

所以然还包括的一些内容:
个人偏好 开源作者也是普通人,他们有很多观点和取舍,未必能够说服他人,只能算是他们自己的偏好。而他们将自己的偏好表达在代码里,有些时候,我们能够很容易理解 (因为我们也是这样想的)。有些时候,我们就会感觉很不解,而且,常常会发生的一类故事就是:某某大牛写了一个开源项目,另一个大牛有感觉不爽的地方。提 了意见建议,人家又不肯改。结果,这另外一个大牛,就一怒之下,另起炉灶,写了一个新的开源项目。
历史原因 有一篇很有意思的文章,解释了《为什么Vim使用HJKL键作为方向键 》,其实原因很简单。当Bill Joy创建Vi文本编辑器时,他使用的机器机器是ADM-3A终端机,这机器就是把HJKL键作为方向键的。

如何搞清楚这些所以然呢?
思考 当然,这种思考应该伴随我们“通过开源项目,学习软件开发”的始终。但是,从方法论来说,可以尝试从以下一些角度出发来思考:

  • 如果我来做一个,会如何去做?
  • 如果能够对这个项目做减法,我可以去掉那些模块和代码?真的能够去掉吗?
  • 通过阅读单元测试,理解开发者的设计思路。
  • 尝试做一些破坏或者修改,来理解项目中的那些做法。这个在下一章会更详细的讨论。

讨论 到开源社区去,发起一些讨论。当然,前提是你必须经过足够深入的思考。不要尽是问一些傻问题
向作者提问 与上面的讨论类似,前提是要先思考。当然,还有一个讨巧的办法,你可以提出:翻译这个开源项目的英文文档,然后,对方当然会很高兴——国际化了嘛。然后,你可以在翻译的过程中,提出各种各样的问题。。。
阅读指南 有些著名的开源项目,本身也非常复杂,所以会有一些文档与书籍:linux内核代码分析、MySQL源码解读、PHP源码分析等等。如果有心学习这样的大 型开源项目,这种入门指南,也是很有价值的。但是,这毕竟是别人嚼过的饭,肯定不如自己去啃来的香。所以,还是回到那句老话,源代码才是最有营养的。

转载于:https://my.oschina.net/tpopen/blog/110642

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值