所有分类
  • 所有分类
  • 实时新闻

程序员阅读源码是一种什么心态?源码对编程意义何在?如何才能更好阅读代码?

题目有三问,我就先一一回答。

然后还会介绍阅读源码的方法。

因此,全文目录如下:

  • 1. 程序员阅读源码是一种什么心态?
  • 2. 源码对编程意义何在?
  • 3. 如何才能更好阅读代码?
    • 3.1 时间维度带来的困难
    • 3.2 空间维度的困难
  • 4. 阅读源码的步骤
  • 5. 阅读源码的方法

1. 程序员阅读源码是一种什么心态?

程序员阅读源码往往出自于:迷茫

你做了很多项目,写了很多代码,但是总感觉自己缺点什么,不知道自己的项目涉及的是否得当,不知道自己的代码书写的是否合理。这时,你会感觉到迷茫,这种迷茫会促使你去阅读代码。

有一段时间,我觉着我非要阅读开源项目的源码不可。

那时,我已经在公司负责设计和开发了许多系统。如果连大学时带领大家开发和维护学校网站也算上的话,我已经进行软件开发整整十个年头了。在这十个年头里,我对自己设计和开发的系统都很有信心。但却有一个疑惑一直在我心头萦绕:我不知道,我的架构和世界最优良架构之间的差距到底有多大。

阅读开源项目的源码能给我答案。

许多优秀的开源项目历经数千开发者的数万次提交,被数亿用户使用。这些项目从可扩展性、可靠性、可用性等各个角度考量,都是十分优良的。通过阅读这些项目的源码能让我找到自己在软件设计和开发上的不足。

于是我开始了我的源码阅读计划。

在阅读源码的过程中,我看过不少资料。但很多资料对于源码中简单的部分讲解的细致入微;而对复杂的部分则避而不谈或含糊其辞。 在阅读源码的过程中,我也走过了不少弯路。经常在一个难点中挣扎很久不得前进。

当然,阅读源码也让我收获颇丰。它不仅让我知道了自己的设计与优良设计之间的差距,还让我学到了许多的架构技巧、编程知识。在源码阅读的过程我也总结出了许多的经验和方法。

这时我才发现,阅读源码的意义所在。

2. 源码对编程意义何在?

总有人问:该如何提高编程技术?

这实际上内嵌了一个假设,就是说编程技术是一项十分特殊的技术,神乎其神。

其实,编程没有什么特殊的,它是科学技术->技术->工程技术中的一个小的类别。

明白了这一点,如何提升编程能力便变得显而易见了。因为,关于学习科学和技术,我们经历过十几二十年的训练。而且,这一训练是极有成效的(相比于国外的一些欢乐的训练方法,这里仅作提及,不展开争论)。

这时你可以回顾自己学习某一门课时,在什么时候有突飞猛进的感觉。

主要有两个阶段:

  • 初学阶段。对,就是上课听讲。这时我们通过课本学习基本的知识,经历从无到有的质的变化,每天都能学到大量的新知识,进步神速。
  • 训练阶段。对,就是课后练习、以考代练。这时我们主要是通过做题,或者工程实训,将学到的基本知识用到实践中,并不断地反馈纠正自身的知识,最终建立知识体系和经验。这时你会常常有恍然大悟和醍醐灌顶的感觉,原来这定理这么用,妙啊!

而其他的一些复习阶段、熟练阶段,则进步较小。常常许久感觉不到什么进步。

反映到编程上,也是一样的。一个人编程能力突飞猛进的阶段主要有两个:

  • 学习基本编程知识、环境。这一阶段是一个纯粹学习的过程,例如你在学习一门编程语言的语法,或者在学习一种算法。这个阶段重在学习的知识是正确的、成体系的。这点是容易实现的,只要确保自己使用了正规的业界认可的教科书,而不是什么《二十一天学会XXX》之流,应该问题不大。这个阶段你自己也能感受到自己的进步。
  • 不断训练纠正提升。这一阶段又可以拆分为两部分:
    • 第一部分:不断训练。相信这一点很容易实现,毕竟有很多程序员都昼夜兼程,急速狂奔,把头发都甩在脑后了。相信这个训练量是足够的。
    • 第二部分:收集反馈,不断改进。这一点对于许多程序员而言是极为欠缺的。试想,你做完哪个项目后,会有专家告诉你哪个地方设计的不好,更好的设计方案是什么;你写完哪段代码后,会有大神告诉你最好是怎么写,可以获得哪些提升。以上的这些机会是进步的机会,但是,我相信是极少的。

