记这两年半的动态二维码

2012年3月至2014年6月,这一年半多的时间里,我的生活一直围绕着“动态二维码”这个东西。它从无到有,从科技作品到科研作品,代码量从1000行的C#到3000行的Java再到4000+行的Scala,传速速率从2kB/s到5kB/s到15kB/s,导师从没有到牛建伟到马帅到Jacky Shen到Chunyi Peng,等等。最终,终于没有辜负我的努力,paper被MobiCom 14'收录,成为了北航第一个在这个会议上以第一作者发表论文的人。

阅读更多

Follow Your Heart

想想三年前的自己,更能感受到Follow your heart的珍贵。

为什么浮躁呢?看别人飞黄腾达,自己坐不住了呗。大四真是个神奇的年份,能够让人们忘记自己到底是谁。什么都想要,注定什么都要不了。

想做的事情太多:想学好英语然后去美利坚;想搞自己的手机应用还得跨平台的;想做自己的网站还要bug少UI优美;想发自己的Paper还要有用还有意思;想上班拿高工资还得有好环境,还想健身旅游泡妞让自己成为社交达人。。。

欲望膨胀的时候就是毁灭的时候。别人很牛逼,但我只是单独的个体。你无法让有60w年薪的人沉下心写paper,也无法让paper发的手抖的人做一个美轮美奂的手机应用。人的精力总是有限的,不能把目标定在“全面”。到了舍弃一些东西的时候了。

三年前的自己,一心想去Microsoft,生活当然简单得多。

反思自己这三年,越来越膨胀。首先大概只有码力还不错,然后成绩变得越来越好,就想着要越来越好赶英超美;项目被认为有科研价值,就想着走向科研的道路一去不复返;互联网思维越来越火,架着自己会那么一点做网页的皮毛,就想着做一个至少能改变自己的网站;机器学习如此流行,就想着赶紧学然后发paper;同学们都出国了就想着赶紧学英语等等。

无法专注造成了现在的我,都是我邹游自取。为什么不能把“别人”当做“别人家的孩子”一样看待呢?我就是我,有优点也有缺点,想把自己打造成完人是不可能的。

这么看来,选择读三年的硕士是非常正确的。我要做出选择。

我打算只用一年时间做出选择,到明年4月份,我会开始对我唯一的目标进行冲击。

这一年时间里,follow your heart.

----

补充:总而言之我以前一直相信“只要有能力,学历学校人脉都不算什么”这句话。

呵呵,多么可笑的想法。

寒假计划

虽然寒假只放那么几天,不过还是要做很多事情滴。

必做:

1. 学英语,托福一战目标80+(学英语真得全职学啊不然太容易忘)

2. 学Network Coding(看一本书)

3. 学习Vim(学这东西和学英语的感觉一样一样的)

选做:

1. 学clojure(装逼神器)

2. 写hierarchical版的todolist(现有的todolist功能略简陋效率略低)

3. 学一点机器学习

不想码代码

大概从大三上学期经历了三个大作业加上实验室的洗礼之后,我就变得十分不喜欢码代码了。

那个寒假我看了很多书,用读书来掩盖已经厌恶码代码的事实;到了大三下学期,除了各种需要码代码的作业,其他真的几乎啥都没有码,与一年前截然不同。

记得大二的下学期,除了课上要写的代码以外,我还写了一个安卓小游戏,五个WP应用,然后写了传说中的动态二维码。暑假一边干着百度的活,一边在又热又不能保证每天洗澡的21号楼码动态二维码的第二个版本——当时的我觉得这辈子码的最优美的代码。

现在完全没有当时的热情了,只有在码scala语言的代码时还能找到一点点兴趣。虽然我打着机械键盘,坐在了有着空调和机柜冷热互补的实验室里,用着在两个显示屏上显示着的Linux Mint,开机之后用Win+E打开Eclipse,Win+C打开Chrome,Win+D打开Douban FM,Win+F打开文件管理器,

