记这两年半的动态二维码

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

这个东西的想法一开始大概来自于大二第二学期开学时我在沙河宿舍一楼的一次等人。无聊的时候看着天花板发呆,然后想到了之前寒假的时候看到的一个光通信的TED视频,于是就出现了这个想法。随后,我花了大概1个月的时间,用C#做了发送端,用Java做了接收端,报名了冯如杯,并且阴差阳错的得了个一等奖。得奖之后,牛建伟老师看上了这个项目联系到了我,并且出钱申了个专利。随后这个学期的后半段就没怎么继续改进它。

到了暑假,去百度实习。期间牛老师又联系到了我希望我把发送端做到手机上。我想了想,觉得这个暑假除了百度实习以外时间挺富裕的,并且有老师看上我的项目我还挺荣幸的,于是就揽上了这个活。没想到做出来之后才知道牛老师是想把它卖给诺基亚。我给牛老师和诺基亚的一些小领导展示了这个东西,虽然小领导们十分感兴趣,但是最终还是拒绝了合作。那时还没有“十动然拒”这个词,不过这简直就是十动然拒嘛。再然后,就没有然后了。牛老师后来又揽了个活,看我会写手机程序就想把我招进去,我对那个活没啥兴趣,不过也帮一个学姐解决了一些问题。前几个月学姐的paper貌似也发出去了,作者里没有我,不知道会不会在acknowledgments里呢。

这大概是动态二维码的前期,还没有科研什么事。做的都是工程上的活,只能算是个科技作品,还总是演示失败。对了期间还出了个事情,就是MobiSys 12'里面的一篇论文和我的东西很类似。这个消息也是牛老师告诉我的。当时我还是挺气愤的,不过人家论文里的做的东西确实比我当时的东西要强,而且大家都是同时独立的在做,后来也就无所谓了。

到了大三,马帅老师在人人上招人,我报名了,主要是因为宿舍桌子太小了,实在是想有个实验室工位。到了实验室之后没想到马老师也看上了我的动态二维码,希望继续搞这方面的研究。我觉得也挺好,至少做的还是我熟悉的东西。于是在十一期间就开始看paper了。科研的道路就开始一去不复返了。

前期的工作到是还比较顺畅,看paper,实现paper里的内容,找问题,找解决方法,一套路下来,我也基本上明白了所谓神圣的“科研”,也不过是如此机械化的步骤。这个学期相当忙,忙到我之后的一个寒假都没怎么码代码。第二个学期一开始,我想到了许多关于动态二维码的点子,实现之后都一一毙掉了。但是,由于忙于“科研”,其他很多机会和想法都没有关注和实现,我还是很后悔的。

直到大三第二学期后半段,从欧洲归来之后,我想到了一个绝妙的点子,那就是把一开始的设计和后来被毙掉的设计合在一起,用分而治之的思想设计。我对二维码重新设计,用放在中间的定位点和横竖坐标分成四块,以此克服partial unavailability和lens distortion的问题。做完之后实验结果也很不错,大概能到10kB/s的样子。我找马老师说可以发paper了,他却说“你这个要挑战蓝牙”。挑战你妹啊,根本不是一个东西好吧。

去年暑假,我有幸来到微软亚洲研究院系统组进行实习。其实我实习的目的也不完全是“联合培养”,更是有机会和更加专业的人接触。我其实对系统组的活不是很感兴趣,这个后面再说。在这段时间我又对动态二维码的“分而治之”的思想进行了改善,既然可以分成四块,那更可以分成m*n块,每块数据之间还可以加入一些联系以进一步提升可靠性,也慢慢有了将重点从速度转到可靠性上的想法。我码完代码、调完程序之后,联系了一个MSRA的搞这个方向的研究员,希望听取她的意见。结果她却告诉我她也刚刚在MobiCom上发表了一篇解决相似问题的paper...我看了她的那篇paper,里面虽然大部分内容和我做的东西无关,不过还是有几个小点重叠了,而且也提高了比较的门槛。好在我及时联系了她,不然我得过两个月才能知道这篇paper。此时真是后悔为什么我没有早几个月就把paper发了。

但是这显然极大的刺激了我。我又去找马老师,说无论如何都得发paper了,不然永远也等不到“超越蓝牙”的时候了。他终于同意了,并决定投MobiSys 14'.

