RSS Feed

December, 2014

  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. Macro

    December 20, 2014 by xudifsd

    A few month ago, I wrote a Clojure macro, looks like this:

    It means if current env is test, then generate normal function, otherwise generate async function and log the error if catched. We need this because when we call some functions, we don’t want to wait them to return, but we still want to catch their exception and log it. But when in test env, we want them to throw exception to make error more obvious. We determine env by environment variable, and default to test env if not provided.

    After I finished this macro, and kicked it online, everything seems fine. But somehow I recall this macro while I was doing something else, and found it has a bug that is difficult to detect. The bug stems from the way I treat it as normal function instead of macro.

    Because macro expansion happens at compile time instead of runtime, this macro needs env variable at compile time, otherwise it will generate normal function. But normally we won’t set env variable at compile time (lein jar), and only set env variable at runtime, because normally env variables only take effect at runtime. So we didn’t get async function online at all, they’re all normal functions. Solution for this is simple, just set env variable before compile.

    This kind of problem is hard to find, because no matter what function we get, the behavior is identical, just a little bit slower.

    It seems mastering macro is not that simple. But macro is less mysterious to me now, when I was reading , macro is something I can’t understand, because the book tells all the goodness about macro without telling any principle about it, this just makes it mysterious, but after you understand all the principle, it’s just a tool to generate code for you, the goodness is you can use normal function in macro just like in other function, but actually macro is not as flexible as function sometimes: they can’t being passed as value.

    Now, I’m quite understand the rule for macro: “don’t write macro if you can”.