思索了这两个问题良久,也去知乎找了一些相关话题的问答,但并无标准答案。因此,我这里也只是记录一些我对此的见解,也许会随着 RTFSC 阅历的丰富而发生变化,我会记录更新于 github.com/mzlogin/rtf…。android
在我看来,阅读源码的意义在于学习优秀的「套路」。git
这里的「套路」所指范围很广,大到架构设计,小到可取的命名风格,还有设计模式、实现某类功能使用到的数据结构和算法等等。所谓高手,其实就是能比大部分人更早更快地掌握套路并熟练运用之人。github
埋头在本身的天地里耕芸当然也能逐渐进步和成长,但总会有时候会遇到一些场景,你苦思良久也没法作出良好的设计,总会有一些时候,纠结如何为一个变量命名让你停下飞速敲击的手指。这些令你为难的场景,先贤们也许早就遇到过,而且给出了优雅的解决方案。看优秀的源码的时候,将这样的场景与对应的方案收入囊中,或者仅仅在脑中留下一个印象也好,以便在须要的时候,你的武器库里总能掏出一把称手的家伙来。算法
不该该这样编程
不该该漫无目的地随手拿起一分源码,试图去通读。这一方面会过目即忘无所收获,另外一方面会枯燥得让你迅速从着手到放弃。学习的方式有不少种,阅读源码并不必定是最适合你当前的状况的。设计模式
应该这样微信
精心挑选要阅读的源码项目。数据结构
这最好是与你的编程语言、你的工做内容、你的兴趣所在相关的,这样才能更切实地感觉到阅读源码给你带来的益处,更有动力继续。架构
若是你想学习的知识点有官方文档,先看文档再看源码。数据结构和算法
直接从源码着手,搞清楚原理当然是好,可是源码有多是难啃的,先熟悉官方提供给全部人看的文档,能较为平滑地对这方面的知识先有个大概的了解,而后再结合源码去深刻。
提出具体的问题,而后带着问题到源码中找答案。
好比在使用 Toast 的过程当中,你可能会想到一些问题:Toast.makeText(...).show()
时发生了什么?Toast 能不能在非 UI 线程调用?能不能自定义 Toast 布局?诸如此类。在源码中探寻完你想要的答案,你的目的也就达到了。
从一些共性层面入手。
大部分的程序里都会使用到的东西,好比线程模型、UI 组织结构、任务调度方式等等。针对某一个方面去了解,比漫无目的要有效率得多。
最好可以编译运行起来。
若是一份代码你只能看不能跑,那可能读到一些地方你只能猜这个地方的数据值和跳转结构是怎么样的,而颇有可能你猜的是错的。但若是你能编译运行,那在须要的时候你能够修改,加日志等等来更好地观察和验证你的想法,获得正确的理解。
作一些笔记。
一方面是将你的学习成果保留下来,方便随时查阅,毕竟只凭脑子记忆是不靠谱的;另外一方面在学习的过程当中,也能帮助理解。
原始连接:阅读源码的意义与方法
假如你对个人文章感兴趣,能够关注个人微信公众号 isprogrammer 随时阅读更多内容。