2020年是颇为魔幻的一年。年初时我人在南美旅行,高原上与羊驼嬉戏之际,澳洲的山火仍在继续,南美的骚乱尚未停止。但是到那时为止,这似乎还是一个正常的开年。紧接着伊朗将军被暗杀,德黑兰客机被戏剧性地误击,第三次世界大战似乎不再遥远。我冥冥中开始觉得这将是一个不寻常的年度。于此同时,日后肆虐全球的新冠肺炎还是新闻中一个不起眼的不明肺炎,而它将深刻改变着我和许许多多其他人这一年的生活甚至是整个人生轨迹。

我的2020年,是混乱而充满变化的,又是幸运而大体平稳的。这一年里,我第一次长时间地居家生活和学习,第一次当了助教,第一次找的暑假实习被取消了,第一次找了全职工作,第一次参与了正式的科研。顺带创造了一年内搬家数记录(5次),一年内(较长时间)居住过的城市数记录(3个:香槟,芝加哥,匹兹堡)和一年内访问过的城市数记录(10个,横跨3个大洲)。

疫情生活

3月中旬,学校宣布春季学期剩余课程全部转为线上授课,然后就一直持续到了12月我毕业。线上授课对我并不是什么陌生的事物,我们学校早就有线上授课了,19年秋季有一门课说实话我也没去过几次教室。在人口密度极低的玉米地,出门溜个圈即使在疫情下也没什么问题,反正几乎也碰不到人。后面室友去了洛杉矶女朋友家,我的女朋友也从匹兹堡来到了玉米地。这么说来似乎还得感谢疫情,给了我这么长和女朋友共同生活的日子。我们一起买菜,一起做饭,一起出去在旷野上骑车,一起去看望春天归来的大雁们带孩子,各自上着各自的网课,生活似乎并没有受到什么影响。虽然超市里厕纸一直缺货,好在我19年就屯了好多。我妈也给我寄了好多口罩,物资上完全充裕。与同学间的正常社交被完全打断了,不过大家一块打游戏,在虚拟世界完成了社交,还多认识了好多新朋友。

7月底的时候女朋友回了匹兹堡开始搬家。我的公寓也到期了,中间离搬入新公寓还有差不多3周的空档期。在村里,几乎所有的公寓都有着相同的空档期。原本小村里的同学暑期都是要回家或者外出实习的,所以这段空档也没什么问题。这次因为疫情,大家都滞留在村里,问题就来了。为数不多的Airbnb房源很快被抢定一空,FB/微信群里的短租房源也被哄抢一空。被迫之下,我找了打游戏认识的一个同在玉米地的朋友,和他的舍友一道三个人跑去芝加哥找了间Airbnb。结果到了之后发现环境太差,维修请求房东又不理。这时我女朋友发现疫情期间希尔顿酒店超级便宜,我们顺势就退了房住进了酒店。搞笑的是,由于我们要住三个星期,酒店前台高度重视,特地给我们安排了一间全景湖景套房,俯瞰密歇根湖。放平时我相必是断然不会花大价钱住这么一间的,也算是感谢疫情吧。

8月底又回到了玉米地,搬进了新公寓。倒霉的是我把自行车从老公寓骑到新公寓的路上把后轮给扎破了(在此吐槽美国的路真的是自行车不友好)。疫情期间修车铺又都关了,车就没法骑了。我的新房间在一楼朝北,采光远不及老公寓的房间。本身屋子的照明条件也不好,疫情期间整天窝家里,颇为颓废。以后装修自己的窝采光真的得好好搞,很影响心情。新学期学校还搞了非常雄心勃勃的新冠检测计划,所有在校学生都要一周检测两次。我一开始不是很看好这个计划,觉得出去检测反而增加感染几率,正好自己公寓离学校很远,写了封申请豁免邮件免去了检测。随后学校检测出的病例在几周内飙升,不少本科生在宿舍大搞派对,而检测出阳性后的隔离安排颇为混乱。在学校重拳出击,将违规者直接退学后,疫情得到了控制,也让我对学校刮目相看。不过随后的感恩节假期还是很轻松地击垮了学校的防疫措施,单靠学校要管住那么多学生还是太难了。