所以,程序员进行了大量的编程作业,却没法收集到足够的反馈。这就像写完了作业,考完了试,但是没人老师给你批改,也没人告诉你正确答案。那你是很难进步的,因为你不知道自己做的对不对!

于是只能在莽撞的试错中前进,这就是成长缓慢的原因。

然而,各种原因,例如教会徒弟饿死师傅等,外加码农领域本来就是年轻更吃香,年老被裁员,所以,想获得前人的反馈难上加难。

但是,有一种反馈是存在的,或者,有一种标准答案可以被你拿来作为反馈。这种答案极为标准,比你周围大神写出的代码还要优秀!

对的,我说的是开源项目的源码。

优秀开源项目的源码经过了几千人的上万次修改,极为经典。这是极好的标准答案,就和课后习题的标准答案一样。

你要用这些优秀的开源源码作为答案去校准自己写的代码:

  • 源码的包是如何划分的,你是怎么划分的?
  • 源码的类是怎么定义的,你是怎么定义的?
  • 源码的分支是如何拆分的,你是怎么拆分的?
  • 源码的架构是怎么规划的,你是怎么规划的?
  • 源码的异常是怎么处理的,你是怎么处理的?

当你阅读源码时,你会不自觉地和自己的代码对比。在这个过程中,你就进步了。

好了,除了学习基本编程知识、环境外,另一个让自己编程能力突飞猛进的途径你已经知道了——阅读和学习优秀开源源码

3. 如何才能更好阅读代码?

阅读源码其实很难。

当我们阅读一份源码时,需要面对的困难通常有:

  • 难以归纳的凌乱文件
  • 稀奇古怪的类型组织
  • 混乱不堪的逻辑跳转
  • 不明其意的方法变量
  • ……

所以很多人即使知道阅读源码的好处,也坚持不下来。就因为以上困难难以克服。

而阅读源码的难,是正常的。

3.1 时间维度带来的困难

从时间维度上看,每一个优秀的工程项目都经历了从雏形到成熟的曲折演化过程。而整个过程都会被映射到一个时间点上,肯定很难。

于是有人提出了阅读源码时,从第一次提交开始阅读的主意。我要说一下,这是错误的!

这是一种纸上谈兵式的错误,提出这种方法的人肯定没怎么读过源码。事实上,我也有过这种想法,然后在实践中很快被抛弃了。

如果一个项目只经过了几次提交,这种方法获取可行。而一个优秀的通常有几千上万次提交,将这几千上万次提交都读完,工作量要比把当前最新版本的代码读完难的多得多!因为其时间维度的复杂度比空间维度复杂度大得多了。

我用下面的图片展示了项目发展的过程,一个项目从版本1到版本n,逐渐完善。版本1一般是最简单最基础的,但是,要想从版本1读起,一直读到版本n,可能要阅读几千个版本。难度极大,远不如直接去读版本n。

程序员阅读源码是一种什么心态?源码对编程意义何在?如何才能更好阅读代码?

还有,许多项目的第一次提交并不是只有几行代码的init项目,往往第一次提交就是几百个类。而且,初期的代码组织还比较混乱。毕竟,作者也不知道该项目能火,往往比较随意。

更别说,历史提交中还夹杂很多的Bug、回退、依赖包升级等等。想要把每次Bug、回退、依赖包升级所产生的历史背景都搞清楚,这几乎是不可能的任务。

3.2 空间维度的困难

每一个优秀的工程项目都凝聚了众多开发者的缜密思维逻辑,而这些逻辑都被投射到了平面的代码上。这使得阅读源码的过程成了逆推开发者思维逻辑的过程,显然,逆推是很难的。

不过,这方面的困难真有解决方案:详细了解开源项目的功能,然后自己琢磨该如何实现

这样,就将逆推的过程转化为了正向推导+验证的过程,这样就相对简单了。

但无论如何,阅读源码总不会太简单。于是有人说读懂源码比编写源码更为困难,想必也是有一定道理的。

4. 阅读源码的步骤

