最近在看Twitter的Oauth2的库的源代码(simplegeo/python-oauth2 · GitHub),看不进去啊…整个库有些自成体系的感觉,看上去联系很紧密,所以从哪里开始看都不方便。从上往下看代码的话,肯定会被各种函数看晕。从main()开始看的话,也会被好多层的调用搞晕。因为之前对Python的Http请求的库并不熟悉(如httplib2, requests),经常会需要看一下其它库的一些内容,更晕了…
现在总是觉得本文来源gao@!dai!ma.com搞$$代^@码!网!自己明白大致的流程,但总有大段的函数看不懂,结合文档看也总有很多地方不明白。自己就是想看明白一些,然后对这个库做一些改进(因为有些API的Oauth流程和其它API的有区别,所以我想改进一下Oauth的过程)。但现在的理解程度,完全达不到这个要求啊…(这两天找到了一个新的库,可以满足我的要求,但我还是想搞明白怎么读代码比较好…)
各位资深的程序员们,我应该怎么做才好呢…
回复内容:
先看文档,再看单元测试。Code Reading (豆瓣) (副题是 The Open Source Perspective,适合题主需求)
代码阅读 (豆瓣) (中译本)之前也是读代码很慢,后来代码写的多了读这些开源项目的速度就明显快了。
读代码慢就是对常用函数和常用库不熟,不熟悉python常用的编程技巧,读代码的时候精力太分散,读代码是一句一句的读,还需要经常上网查语法什么的,没有办法把精力放在代码的整体结构上,即使是每行代码都看明白了还是不知道整个程序的逻辑,同时耗费精力比较大,很快就累了,效率很低。
熟悉了常用库和编程技巧之后读代码的时候很多功能自己都实现过类似的,扫一眼就看明白了,很多函数扫一眼就知道什么功能,思路不会被不懂得语法或者编程技巧打断,一直停留在程序的逻辑上,这样看代码就轻松多了,而且很快,基本上小的项目随便翻翻就知道它的思路了,大的项目的话其实不用全都把握,只要把与自己要看的部分相关的熟悉了就好了。
读代码快的人也并不是什么都会比你快,当他们碰到一些没见过的东西时也是需要查询,自己写一些例子来熟悉,也要花一些时间,熟悉单个知识点也并不比你快。
文档和测试用例对于楼主目前的阶段来说用处不大,这些东西只能是在你读代码变快了以后锦上添花的东西,很多时候看看文档和测试用例会加快理解这个库的速度,起个和代码对照的作用
如果想要通过熟悉这个库来提高编程水平的话,就把里面用到的第三方库和编程技巧自己多写写,这样回过头来看就知道作者为什么这么写了,很多代码看起来很复杂其实思路很简单的。一开始我也觉得是自己没有掌握方法,一度还想去买一本很著名的教人读代码的书,后来没买,因为不知不觉我就发现我读代码越来越容易了。
你觉得调用栈跳来跳去的记不住是吧?你觉得模块功能联系太多反馈回路太复杂是吧?其实真正原因是你脑子不够用!
一开始,我读一个三四千行的代码要做上千字的笔记看上一俩星期,后来就不用了,读下来函数调用栈都在脑子里,最多画个草图标一下各模块依赖关系。后来有一次给新人讲模块,用SI,函数间点来点去点得飞快,最后发现我这一口气已经走了几十个函数了。
计算机跑程序,调用栈太多会耗尽内存死机,人读代码,大脑的调用栈太多就会耗尽记忆力然后晕掉,解决办法就是多读代码,把你大脑能够支持更深的调用栈深度的记忆力的潜力开发出来。等突破临界点了你自然会懂怎么读。先骂作者,然后找个小点的例子调试。多看,猛看,看了几十万行规模的系统后再看其他系统就自然如履平地。