10月1日我搬家去了匹兹堡和女票团圆。女票不愧是社交达人,隔几个礼拜便组织密友进行小规模的活动,从做月饼到玩桌游,非常的欢乐。时不时地还可以一块去周边的公园爬山(毕竟山城)。这段时间最大的发现可能是一个每周给你配好餐,备好原材料打包送上门的餐饮服务。事先网站上选好菜谱,买什么菜,怎么做都不用操心了哈哈,照着食谱从冰箱里拿出配好的原材料做就是了。想想还是很幸运的,疫情并没有怎么影响到我的生活,甚至可以说是提升了我的生活水平。

助教

2020年我第一次当了助教:春季带计算机网络,秋季带分布式系统。两个学期的助教都是一开始没申请上,快开学了突然候补转正了,也算是运气不错。当助教给我最大的感受是一门课拿A和真正掌握这门课的内容并能系统性地输出相距甚远。在Office Hour答疑时,你的每个知识点漏洞都有极大可能暴露在学生的疑问中。即便是已经掌握了的知识,如何深入浅出地把知识讲透也是一个极大的挑战。此外,答疑时的时间安排也是一门学问,有的学生一问问好久,但是后面排着一长队人,不得不学会怎么提前告知大致的时间分配限制,和中途怎么委婉地提醒学生超时了。更为令人苦恼的可能是学生拿着编程大作业的代码给你看,每个人写得都不太一样,还动不动上千行的,看起来真是头疼。后面发现让学生自己给我讲一遍他的代码更有效率,不过又碰到了大部分学生自己也讲不清自己的代码的问题。这个时候我只能甩锅让他们自己结对讨论思路去,后面发现效果还可以,不过疫情之后就很难这么做了。

有趣的是,我们学校授课有三种方式:传统的线下授课,网上在线授课,Cousera网课(针对在线硕士项目)。我两学期的助教经历碰巧覆盖了全部三种授课方式。其中春季的计算机网络课一开始是传统的线下授课(但是会有录制的课堂视频),后面考完期中考就碰上了全校转成线上教学。我们的期中考试还是传统的纸质试卷形式。一个头疼的问题是卷子批完了,以往是直接还给学生的,这次因为疫情无法把纸质的试卷还给春假后散在全美各地的学生们。我们的解决方案是把每一份试卷都扫描出来电子分发给学生。那会也是挺蠢的,一个博士生跟一个硕士生,不会用高级的扫描仪,人工把每一份试卷拆开来,一面一面地扫描,再合并一整份扫描文档。扫了一小时觉得太累了,开始研究起扫描仪怎么用,结果发现它可以自动扫描一证份多页文档。当然作为CS的学生,我后面还写了小程序自动把扫描的试卷分发到学生的GitLab仓库里去。秋季的分布式系统课是网上在线授课和Cousera网课并行的,但是两种授课方式下的编程作业并不一样,带来了很多混乱的场面。特别是没有一个助教做过Cousera网课版本的编程作业,使得Coursera学生得不到有效的关于编程作业的帮助。这是一个比较大的问题,需要来年改进。一个突发事件是学期刚过半时,教授在印度的母亲要动手术,教授千里飞了回去陪伴在旁,把全部的重任暂时交给了助教团队。好在课程主要依赖过往学期的课程录播,在整个助教团队的合作下平稳地结束了一学期的教学。值得一提的是,整个助教团队分布在全球多个时区,一开始的沟通协调让我颇为不适应,当然后面慢慢就适应了。

找工作