然后肆无忌惮的用Chrome刷人人,刷TheOldReader,刷Zhihu,刷贴吧,刷人人,……直到吃饭,睡觉。

我不知道这是为什么。就是不想码代码。可是实验室有活一直在催,实习也即将有活,大MSRA系统组看起来也是个码农组,不码代码是万万不可的。

“把兴趣当作工作,是兴趣最好的坟墓。”

求解救。

搞一个新的程序设计语言?

当了好多年的码农,有时候真的想搞一个完美的程序设计语言一直用下去。去年编译原理大作业让我的这个愿望更加清晰了一些,但是现在又有些退缩了。学到的越多,越不敢去创造。

但是实验室的活儿只能用Java与C++,课堂里的东西呢?也是Java, C#, C++, 顶多在上学期有一门Ruby的课程,我还没选。所以到现在,上面的愿望就愈加模糊了——没有用处的语言,造它何用?

不过还是想写一下我使用过的语言的各种缺陷和我的构思,希望有朝一日这样的新的程序设计语言能够成真。

1. 不要禁锢在面向对象里。典型的语言就是Java与C#,任何一个东西,变量、类、函数等等都要被包含在一个类里,每个类还必须单独在一个单独的文件里(Java)。

在OOP的课里,我们以用更多的类、有更多的文件和代码行数为荣。现在看来,真是太可笑了。OOP确实给大项目带来了很多方便之处,但是也让项目无从下手。

比类要细化一些的大概就是函数了,这也是我最近很迷恋FP的原因。而且,如果你愿意,FP也可以当OOP来用。

Java支持FP看来是无望了,这样一个庞然大物太难以改变了。Scala是个有前途的语言,但也不是个好语言,虽然很多特性让我眼前一亮,但是它是OOP向FP的妥协,让人感觉不伦不类,如同C++一样。但是C++有高性能,Scala有么?

所以我心目中的语言,代码的单位一定是函数。

2. 语法可以自己定义。很多语言有很多语法,比如说C#,我从它的1.1用到了现如今的4.5,语法多了不少。如lambda表达式省掉了delegate,var,async/await等。但是人和人的想法是不一样的,如果我们可以自定义自己的语法该多好。比如说我十分想在C++里用一种非常优美的方式实现可变参数,如这样:

int sum(int x){return x;}

int sum(int x, ...){

return sum(...)+x;

}

当然这是不可能的,哪怕动用C++的宏和模版也是不可以的。据说lisp的宏是比C++的宏可怕的多的东西,可以定制一切,大概就可以自己搞搞让它支持这种语法吧。

3. 面向人类语言的语法。据说,lisp是一个评价很高的语言。我在寒假看了《计算机程序的构造和解释》,发现它确实非常牛,是属于语法非常少、功能非常强、而且可定制化的典型语言,而且还是函数式的。但是,一般人不会使用它,因为它的语法一般人忍不了。

现如今的语言都往人类语言的方向发展,如python,写起来的代码就像说话一样。比如说

a,b=c,d

这样的语法是我在Java/C#里梦寐以求的。

面向人类语言也就意味着语法分析、词法分析将变得很困难,就像lisp根本就不需要语法分析器一样。

4. 面向IDE。语言不能少了IDE,虽然有很多装逼和牛逼的人会说那是你能力太弱。和上一点一样,语言是面向人类的,不是面向机器的。语言的发展不是为了那些装逼的和牛逼的人,而是为了更广大的劳苦码农们。这方面比较好的是C#,配合Visual Studio简直太完美了,不过最近加入了一些动态语言的东西导致VS有时也不这么靠谱。

另一方面,弱化类型也是我想要的。如Java里定义一个函数,类型就要写半天。如果可以省略类型该多好。但是这样IDE的语法提示就少了很多。

