赞
踩
不知道大家遇到一个项目,里面有上万个源码文件,是如何梳理出来
框架,进行分析,快速学习的?
在大学的时候,我接触的工程,最多几百个源文件,也没注意技巧,
就是生硬的去看,效率必然低下,不过那个时候也不追求快速高效,
就是慢慢吸收的过程。
当我进入职场,开始了代码编程工作,优势慢慢发挥了出来,就是我
阅读代码比其他人快,并且高质量,能够提炼出来流程。后面领导便
将新项目交到我这边,花费一段时间,将源码的整个逻辑捋顺,输出
文档让大家学习,快速上手。
这个我把它称之为枝干体系,也就是我们阅读代码很容易陷入细节里
面,就如同回调陷阱一样,因为一层层的调用,导致大脑的堆栈溢出,
学的累,又没学会,从而打击自己的自信心。要想避免这个问题,就
是在阅读代码的时候,需要先找到主体逻辑,当这个反复总结出来后,
再去找到一条线索,进行分析,调研,画流程,类图,时序图。我把
阅读代码总结成这几个步骤:
① 看参考文档,快速理清源码结构。 ② 打开每个目录,熟悉下源代码名字。 ③ 用代码工具打开,建立工程(Source Insight)。 ④ 看文件里面的方法,以及方法继承,方法前面的注释。
⑤ 相关联的文件。 ⑥ 打通入口,对外的接口。 ⑦ 测试验证。 ⑧ 网上看别人的分析,以及对照着跑一遍。 ⑨ 做笔记,总结。
注意的是,不要上来就追求细节,这样子会让你理不清楚整体框架流
程,这个会导致自己越跟越细节,只见树木不见森林的感觉。在一份
代码出来后,第一件事就是看它的文件目录下,有没有类似
Docs,Sample 这类目录,这个代表着你能够直接看到官方的文档,是最
直接的一手资料。
像很多人问安卓 NDK 怎么学,我想说的是 NDK 工具包下面,已经给
了全部资料,非常详尽,每个参数都给出了注释,说明,还有就是 Google
官方的 GitHub 上,也给出了示例代码,这个就是你的一手资料。我
们学习网上的开源代码,第一件事就是找官方文档和示例代码。
官方文档会给你解决这个库能做什么,怎么编译,移植的平台这类信
息,让你对这个代码的用途有个初步的印象,可以判定是否是自己需
要的。如果官方的文档是英文的,你英文阅读能力一般,可以用在线
翻译工具直译,大致也能猜到它的意思。或者自己百度搜索,看看国
内有没人做了翻译,写了博客。
比如我之前需要一个三方渲染库,我找到了 SDL,于是我第一步就是看
它的说明,
关键信息,支持 OpenGL ,Android,C 语言写的,以及版权信息。这
些信息会让我初步判断,是能够满足我的需求的。然后在此基础上,
搜索网上是否有人研究过,一搜索找到了一些实例,说明路线是通的。
这是第一步,看源码的初步介绍,信息。这个是开源项目,是你在解
决一个项目问题的时候,去找开源项目的技巧。我们在公司上班,源
码是现成的,比如功能机项目源码,你是知道这个项目是做什么的。
那么第二步就是找到 Demo,去查看这个代码,对于它的流程,演示
了什么,有了大概的判定,这个时候就是看怎么把它跑起来。千万记
住,不要一上来就是 Hard 模式,比如直接实战一个项目,就像我在
刚上班的时候,选择的是跟着公司的文档,去敲代码,把 Demo 跑通。
Demo 跑通之后,第三步就是 Demo 里面怎么跟源码匹配的,我们知
道自己在开发一个 Demo 的时候,必然会用到系统的接口,我们叫
API,这个 API 打包出来就是 SDK。那么 Demo 中调用的系统 API ,
就是你分析源码的切入点。找到切入点非常关键,它让你找到下手的
地方,有了方向就好办。
这样子我们就自然而然的进入系统源码中,开始了探索源码的历程,
关于阅读代码,这里有一些总结,分享给大家:
① 不要追细枝末节,在刚开始时候追两三级嵌套即可
记住要做总结,要知道你不跟下去的的输入,输出是什么。这个就跟
我们学习堆栈一样,压入栈太多,引起了栈溢出。代码不可能一次就
吃透全部,我们的策略是不断地渗透,今天一个方法,明天一个文件,
然后是一个目录,最后是一个项目。
在一个文件结束后,有可能不是目录,而是一个功能。比如我们看了
一个查询系统当前的进程列表方法,进而了解了这个文件,那么我们
就可以直接检索系统调用这个方法的地方,看看它的用法,以及它是
在哪些文件中使用的,这样子就可以找到下一个切入点,再次深入源
码当中学习。 ② 画流程图,时序图
可以是在线画图软件,本地的话我用的 StarUML 工具,可以满足平时
的使用。画这个是方便我们总结,也会加深记忆,同时还能让自己有
成就感,学习下去的动力。
我们需要激励源,画图如果让同事看到,会让你有成就感,有了炫耀
的资本,这样会更激发自己的战斗欲,这就像是好学生因为老师的表
扬,会更加拼命学习,为的就是保持这个好学生的身份。
我们对于分析的代码,随着画图会理解的更精准。从记忆深度来说,
文字不如图,图不如视频。我们看项目文档,很多时候都是画的
图,清晰,并且让你很好理解。你下次遇见问题,就会想起这个图,
然后拿出来进行参考。 ③ 笔和纸
我自己喜欢写写画画,于是买了一盒中性笔,同时买了一袋打印纸,
也不贵,可以用很久很久。用这个的目的是,很多时候我们工具用的
不熟,画起来不符合我们的思维,所以需要个东西去乱画,记录下来
当前的疑问。
用笔记录疑问,简单的画下流程,为的是让一闪而过的想法留存下来。
画流程图和时序图,实际是已经有了一些掌握,不是一抹黑的阶段。
当你对整个流程还不是熟悉的时候,最好的方式就是先随意画,记录
下来,然后慢慢消化,最后画出来,变成文档。 ④ 带着问题进入,有目的性
没有问题的跟进代码,会让自己不知道在干什么,于是我在学习代码
的时候,都是先设定问题,有自己的目标。比如分析完这个文件的所
有接口,从接口能分析出这个源文件的对外方法都有哪些,这个文件
是做什么用的?比如 FileUtil.java ,我们一看就知道是文件相关方法,
里面有打开,关闭,追加,删除等方法,这个接口列表就是我的目的。
再比如安卓启动过程的入口是哪个文件,这个文件都有什么方法,都
有哪些接口可以调用,记录下来,做总结。
如果有官网 API,那么就上去看,然后发现哪个解释自己能看懂,就
先看这个,然后顺着这个进行未知的方法探究,这样子可以做到信心
满满,不会被满屏不懂的技术打倒。 ⑤ 在解决具体问题后,多看看其他方法
这个在学习过程中非常重要,我平时看见很多人阅读代码只看下自己
解决的地方,其他地方不怎么仔细看,于是下次遇到一个需求就不知
道有没有支持了。
只有你打开好奇心,在时间充足的时候,对你掌握的代码,进行扩充
代码领域,从你熟悉的一个流程里,进行不断扩充边界,这样子你最
终就攻下了整个模块。
也就是先找一条线跟进这个模块,然后在这个线上找每个细节,继续
扩充知识,最后就出现了知识体系,一个参天大树。很多理论都是可
以迁移的,比如目标管理里面强调的,目标,拆解,验证,复盘。
先制定可以测量的目标,然后分解成一个个小节,然后一个个小节验
证,最终复盘发现新的问题,再制定新的目标。做项目,做需求,阅
读代码,都是可以使用的。源码阅读需要一个线,也就是一个目标,
设定了目标,就可以去执行。比如跟踪马达从上层到最终驱动,硬件
的流程,绘制出来一个时序图。
然后发现这里还有霍尔器件,还有光感传感器,触摸屏,然后在做完
了马达的整个逻辑,是不是就可以探索进入其他模块,继续分析。
只有这么去做,你的知识体系才能日渐丰满。 ⑥ 总结,写笔记
多去写,多去思考。只有你去写,有机会的时候,最好要去讲。写和
讲这两个方向都会将自己模糊的知识点逼出来,更好地认清自己的不
足,从而这些就是你下次阅读代码的目标。
同时写笔记,发到网络上,还是建立自己影响力的一个环节。如果你
写的好,那么在当下互联网时代,你的机会就会比其他人大很多。
我们要做到喜欢阅读代码,并且有自己的方法,不是胡乱看看,而是
有目的,是解决问题,还是深入研究?是总结文档,还是流程分析?
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。