2020年是我研究生的最后一年,自然也是积极找工作的年份。19年10月底的时候,我拿了Quora的2020年暑期实习offer。那个时候我还畅想着暑假好好实习,争取直接转正。理想中的计划是和女朋友一同留美工作一段时间再看要不要回国。2月份的时候,新冠疫情传到了美国,但是我还是很乐观地觉得这不会影响到暑期的实习的。3月份的时候,陆续有公司将暑期实习转为线上,个别公司直接撤回了offer。这个时候已经有一些同学开始做两手准备了,在国内外都积极开始寻找保底的机会。后知后觉的我毫无动作,依然寄希望于公司不会撤回offer。紧接着HR给我打了通电话,暗示我现在可以取消offer,另行去找别的机会。这个时候我开始有些急了,与此同时却又很悲观,感觉这个时间点再找希望渺茫,于是乎依然毫无动作。最终4月13日的时候,HR通知我暑期实习被取消了。这个时候离国内腾讯实习投递截止日期只剩一周,被焦虑暂时击垮的我最终也错过了腾讯凌晨的笔试。之后重新振作起来的投了国内外好多家,不过最后都石沉大海。阴差阳错之下,我联系了我很喜欢的一个教授,意外地开启了一段科研之旅。

在此期间我也和我女票讨论了下,觉得在这样的形势下一起留美可能很难,而美国面对疫情的糟糕处置和两极化的政治氛围也让留美的吸引力打了折扣。我于是打算国内国外一起找再择机而动。出乎意料的是,招国内工作的事格外顺利。6月中旬的时候,一同Quora实习被取消的一个小伙伴问我有没有兴趣投字节。我一开始还以为他说的是投暑期实习,结果官网一看发现找全职的提前批都快截止了。我赶忙挑了一个杭州的岗位投了出去。字节的面试效率令人惊叹,在有时差的情况下,以几乎是两天一面的效率迅速完成了四轮技术面试。二面的面试官尤其令我印象深刻,知识面之广博令我叹为观止。大概是自己平时储备还不错吧,没怎么准备,第一家公司的面试就这么拿了offer,分组被分到了流式计算的组,也是我很感兴趣的方向,可能也是命运的造化吧。与此同时,华为的HR也联系了我,后面也顺利通过了全部面试。特别想吐槽的是,华为过了面试只代表进入人才资源池,拿offer还得排队被捞起来,真的是匪夷所思。由于有了字节的offer,我后面只投了阿里,腾讯和百度。阿里和一个P9的大佬聊了一下,全程被问参与开源项目的经历。可惜自己没怎么参与过,随后就被默拒了。腾讯面了一个视频架构的组,感觉聊得还行,不过也被拒了。后面百度我也懒得面了,就这么接了字节的offer。

找国外工作就很不顺利了。投的不多(不是特别想去的就不投了),全部被简历拒了。唯一一个面试机会来自Quora,而且被取消暑期实习的同学可以只面一轮技术面。遗憾的是,唯一的一轮技术面里,我卡在了算法题上,被提示了好几次才做出来。本来还想了挺久Quora跟字节哪个好,后面想清楚了还是去字节,开始想怎么跟HR说把Quora拒了,结果面试没过。HR还专门跟我约了一个Zoom会议来通知我被拒了。虽然这可能是为了体现对被面试者的尊重吧,不过让我感觉更忧伤了。说到做算法题上,我是真提不起太多兴趣做算法题,为了准备面试Leetcode刷了差不多400题,也写了大量的做题总结(最后也编成了一部不完整的算法手册)。最终的结果是算法水平提升了(明显感觉自己的项目中运用算法更得心应手了,当然这些算法放到面试基本算是简单题),做题水平倒是感觉没啥提升,笔试面试的时候不会做还是不会做。。

科研