5. 冗余要少。我想到最近写的东西,就会发现,好多冗余的东西啊。比如说,Java里,每个代码文件开头的那堆import. 这些东西当然有用,但是,如果这个世界(这个程序的包)里只有一个叫做xxx的类,我为何还要费劲的import它?又比如Java的输入输出,当年搞ACM的时候简直对这个输入输出太有意见了,虽然是使用了Adapter的设计模式,看起来很高端大气上档次的样子,但是冗余太多了啊!为了输入个数字搞这么多代码干啥?

6. 面向并行计算。现如今的大部分语言还是要显式的搞thread啊,mutex啊之类的东西,好麻烦,而且还不能适配CPU的个数。最近在看《并发的艺术》,发现为了个并发会有这么一本书的算法,真是不明觉厉。对于分布式,更是有一堆connection,错误处理之类的东西,为了简单的一个功能(如分布式队列)却要写上千行的代码。

对于immutable的语言,比如说纯函数式语言,貌似确实可以很容易的支持并行计算,但是也不能做到适配CPU的个数。对于支持actor模型的语言,如scala,看起来很容易做到适配CPU个数,但是对于现有的代码和设计方法也需要重构才行。

7. 编译(解释)、调试简单。还是有很多牛逼或者装逼的人推荐使用gcc+gdb编译和调试cpp程序,但是我依然一直在使用的是VS的编译调试功能,确实好用。相反,我一直找不到如何不用VS对C#程序进行调试。 又如, Java的java.exe和javac.exe我一直不知道他俩的区别。

我心目中的简单的编译器,它绿色环保跨平台,只有一个可执行文件,它可以接受一个像人类语言的参数或输入,去执行我们想要的东西。

8. 支持reactive programming. Reactive Programming是我梦寐以求的东西,比如说Excel,一个数据变化会引起一连串的数据的变化。这个功能在有用户界面的程序上用处相当大。

当然支持RP了就肯定不是immutable了,所以需要好好设计一下。

9. Lazy Evaluation. Lazy的思想应该不只在lisp这样以列表为主要结构的语言中。用好了lazy可能会极大地提升效率。

如,一些函数是纯函数式的,也就是说,一样的输入在任何时候都会得到同样的输出。这样的函数完全可以弄成Lazy化的——如果这个函数需要很大的计算量,那么可以在计算完第一次后,将输入作为key,输出作为value存储到一个NoSQL数据库中作为cache。这种需求很大,现在的情况是,NoSQL很火,但是程序员仍然要像操作SQL语言一样操作NoSQL数据库,将数据库整合到语言里不是很好么?

10. 让垃圾回收更加智能。最近在开发Android应用,发现它的垃圾回收简直太慢了,Java还只支持在堆里分配空间,实在是太不爽了。Java、C#之类的语言之所以效率较低有一个原因就是自动垃圾回收。这个暂时还没想到啥好的解决方法。

十大计划

从即日起我决定完成以下十大计划:

1. 跑步计划:平均每两天跑一次,800-1000米,达到跑完1000米后不喘的效果;

2. 吃水果计划:每天吃一个水果;

3. 早起计划:每天早上8点前起床,由于课程坑爹,这个计划是必须要实现的;

4. 论文计划:2013年发表一篇论文;

5. 背英语计划:以平均每天20个新单词的数量背英语单词;

6. 买手机计划:在上半年买一部高端手机;

7. 函数是语言计划:用函数式语言写一个真正的项目;

8. GIT计划:将自己以前搞的大部分小软件搞到GIT上开源;

9. 喝汤计划:每天晚饭在食堂吃的话配一碗汤;

10. 写博客计划:每月至少一篇技术文章。

2012

2012年是我码代码最多的一年。1个android小游戏+5个wp7水应用+DynamicCode第一版+BrickBreaker小游戏+DynamicCode第二版+Gearman小修改+Kestrel大修改+C0编译器+Shieldstar大游戏+Cobra实现+数据库大作业...