阅读源码推荐按照下面的步骤进行:

  1. 了解项目的背景。这相当于了解了项目的需求。
  2. 充分了解项目的功能,并熟练使用。我们说过,将逆推的过程转化为正向推导+验证的过程是阅读源码的一个重要方法。而了解项目的功能是这个方法的基础。
  3. 调试代码。通过断点调试,掌握整个代码的流程走向、主次关系、依赖关系。
  4. 划分源码。根据每个包、模块的功能不同,将源码划分为几个部分。
  5. 由底层到上层,逐个击破。先阅读不依赖其他模块的,或者依赖其他模块比较少的基础模块。然后逐步上移,完成整个项目源码的阅读。
  6. 横向总结。在由底层到上层阅读完成后,横向以功能点为维度串联源码的实现逻辑。

一般情况下,一个项目的源码要在3~4个月左右读完。否则,可能读到后面的,已经忘记前面的功能了。

当然越快越好,但考虑到我猿们还要加班,时间太短了不太现实。

5. 阅读源码的方法

有人说读懂源码比编写源码更为困难,不无道理。而源码阅读和软件开发一样,是一个非常综合的能力,没有一个万全之法。但有很多不错的方法。

例如一些常用的方法:

  • 调试追踪:多数情况下,当我们对某些变量的含义产生疑惑时,借助开发工具的调试功能直接查看变量值的变化是一个非常好的方法。而且该方法还能指引代码逻辑的跳转过程,对于理解源码极为有用。
  • 归类总结:优秀的源码都遵循一定的设计规则,这些规则可能是项目间通用的,也可能是项目内独有的。在源码阅读的过程中将这些设计规则总结出来,将会使得源码阅读的过程越来越顺畅。
  • 上下文整合:有些对象、属性、方法等仅仅通过自身很难判断其作用和实现。此时可以结合其调用的上下文,查看对象何时被引用、属性怎样被赋值、方法为何被调用,这对于了解它们的作用和实现很有帮助。
  • 类比阅读:如果存在实现某功能的两条或者多条路径,可以类别阅读,找出他们处理逻辑的不同。

还有很多方法,不再一一介绍。因为没有实在的源码案例,光介绍显得很浮。

如果大家真的决定阅读源码,开始提升自己架构能力和编程能力的新阶段,可以阅读《通用源码阅读指导书——MyBatis源码详解》。

是一本以MyBatis源码为材料,详细介绍源码阅读相关方法和技巧的源码阅读指导书籍。

该书以实际开源项目MyBatis为例,详细介绍了源码阅读的经验和方法。在源码阅读中,透彻分析了相关的背景知识、组织方式、逻辑结构、实现细节。在本书的讲解中,不漏过每一个类,不跳过每一个难点,做到深浅一致。并对这些源码阅读方法进行了进一步的总结整理。

因为我是这本书的作者,自夸的话不多说了。

而且,事实上,这本书的销售情况已经十分火爆了。

甚至,这本书还被台湾地区购买了版权,繁体版也开始发售了。因为台湾地区市场很小,出版社很容易亏本。因此,凡是台湾地区购买版权的书籍一般都是受到多方肯定的。

不过繁体版卖的也确实贵,我算了下,折合人民币200+。

程序员阅读源码是一种什么心态?源码对编程意义何在?如何才能更好阅读代码?
繁体版封面

​阅读源码会使你有很大的提升,但是这个过程也确实需要你沉下心来慢慢进行。

编程的进步之道就是:

多学,多练,但千万别忘了对答案!

最后,用书籍前言中的一句话结尾。

程序员阅读源码是一种什么心态?源码对编程意义何在?如何才能更好阅读代码?

我是高级软件架构师易哥

欢迎关注我,我会偶尔分享软件架构编程方面的知识。

原文链接:https://www.w1ym.com/83123/,转载请注明出处~~~
0

评论0

请先

站点公告

【温馨提示】 本站不建议您对本站支付任何费用或开通任何会员本站99%资源为免费资源只提供共享不提供技术支持,本站资源主要以学习开发为主,本站是为个人资源记录学习研究等情况而建立,如特殊原因下载,需在24小时删除相关资源。本站资源均来自互联网收集或网友分享,若有侵权,请联系站长删除,谢谢。立即查看
显示验证码
没有账号?注册  忘记密码?