原本我是没有参与科研的想法的。本科时期的小段科研经历已经让我认识到我喜欢做更具体明确,有更直观产出的工程实现方面的工作。阴差阳错的是,暑期实习被取消之后,我联系了我的OS教授询问暑研的机会。我的OS教授也许是我目前为止见到过最有个人魅力的教授。他能将复杂深奥的知识讲得清晰易懂,他也能将原本枯燥的课堂变得生动有趣。他一方面看上去是个“大”学生,喜欢free food,理想职业是tenured graduate student;一方面又显得格外成熟,为学生分享他的研究经验和在工业界和学术界的体验差异。他一方面很严厉,slack里常常点名批评做得不好的学生;一方面又关心学生的生活,而且悉心为学生分析职业路径的选择乃至情感问题。说来好笑的是,我上了他两门课,和他合作了半年的项目,前后将近一整年的时间里我只(线下地)见过他不超过5次。春季学期刚开学没多久,他去加拿大办签证结果回美国被拒绝入境,就此被困在了加拿大,提前开始给我们远程授课。后面他终于回来了,第二天学校就宣布因疫情所有课程转为线上教学,就这么一直持续到了我毕业。

言归正传,我的第一个项目是开发一个针对JVM上运行的程序的程序配置追踪框架。此前一个学长的项目已经实现了这一功能,但是他的实现与上游分析高度耦合。我们希望将这一底层功能抽象出来,从而服务于更广泛的上游分析。学长提出的方案是基于底层的Soot编译器框架,从头写一个污点分析框架。经过文献搜索,我提出了基于FlowDroid,一个Android程序污点分析框架来实现我们的功能,这样可以节约大量开发时间。然而,我花了一两周的时间试图理解这个框架,迷失于源码的海洋中。最后导师让我介绍这一框架时只能支支吾吾地说些高层次的概览信息,但是具体怎么通过这一框架实现我们的需求依然不明确。导师严厉地批评我说我不主动去思考怎么去实现我们的需求,作为项目的组长没有take initiative。这之后我重点关注起怎么改造这个框架来实现我们的需求来,顺利地推动了项目的进展。然而事后证明这里我给自己挖了个大坑。至少在暑假时看来,项目进展出奇地顺利,以至于我的导师都说这一切seems too good to be true。

基于FlowDroid的程序配置追踪框架告一段落之后,我们打算利用这个框架进行一些开创性的研究。我们的目标锁定在了程序配置使用的不一致性上。这些不一致性会使用户在配置程序时对程序的预期运行效果产生误解,甚至可能导致严重的生产事故,因此我们希望可以开发一个工具来自动地找到这些使用不一致的配置值,提醒开发者修正。大致的思路是通过程序配置追踪框架追踪同一个程序配置或者同一组类似的程序配置的全部使用路径,找出这些程序配置使用上的不一致的地方来(比如说一个string类型的配置值在进行字符串比较时是否始终是大小写敏感的)。与暑假不同的是,这次我要带领一个三人小组一起攻关这个项目。我第一次深刻地意识到带人实在不是一件易事,我要确定项目的大体方向,要合理地分配任务,要是团队成员一开始的领域知识有所欠缺的话还要帮他补上。疫情之下,三个人和导师分属四个不同时区,也无形中大大增加了沟通的难度。好在在导师的帮助下,起初还算顺利。不久,我们发现了我们的程序配置追踪框架在同样的配置设置下分析同样的程序多次会出现不一样的结果,这对我们项目分析结果的可重复性是一个致命的打击。随后的研究表明这个不可重复性似乎是来自FlowDroid本身,而FlowDroid的作者也向我们证实了其存在潜在的bug导致了非确定性的分析结果,但是短期内他们无法修复这一点。

