池建强的公开课

讲讲咱互联网行业自己的故事

个人成长,观点,认知, 软技能

池建强 极客时间创始人、墨问西东创始人

第254期 | 对话胡夕:我是怎么阅读源码的

讲述:池建强 大小:11.82MB 时长:00:12:18
00:00
1.0×

你好,这里是卖桃者说。

跟读者朋友们同步一个消息,之后卖桃者说会开一个新系列,邀请一些技术大咖来做客聊聊天,如果你有感兴趣的老师,欢迎留言告诉我。

今天有幸邀请到的是胡夕老师。胡夕老师先跟大家打个招呼吧。

胡夕:卖桃者说的朋友们,你们好,我是胡夕,非常感谢池老师的邀请。

我现在在友信金服商业智能部任总监,主要负责集团用户画像、商业流量变现等相关工作。同时,我也是 Apache Kafka 社区活跃的参与者和代码贡献者。去年,我在极客时间上开设了一个关于Kafka技术与实战的专栏,反响还不错,最近又开设了一个关于源码的专栏《Kafka核心源码解读》,不知道在听的朋友们有多少是我专栏的订阅者。

池建强:胡夕老师是我们的老朋友了。极客时间的很多读者都对如何为技术社区做贡献非常感兴趣,胡老师跟大家分享一些你在社区的经历和贡献吧,有没有遇到过一些有意思的人或事?

胡夕:社区还是很有意思的。目前呢,我在社区的Contributor List上排在第21位,应该算是国内比较活跃的代码贡献者了。我查了下自己的PR List,前前后后大约为社区贡献了近100个功能修正或改进。我举一个比较有意思的来说下。

记得之前做视频直播的时候我说过Kafka有个KIP网站,也就是Kafka的新功能提案,里面保存的是提交给社区审核的各个Kafka新功能改进。其中有一个是我完成的,即KIP-223。这个提案为Kafka的Java Consumer引入了Min Lead监控指标。

在2.0版本之前呢,Java Consumer端只有Lag JMX指标,用于监控消费进度的滞后程度。这个指标有一些小缺陷,那就是滞后的消息数在某种程度上并不直观。举个例子,如果一个Consumer的Lag数是10万条消息。我们的直观感受是这个Consumer滞后很严重,对吧?其实不是的。我们要结合分区的总消息数来看。如果该分区总共只有20万条消息,那么落后10万条是非常严重的滞后;倘若该分区有1亿条消息,那么落后10万条消息其实也还不错了,不属于太严重的滞后。

Lead指标就能比较好的规避这个问题。Lead指标计算的是Consumer与分区当前最小位移值的差值,如果接近于0,那么我们直接就能判断出该Consumer非常滞后了。这就是这个KIP的作用。

其实不光是KIP,我还为社区贡献过很多BugFix。总的来说我参加社区这几年还是很愉快的。我一直认为,相比于其他开源社区,Kafka社区非常的开放和民主。在这里大家彼此不含任何偏见地讨论问题。只要你提出的意见有足够的说服力,社区一定会采纳的。

另外社区里面的大神很多,大神的种类也不尽相同。有的大神对于Kafka组件的架构和源码非常熟悉,有的甚至是一看到异常就能定位到有问题的代码;而有的大神“剑走偏锋”,用自己独特的技能帮助社区,比如社区的Ismael Juma。

这哥们儿可是个神人,如果你查看社区的贡献榜,可以看到他以480个Commit高居榜首。Juma主攻的方向并不是具体的组件,而是专注于Kafka外围支撑系统。比如,构建Kafka的Gradle是不是该升级了?Kafka支持Java和Scala语言的版本是什么?这些问题都是由他负责的。也正是从他身上,我认识到参与社区的形式可能是很多样的。

池建强:以前更多是国外的程序员和公司在开源领域做贡献,近几年国内开源氛围也越来越好,很多程序员都在参与开源工作。不过,参与开源第一步就是读别人的源代码。你最近在极客时间上开的专栏是关于 Kafka 源码解读的,那你是如何跟阅读源码这件事结缘的?阅读源码的习惯给你的工作和成长带来了哪些价值?

胡夕:最开始阅读Kafka源码是为了解决生产环境上碰到的一个实际问题。那是几年前的事情了。那时候网上的资料和文章非常少,碰到问题通常只能求助于社区或自己啃代码搞定。当时选择了直接看源码自行解决。后来发现效果还不错,于是就萌发了读整个代码的想法,后面就慢慢坚持了下来直到今天。

养成阅读源码的习惯主要有3个方面的好处:

第一是能够直接帮助我解决实际工作中碰到的问题,比如专栏里每一讲我都会尽可能地分享一个实例出来以证明此话不虚。

第二是起到了触类旁通的作用。尽可能地多地阅读优秀开源框架源码对于我们提升自身技能是有巨大帮助的。阅读Kafka源码积攒起来的方法和经验可以让我快速地上手其他框架的阅读,缩短学习曲线。

