You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

60 lines
7.1 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 结束语 | 源码学习,我们才刚上路呢
你好我是胡夕。《Kafka核心源码解读》课到今天就告一段落了又到了和你说再见的时候。
当初接下这个任务时,我记得小编和我说,咱们这个课程将会是极客时间的第一个源码类的专栏课,我顿时觉得既自豪又忐忑。
自豪的是我能够作为首个源码专栏课作者给你分享Kafka源码的学习心得忐忑的是源码并不好讲如果讲解的粒度太粗就会流于表面不够深入而粒度太细的话就很容易陷入流水账似的代码走读这其中的度需要仔细拿捏才行。
不过,我依然还是愿意试一试。
因为我始终觉得,现在的编程教育对于阅读源码的重视程度远远不足。一直以来,学校或各类培训机构只看重编程技能的灌输,而忽略了带领大家一同学习业界流行框架的源码编写方法,但这恰恰是非常关键的。如果你没有阅读过大量质量上乘的代码,那么,你就不可能写出优秀的代码。
就像美国作家斯蒂芬·金所说“If you dont have time to read, you dont have the time (or the tools) to write. Simple as that.” 虽然这句话是关于写作的,但是对于我们写代码来说,同样也是适用的。学习比自己更有经验的人写出的源码,一定会直接或间接地影响你自己的编码水平。
我曾在[开篇词](https://time.geekbang.org/column/article/222935)中提到过阅读源码的3个好处但实际上对于一个每天都要写代码的程序员来说**我们阅读源码的最大目的,就是能够写出更好的代码**。这么多年阅读Kafka源码的经历让我对此深有体会因此我很想把我的阅读经验整理出来分享给你尽可能帮你更加科学高效地阅读源码从而写出更好的代码。
从2019年12月开始筹备这门课到今天交付完成共经历了近八个月的时间我精心挑选并讲解了Kafka Broker端主要组件的核心源码。我个人觉得总体上还是成功的。有很多模块的源码分析我自己在写的时候都收获良多。因此我在想如果你认真地学完了前面的内容应该也是有些收获的。
当然,无论你眼下掌握了多少,这些在过去更新的知识就停留在过去了,等着你时时去翻阅,去消化,去借助它们解决现在以及未来的问题。此刻,我们就要暂时跟它们说再见了,我想再和你聊一聊未来的事情,未来学习源码的事情。
课程结束后你应该如何继续你的Kafka源码阅读计划呢我根据自己的经验再给你分享一些建议。
**首先我建议你研读一下Kafka Clients端的代码**。
你可能会问难道不是应该先阅读Broker端其他组件的代码吗为什么要读Clients端的代码实际上Clients工程包含的已经不仅仅是客户端的源码了它还包含了各类支撑服务器端组件的基础代码比如通信通道、消息集合等等。了解它们的实现可以补齐你对Kafka代码框架的整体认知。**通读并搞懂Clients和Core工程下的代码是精通Kafka实现原理的必要步骤**。
**其次把课程中涉及到组件的测试用例代码学习一遍最好是打上断点边运行边Debug**。很多时候,光看组件实现源码,还是会很难理解它真正运行起来是什么样的,而测试用例就能够很好地带领我们一探究竟。
我举个真实的例子。当初我自己学习Log Cleaner源码时就非常吃力。我把LogCleaner类看了很多遍却始终不得要领。后来我突然想到不是有个LogCleanerTest吗于是我就翻开里面的各种test×××方法挨个儿琢磨终于明白了这个组件实际的工作原理。因此我想特别提醒你一句千万不要忽视测试用例代码的威力。
**最后你一定要读一读Log Cleaner组件的代码**。
它主要用于完成带Key消息的日志清理在其他场合的出镜机会不多所以我并没有专门在课程里讲它但是它其实也是Broker端非常重要的组件。
我们熟知的位移主题,就是依靠这个机制,定期删除过期位移消息和过期注册消息的。事实上,清除过期数据或重复数据,是任何一个数据存储系统都要解决的关键课题。这个组件的代码量不多,你可以在很短的时间内掌握它。
Okay现在阅读的方向有了但你依然可能会遇到一个难题那就是看不懂怎么办
虽然我给出了一些源码阅读方法,但是,毕竟,理解别人写的代码是一件很有挑战的事情,因此,我的答案是:“别着急!”
刚开始时你可能压根不知道某个方法或类的代码是做什么的这是非常正常的现象。这个时候你要做的就是初步了解一下代码结构和轮廓知道有哪些类类中定义了哪些API。这就像学习写作一样努力搞懂一些知识范畴之外的代码就可以扩大你的代码功力的外延。如果一直徜徉在简单、枯燥、易理解的代码海洋中就很难真正地有所进步。
同时,你也不要幻想,代码只读一遍就可以了!阅读源码这件事,一定要重复很多次之后,才会有“质”的变化。
不知道你是否听说过“洋葱源码阅读法”,它指的是,我们读源码,就要像剥洋葱一样,第一遍的阅读仅仅是获取整体项目结构和概要,接下来的多遍阅读,才会逐步揭开代码的本质。切记:**每次只剥一层**。
除此之外,如果说我还有什么私藏的方法,那就是亲自动手去修改源码。
实际上只有你对阅读的代码进行了一些改进或变更才能真正地体会到阅读源码的快乐。因此在阅读Kafka或其他框架的源码时你不妨亲自动手改一改代码做一些实验Debug一下去体会一下你所做的改动给Kafka带来的变化。相信我你会爱上这个过程的。
**最后,我还想说的一点是,不要恐惧**。阻碍很多人阅读源码的第一大原因就是恐惧。一想到有那么多行代码要读,就本能地竖起了放弃的大旗。其实,再宏大的框架,也是一行行代码堆砌起来的。我一直秉承着一句七字箴言:**你敢写我就敢读**!现在我把它送给你,希望在你想要放弃的时候,把它拿出来,鼓励一下自己。
好了,这一季的课程就到这里结束吧。今天没有太多华丽的表达,全部都是一些朴实的建议。其实,所有的一切,我其实都只是想说,源码学习,我们才刚刚上路。
阅读源码仿佛一场漫长的登山之旅,半山腰很挤,我们山顶上见。
我给你准备了一份[结课问卷](https://jinshuju.net/f/a88osf)希望你能在问卷里聊一聊你对这门课的看法。欢迎你点击下面的图片用12分钟时间填写问卷期待你畅所欲言。
[![](https://static001.geekbang.org/resource/image/13/1a/13edef1ac4708f68b31d98cd93c8051a.jpg?wh=720*505)](https://jinshuju.net/f/a88osf)