卖桃者说
池建强
极客时间创始人、墨问西东创始人
30376 人已学习
免费领取
课程目录
已完结/共 523 讲
第一季 (135讲)
第二季 (134讲)
第三季 (124讲)
第四季 (90讲)
卖桃者说
15
15
1.0x
00:00/07:20
登录|注册

第27期 | 阅读源代码的一些心得

讲述:池建强大小:5.87M时长:07:20
你好,这里是卖桃者说。今天想跟大家聊聊我早期阅读源代码的一些心得,希望能对你有所帮助。
之前有读者问过我这样一个问题:
我猜您平时应该有阅读开源项目的源码,好的开源软件或者框架,动辄数万行的源码,虽说是宝藏,但我看源码一直不得要领,投入时间不少但收获甚微,请教下:您阅读源码的关注点一般有哪些?您看源码有没有什么方法论呢,如何抓住重点下手?
 
有时面对优秀的开源框架,想学习,我甚至都不知从哪看起。
还有读者希望极客时间上架一个专门讲阅读源代码的专栏。其实我们还真有,专栏名叫做《深入拆解 Tomcat & Jetty》,这个就是源代码级别的讲解,有兴趣可以去读读。
毫无疑问,阅读优秀的源代码是软件工程师提高自己编程能力和学习开源框架的最佳手段之一。
如果你是一名运动员,除了持续的刻意练习,还需要观摩大量对手的比赛视频。作为一名小说家,除了笔耕不辍,还需要阅读大量的其他作家的伟大作品。当然,观摩和阅读不是目的,是手段。路遥在创作《平凡的世界》之前读了大量的“名著”,然后,他把所有尊敬的作家都安放在历史为他们准备的“先圣祠”中,让他们各自光芒四射,照耀大地,然后开始创作百万巨著《平凡的世界》。照耀你的世界的光芒,应该是自己发出的。
程序员亦是如此。在编程的路上,有无数的大师写出了伟大的代码和软件,去学习他们的编程技巧和技术风格,取其精华,去其糟粕,有助于更好完成自己的作品。
在我的编程生涯早期,有幸参与了一个类似 CORBA 的分布式应用系统的开发,我在那段时间差不多通读了这个项目的早期代码,其整体架构规划和代码设计的精巧程度让人叹为观止(代码的编写者是早期的 CORBA 规范制定者)。这个经历对我后来的编程之路产生了深远的影响。
技术圈有个约定俗成的短语“RTFSC”,Linux 之父林纳斯早年回答别人关于 Minix 的一个问题时,所说的第一句话就是 "Read The Fucking Source Code",这就是 RTFSC 的来由。这句话可以说是生动形象的体现了阅读源代码的重要性和艰难度。
与编程一样,阅读别人的源代码永远不是一件轻松的事,或者说,是一件困难的事情,需要持续的投入,阅读、研究、把玩、实践。很多人觉得拿到了源代码就像买了本书一样,放到书柜上,立刻就产生了一种学会了的错觉,但真正实践起来才会体验到强烈的挫败感。大部分情况下,读不下去,不是方法不好,而是投入度不够。
阅读源代码,一定要找到好的开源项目。什么是好的项目?口碑好且应用广泛的项目就是好项目,比如 Docker、Spring 系列、OpenResty、Redis 等,都是非常好的阅读素材。另外,完善的文档和足够的测试用例(test case)覆盖率,都是衡量一个开源项目是否优秀的标准。很多人说,代码即文档,好的代码本身就是自解释的。但是,对于规模宏大的开源软件来说,没有文档是不可想象的。所以在阅读源代码之前,一定要读文档。尽管读了文档之后,你可能不知道代码的技术细节,但至少可以了解项目的轮廓。结合开源项目的代码目录,差不多可以绘制出一个粗粒度的整体架构图。
如果你没有理清整个源代码的框架和逻辑就闷头读下去,那你很可能会陷入到细枝末节的纠缠中,被那些枝枝蔓蔓搞得焦头烂额。
在了解整个项目的整体框架后,你可以为每个目录(或模块)做好记录和标识,然后逐一阅读,或者直接去读你最感兴趣的部分。
我读源代码喜欢自顶向下的方式,先把整体脉络理清楚,然后按照模块去阅读代码,把类和类、函数和函数之间的调用关系记录下来,如果可以进行逆向工程,用类似 Intelli IDEA 这样的工具把代码之间的调用关系用 Diagrams 展现出来,阅读会更加直观一些,不同的语言有不同的工具可以选择。
另外,阅读测试用例同样能帮助你理解作者的代码设计意图。正常情况下,测试用例都是从文档和设计衍生出来的,而不是完成了代码再写 test case。阅读测试用例,可以让你更清晰的知道对应的类和函数想要做什么事情。
在阅读的过程中,你总会遇到一些看不懂的代码,这很正常,不要慌,也不要轻易就放弃,你可以做个记录,然后跳过这一部分继续往下看,在弄懂整块代码后再回过去读那些不明白的部分。这样,你对代码的理解加深后,之前的难题很可能就迎刃而解了。当然如果你读完整段代码后,发现之前看不懂的部分其实只是一些细枝末节,那你完全可以跳过这些部分,毕竟我们阅读源代码更多时候是为了学习前人的设计思想和抽象逻辑。再强调一遍,千万不要让自己陷入细节的泥淖中。
阅读源代码需要顺手的工具,我自己喜欢用 Vim,配合 NERDTree、CtrlP、ctags、taglist 等插件,Vim 可以成为一款优秀的代码浏览工具,而且非常轻量级。你可以在终端里用命令迅速打开、关闭、查找和索引程序,并进行有效的关联跳转(静态代码)。如果你不习惯,也可以用 VS Code、Sublime Text、Atom 等工具。当然,如果你要进行调试和跟踪,那最好使用相关程序栈的 IDE 工具,比如 Eclipse、Jet Brain 系列工具、Xcode 等等,这样你可以在 debug 状态跟踪所有的函数调用和变量参数在执行时间线上的变化。
重复一句,工具和方法永远不是最重要的,去读,并在遇到困难的时候,看不明白的时候,咬牙坚持下去,抽丝剥茧,逐个击破。最终,你会在冰冷黑暗的二进制世界里面看到一张地图,找到一座灯塔,然后去解释和还原这个底层世界里每一个细微方面的语义,重建出高层次的抽象概念和关系。
你有阅读源代码的习惯吗?欢迎在留言区分享你阅读源代码的技巧和心得。
好,今天的话题就先聊到这儿。卖桃者说,明天见。
(编辑:成敏) 
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结
该免费文章来自《卖桃者说》,如需阅读全部文章,
请先领取课程
免费领取
登录 后留言