写Paper才是搞科研的重头戏,而我显然是门外汉。前几个版本的paper写的确实是惨不忍睹,后面的版本好了一些。但是最烦人的是马老师帮我改paper的阶段。我无意否认他对我的付出,但是遇到问题,他就认定是我做错了,而不是他自己的错误或者他不懂。他毕竟不是搞mobile或者网络方向的,却对自己的判断如此自信。于是,改paper的过程中闹了很多的不愉快。最呵呵的是他十分强调“证明”和“定义”。确实,这两点对论文非常重要,但是一些众所周知而就他自己不知道的东西,为什么还要明确的写出定义或者证明?我把他改完之后的版本给MSRA的Jacky Shen(一个网络领域的研究员),他的一个建议就是,“Well known的东西太多了”。

最后那几天我每天给他邮箱发一篇我修改的版本,最后一天的时候的凌晨我又把最新修改的版本给他发了过去。转天他看错成前一天的版本了,第一反应是:“你这啥都不对啊,你发错版本了吧!”后来我又发了同样的一份过去他才发现问题出在他自己身上。

盲目自信和不愿承认自己的错误,而善于指责别人的错误,这是老师的职业病。我对这两点太熟悉了,因为我爸就是大学老师。这也是为什么我不想当老师的一个原因。

终于在deadline前十分钟,把paper submit出去了。我玩了一个下午加半个晚上的fifa14以发泄心中的压抑。改paper这两个月过得真的是太压抑了。

后来在MSRA被分配到了一个室内定位的组里,做了一些computer vison方面的研究。这个方向真是水太深啊。一篇CVPR的论文中会引用十几篇相关领域的论文,然后依次递归下去,不读个几百篇paper根本就看不懂这篇论文讲的是什么。好在boss也没打算发paper,只是做一些preliminary study而已,毕竟他们和我也不是搞这个方向的。这三个月我也是对cv方向有了一个大致的了解,也发现这个方向虽然效果很炫,但我并不是很感兴趣。我发现我这两年来的主旋律就是跨界啊呵呵。

再后来,3月3号的早上MobiSys的结果出来了,被拒了,分数两个4两个3两个2,按理说不是一个低分。但是看通过率还没到10%,我也就认命了。后来面临一个选择,是不怎么修改直接投6天以后deadline的MobiCom等着两连拒呢,还是大修一下然后投接下来的INFOCOM或者NSDI呢。我与马帅和Jacky分别进行了交流,决定直接投MobiCom飞萤扑火。Jacky又找来了Ohio-State University的Chunyi Peng(虽然她是中国人,但我一直不知道她的名字用中文怎么写)来帮忙改paper.

后来又是一段苦逼的日子,虽然只有六天。但是凌晨3点提交完paper之后,我还是没打招呼的翘了一天班。

之后的直到现在的几个月时间里在做另外一个类似的项目,一切都还可以忍受,虽然项目也很有难度,但是大概不是我的idea的原因吧,没有那么大的责任感,经常拖到deadline前夕才干活。被别人夸奖的“self-motivation”,不过是不甘心而已。

到了MobiCom结果通知的日子——6月3号,忐忑了一整天以半个小时一次的频率刷新邮箱,都没有看到notification,正在自以为是默拒的时候终于来邮件了:“the acceptance notifications have been delayed.” 于是又忐忑地等待了三天的时间。终于在6月7号凌晨来了邮件:“Conditional Accepted”。虽然是Conditional,但是还是非常兴奋有没有!我立马联系了作为MobiCom reviewer的Chunyi问conditional代表什么,她回答我说今年的MobiCom貌似是paper的质量普遍偏低,于是要求在最后accepted之前需要按照reviewer的意见进行修改才行。也就是说,所有被Accepted的paper都是conditional的。于是又是持续十几天的昏天黑地的改paper的过程。说实话,我非常讨厌写paper改paper的过程。程序员都爱说“Talk is cheap, show me the code”,但是在写paper的领域完全是反过来的。我必须把reviewer们当成不会写程序的傻x(事实没准真的是这样的)去写。

最终又是在凌晨三点的时间提交了最终版本上去,适逢世界杯正好看了30分钟法国队的比赛后来扛不住了回去睡觉了。过了三天,结果出来了,finally accepted.

至此终于可以告一段落了。

这两年多让我对所谓“科研”有了新的认识。我一开始认为科研是一件多么神圣的事情啊,后来觉得,科研也不过如此。过程机械化,过于强调数据、强调逻辑,强调创新性,而忽视实用性,甚至忽视所谓的“进步”到底有没有用。举个例子,之前有一篇也是研究二维码传输的论文发表在MobiSys 12'上,它的主要贡献之一在于什么呢?在发送端(只有发送端)以约1m/s^2的加速度连续运动1s左右的时候可以动态降低速率。请问你在什么时候会以1m/s^2的加速度运动发送端而接收端静止不动持续1秒钟呢?还有通过对symbol进行重排以减少接收端和发送端在一个方向(x方向或y方向)的相对运动造成的模糊现象。请问什么时候会只在某一个方向进行相对运动?而且经过测试这个优化对90%的文件不起作用,相反会带来大量的运算。这些方法虽然能够带来很好看的数据,能发一篇吸引reviewer们的paper,但是在实际中有什么用呢?

