程序员写代码要看源码?

网站建设,网站制作,网站开发,网站搭建,就相当于做完练习题后不对答案,根本就不知道自己写的好还是差,

自然就无从进步!

只有看了优秀的源码,才能知道自己哪里写的不好、哪里可以改进!

否则就是闭着眼奔跑,往往费力不讨好!


我是一名具有十余年软件开发经验的老码农,负责设计并实现了多个系统或平台。

同时,也是《分布式系统原理与工程实践》《高性能架构之道》等书籍的作者。这些书籍有的连续多年登上JD的书籍畅销榜、有的被高校选作教科书、有的甚至在台湾地区发行繁体版。

另外,也参与了一些开源项目的开发。

今天,分享一下自己学习编程的经验,希望能帮到大家。


1. 为什么要读源码?

首先我们要明白一个道理:编程没有什么特殊的,它是”科学技术->技术->工程技术“中的一个小的类别。

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

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

主要有两个阶段:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

2. 怎么读源码

2.1 步骤

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

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

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

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

2.2 方法技巧

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

例如一些常用的方法:

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

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

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

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

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

但我保证,只要你读完一个项目的源码,就会收获巨大。

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

行业起起伏伏,

只有学好技术,有真本事,才是立身之本啊!


评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注