第三就是培养了自己的毅力。很多人觉得这可能是本末倒置了,难道不是因为个人毅力很强才能坚持源码阅读吗?其实,日复一日地阅读源码也在不断地磨练着我们的毅力和执行力。从某种程度上说,毅力和执行力的提升可能比技术本身的提升还要来的弥足珍贵。

池建强:大家都知道阅读源码、弄懂源码很重要,但这事儿很难,“我到底该如何开始,又该如何坚持下去”,可以说是所有人都会遇到的困难了。能跟大家分享一下你是如何阅读源码的吗?有没有一些技巧、工具、心态分享?

胡夕:就像前一个问题收尾时说到的,毅力或执行力对于我们长久地坚持源码学习至关重要。我见过很多人一时兴起,比如今天花上几个小时的时间兴致盎然地读代码,但是没有明天了。这对于学习源码这件事情是要不得的。

毛主席就曾经说过“世界上怕就怕认真二字,共产党就最讲认真”。我虽然不是党员啊,但是我对此话深表赞同。我最开始读Kafka源码时,实际上每天的进度是很慢的。有的时候我一天只读400-500行代码,因为我觉得如果我在今天能搞懂这500行代码都做了什么,我就已经胜利了。我不着急的,我知道这是一个持之以恒的工作。因此这里有个小技巧或建议给到大家,不要贪多!每天阅读源码的长度不要太长,给自己一个消化的时间。

另外,阅读源码常发生的情况就是自己读不懂某部分的代码。实不相瞒,即使是现在,Kafka中依然有些代码我没有完全搞懂。没关系,读不懂的代码,你可以选择先跳过或者暂时忽略。

如果你是个追求完美的人,那么对于读不懂的代码,我给出几点建议:

  1. 多读几遍。不要小看这个朴素的建议。有的时候我们的大脑是很任性的,只让它看一遍代码它是很傲娇的,多给它看几遍,也许突然就福至心灵了。
  2. 结合各种资料一起攻克,比如社区或网上关于这部分代码的设计文档,源码注释或者源码测试用例等。特别是搞懂测试用例往往是让我们领悟代码精神最快捷的办法了。

最后还是要提醒大家,学习源码是一个长期的工程,不要幻想有捷径或一蹴而就。坚持下去,后面的收获自然是水到渠成的。

池建强:做任何一件事,坚持一下,就可以超过大部分人了。但坚持学习真是挺难的,尤其是学习遇到问题的时候,否则大家都成专家了。你之前阅读源码的时候有没有踩过什么坑?后来又是怎么解决的?

胡夕:要说踩过哪些坑?那实在是太多了。首先便是提问和回答问题的艺术。

由于社区都是使用英文进行交流,而英文不是我们的母语。因此我们很多国内开发者在参与社区与别人进行交流时会显得比较吃力。很多人在描述问题时因为怕露怯,所以不敢过多表达自己的意见,从而造成交流障碍。我自己也犯过这样的错误。实际上,英文水平不高更要求我们在问题描述或交流时多说多写,尽可能地把我们的意思表达清楚。如果我们觉得用英文无法表达出我们的意思,可以使用举例的方式让人家看明白。

其实,关于这个问题我最大的感受就是不要把自己封闭起来一个人阅读源码。要多多参与到社区或是其他的论坛组织——比如咱们极客时间的部落或留言区就是一个特别好的地方。在这里大家可以一起讨论学习,这种学习效果绝对比你一个人关上门修炼来得高效。

我自己就有过这样的亲身经历。之前在学习Cleaner组件的代码时,我理解起来特别困难,后来,通过相关的几个JIRA和Cleaner的作者饶军大神直接进行了交流,顿时我就明白了源码的作用。当时我就想,我太傻了,何必一个人去啃代码呢?碰到问题直接和社区的人交流是最事半功倍的了。

池建强:的确是这样,有时候埋头苦读,不如走出去跟大家交流交流,会有意想不到的收获。最后,对于即将或已经开始阅读源码的同学说一句话吧。

胡夕:大家都是老百姓的孩子,谁也不比谁笨。就是希望大家能够坚持下去。你若盛开,清风自来!

池建强:学习源代码是成为优秀工程师的必经之路,我也送大家一句话:但行好事,莫问前程。回报就在未来等你。

再次感谢胡夕老师,在这里为极客时间打个广告,如果你对阅读源码感兴趣的,或者之前尝试读了却没有入门,推荐大家订阅《Kafka核心源码解读》这个专栏,不仅有老师带着学,还有其他同学一起交流,学起来肯定事半功倍。

胡夕老师还给卖桃者说的读者提供了专属优惠口令,具体信息,你可以点击文稿中的图片查看。

卖桃者说,明天见。

(编辑:夏天)