2018 年是我算法竞赛生涯最辉煌的一年,也是最后一年。因为这是我第二次进入世界总决赛,根据官方的规定,我将再不能参加 ICPC 系列比赛。至于其他的单人比赛,由于自身实力不足加上最初的热情已消失殆尽,我也没有计划再参加。离开了算法竞赛,自然想找些别的事情做。最近几个月,发生了很多事情,使我对自己想要的生活的认知也愈来愈清晰。这里不得不提一下,我的很多观点在 BYVoid 大神博客的启发下变得愈加成熟。虽然很多文字是他若干年前写下的,但是对今日的我仍十分适用,我不得不由心感叹:此乃神人也!
BYVoid 给我一个很大的启示即不要盲目追求他人的追求。大家都在追求继续深造,去做研究,但这不一定适合自己。大学刚入学的时候,我也跟着大家刷 GPA,准备各种语言考试,每门课不管学会了什么,只要分数高就行了。
— 为什么要分数高?
— 因为将来可以申请更好的学校。
— 为什么将来要申请最好的学校?
— 因为可以更好的深造。
— 为什么要深造?
— 因为老师学长都说这样好。
但是仔细想来,这种”随大流”的做法真的是适合自己的吗?我不是说同学们这样做一定是不对的,有些人可以静下心不闻窗外事,有些人有超人的智商,这种人去做研究当然没有问题。但是在我们自己去追求做这些时,有没有考虑到自己的实际情况呢?拿我自己来说,我是一个很”浮躁”的人。做一件事情的时候,如果做了很久都没有效果,就会开始自我怀疑 — — 这样做是不是有问题?我是不是应该换个思路?我是不是不适合做这种事情?这种”浮躁”是性格的一方面体现,很难简单的以”好”或”坏”来评价,但是可以作为是否”适合”一件事的评价标准。
我明白自己不是可以”两耳不闻窗外事,一心只读圣贤书”的人,也无需强求去做自己做不到的事。所以在离开算法竞赛闲下来后,我决定去业界实习,去做一些短期实实在在可以看到变化的事情。看到自己做的工作有了效果,自己会产生一种成就感,这种成就感可能不大,但是可以作为鼓励自己继续做下去的动力,进而让自己坚持下来完成一个困难的任务。有些人不需要这种成就感便可以坚持下来,而我的性格却决定了看不到效果很难有动力,这是我选择去业界的很重要的原因。
实习的准备
我的大学生涯可以说是相当单调:两年多的主要精力都投入到了算法竞赛。所以简历是很好准备的 — — 罗列上竞赛生涯拿到的种种奖项就占了将近一页。再加上一些课外活动,比如担任 ACM 队队长,去国外暑期交流等就差不多了。我原本想再对简历做多一些包装,但是想来想去也没什么可写的,朴素些就朴素些吧。
准备好简历,就是选择哪些公司了。由于这是我第一次实习,所以没有任何经验,只能从学长那里了解情况。但是学长介绍的各项工作的具体内容我也是听的一头雾水:因为很多技能之前根本没有接触过。但是我了解到了一个重要信息:对于中国计算机专业的学生来说,难度最大的是 Google,其次是 Hulu、Airbnb 这些外企,再其次是腾讯、阿里这些大的中国公司。我心想用最简单粗暴的做法来投简历:投最难的,于是我投了 Google 和 Hulu 的实习,其中 Google 找了正在 Google Sydney 工作的张伟华学长内推。两家公司都很快接到了面试的通知。
中间有个小插曲,腾讯的 HR 从学长那里得到了我的联系方式,联系到我问我对腾讯有没有兴趣。抱着多个机会没坏处的心态,我表示有兴趣,随后 HR 为我安排了面试。所以虽然我只投了两家公司,但是最后却面了三家。
Hulu
Hulu 的一面是所有面试里面最早的。面试形式是面试官打电话给我,同时给我一个网址用于写代码,面试官一边在电话里和我说话,一面在网页上看我写的代码。由于是第一次面试,所以有一些紧张。面试官首先问了我一个图论的题目,那个题目十分简单,我很快就解决了,心情也放松了很多。随后她又问了我一道稍难的数学相关的题目,由于前面进展很顺利,这道题没用多久也被我解决了。解决了这两道题之后,我看时间才过了半个多小时,这距离计划的 50 分钟还有很久,于是就和面试官聊了一下其他方面的内容,等到时间差不多的时候就结束了。
面试结束后过了十几分钟 HR 打电话过来说我一面通过了,问我什么时候有空进行接下来的面试。当时由于我即将去秦皇岛参加一个训练营,又考虑到即将过年,所以就将后面面试时间拖到了年后。
年后开学的第一周,HR 为我安排了后续的面试。后续有两轮面试,每轮一小时,连续进行。也就是说会有连续两个小时的面试。二面和三面与之前的一面的不同点在于:不是通过电话进行语音沟通了,而是通过一个叫做 Zoom 的软件视频交流。我认为这样其实更好,因为彼此都可以更清楚的看到对方的表情,从而获取更多的信息。总体上来说二面和三面也是主要考察算法能力,只是难度相对提高了一些。二面的题目我顺利的解决了,三面的题目由于一开始方向出现了一些偏差,导致只是实现了基本功能,没能做到最优化。
面试结束后过了不久,HR 通知我面试通过了。
Google 的面试形式和 Hulu 一面的形式十分相似,也是面试官打电话过来,同时在一个 Google docs 上写代码。可能是一面只是初筛的缘故,Google 的一面和 Hulu 的一面一样也很简单。一面考察了一道编程题目,因为那道题目并不涉及算法,所以我按照面试官的要求一步步完善,直到符合了面试官的要求,面试就结束了。
面试结束后过了一个多小时,Google HR 给我发邮件告诉我一面通过了,并给我安排了二面的时间。
由于一面相对顺利,我低估了二面的难度。二面一开始,面试官就给了我一道很难的算法题,我读完题目之后感觉毫无思路,只能去逐个试探题目的突破点。过了十几分钟还是没能想到比较好的做法,于是我准备自己手算一个例子来观察一下,当我把例子写下来的时候,我突然发现了一个很关键的点,并通过这个点想出了一个次优的做法。这时时间已经过了很久了,面试官让我先把次优的做法实现一下,但是我觉得自己距离正解很接近了,所以向面试官又申请了几分钟思考时间。思考片刻后,又灵光一现发现了另一个关键的点,从而想出来了最优解法。这时时间已经过了很多了,我马上开始思考代码怎么设计,思考清楚后开始写。由于这个题目确实思考了很久,所以逻辑很清楚,只用了几分钟就完成了代码,完成代码后和面试官简单的聊了一下就结束了。
二面结束之后,我觉得自己发挥的不错,所以一直很激动的等待结果。但是等了好几天都没等到结果,我看了下日期,马上就要过年了,猜想 HR 可能已经放年假了,所以就不指望年前可以出结果了。然而就在腊月二十九的凌晨,我收到了 HR 发来的邮件,告诉我二面通过了,接下来只需要等待 Hiring Committee Review!
等待 HCR 不需要我做任何事情,所以我便没有过于关注这件事情。几天前,我突然接到一个来自北京的陌生号码打来的电话,一接听发现是 Google 的 HR,她告诉我我通过了 HCR。
Tencent
可能由于非外企的缘故,腾讯的面试方式和 Google、Hulu 有很大区别。一面的时候面试官问我学习过哪些课程,我如实回答操作系统、计算机网络等,然后面试官就问了一些相关的基础内容。不得不说,由于精力过多投入在比赛上,对于课上的内容我的掌握程度只能应付考试,面试官问我的问题我回答的磕磕绊绊。问了很多这种基础知识后,面试官又问了我一个算法题,那个算法题是一种算法的裸题,只要是系统学习过算法的同学都应该学过那种算法,所以我都没有思考就写出了代码。
由于面试官问了大篇幅的基础知识我回答得很不好,而最后的算法又只占一小部分,我一度觉得自己无法通过面试了,但是面试结束后面试官却直接告诉我我通过了面试。面试结束后我赶紧恶补专业课的基础知识,准备后面的面试。
二面的时间 HR 迟迟没有说,直到某一天我突然接到了腾讯的电话,电话那边说要进行面试,我十分慌张 — — 因为当时我正在地铁上,完全没有面试的状态。于是我问面试官可不可以推迟面试,面试官却说只需要十分钟,于是我就找了一个安静的地方和面试官聊了一会。电话那边没有问我技术类的问题,只是问了一下我的打算和擅长的领域,由于和之前接触的面试完全不同,所以我也没有把这次通话当成面试,也就没有放在心上。
过了几天,HR 突然告诉我说我通过了技术面试,我十分吃惊:难道那次十分钟的通话就是二面了吗?之后 HR 又补充道,接下来还有一轮 HR 面试。不过 HR 面试只是了解一下面试者大概什么时候可以参加实习,将来的就业计划,也没有问到技术问题。
就这样,我”莫名其妙”的拿到了腾讯的 offer。
纠结的选择
由于大三时间只剩半年,加上这半年的课程也不少,所以我没有可能三个 offer 都接受。选择哪家成了一个大问题。坦白来讲,这三家我都很有兴趣,面试途中也都给我了不错的印象,尤其是 Hulu,为了一个实习生竟然准备了三轮技术面试。是“但鱼和熊掌不可得兼”,无论如何总要有所放弃,我十分纠结。到写这篇文章时,我还没有做出最后的决定。
总结
断断续续两个月的面试经历,我了解到了很多事情,也发现了自己的很多不足。期间要十分感谢张伟华学长、王袤广学长给我提供的各种帮助,也要感谢 qls,沈俞霖学长、张建平学长、陈景琦学长等为我解答疑问。无论如何,最终是拿到了自己满意的 offer,期待在接下来的实习过程中,可以找到自己擅长的方面,做出让自己满意的成就,也希望在更远的将来能成为想成为的人。