GSoC 2019小结

今年参加了Google Summer of Code 2019 (GSoC)的活动。项目已经结束一个月了,来写写这次活动的一些体会吧。

那些年的机缘

首先讲讲GSoC这个活动。第一次知道它是在2013年暑假,当时我在香港中文大学暑假实习做RA,参加香港理工大学的开源日活动时,听到有人讲起来这个项目。可惜当时已经是大三暑假,按当时的规定大四暑假好像不能参加,就错过了。第二次想起来这个活动是在研一的时候,那是2015年的时候,Hadoop非常的火,想做些Hadoop相关的事情,查来查去只有Apache底下的一个子项目是相关的,申请了但没申请上。当时还安排了一轮面试,后来问了下反馈,说是准备的挺充分的,只是另两位同学已经开始研究Hadoop代码,并做了一些开发计划。在KAUST读研的时候实在是太累太累了,根本没有时间去研究代码,能写份proposal出来已经是生命的奇迹了,更何况申请的是非常火的项目,所以说落选也是理所当然。不过呢,这份反馈还是非常重要的,至少让我明白了proposal应该尽可能具体,最好能具体到每行代码的写法。不过呢,越具体的proposal就需要越多的时间,落选的话损失也会越大了。

今年再写Proposal

今年参加GSoC其实也是挺忙的。读PhD的第一年,对自己的课题一脸蒙逼,还要同时兼顾教学,要批很多本科生的作业。让我坚持下来的,就是GSoC的那6000刀的奖金了。当时只花了一周多的时间去写proposal,先是痛苦的挑项目,当时想着尽量做些Kubernetes相关的项目,毕竟现在这种云服务比较火,至于人工智能相关的项目感觉太难太难申请了。另外尽量挑数据库的项目,毕竟是在读数据库方向的博士,能给PostgreSQL贡献代码的话,是一件非常硬核非常酷的事情,说不定还能看到我们组老师当年在Berkeley的时候写的代码。写proposal的时候也是根据以前的经验,尽量具体,写具体的要改的代码或者列出来具体的性能指标。写的时候告诉自己,写六页的话,每页1000刀,那每一个词都要好几十刀了,最后终于憋了这么两份proposal出来:

项目录取

项目录取的过程,基本上等同于彩票开奖,谁也不知道写成什么水平能中,而且这个阶段是不方便去联系开源项目的成员的。根据事后的数据,录取的比例似乎是五中一的水平。我的两份proposal也就只录取了Linkerd上做Kafka解码器的那份。我的PostgreSQL的proposal我还专门去要了一下反馈,那位开源项目成员现在是俄罗斯一所学校的教授,他读博士的时候也参与过GSoC的项目,并且做的就是PostgreSQL。他给我的反馈让我非常的无奈,他之所以没选我的proposal,是因为其它的项目都有至少两个导师有兴趣,而这个项目只有他一个人带的话他觉得吃力。我投的这个课题,一份proposal都没有中。至于说能给我什么proposal方面的建议,他说,我建议你,要不过两年来当mentor??这都什么鬼建议...

不管怎么说,暑假有钱拿了,美滋滋~~

项目的第一个月

我参加的这个Linkerd的项目,是用Rust和Go写的,我要处理的部分主要是Rust。在我心目中,Rust一直是一种反人类的编程语言。每次看到那么多括号,我就像被针扎了一样难受。在微软的时候,组里有一位小伙伴非常的热爱Rust了,把我们Python后端的一部分用Rust重写了,导致我后来改Python时,遇到了很多调用Rust时出现莫名错误的Bug。在长达一年半的时间里,我一直想努力学习一下Rust,但每次打开代码我都退缩了。这次,看在6000刀的份上,我粗略的把Rust的教程过了一下,感觉自己已经精通这门语言了,然后点开代码库,发现那么多括号,还是看不下去...括号一多本来就不想看了,然后代码里还各种trick各种坑。

另一方面是看了看Kafka的protocol。这种通信协议也是非常无聊了,看看它怎么定义的基本类型,有哪些数据模型之类的。刚开始的计划本来是从其它Rust的库里粘一些Kafka的相关解析代码,结果找了一圈,并没有现成的代码。那些库是实现了一个Kafka的部分功能的client,并不是一个完整的codec。所以嘛,还是要亲力亲为的。

第一个月的进展好像是,按着proposal里说的改代码的地方,改了改,然后写了写Unit Test。

第二个月

这个月好像是试了试不同的codec的写法。Rust这门语言阉割了很多其它语言里的特性,比如说Rust连继承都不支持,我刚开始写Rust的时候完全是按Java的风格在写,写完我自己都感觉不对劲但不知道哪里有问题,后来改了几次,才确定了一个比较完善的方案。Rust号称是适合高并发的环境,但对于非常复杂的业务逻辑,肯定是不如Java来得得心应手了。

在我纠结完codec的设计之后,好像离第二个月月底的项目验收就不远了,我掐指一算,就算codec写完也肯定没时间集成到Linkerd里。这时候和mentor商量了一下,codec的部分先放下,反正能解析个request header,知道每个request的大小,就已经非常重要了。我这时候开始研究怎么搭Minikube的环境,并且用Minikube来开发Linkerd。这里遇到了非常多的坑,其中之一是Kubernetes的源都在Google的域名下,也就是说,在国内被墙了。我一直没搞明白怎么给虚拟机挂上代理,这个事情卡了我好几天,直到有一天我在Minkube的进程表里看到了10.0.2.2这个IP,感觉很神奇,我才知道这个IP是指虚拟机的宿主机。

后来是能把Linkerd编译并且装到Minikube里了,不过呢,这样操作一次我记得要花一个小时左右的时间,根本就不适合开发的节奏,所以最后还是直接编译Rust代码在Macbook本地运行。就这样,编译一次也要好几分钟,非常的让人心急了。

第三个月

第三个月过的也非常的混乱。直到最后都没有把整个Kafka放到Minikube里用Linkerd来部署来运行,最后就又加了一些测试吧。最后mentor也是给过了,也是收到尾款了,不过呢,还是觉得没有达到自己最初的期待吧。此外,Kafka的protocol部分,也是通过JSON来规范化定义的,他们还自己写了个从JSON生成Java代码的generator。其实要是能写个JSON到Rust的generator也算是很大的贡献了,因为彻底的解决了之后Kafak protocol升级的问题了。

这里是最后交的项目总结

事后反思

从个人的角度来讲,这次项目做的没有达到预期,我当时的期待就是说,能把代码merge到官方的代码库里,能真正的上生产环境,而不是一个小小的demo。归根在底还是计划的时候太过随意了,没有意识到搭建Kubernetes整个的开发环境这么复杂,这么耗时。其次就是没想到Kafka的protocol没有现成的Rust的库,同时,也没有现成的JSON到Rust的generator。归根到底,这些意外都是因为没有在项目里投入足够多的时间和精力。现在回过头来看这个项目,还是有些强迫症没得到满足的感觉,明明那么多事情能做,到头来只做了一小部分。

不过呢,从这个项目里,我也是收获满满,一方面是入门了Rust,我在微软一年半的时间都没有勇气看下去Rust的代码,另一方面也是了解了Kubernetes的开发。现在开源项目发展太快,不过是Rust,Kubernetes还是Kafka,听起来总觉得很厉害很遥远的感觉,现在终于能有一些切身的经验体会了。此外,意料之外的收获是,Facebook Libra也是用Rust来写的,正好可以看看Libra相关的代码了。毕竟比起代码与科研,区块链这种直接和金钱挂钩的事物才是真正的让人兴奋啊。

links

social