一、前言
1.把异常信息复制粘贴到搜索引擎里,回车,按照搜索结果中说的方法步骤解决问题;
2.把没见过的API复制粘贴到搜索引擎里,回车,找一篇写的清楚的帖子,按照里面的使用方法写逻辑。
以上两个场景,在日常的工作中占有极高的出场率,仅从技术工作角度来讲,以上内容是大部分程序员解决问题、完成工作的主要方式之二,这无可厚非,在信息获取成本越来越低的大环境下,这是在最短的时间内完成任务的最有效的方式。
没有人愿意浪费时间,即便是完美主义者,也会选择先把任务完成,再回头去仔细研究,这也是最合理的工作方式。然而绝大部分人并不是难能可贵的技术狂热者,对技术的追求度不够、自律性差、遇到困难浅尝辄止,成为了阻碍自身进化速度的拦路虎。工作中拥有一个引路人,拥有一个负责任的引路人,拥有一个良好的技术工作氛围,是需要运气的,可能你的运气并不好,那么以上三点就是你甩开别人、取得巨大进步所必需的性格和品质,因为你没有好的环境,就必须要自己创造出好的环境。
这里需要提到一个你自己都可能不曾发觉的前提,你所拥有的资源,远比你意识到的多,正因如此,你也并没有好好利用他们。
如何以自己为出发点,通过使用能够轻松获取到的资源,来提升自己呢?
最基本的方法就是。
读 源 码。
二、为什么要读源码
1. 使用工具不读源码,就像玩游戏不读技能说明
玩的都是同一个游戏,同一个职业,同一套装备,为什么你只能看着大神的背影艳羡?因为你对你玩的角色没有充分的认知,无法将能力最大化,你无法做到顺风局中砍瓜切菜,掌控全场,也无法做到逆风局中冷静稳定,绝境翻盘。
对于程序员来说,你使用的技术和工具,就是你的技能,而这些技术的官方文档、源码,就是她们的技能说明,并且就放在官网、Github等触手可及的地方。
2. 源码才能让你跟别人有最有效的交流
“XXX详解”、“XXX原理解析”、“XXX快速上手”……新手看无数篇类似的帖子,也只能感叹大神们都“各怀心腹事,尽在不言中”,你似懂非懂。
废话!那是人家对源码的精炼,再结合自己的理解,升华出来的通俗易懂的内容,这些具有教学意义的技术帖,就像一个个将底层高度封装后的框架、中间件,你能看懂,但其实你还是不懂,你觉得你会了,但其实你还是不会,这种落差犹如海浪般不断冲刷着你的自信,而你的焦虑就像礁石上产生的青苔……
当且仅当你仔细研读了源码之后,你才有可能产生共鸣。
3. 好的歌曲值得单曲循环,好的代码值得反复推敲
源码中体现的设计思想,使用的设计模式,对细节的处理方法,值得反复学习,每读一遍,都会有新的心得体会,都会对你的思维有着积极的影响。
也许你能轻松默写出各种算法,也许你能不假思索背出各种概念的定义,但是你无法把心法转换成招式,运用在实际中,阅读源码吧,那里充斥着教科书般的技能运用方式。
4. 深度掌握技术,才是自信的源泉
技术革新的速度令人咋舌,新技术对底层的封装越来越严密,框架使用的学习成本越来越低,后来者似乎更容易追上你的脚步了。业务固然极其重要,但技术的深度决定了你打遭遇战的能力,以及职业生涯抗风险的能力。
能将业务场景转换为技术集成是一个技术人的核心能力之一,也是最具价值的能力,多精通一项技术,就意味着多一个选择,选择多的人总是比选择少的人更加处变不惊,自信外溢的。
三、如何读源码
那么,如何读源码呢?
1. 选择项目很重要
首先,要选择一个应用范围广、存活时间长、有较多版本更迭的开源项目。
应用范围广,说明她的功能和性能都受到了业界的肯定,是一款优秀的产品,也许你也正在使用,能让你更有亲切感,提高阅读兴趣。
存活时间长,意味着网络上会有大量的分享资料,使用心得,踩坑经验,能够帮助你更好的了解和理解。
有较多的版本更迭,代表她在不断的成熟完善,喻示着大量的技术人才对她升级改造的帮助,无论从代码结构、架构设计,还是功能逻辑,都已经获得了较好的优化。
开源,使你能够轻松的获取代码、文档。
2. 高屋建瓴,由面到点
选择好之后,你要对选择的项目所针对的功能进行了解,她为何而生,完成了什么使命。
阅读源码向来不是一件容易的事,需要你耐心、细心的一步一步跟代码,如果你能将代码下载到本地,使用IDE跑起来最好,这样能更有效率的跟踪代码。选择一款你最顺手的IDE吧。
你需要先将整个流程走一遍,不要过早关注细节,否则容易陷入钻牛角尖的死循环,心中有一个大致的全局认识,然后再去针对各个细节逐一击破。这个过程中,你可以借助代码中的注释,通过绘制业务流程图的方式来把握整体,同时记录下关键类、关键方法等内容。
对整体有了大概的了解之后,你就可以开始细化每一步的逻辑,这个阶段你需要关注的是各个接口和抽象类的具体实现,配置文件的使用等。这个阶段是最耗时,也是最难的,越优质的项目越复杂,有可能你跟着跟着代码,就把自己绕晕了,好脑子不如烂笔头,勤记录,多画图,把逻辑结构体现在肉眼可见的地方,更容易理解,同样的,代码中的注释非常有帮助。
3. 点面结合,模块化
结合最初总结出来的整体流程,试着将其拆分成多个模块,按照各个模块去整合细节,要确认每个模块都完成了哪些任务,是如何完成这些任务的,模块之间是如何承上启下的。
如果前期准备工作做的好,到了这一步你已经开始渐渐对整个项目有了清晰的认识,也有了更深的理解,将会有质的飞跃。
4. 多读几遍,多读几遍,多读几遍……
简单粗暴的解释:一遍不够。
5. 检验成果
有的人容易忽略这一步,其实这是升华的关键,个人认为,没有什么比自己完整的写一遍更好的成果收割方式了。
建议大家不要只动眼,一定要重写,因为只有在写的时候,才能真真切切的落地,否则即便你看了很多遍代码,自认为掌握的不错了,但是也可能只是空中阁楼而已。
四、结尾
源码的魅力,只有读过的人才能体会,而你的魅力,只有读过源码后才展现。希望大家戒骄戒躁,不要急功近利,大部分技术的迁移性是很强的,只是你从来没有迈出过探索的第一步。