还有各种猫腻,以让自己的paper看起来逻辑没有问题但是实际上根本不是读者想的样子。还是那篇paper,这篇paper讲的是smartphones之间的传输,强调“real time decoding",实验的最后一节也测了decoding的时间,数据也确实可以real time。但是我编的代码一样的算法,可是decoding时间根本不是一个数量级。对一帧的图像处理在我的nexus 4上需要用140ms,可是它的测试结果却只用12ms,Corner detection竟然只花了2ms,而且同样都是用的Java。稍微算一下就能知道,1GHz的CPU,1280*720的分辨率,共921600个像素,假如对每个像素的操作用掉10个CPU时钟周期,也要9.2ms,这还没算Java带来的GC overhead和内存读写所需的延时,对每个像素的操作也会用掉远远大于10个的CPU时钟周期。后来一篇MSRA发的paper是对它进行的改进,也测试了解码时间,明显正常了很多(在低分辨率的情况下40-50ms每帧)。这对paper的逻辑没有任何影响,reviewer们大多也没码过手机上的代码,也看不出来这个猫腻,但是只有你亲自编程实验才会知道。我猜,它所说的“real time decoding”是在电脑上离线处理才能达到的吧呵呵。

我希望能够从我做起。在MobiCom会开完之后,我打算将我的动态二维码开源。

另外一个认识便是我心目中的研究一定要“有趣”和“有用”。在一开始提到我不太喜欢MSRA系统组,就是因为在和系统组大boss在某次聊天时,他说过“系统组的研究是需求驱动的”。我在系统组两个多月的经历也印证了这个观点:几乎所有项目的目标都是满足产品组的需求。这是一种非常合理的研究方式,至少是对分布式系统来说的。但是,对于我来说,我不喜欢这样的方式。“好奇心驱动”才是研究应该有的,将自己非常感兴趣的idea,实现为非常有用的东西,这才是我理想中的科研。而“需求驱动”的话,还是去百度基础架构部工作吧。我不认为百度基础架构部比MSRA系统组要差,除了没有博士文凭。

这两年多也让我感觉到了搞科研的悲哀之处。教授们应该都曾这样说过搞科研的好处:“你的工作内容就是你的兴趣所在!”听起来好吸引人啊,但是又是一件多么悲哀的事情!尽管感兴趣是搞科研的前提,但是至少对我来说,工作和兴趣爱好应该是分开的。工作是“今天做了,明天还得做”,而兴趣爱好是“今天做了,明天还想做”。注意这两点不同。明天还想做不代表明天就必须做,也许我心情不好,也许我有别的更感兴趣的事情,我就可以不做。但是作为工作,paper deadline到了你能不做实验?你能不写paper?这些“必须做”会毁掉一项兴趣爱好。

于是最近疯狂迷恋钢琴。

“动态二维码”在最初只是由于我的好奇而在课余时间搞出来的恰好能work的小项目。虽然现在发了顶会paper,但是还是想感叹当初那个由于好奇就说干就干的我,一去不复返了。

  1. quark duscbt Google Chrome Windows 说:

    膜拜大神……
    知足吧,CS科研还能看到有用的点,基础学科才真叫毫无实用性。。
    不过基础研究大概也是应用研究的雏形吧,就是需要太多雏形当炮灰罢了。。

  2. 膜拜大神...同觉得体制内的科研很抹杀人的想象力和将其作为一项事业的激情,不过得失总归看心态了,如果能借着有限的资源,尽可能地保持独立的自我,不要让太多琐事搅了一开始的好奇心和解决问题的兴致,感觉也会乐在其中~继续加油咯~

    • 好长时间没有看到你来我博客评论了诶。。
      高校师生严格的等级差异,以及缺乏精神以及物质上的回报,尤其在我航还有诸多行政上的低效,真是很容易让人丧失激情。。
      找回以前的心态中。。

  3. 半夜睡不着,突然想起你的博客。来看一眼,居然更新了。感觉和之前私聊的不太一样,诚如楼上上言,做计算机的研究确实比基础学科研究好多了。
    还有国内科研的回报真是。。。

txx进行回复 取消回复