全部留言(15)

  • 最新
  • 精选
  • 莫吉米
    阅读代码真的是不容易的一件事,我刚毕业的时候,大概整天就在看代码,入职三个月看了lvs的代码,看的昏天黑地,后来又逐渐看了ffmpeg,gearman等等,当你阅读的代码越来越多的时候,其实看代码还是有一些技巧的,而代码的设计,也是有共性的,现在我遇到解决的问题的时候,就会从框架,libc,内核一级级的往下看,你要是有过一遍这样的经历,你会发现那种遇山开山的感觉真是爽爆了。

    池建强回复: 这孩子咋这么优秀

    24
  • 磊爷
    池老师,我想点赞,可是没有这个接口,只好评论点赞了。

    池建强回复: 可以点赞啊

    5
  • 宝琳兄弟
    我有很多次尝试去读框架源码,但是每次都走不通,入口就一个,进去后完全就是个迷宫,不管选那条路走,都跟脑袋撞到墙一样的感觉。目前还没有找到解决办法。
    8
  • 匠心零度
    个人总结读源码技巧 先让项目可以跑起来(很重要的一点) debug 打印日志以及修改log4j日志级别 查看调用栈 全文搜索 大胆猜测再验证
    7
  • 吃草🐴~
    我做任何事情,喜欢自己研究。可能是过于自信(很多人都肯定过我的研究能力,尽管有时候比较慢),也可能是深受素质教育的毒害,嘿嘿。 之前看过源码,但是一直都觉得自己水平还不够,完全看不懂。现在想想可能确实是不得要领。后来就喜欢看传说中的野鸡博客的源码讲解,或者看同事的代码,就造成了我的代码质量不高,可能是他们也菜,哈哈哈哈哈哈,开玩笑。 Tomcat & Jetty 是我目前最需要看的一门课。因为公司用的是 Tomcat,最近研究了 LeanCloud 的后台,他们是 Jetty。趁着这个机会可以多研究研究 Servlet 相关的知识。
    4
  • 熊斌
    最近在读SpringFramwork的源码,我的方法是书+源码+实践,三者结合起来学习的话效果会好一点,但比较费时。遇到的难题是想要将学到的内容输出到博客中,动起手来发现很难,而且Spring系列的博客实在太多了。
    4
  • enjoy
    1 阅读源码的重要性:是提高编程能力和学习开源框架的最佳手段。 明确看代码的目的: a 学习设计思想,抽象逻辑 b 学习代码实现细节,奇技淫巧 2 读源码遇到的问题:大部分情况下,读不下去不是方法不好,而是投入度不够。 3 读源码的方法: a 选择好的项目:口碑好,应用广,文档完善,测试用例多 b 自顶向下:先搞懂整体脉络,再按照模块阅读,把类和函数之间的关系记录下来 c 看测试用例,会更容易看懂 d 看不懂时,不要放弃不要慌。做好笔记,暂时跳过,等看懂其他的再回来看,更容易看懂。 e 千万不要陷入细节中。如果代码细节不重要,那么可以暂时忽略 f 需要顺手的工具。vim,vs等 4 最重要的:不是工具和方法。而是去读,而且遇到困难时,能够坚持,咬牙,最终看懂。
    2
  • 熊猫
    从主要接口,一边看一边画UML图,防止迷路,😂
    2
  • 迷羊
    先看接口,理解架构起,然后再看细节。
    1
    2
  • 开心
    我先从读帮助文档做起吧
    1
收起评论
显示
设置
留言
15
收藏
99+
沉浸
阅读
分享
手机端
快捷键
回顶部