开源代码难阅读?几位研发的“妙招”帮你解决
毫无疑问,开源已经成为未来软件发展的一大重要趋势。对于企业来说,开源能够进一步提升产品的影响力,拉近与用户的距离,那对于程序员来说,开源又能带来什么呢?作为程序员的你,是否也会产生这些困惑:工作这么忙,哪有时间参与开源项目?程序员如何才能加入到开源项目中去?阅读一份开源代码都很难,更别提去 Review 代码了……为了找寻答案,我们沟通了几位深入参与了开源项目的研发同事,把他们的相关见解进行了整理和总结。
首先要了解你自己,参与开源项目的初衷是什么
分享人:涛思数据研发工程师 唐方智
作为一个有经验的程序员,大大小小的项目我也参与了不少,程序员圈子里的一个现象是,在做项目开发时总是觉得被赶着跑,这或许也是大环境下的一种无奈。对于这一点,我后面开始有意识的调节,方法之一就是积极地参与开源项目,和众多开发者一起协作、分享、鼓励,这种心情也得到了极大地改善。
我参与开源项目起源于一次偶然的尝试,因为帮助同部门的一个伙伴排查代码缺陷而入的坑。大概情况是,他认为一家开源社区的代码写的不好,就自己改了一下还提交了 PR,结果被人驳回了,他不相信自己代码有问题,觉得这个开源社区有些针对他,就拉着我一起排查。但在排查之后,我们发现确实是他改写的代码有误,之后我俩合作修改后再次提交了 PR,令人高兴的是,很快就收到了 GitHub 发来的合并成功的通知邮件,还收获了社区代码管理人员的一个大大的赞。
这次经历让我觉得诧异的一点是这个社区的开发者水平,实话讲,我帮着修改的代码提交确实有点难度,如果没有资深的内核开发功底是很难处理的,但社区的开发者对于细微的对错也能很快分辨出来,其功底之强让我眼前一亮,对这个项目也产生了很大的兴趣。
基于此,我关注了这个开源项目并成为了它的 Contributor,后面还参加过他们组织的 Meeting Up,也和社区的开发者频繁地探讨技术问题,令我惊喜的是,在这个过程中,我对此前略感枯燥的开发工作有了截然不同的热情。究其原因,我觉得是因为开源社区和封闭部门集中开发的工作模式完全不一样,在这里你能遇到同道中人,既能沟通技术,也会 Battle 方法,而这些社区开发人员也带着一股对技术油然而生的热爱,并没有像企业开发者一样被明确的目标和功利追求所左右。
综上所述,我参与开源项目的初衷,一是觉得自己的代码创作得到了认同,二是在日常的工作之余,关注开源项目让我对程序员的日常有了新的感受,也为我打造了一个既能进步又不会产生太多束缚的社区圈子。我们在做任何一件事情时明确自己的初衷和目的是很重要的,如果你明确了自己参与开源的初衷和目的,不仅会干起来更有劲,还能从中享受到乐趣。
有意愿去尝试,但如何行动?
分享人:涛思数据研发工程师 唐方智
我知道还有一些小伙伴,有心想要投入开源,但却迟迟没有找到有效的路径。从参与开源的经验出发,我总结了以下几点方法和路径,给到大家参考:
(1) 圈定几个目标,找到喜欢的项目。多关注 GitHub 上热门的方向,分析这些技术方向和自己想尝试的方向是否匹配,从中选取技术体系和自己相符、应用前景和自己想从事的领域大致相同、并且项目社区活跃、开发者相对丰富、交流也简单的项目。
(2)找到喜欢的项目后,可以多关注一些它们分享信息的渠道,包括微信群、博客、Twitter 、issue 邮件通知、网站信息等,便于你及时地找到社区伙伴,并快速融入其中。
(3)尝试对一些 issue 进行分析和解答。先不要急着提出问题,可以先看下别人都提出了哪些问题,结合你自己的技术实践,看看这些问题是否自己也能够解答,这样基本可以评估出社区开发者的水平。当然,还是要理性地看,期望一个社区中全是资深的精英开发者,那是不现实的。
(4)去排查并尝试解决一些 Bug。在进行漏洞修补的过程中,能让你更好地熟悉代码结构和代码内容,并对代码中的模块有一个全局的认知。
(5)尝试做一次 Pull Request 。结合你对项目的熟悉和理解程度,开始真正地为项目贡献代码力量,可以试着发起一些合并请求,将你的 ideas 贡献给社区,并附上你对项目和代码的思考,看是否能够获取到一些共识。
(6)写一些博客或者技术分享的文章。在文章中可以对项目做一些剖析,去发现项目更多的热点,然后和身边的人一起讨论,和志同道合的开发者融入到一起,也为自己沉淀一些思考。
(7)参加一些线下的 Meetup 。以线下见面的方式结识活跃在社区中的网友,以及项目的开发成员,去了解他们的理念和价值观,并做一些深入的技术交流、行业交流,进一步拓展视野、思维和人脉。
(8)相信自己所做的努力和工作具有长期价值。当你真正身处其中后,你会发现参与开源为自己和参与其中的开发者带来技能提升和精神愉悦等诸多价值,是帮助你实现成功的一个有效途径,强化这股信念,最终让自己热爱协作,热爱共享和开源精神。
我自己也参与过很多开源项目,就拿我目前在参与和建设的 TDengine 来讲,现在基本上做物联网大数据场景的企业,都会将其列为 Database 选型调研的产品之一,接下来随着物联网的快速发展,TDengine 一定还有更大的应用空间。无论是从哪个角度来看,自己参与建设的开源项目能够一直得到发展和维护,这都是一件让人非常愉悦的事情,毕竟它代表着我们对生活和技术的热爱。
我们从开源项目中能获得什么?
分享人:涛思数据研发工程师 温洲
我从开源项目中学到的第一件事就是如何去阅读、理解大量的代码,这也是成为一个专业选手的必经之路。在当下开源已渐趋流行的时代,开源项目也是层出不穷,很多优秀的开源项目源码都是经过实践验证、千锤百炼而成的,和我一样年轻的程序员,可以从这些项目中学到很多课堂上学不到的东西。从自身开源经历出发,我总结了以下四个方面的获得:
- 编码风格。在开源项目中你可以看到各种各样的编码风格,尽可能让自己尝试去适应这些不同的风格。此外,你还能通过代码风格辨认项目专业程度,如果一些项目使用了多种编码风格,那它就会显得不太专业,统一的代码风格对于代码的可阅读性非常重要。
- 编译方式。从开源项目中你可以学习到不同的编译方式,例如:Make、CMake、GYP 还有各种 IDE,学习到如何用各种方式配置你的工程。
- 代码管理方式。从开源项目中你可以学到不同的代码管理方式,例如:SVN、GIT。学会熟练地使用它们,并且高效地运用到开发过程中,这会帮助你更加深入地了解项目分支的管理。
- 解决问题的方式。从开源项目中你可学习到工程师是如何解决问题的,比如如何选择算法、如何选择库、如何把设计转化为模块等,借鉴他们的经验来帮助自己更好地解决工作中出现的问题。
Review 代码真的很难吗?
分享人:涛思数据解决方案架构师 刘溢清
不知道大家有没有这样的感受:阅读一份开源代码太难了,更别提去 Review 代码了;面对一个庞大的开源项目,真的不知道如何下手……我之前也有过这种困惑,直到后来在使用 TDengine 这款 Database 时遇到了一个问题(此时还尚未加入涛思数据)——我需要从 TDengine 迁移数据,官方提供了一个 taosdump 工具,但是导出的数据表有丢失。
当时我第一时间向官方反馈了这个问题,但由于源码是开源的,我就想抱着试试看的心理,自己进行一下修复。随后我就打开了 TDengine 在 GitHub(https://github.com/taosdata/TDengine) 上的源码。
二话不说,gdb 走起:
(gdb) p tableDes->cols[26] $17 = {field = "inspection_well_place", '\000' <repeats 44 times>, type = "NCHAR\000\000\000\000\000\000\000\000\000\000", length = 150,note = "'一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一", <incomplete sequence \344>} (gdb) p tableDes->cols[27] $18 = {field = "\270\211四五六七八九十一二三四五六七八九十一二三", <incomplete sequence \344>, type = "\272\224六七八", <incomplete sequence \345\215>,length = -1159429960, note = "\214三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三四五六七八九十一二三", <incomplete sequence \344>}
随后发现在代码里已经把这个字段截断了,回过头去查看代码,发现这里对导出字符的长度做了限制:
#define COL_NOTE_LEN 128
接下来把这个长度改得更长了一些,编译运行,表就顺利地导出了。我也成功参与到了开源的事情中了,自我感觉还挺良好。
试想一下,如果说当初选择了一个闭源的软件,发生了这个问题或者有了新的需求,我们就只能去联系开发团队,至于什么时候能够修复或者开发都还是个未知数。如果不幸开发团队已经解散,就彻底凉凉了。
除此之外,在我看来开源软件还有很多优点:
- 开源的代码让人更有信心去使用。源码开源,别人就可以去研究底层的实现,可以去证实你的功能和实例。
- 好的开源项目,代码质量更高。越是好的开源项目,越是有更多的人愿意去维护他,久而久之,功能就会越来越完善,代码也会越来越健壮。
- 好的开源项目,代码更持久。一个好的项目不只有作者自己维护,还会吸引更多的开发者去协同,如果作者不再维护,也会有其他的人站出来继续维护。
- 开源的代码可以有更多的客制化开发。没有一个工具可以做到适用于任何场景,每个项目都会有各自不同的需求,我们可以根据需求来定制属于自己的版本。当初阿里选择 Flink 的时候,Flink 也并没有多么完善,阿里也是重构了 Flink 的分布式架构,实现了增量的 Checkpoint 来应对阿里的需求。
通过参与 TDengine 开源这件事,我也给自己建立了信心,发现其实参加开源并没有我们想象的那么难,以至于后来我越来越多地参与到了开源的项目中:
从这件事情说起,不仅是为了分享我是如何踏入开源大门的,也是为了证明 Review 代码真的没有很难,你可以从以下三点出发:
- 需求驱动:对于需求驱动型的人,带着需求去学习,效率才是最高的。很多时候,我们并不需要通读所有的代码,完全可以从自己的需求出发,这样也会充满动力。
- 选择低起点:我们可以从一些简单的模块入手参与到开源项目中,较低的起点更容易上手实践,也有利于更深入地去阅读其他代码。
- 高效使用工具:通过 gdb 等自己擅长的调试工具,能更快地了解代码运行逻辑,了解参数、栈的信息,对于源码阅读很有帮助。
一些好上手的开源项目推荐
分享人:涛思数据研发工程师温洲
万事开头难,对于新手来说,面对庞大数量的代码时肯定会很困惑,所以我们可以选择一些对初学者友好的项目开始。下面这几个项目是我参与过的,对于初学者来说上手会相对容易。
- Mozilla Firefox Source Tree
Mozilla Firefox Source Tree 包含有十多个子项目。他们提供了完备的文档,便于新的开发者上手、贡献代码。因为整个开发涉及到的技术比较多,他们还设立了单独的 Channel,开发者可以在这些 Channel 寻求帮助。在他们的文档页面上,列举了一些 BUG、缺陷等,开发者可以从这些基础问题入手尝试进行学习或者开发。
- Visual Studio Code
VS Code 是一个相当大规模的开源软件。目前这个软件有超过 5000 个开放式问题,这就意味着你可以很容易地从中选择出一个或者几个问题来重点跟踪。在此过程中也可以提交新的问题、新的特性要求,对于你学习这个工程会有很大帮助。
- TDengine
TDengine 是涛思数据使用 C 语言自主研发的一款时序数据库(Time-Series Database),已在 2018 年 8 月推出正式商业化版本,目前单机和集群版均已经实现开源,是一款较为流行的时序数据库产品。如果你对数据库或 C 语言感兴趣,那可以尝试阅读一下 TDengine 的代码,都有比较完整的文档说明,上手操作会比较容易。如果你愿意,你甚至可以参与到项目的开发中。
写在最后
很多人在参与开源项目时,往往会纠结于自身时间有限、知识储备不足、不知道如何开始、找不到合适的项目,因此一拖再拖,直到热情消退。但其实参与开源项目根本不需要考虑太多,它不像日常的公司项目开发,有进度要求、规划协作,很多开发者参与开源就是为了缓解工作中各种压力的。你可以随时随地投入到这项事业中,不需要有任何压力和包袱,在这里可以尽情地发表自己对于技术和代码的看法,与其他的社区成员沟通和交流。
从上面三位开源参与者的分享中我们也可以总结出参与开源的意义:当你真的成为一名开源社区的贡献者后,你会为自己的 idea 被社区接纳而兴奋,会为和社区开发者们愉快真诚的协作而开心,会因为偶尔一次的线下见面会彼此感情的增进而愉悦……你会发现,除了日常的工作之外,原来还能和一群有共同志向的朋友一起做这样有价值有意义的事情,过程中你不仅收获到了更多的认可和成长,也对技术和工作产生了更多的热情。
想了解更多 TDengine Database的具体细节,欢迎大家在GitHub上查看相关源代码。