关于读源码

read the ******* source code

Posted by 宸笙 on June 10, 2018

导语

一直无法避免的话题就是读源码,那么是否有必要读呢,要读那些或者怎样读呢;

是否有必要读

很有必要

  1. 学习一些优秀工程师的编码规范和思路,有助于启发自己的思路,借鉴到自己平时的编码中;
  2. 很多人会抱怨公司项目简单,找不到提升的路径,其实很多开源三方库或者系统源码本身问题足够复杂,写出的质量也是较高的,这本身也是很好的学习机会,其实我们手头就有很多不错的代码如jdk等;
  3. 读源码是了解Design Patterns的最佳实践的途径,看下在复杂的问题下,为了解决复用和解耦问题是如何恰当使用模式的;
  4. 掌握解决常用问题的思路和技法,并能尝试去实现下简单的轮子,而造轮子也会提高自身对开源库代码的理解和把握,造轮子和读源码相互促进;
  5. 学习封装,抽象与设计;

    学习一些优秀库的作者是怎样把复杂琐碎的细节和交互过程封装起来,并对外暴露简单明确的Api和概念(类)的;

    学习在复杂问题下是如何抽象,抽象意味着通用性高,能决绝大部分类似问题;

    学习好的设计,有了清晰的设计意图和思路后编码会快很多,这里可以学习好的设计,比如正交,另外也可以看下一些语言中的看似平常构件是怎样被巧妙使用的,比如Retrofit巧用动态代理等;

    体会性能和好用的权衡取舍,考虑一些实现方式是运行时反射还是编译时生成代码,开发者使用时的语法约束的程度,生成代码导致的apk大小和运行时反射性能损耗的折中,在系统或机制的制约条件下,找到合适的hook点并解决问题柳暗花明;

读源码

  1. 读较好的三方库源码;

    Volley,OkHttp,Retrofit,Dagger,EventBus,ButterKnife…

  2. 读JDK部分源码;
  3. 读Android SDK中的源码;

怎样读

  1. 把握整体思路;
  2. 带着问题针对性阅读;

源码背后的

  1. 思路
  2. 意图,别被细节和框架耗太多精力而本末倒置,但难点在于结合业务下作者的实现也是主观的,此时就是需要读懂readme或者注释了,使得能尽量接近作者的设计理念,毕竟逆向都是不容易的,这些细节仅是实现意图的方式之一,意图只有一个,剥离掉一些无关细节,从语法表征上看,framework或library或许基本是泛型,反射,注解,多态,Design Patterns等语言构件;