工作七年以来,陆陆续续向社区提交了一些源码贡献,即Pull Request,简称PR。对于一个热爱技术的开发人员来说,能读懂被业界广泛使用的开源框架里的代码,甚至回馈社区,将是一件莫大的荣耀。下面简单聊聊这件大事,可能限于知识水平有些不足或片面的地方,希望多多理解。
一、我目前的社区贡献
以下列出的内容都满足如下条件:被社区merge;在业界足够知名;完全由自己提出并解决
1、Presto
(1)14007
使kudu connector支持kerberos认证,且在续期有效期过了后能自动获取新票据
(2)14422
删除连接器时新增清理PlanOptimizerProvider,修复核心模块的bug,为以后添加动态加载连接器功能打下了基础
2、Flink
(1)12442、12789
官方文档的flink事件时间章节
(2)12748
官方文档的数据类型章节
(3)12794
官方文档的用户自定义函数章节
二、重要性
1、对公司业务
我们在大数据系统中使用的绝大部分基础设施都是基于开源软件的,很多开源软件都具有版本更新快、文档不充分的特点,如果能读懂源码,我们便能做到知其然更知其所以然,小到可以充分理解某配置参数的含义从而优化系统性能,大到可以修改源码添加、优化功能以满足公司业务场景的需求。所谓外行看热闹,内行看门道,在软件行业尤其是大数据领域,那些ppt、营销包装过的数字其实并没有多大意义,反而是对开源社区的贡献可以体现一个公司的技术价值,在立足于以技术赢得市场的行业里,做好开源或技术文档输出是非常重要的。
2、对自身技术发展
我相信对每一个立志做技术的从业人员来说,都不想满足于只做个sql boy或crud boy,想提升自己的技术架构水平,那怎么办,按大牛们常说的把《深入理解计算机系统》、《java编程思想》这类有名的大部头经典读一遍吗?不尽然,至少对我来说不是。在我看来,编程技术首先是一门实践型的技术,搞懂一个知识点对我的刺激远比不上自己的代码解决了一个个具体的业务场景,看着自己的代码运行在众多的机器向很多人提供高效安全的服务,我想这就是我作为一个技术人的浪漫,在其中我能感受到高层次的多巴胺,那是一种强烈而持久的快乐。而想得到这种快乐,最好的办法就是向业界某些关键领域如流计算、OLAP里最流行的开源社区输出自己的贡献,当然即使发现社区已经足够完善难以进行贡献,阅读这些开源社区的代码本身就像攀登高山一样,不断地磨砺自己的心智,提升自己的技术水平。
三、方法
1、把握技术架构和关键特性,熟悉扩展机制
技术架构和关键特性是我们阅读源码时要遵循的基本思路,比如得知一个开源框架是Master/Worker架构,在看系统加载运行的源码时要有目的地去看Master、Worker相关的代码。
官方文档一般会讲解有关扩展开发相关的内容,这部分内容要重点去看,比如Presto官方提供了SPI文档,有一些介绍和示例,可以帮助我们快速掌握扩展方法
2、切忌追求完全看懂,多用跳跃式思维
当然这个跳跃式思维不是说看不懂了就跳过,而是看懂基本的意思即可,或者合理脑补出晦涩难懂的部分,然后跳到下一部分
每个开发人员的思维习惯、技术优势都是不一样的,这就导致同一种功能在不同人手上会有千差万别的实现方式,如果我们一旦陷入这种差异而无法脱身,将会很大程度拖延进度,也可能丢了西瓜捡了芝麻走上弯路,更可能产生强烈的挫败感以至知难而退。
更可取的方式是领会作者的意图即可,不用过分深究实现方式,领会代码的编写框架和意图是核心,有以下方法:
- 方法、接口、变量名都一般蕴含了意图的概要信息
- 注释信息包含了大量的详细解释
- 若一个功能有示例实现,可以重点看这个示例,屏蔽了很多技术细节,便于理解
- 代码一般是由少到多、由简单到复杂,可以看看老版本的实现
- 查这个功能相关的pull request,里面会有作者一些开发思路和意图
3、敢于动手,大胆验证想法
当我们有了一个想法时,不要停留在思想层面,可能这就是一个很好的灵感,大胆在源码上进行修改、编译后验证自己的想法,若没达到预期,这很正常,从运行日志里找问题原因,排错后解决问题,或者开启debug运行模式,看函数跳转的逻辑和关键值的变化。一步步靠近想要的结果
4、分解任务,循序渐进
不要追求一蹴而就,可能最终要实现一个很复杂的功能,但可以先将这个复杂功能分解为核心功能、附加功能、优化功能
比如要实现presto kudu数据源的kerberos认证功能,核心功能是kerberos认证,附加功能是配置kerberos连接信息让presto可以感知到,优化功能是可在不重启presto的情况下感知到kerberos连接信息的变更