RSS Feed

Posts Tagged ‘gsoc’

  1. 2014总结

    December 30, 2014 by xudifsd

    2014年我的关键字应该是“遇见”和“Clojure”吧。

    经历

    今年对我影响最大的一件事情就是Google Summer of Code。大二就想参加了,但是由于种种原因直到今年才真正参加,从去年十二月就开始在往届项目的idea page上去找感兴趣的项目,二三月联系mentor、提交patch,四月看类型系统的论文,五月开始,八月结束。整个过程耗费了大量的精力和时间,但是收获也是巨大的。

    之前预期的收获就是Google发的钱以及简历上可以多写点东西,但是后来发现远远不止于此,不知道其他的开源组织怎么样,但是我觉得Clojure这个组织还挺有意思:它会筹集一些钱来赞助参加了GSoC的学生去参加Clojure/conj或Clojure/west,而且社区内部似乎很多人也愿意帮助一些项目的进行,比如我做的Typed Clojure项目本身就是诞生于GSoC项目,维护者也就是我的mentor就是全职在做这个项目,靠的就是从社区筹集的资金。现在Clojure社区经常讨论的一个话题就是diversity,说现在的Clojure开发者80%都是白人男性,希望能吸引到其他的人多参与,Clojure/conj就提供这样的grant。社区本身也挺有活力,在刚开始GSoC的时候,就会有Clojure Gazette这样的媒体邮件采访做GSoC的学生,并问一些项目的问题这样。

    不过我觉得最主要的一个收获是开阔了眼界,知道了一个非公司资助的开源项目是怎么运行的,遇见了mentor,知道了他是怎么去做事情。最近才知道他现在在美国读phd,仍会继续做Typed Clojure项目,而且还计划资助几个学生兼职开发,命名为diversity scholarship,主要想资助非白人学生,增加Clojure社区的diversity,原因就是在GSoC中与不同国家的学生交互的经历很有意思(其中还提到了我,很开心,笑)。

    除了GSoC,我还通过其他的渠道遇见了很多人。

    八月的时候,国内参加了GSoC的学生还在北京聚了一次,遇见了更多有意思的人,有传说中做CERN项目的牛人、扬言只写了14行代码就完成了GSoC的大神、写gcc go前端的萌妹子。之后还参加了十一月份的hackathon,约了两个一直想面基的豆瓣友邻参加,虽然没有得奖,但是整个过程还是很有意思,认识了很多上交的学生,还认识了超厉害的前端妹子

    另外还遇见并喜欢上了一个女生,虽然最后无疾而终,但是还是很感激这段感情,让我成长了很多。最后觉得都是时辰的错啊。

    总结

    之前看一个关于Google面试tips的文章,说最好的状态就是“know a little a lot, know a lot a little”,现在觉得这话很有道理:做到了前一点才能显示自己的独特,做到了后一点才能为自己创造更多的机会。一两年前我还一直只想着找一个内核相关的工作,学Lisp完全就是副业,但是谁能想到今年我写的绝大部分代码都是Clojure?我发现,懂得各个领域的不同知识可以让你把很多知识串起来连成网络,这样很方便理解与记忆,而且这样在任何时刻你都可以不花太多时间就能把know a little的知识扩充成know some,甚至是know a lot,然后就能投入使用。这似乎和投资里的“不要把鸡蛋放在一个篮子里”的道理一样吧。

    另外我也发现了多接触些人、多看一些书的必要性,这个社会不管是资本驱动的还是技术驱动的最终还是由人构成的,了解不同的人的经验和理念会给自己带来很多启示和帮助,很可能下一个你遇见的人或书就会彻底改变你。就我而言,如果当年没读过《黑客与画家》,我也不会去学Lisp,也不会接触到Clojure,恐怕今年也就没法参加GSoC并且找到工作了吧,笑。

    希望新的一年能出一次国,最好是能参加Clojure/west,然后就是多点一点分布式系统的技能树,一直想点,但是一直没机会实施,最后就是要更多地遇见一些人,探索生命中更多的可能性。

    明年我会尽量用英文写技术相关的博客,因为发现读我博客的国人基本上都懂英文,而且用英文写博客可以扩大受众,何乐而不为呢。


  2. 关于Typed Clojure

    August 17, 2014 by xudifsd

    最近一直很忙,都没空写什么东西了。今天终于闲下来了一些,现在正值今年GSOC项目要结束,而且国内关于Typed Clojure的资料少得可怜,所以写点东西介绍一下。

    Typed Clojure

    Typed Clojure的作用就是给Clojure语言提供一个可选的类型系统,以获得与静态类型语言同等的类型检查能力,但是这种能力的获得仍然是需要一定的代价:那就是使用者需要为每一个全局变量以及函数都加上类型注释,现有的类型可以见项目的wiki。不过它确实能完成对Clojure的类型检查,甚至包括对nil或者java null的捕捉,这一点还是很帅的。

    感兴趣的话可以看作者Ambrose在Clojure conj上的介绍视频(需翻墙),这个介绍讲的还是很清楚的。Typed Clojure完全通过Clojure的宏来实现,而不需要特殊的解释器或编译器,这也是Lisp类语言最大的优势,试想如果需要给python加一个类型系统,不自己重写个解释器是不可能。

    Typed Clojure受Typed Racket的影响很大,很多理念都是借鉴自他们,甚至我今年的实现内容也受到他们的影响。就健全性来说Typed Racket要优秀很多,因为Typed Clojure现在就只有Ambrose在维护,贡献者也很少。而Typed Racket就有点像是一个学术项目了,它们的贡献者以及维护者大多是Northeastern University PLT实验室的博士或博导,他们大多会在这上面发论文,比如这篇介绍,就说“Typed Racket is not just a nice language … it’s also informing PL research at every level”。

    我的工作

    我今年GSOC的内容就是给Typed Clojure类型系统添加两个函数类型,让Clojure中一些特别奇葩的函数也能使用first class type做类型标记而不需要在类型系统内部特殊处理。这些奇葩的函数就包括assochash-map。因为这两个函数对参数还有特殊的要求:因为都是操作map的,所以要求接收的参数与返回值map的key和value的类型匹配,而且也要求参数是成对出现的。

    Typed Clojure已经有了和Typed Racket类似的dotted type variables,这种类型已经可以用来表示不限参数个数的、任意类型的函数,并在结果上对参数类型加以限制。但是却无法表示要求参数成对出现,所以之前Ambrose的想法就是提供一个类似...2这样的语法来表示参数成对出现,不过这种做法有点类似将参数写死在类型系统里,如果之后出现了要求参数成三个出现,则又必须提供...3这样的语法。

    在与Typed Racket的人交流后,我们决定使用最lisp的方式解决——使用list。简单来说就是给list类型加上一个:repeat这样的属性,让:repeat的list可以匹配与它长度成倍的list,例如,(HVec [Number String] :repeat true)可以匹配(HVec [Number String])以及(HVec [Number String Number String])之类的,并且给函数类型加上<*以及<...这样的语法,意思是将多出来的参数捕获并与它之前的类型进行匹配,它之前的类型一般是有:repeat属性的list,这样就很好地解决了写死参数的问题——多给list内部加一个类型就能支持参数成三个出现的要求了。

    如果对细节感兴趣的话可以看下我写的关于我的实现细节以及Typed Clojure类型推导的文档

    Typed Clojure现在仍然很不成熟,从版本号(0.2.66)就可以看出来,现阶段已经可以在一些小的项目中使用了,但是我觉得在真正的生产环境还是最好不要使用,首先一个原因就是它的类型检查还是比较慢的,再者就是他的硬伤——学习成本,需要在项目中使用就需要完完全全学会它的类型注释。

    如何向Clojure贡献

    Clojure以及任何Clojure官方库的贡献都要求签CA,以前还必须是纸质信件邮寄到美国,现在终于支持电子版了,内牛满面。不过签完CA后还不能通过github的PR进行贡献,必须通过Clojure的JIRA提交patch。这确实有点麻烦,但是Clojure也是通过这种手段保证不会有有版权代码的进入。

    如果想要给Clojure或它的官方库贡献代码的话可以从它的JIRA中的issues下手,因为那里一般都是一些实现的bug,会有比较清晰的思路着手,并且能在这个过程中熟悉原有代码结构。

    关于开源

    今年参与Typed Clojure觉得最大的收获就是了解了下国外的开源是怎么运作的,我觉得这中间最重要的就是sponsor扮演的角色。很多项目开发者要不就是兼职开发开源项目要不就是全职开发了,比如我的mentor Ambrose就是全职在开发Typed Clojure,但是收入从哪来呢?就是通过sponsor,比如他就通过国外的众筹来筹得一些项目经费。

    甚至在Typed Clojure还没开始时,sponsor就在扮演很重要的角色了,见。Ambrose就是这样参加了那次Clojure conj,并在这个会上介绍逻辑编程,在会下和别人交流时别人提到有类型系统的需求,然后Ambrose才开始着手实现Typed Clojure的。

    国内貌似还是没有这样的捐助气氛的吧。


  3. Google Summer of Code 2014

    April 24, 2014 by xudifsd

    gsoc2014

    首先非常感谢@0xFAN君之前的帮助,回答了我很多关于比赛的问题,还给我看了他以前的proposal做参考,觉得这次能进真是多亏了饭君的帮助啊!

    今年GSOC被接受的项目名单出来了,有1307个学生参加,其中就有,想想还有点小激动呢。

    要知道我可是三年前就想进这个比赛了啊!

    当年大二刚学会C,但是已经用了两年多的纯linux,所以对开源充满好奇,也想参加个开源项目试试。当时看一个人的博客(现在已经没了)知道了GSOC,就想进去试试。现在想想那时连系统调用是什么、怎么用C打开一个文件都还不知道,就知道vim、linux是开源项目,所以只有看下以前参加GSOC的项目,觉得git这个项目还不错,而且是用C写的,linux都在用它,觉得应该挺牛X,而且社区成熟,文档挺多,于是就准备报它们的项目。了解了它们列出的idea,混了下邮件列表,准备做让git支持大文件的项目,mentor是Jeff King,搜他时发现他刚加入github,于是也跟着注册了github。当时给Jeff发邮件聊项目,结果回我邮件说“我们更喜欢公开讨论问题”。由于对自己英语没这么大信心,发个邮件还要拼写、语法检查半天才敢发出去,而且一想到自己发的邮件会被全球这么多人看到,还会被Linus看到就觉得紧张得不行了,所以并没有交流很多,而且当时技术实在是不行,草草地看了下git源码,好多库函数都不知道,perror都不知道是什么,也去投了个proposal,结果早早地就被reject了。

    现在想来真是初生牛犊不怕虎,不过这次经历对我改变很大——注册了github,习惯于用git,严格要求自己的code style,知道开源项目怎么组织。之后还花了很多时间去认真地读git源码,还写了几篇git源码阅读的文章在这个博客上。所以之后用git简直熟到不行,很多同学有git问题都找我。

    之后三年由于准备考研、去北京实习,完全没时间参加,所以这比赛几乎成了我的梦想。今年终于有空出来的时间了,所以春节结束后马上就开始准备了。发现自己对于C不是那么感冒了,而学clojure已经半年了,所以就准备报个clojure的项目,看他们idea页的Dynalint觉得挺简单的,于是就联系mentor,看了下code base,觉得真是太简单了,而且工作貌似也挺无聊,只是给这个工具加一些数据条目而已。不过这个mentor还有Typed Clojure项目,是给clojure加一个类型系统的,由于在学校做的项目是符号执行,对于静态分析了解了许多,所以最后选了Typed Clojure这个项目,其实现在回想起来还是觉得自己挺厉害的,两个月时间从完全不知道类型系统到现在提交了5个补丁。这期间也花了很多时间在这个项目上,所以被接受也是预料之中啦(笑)。

    这期间最大的发现就是开源项目的组织形式都有很大的差别,clojure的管理形式和linux、git那种完全靠邮件列表的形式完全不同,clojure全是通过JIRA这个问题管理系统来管理和讨论源码,而且所有补丁是通过patch文件作为附件来提交,不允许通过github的pull request接受外来补丁,就是为了避免版权问题——因为所有通过JIRA发送补丁的人都必须签CA才行。不过我觉得这样就完全阻止了那些不想长期开发,只是想提交个补丁的人。你可能说这样可以提高代码质量,但是clojure的java部分是我见过的最丑的开源代码(只是指code style,不是指设计)。clojure的CA政策真是怎么吐槽都不为过,还要求邮寄,真是很打击积极性呢。当时为了签CA还寄邮件寄到Rich Hickey那,过了一个月还没收到,以为寄丢了,赶紧让在美国的师兄重寄一份,结果过了几天我那封6块钱寄出的平邮有惊无险地寄到了,现在想想还真是神奇。

    有了CA后就时不时地发patch、问代码来跟mentor刷存在感了,到最后宣布结果已经给项目贡献了5个patch了,其中一个还是比较大的,前前后后改了4、5次,rebase后总共7次提交。

    所以我也就没什么悬念地进了,不过进了后,国内同样参加GSOC的学生建了个QQ群,听他们讨论说有个人像我这样花了很多时间,也提交了很多patch,结果还是被拒,实在有点可怜。

    discuss

    5月19就要正式开始写代码了,根据vim的说法,学生是被期望每周工作40小时的,我猜这也是为什么每年印度学生越来越多,都超过美国本土学生的原因吧,因为奖金才5500刀,美国随便去哪实习也应该比这高吧,还期望工作40小时,倒是如果转成人民币之类的倒还值些钱。不过今年算是我最后有时间参加这个比赛,也算是完成了自己的一个梦想,走上了码农的一个巅峰啊。

    如何参加

    其实这篇文章也是想宣传一下GSOC,因为我之前也是通过别人的博客知道这个比赛的,只是那人的博客已经不存在了,所以也相当于是传承了(笑),而且听群里的人说有几个也是看pluskid博客才知道这比赛的。而更多的同学都不知道这个比赛,因为不知道而没能参加这样的比赛还是挺可惜的。

    其实把GSOC叫比赛并不好,最好是叫项目,因为它并不存在要熬几天夜去写代码马上实现某种功能,相反它有三个月时间让你完整地接触一个开源项目的方方面面——交流、修bug、写文档、写测试。所以这可是真正了解开源项目的好机会。还有5500刀的奖金,换成人民币还是挺不错的,而且参加这个项目会专门有开源组织的mentor来指导,实习时可没这种待遇啊,况且完成后还能跟别人吹吹牛B,何乐而不为呢?

    不过这项目有个限制就是必须是在读学生,不过不管是本科、硕士或是博士都行。如果你不是学生而是开源项目的贡献者也可以志愿当项目mentor,当然mentor就只有500刀的奖金了。我今年的mentor就是前两年以学生身份参加GSOC,今年以mentor身份参加。

    之后如果有人想参加GSOC并且有疑问的欢迎联系xudifsd (AT) gmail (DOT) com,我会尽力帮你,当然下一次项目得一年后了,而且每年Google都会说不确定第二年会不会继续举办。

    总的来说,Google Summer of Code还是很值得参加的,不仅对学生的工程能力有很多提升而且确实能吸引很多学生进入开源项目,现在很多项目都是靠GSOC来拉新人了,而且很多学生也挺靠谱,不仅当时贡献了代码,也成了项目的长期贡献者。

    希望能有越来越多的中国学生参加GSOC。