于是整个项目的进展回到了零点。最终我们决定回到暑假最开始的地方,基于底层的Soot编译器框架,从头写一个污点分析框架。当然过去4个月的努力也没有白费,改造FlowDroid的经历让我积攒了大量关于实现污点分析框架的经验。而从头写一个污点分析框架的过程,逼着我反复思考一些细节上的实现选择,反过来让我理解了FlowDroid的一些原本无法理解的设计的巧妙之处。但是如果FlowDroid没有bug的话,我们的框架在精度和可拓展性上完全无法与FlowDroid媲美(我们的框架也大概率有bug)。虽然做了一些针对特殊应用场景(程序配置追踪)的功能定制,但是我们的项目是否能被真的用起来,用得好还是个未知数,尤其是我们也为了支持一些特殊使用场景对其他使用场景的支持做了妥协(而且妥协之后依然效果不理想)。

不论这段经历最后的产出如何,我算是第一次较正式地体验了科研。一个副带效果是我学会了,并且爱上了使用GitHub Issues来管理项目的进度。比较遗憾的是,由于我懒+打定了注意大不打算读PhD吧,导师让大家申请fund参会OSDI我也没去,领域相关的研讨班我也没去过。导师大概也是看我不读博,没专门点名批评我。不过想想还是浪费了不少成长的机会。此外我目前感觉还尤其欠缺的一个能力是怎么把复杂深奥的知识讲得清晰易懂,我经常讲着讲着绕来绕去说了一通,导师一两句话总结就感觉比我说得还清楚(捂脸)。导师最近提到他一个朋友判断一个人读没读过博的标准就是看他能不能把一个复杂的事讲得很清楚,希望我没读博也能慢慢修炼地让他朋友误判吧LOL。

回国

正常情况下回国并不是一件难事,地球的两端靠一张机票便可联系在一起。不过在今年的特殊形势下,回国之旅可谓挑战重重。好友赵行之回国一波三折(一个不幸的事往往接二连三而来的故事)。本来觉得12月才毕业,回国还不是很急的我,在他的劝说下,7月份开始搜索回国机票信息,发现12月前从美国直飞回国的航班经济舱已基本售空,于是果断买下了12月19日的旧金山至上海的回国航班。根据那个时候的政策,只要填健康码和登机前一周内做一次核酸检测拿到小飞机的图标便可登机。此后核酸检测的时限要求不断收紧,不过也不是什么大问题。

后来到了11月份,政策突然收紧,要求登机前48小时做核酸和IgM抗体双检测拿到绿码后方可登机。此时我已经到了匹兹堡,一番搜索之后发现匹兹堡并没有可以做IgM抗体检测的地方,只能去旧金山做。在一亩三分地论坛上根据网友的攻略选定了检测机构,订好了去旧金山的机票和酒店。之后虽然有些小波折(航班信息每周都在变),一切都很顺利。12月16日坐飞机在美东暴风雪中自匹兹堡起飞,经芝加哥中转(所有匹兹堡直飞旧金山的航班都取消了),顺利抵达旧金山,做了检测,拿到了绿码。

起飞前一天,我突然右下方的智齿开始肿胀。吃了头孢之后,炎症有所好转,顺利通过了机场的测温上了飞机。上了飞机之后,炎症加重,一度无法张嘴进食。好在我妈上飞机前在航班群中找了一位热心的杭州老爷爷要了一盒抗厌氧菌的替硝唑。虽然药已经过期了大半年,但是临到头来也只能服了试试了。我的女朋友也特别地照顾我,在飞机上让我躺着睡了大半程。在大家的关切下,药起了作用,下飞机前炎症得到了控制。到了浦东机场,要依次完成测温,填写知情书,鼻咽部取样核酸检测,入关,拿消杀的行李,最终统一前往隔离酒店。与之相比,美国的防疫措施可谓形同虚设,也难怪确诊人数屡创新高了。

本以为到了隔离酒店平平安安地隔离两周就好了。就在2020年的最后一天,我女票突发急性肠胃炎被送到了医院。希望她早日康复吧,健健康康地迎接2021第一缕朝阳。

新年

希望疫情可以早日过去。其他的话,2021也没什么特殊的新年愿望吧,和菜菜一起好好工作,好好生活就够了。

2020年12月31日于苏州隔离酒店