2019年末的一些想法与近年状态

今天是2019年11月29日,距离2020s没有多少天了。

今年是研究生生涯的第三个年头了,简短回顾一下我的近年来的状态吧。

研一

2017年的夏天,可能由于之前做过验证码识别的东西,效果还挺好的甚至还拿了个什么奖,我觉得自己可能对深度学习有点兴趣;也觉得目前的 Deep Learning 有很多问题没有解决:比如如何从大量无标注数据中学习到内在逻辑、比如如何实现动态的网络结构。我的心态更像是试试水的态度,爸妈感觉这个行业也很有前景,于是基本没怎么犹豫,我选择了本校保研,方向是深度学习。

后来的半年,感觉这个东西并非我想象的有趣并可解决;与想象不同的更是对研究生教育方式的不适应:我想多花点时间打基础,至少要多看点各种细分领域的前人研究,但是事实是导师并不 care ,一上来就问我想做哪个方向,并在一两个月后赶鸭子上架一样 push 我出成果。事实上很多成果,我认为并不能叫做成果,因为很少真正 work 并且有实际意义。后来我逐渐认识到,当前的大多数机器学习领域的研究,只 focus on 细节的修修补补,往往只是将具体任务的先验信息嵌入深度网络的结构,取得一点点指标的提升。

这并非我想要的东西,加之导师惨无人道的 push 手段,在那段时间我精神状态是非常焦虑的。内心感到焦虑却没有方向,说逃避也好,说追求也好,我开始闲着无聊试着学点别的东西,比如试着写一写 Golang ,然后发现意外地好用,作为一个 Python & C++ 选手,Golang 应付高性能并发省了一堆麻烦事;拆了一个叫喵喵机的热敏打印机的协议并接入微信公众号等。

研一的下半年,受不住导师 push 我终于跑路了。不是 quit,而是换了一个导师。不 quit 的原因也很容易猜到:“你退学了没工作咋办?”、“你再忍忍”诸如此类。当时的我并没有比较独立的想法,也没有什么未来规划,只能这么下去了。新的导师是我以前的一个老师,科研产出相比之前 push 狂魔少了点,但是就人品和态度比之前的高了一个数量级。

但是即便是换了导师,我对 DL 这些东西还是不太能提得起劲。可能根本原因是觉得没有实际价值吧,但是既然选择了这条路,就得干下去。后面接触了 Video Segmentation 和 Optical Flow 领域,感觉说不定可以搞点东西?于是半摸鱼半干活地尝试用 FlowNet 中的 Correlation 一些没有标注的视频,计算帧间的类似 Flow 的东西,并作为权重将原始帧恢复为下一帧,以此实现对高层语义信息的抽取。做这个的过程中学着写了一些 CUDA 代码,虽然最后实验没啥成果但是 CUDA 倒是入了个门。

再后面,摸鱼的过程中找到了一个垃圾手游,叫少女前线。我室友把这类游戏叫做种菜游戏,我感觉挺生动形象,因为要做的也就是每天上去点一点。作为一个程序员自然不满足于每天点点点,于是针对安卓版本的游戏客户端,尝试拆掉游戏的加固,拿到通信加解密算法和通信协议,最后用 Golang 实现了一个简易的游戏脱机挂。再后来,做的更复杂了一点,比如接入代理池、批量注册、批量挂机、无伤战斗之类,感觉还挺有意思。后面看着某宝上的都是一堆安卓模拟器挂机,而我可以单机挂数千个账号,还是蛮有成就感的。比起 Deep Learning 领域的大多数无用的问题,我觉得光是有用这一点就已经足够我认为它更有趣了。

研二

后面的一年依旧是半干活半摸鱼,虽然没啥正经产出,但是也学了不少、造了不少好玩的东西,比如某个多连接加速的小飞机、逆向并学着用 Flutter 写了某粉红色漫画App的第三方版App、养了三只仓鼠并为它们创建了一个自动发布每日运动步数的微博、写了可权限分级的 TG 转发 Bot 并4个月收获 6000+ channel 关注之类。

三四月份开始找暑期实习。关系到我将来会一直从事的东西,方向一定要慎重选择,至少不能再抱着试一试的心态去搞玄学炼丹了。而我真正喜欢什么呢?静下心来想了一想,从本科以来,1. 我喜欢的东西都是很有用并 work 的东西;2. 对于稍偏底层的东西更有兴趣去了解它的工作原理;3. 更希望做有难度更 hardcore 一点的东西。结合这些经历,我投了几家云计算开发岗,比如蚂蚁那边是云原生方向。

一共面了三家:旷视、字节跳动、蚂蚁金服,幸运的是都收到了 Offer 。

旷视在北京,就不考虑了。字节和蚂蚁感觉都挺不错,但是鉴于蚂蚁的江湖名气和口碑还是要比字节这种新公司要大一些,字节那边岗位也并不确定,我选了蚂蚁。在蚂蚁做的事情主要是基于 SQL 提供 ETCD 的能力,因为多数派协议做不了双机房高可用;而比如 MYSQL 可以直接主备双机房高可用。对于 Federation 这种需要跨机房高可用的情况,至少要三机房才行,很多客户同城也只有双机房。做这个东西前后尝试了两种数据库表设计方案,一种是存单副本,每次 UPDATE;另一种是类似 ETCD 做 MVCC 记录同一 key 的多个版本,并通过周期性 Compact 删除冗余历史数据。第一种方案对于 ETCD 的TXN 并不好做,而第二种可以以稍高的并发失败率来换取高性能的插入。

在蚂蚁的这两个月一开始并没有很开心。阿里郎搞得我很烦,感觉做什么事情都有人盯着。我对它做过一些逆向工作,因为工作量比较大只做了一点点,至少发现了这个东西在向常见的浏览器进程注入代码。在这一点上我很理解公司的行为,同时把公司电脑与私人电脑隔离开也可以一定程度上避免隐私问题,只是监控员工这种行为让我感觉很不舒服。这种行为在我看来威慑的意味更大一些,因为它根本就没办法完全防止数据泄露,地位和地铁安检一样的尴尬。

但是!我的 leader 是一个很nice 的人!我刚进去的时候发现团队都在写 Java,就感觉很僵硬,因为对这门语言一直没什么好感。不过后续因为业务和框架要求不得不学一学写一写,这个过程中我的 leader 给过我很多指导,我很感谢。能帮实习生 Review 代码的 leader 一定不会差。

后面 leader 找我聊过很多次,给我了很多启发。其实我只要做好自己就好了,只要学到自己想学的,并不是对公司一定要是 100% 满意才要认真工作。所以无用、不重要的那些东西,无视就好了。实习结束我一度非常确信我会接 Offer,最后因为薪资原因还是签了字节跳动。因为这一点我一直觉得对 leader 很对不起,哎。

在蚂蚁的两个月,我在工程能力上进步不少,从 Java 一窍不通到了能基本把 SOFA Boot 用起来并搭一个高稳定的基础服务,至少以后写 Java 做个 CRUD boy 是够了哈哈。和自己的 Toy Projects 相比,写生产级别的东西的确有更高的要求,我也得到了远比自己折腾快得多的成长。比起这个,我觉得对我个人心态上的成长更重要一些。我开始思考我到底想要什么,开始理性地分析价值观中不合理的部分。

研三

到了研三,开始感觉到比较强的毕业压力了。虽然学校的毕业要求并不高,但是老板表示他的要求没有那么低。从十月份开始被老板催着赶论文实验,就是把一堆东西一堆信息往一起糊,本来就是个玄学方向,又不加论证分析,能不能出结果那当然看脸的啊。事实是脸挺黑的。

老板不放轻易毕业,我也很无奈啊。突然就想起了退学。这个念头就像星星之火,越想越有燎原之势。抛开这个证的意义,我觉得我可以结束我的复旦生涯了:我得到了我想要的成长,剩下的只有完全没兴趣没意义的东西。而如果分析一下证的意义,除了上海户口外好像也没什么了?我觉得与其需要证来证明自己,不如背水一战用能力来证明吧,何况复旦本科学历应该还是够的。

因为有出国的打算(长期),就感觉这个东西愈发没用,它值得我做半年无趣东西吗?和字节跳动协商后,那边的答复是可以以本科学历走社招接收我。嗯,感觉生活还是蛮有希望的!我也并不觉得我这两年多会因为放弃毕业证而消失其意义,虽然看起来的确有点可惜。

今天交掉了退学申请。

这两年多的时间,我逐渐增加对认识自己的认识,价值观也更加独立,虽然走了点弯路,但是无论是那条路,过去了就是过去了,各有得失吧。对自己的期望就是未来能够更理性独立地思考、更虚心踏实地成长、更谦和友好地待人,更勇敢真诚地面对未来。