大三时从决定开始为日后工作做准备,到拿下字节的技术岗实习offer,经历大概4个多月。想通过回顾下经历的方式,顺带总结一些技术岗实习备战经验,以飨后人。

想定找工作是在19年10月左右。之前业余的时间差不多一半从19年寒假开始,扔在跟杜*全后面开组会,听论文,拼屎堆上,另一半从19年7月开始,摆弄摆弄论坛系统的雏形,当时所在的编程社团希望在学校推出这个论坛去收割用户。19年暑假期间本来老师计划让我和另一同伴去西安参加一个医学图像识别比赛,但因为主办方的比赛要求一锅粥、老师通知的传达问题和我自己的基础问题,最后初赛结果也没顺利提交,比赛之路就这么完蛋。之后差不多就是开学,老师还希望我能在那个比赛的屎堆上继续做修改,准备基于那套数据集写论文。开始对原先坚持的论文保研的道路产生了丝丝怀疑。

9月份是16级为了保研战火纷飞的日子,安大我们专业(计算机)这一届保研情况,说真话就是挺糟,有点穷小子看不上绿茶的既视感つ﹏⊂,不点名的某些学校,之前对我们学校专业收保研可以收到末尾保研的,但19年就只要年级第一的人才能去。还有一件触动我的事是和我在同一个课题组的学长,他之前投了一篇被SCI二区接受的期刊,走到Accept的阶段,但还没有被SCI检索。恰恰这时候保研评定开始了。之前我在的院默认牵涉到论文评级时都是以SCI检索到的才计入评级依据,但这位学长恰恰发论文的时机就是这么巧,之前学校的保研细则也没说明白,需要是SCI检索的论文才能满足条件。学长尝试过和院系领导Argue过,但后来看他动态,应该是Argue失败,收拾收拾准备考研了。这么算的话,投论文保研的机会成本大的过分。算下来的话,我得在19年末写完论文第一稿,之后反复修改之后投过去,才可能凭论文提名次蹭到保研的名额。至于什么时候确定被检索,看命。9月末的组会,轮到我主讲。我把之前的屎山画了个ppt图,展示了一遍,确实是期望基于这个网络写论文,里面提到训练集和测试集数量,被老师抓住错误说了几句,承诺会后修改。组会之后,我自己在想,9月末这时候,离准备论文不到3个月,自己连训练集测试集的意义都能搞混,发表论文是真的困难。想到当时跟着老师做科研活动的动机,说出来不怕被笑话——为了不至于拿不满创新创业学分从而毕不了业,于是采取跟老师真正做科研这种时间成本这么大的方式,实际上对深度学习这事物并没有啥激情去研究。之后再被保研诱惑着,希望靠发表论文,获得加名次,在末尾名次保上研。现在写这些感觉挺荒谬可笑,但一年前不但当了真,还真的去实施了。于是几天后做出决定,网上私聊老师,决定退出做科研,专心备战找工作。老师还是一如既往地“嗯”,但这一次让我觉得云淡风轻,终于能摆脱这种活得不明不白的日子了。

保研、考研、工作,如果自我认知不是大佬的话,那想做到兼顾准备两者及以上还是有难度的,但中国学生嘛,从中高考开始,养成一个习惯,什么东西,只要它是需要争抢得到,那么它就是香的。但这件事并不适用于选择三个去向上。保研不少人三年头铁去抢名额,大三也有很多人选择去考研,甚至之后二战三战,但路径选择还是得看兴趣,看适合度,不是依据争夺的激烈程度。选定路径之后就要试着敢于放下另外的出路,沉没成本作为决策的依据,是不合理的。

10月初选定想工作之后,下一个问题是怎么准备去工作。离大四秋招季还有近一年,但离寒假只有3个月了。想寒假期间开始投实习,考虑了下我已有的资源/知识:

  • 计算机网络、编译原理当下学期在学
  • 计组、数据结构、操作系统、数据库之前学校考试分数还行,但忘了不少
  • 《CSAPP》看了大半,做了部分题目
  • C++语言比较熟
  • 大一在不同平台刷了适量基础算法/数据结构的算法题
  • 代码量按行数算差不多够格
  • 额外有玩Linux服务器的经验
  • 带着学校的一个编程社团的后端组,可以两个月内push一个项目用于美化简历。

准备的本钱差不多就是这样。

之后是想搞明白我需要准备哪些东西,才能让我在几个月之后能够到大厂的实习生招聘要求。普及一个方法:

  • 明确掉自己想去什么职位,精确到能在公司招聘职位列表中挑出来的那种。正面例子:我想做服务器/后端开发。反面例子:我想以后做程序员。
  • 网上大量搜索职位相关的往年招聘信息,开好一堆放着
  • 一个一个过一遍,同时开一个笔记本,看到之前没出现的要求就记下来,过完了也就能知道对这个职位,公司不约而同看重哪些能力/技术栈

我经过这个过程之后,得到这个技能列表:

算法题:
66(剑指offer)+83(程序员面试宝典)约150题
每天至少3题,理想情况50天完成(旅游两天去掉吧,其他一定要保证每天)
Leetcode、其他的“典型”算法题待安排
感觉有启发的算法题要记笔记,供之后复习

牛客的基础题:
先打卡1-2天看情况,再定计划

C++基础:
4本《Effective》系列,暂时1个月1本
《程序员面试宝典》5-12章,最多2天一章过一遍并适当做笔记

C++项目:
自顶向下方法的4个作业,boost/asio+thread库完成,正好1个月1个
智能指针,看完2本Effective后可以尝试开始写(半个月?shared_ptr好像是能要求当面写出正确代码的那种)
懒惰赋值、急切赋值

HTTP:
《图解HTTP》11章,一个月3章

DB:
《MySQL 是怎样运行的:从根儿上理解 MySQL》24章,2个月结束
SQL语句练习,待定

底层:
《现代操作系统》Linux一章,半个月结束,开始时间未定
《深入理解计算机系统》进程、并发两章,1个月结束,开始时间未定
《C++并发编程实战》,写服务器配合着看

Python高级语法:
https://docs.pythontab.com/interpy/ ,25章,12月-1月看吧

别被吓到,这个最初版本的计划大致完成率到70%都不错了,后期有删减的。

之后就是完成目标最无聊的阶段——前期积淀。每天刷题,看书,有时出去玩中断一下第二天再补。大概持续了1个半月。之后编译原理期中考试挂了。学期里其他几门专业课,除了网络原理学的还不错,其他硬件的课,课上不是在睡觉就是在做计划上的东西,没听过课。但编译原理这课挂了倒让我害怕了一下。这学期如果有挂的课,那非常影响寒假的实习投递。于是下半学期,花在计划上的时间确实少了,更多是返回高中的学习模式,看概念,刷课后题,网上找课外题目,只求期末考试几门课全过。

这段时间(决定工作起到期末考试止),也有件事在并行着做,就是带着团队做一个新的项目。是一个校园服务小程序,就是做crud,没有大佬的项目各种高大上的组件,分布式,高并发架构。一直觉得那样干没啥意义,自己项目本来就没那么大需求,硬把一堆组件往项目上堆,干嘛呢。可能是没被阿里的面试毒打过,所以这么想吧……本来应该是我带一个组的人去做,但组里没人写代码,于是后端部分代码就自己全包了。对我也是好事,你们没有代码贡献,那之后别对这项目所有权说三道四。11月有个QQ小程序大赛,社团想拿这个项目参赛,于是做好了全套提交、上线流程。我就有了一个后端部分属于自己,线上实际运行,可以向外提供服务的项目(虽然运营组的同学没实际向外做宣传,但也就差宣传工作了)。凑一堆高大上的组件,但项目做出来就是面向面试,服务人数为0,意义在哪呢。貌似现在还很流行这套。

期末考试结果还好,网络原理考了90+,其他课至少没有总评被挂的。寒假开始,我的基础变化大概是下面情况:

算法:
《剑指offer》全部看了一遍,动手写了一大半,少数代码量大的没回顾
C++:
Effective C++系列的书,STL那本没看,Modern C++阅读大半内容,另外两本回顾了一遍
对照上面四本书,高频面试点有笔记
网络:
《图解HTTP》刷完并有笔记
网络原理学的还不错,相关面试题不虚
DB:
《MySQL是怎样运行的》章数21/24,并有笔记
Python:
高级语法那个网站看了并有笔记
NoSQL:
笔记留了概念

寒假回家,开始投简历。之前看到过一个公众号,超级简历,举办活动进去抽过奖,拿了半年的会员,放着没管了。本来以为是个废奖,但开始写简历的时候,发现这个机构还是挺值得推荐的。模板调出来,自己啥技术栈啥项目经历往里面填,它自动评价的分数低了就照它指出来的毛病改,它的错误提示少了,一份过关的简历其实也就成了。

写简历的时候,是需要面向HR的。HR大多不是技术人士,筛你简历的方式出不了这几种:

  • 看学历,看毕业年限,扫视你简历里的关键词,看和JD里的关键词吻合度大不大
  • 机器筛选,相比上一种更自动化,更冷血

那么我们写简历的时候,时刻要提醒自己

  • 注意体现关键词。比如自己的学校是211、985,那么就在自己就读学校后面注明是211/985学校;写技术栈的时候不要口语化,用关键词列举形式,方便阅读或机器筛选。
  • 写项目经历的时候,用这个公式,不要口语化:
    • 目的是什么(解决了什么问题)
    • 自己的角色是什么
    • 自己采用什么方式(技术栈)解决了这个问题
    • 影响怎样(有数字最好,这时候实际上线提供服务的项目的好处就体现出来了)
  • 简历不需要出现任何感性文字,HR/面试官不关心个人总结那堆废话,更关注当下候选人具备什么技能
  • 与所求职位无关的文字不要写,典型:兼职刷单、技术类岗位写销售/家教实习经历等等

可能比较反常识(我这么写的话简历空空的怎么办(;′⌒`)——活该,谁让你前2-3年不学的),请用补技术栈、做项目、列相关奖项的方式去填满简历的空白,而不是靠一堆漂亮话。漂亮话构不成你入职后每日的代码提交。

准备好简历之后,开始在寒假初期海投了。推荐若干投递到小公司的APP:实习僧、智联招聘、51job、拉勾招聘。目标是求一个小公司实习的话,在这4个APP里,每个APP每天投10个,投到有回音为止即可。

插入两个APP相关的隐藏问题:

  • 如果求职目标是大厂,则这些APP反而应该是最后用的途径,因为其他途径收到的简历很多,HR一般会在最后没得选了才会翻这些APP里面的简历。
  • 如果投递腾讯的实习,不想做“外人”的话,请认准官网投递,不要用这些APP,关键词:劳务实习 日常实习 官网投递 腾讯实习,自行搜索相关信息。

投小厂的同时也在投若干大厂。我采取的投递方式比较独特_(:з)∠)_:

  • 当时在冠状病毒疫情期间,春节放假快放完时,有自媒体统计了各大互联网企业的复工时间,做成了一张大表。我就对着那张表,一个一个搜出来他们招聘的官网,找到期望职位,投递。这种方式大概投了几十家左右。
  • 这种方式就没啥特殊的,牛客上天天翻求职广场版块,近期内所有出现过,并且自己感兴趣的职位,地毯式轰炸一遍。大概20+职位用这种方式投递。
  • 之前了解到一个字节跳动公司的人开了个公众号做内推。进了相关交流群,通过内推投递过字节跳动。免费给他的公众号打个广告:内推熊。内推机会确实很多,有投递疑问也可以给到回复。

唠叨两句内推:内推很重要,特别是对不太擅长全国高等教育入学考试,但在计算机学科上还是有点能力的大佬们,更重要。大多数内推的作用是让你跳过HR简历筛选,少数规格更高的内推能让你同时跳过笔试筛选直接去面试(比如字节的白金内推码)。能力再好,被有眼不识泰山的HR筛掉多可惜(。・∀・)ノ。一般投递的优先顺序是内推大于网申。牛客上还有一些做部门直推的。如果帖子里承诺了简历不会进入系统,那么这种方式是比内推优先级还高的,如果职位感兴趣,优先投递。

从大规模投递完毕,到我经历第一次面试,还是隔了至少十几天的。这段时间在干另一件事——刷面经。这件事做的动机是当时不太看得进去正经的教材,但又不想十几天以上的时间白白浪费掉,于是想到试试面经这种极其功利的准备方式。事实证明,这种方式,功利、简单、有效。我是这么做的:

  • 牛客上通过搜索可以找到历年春招/秋招的面经汇总贴,感谢牛客的运营们。
  • 找到投递职位相关的面经汇总版块,我当时看的是C++版块,因为简历确实是把C++当拳头语言写进去的……
  • 一个一个开出来看。面经一般就是给若干关键词,问题,能大概描述一场面试里面试官考察了哪些知识点。
  • 打个比喻,面经像是生米,煮成熟饭得靠自己。煮成熟饭的方式就是根据关键词去搜博客、解析文章,直到面试官问:“给我介绍一下xxx”,笔记里有大堆对应内容为止。
  • 循环往复,直到整理厌了为止(绝对会在整理完之前整理厌……一是量大,二是整理到后面会发现对一个职位考核的面试官问的问题会有不少共通的)。

整理到一定量之后,可以像背单词一样,回头看一看。面试临近的那段时间,我有状态看知识的时间,都是用在和面经纠缠上。刚刚开了下onenote扫一眼,面经关键词整理了快50个吧,相信开始更早或是更耐枯燥的大佬能整理出来更多。

面试前两天,差不多就是翻笔记。以我当时的工作状态,笔记翻一遍之后,差不多也就是面试时候了,真不是我笔记记得多( ̄、 ̄),是每天有状态看的时间并不多。

面试中的一些小技巧:

  • 面试官的态度说明不了任何问题,他可以脸上笑呵呵地在心里给你打0分,也可以对你很满意了但强装一副严肃气场。专心问题即可。
  • 遇到问题答不出不用慌,合格的面试官的面试目标就是找出你的能力上限在哪,如果从头到尾问了一堆你都看不上的问题,结合面试时间过短的情况,极大可能是挂。
  • 遇到答不出的问题,强作镇定胡诌一个答案是减分,特别是遇到一些有心眼的面试官,故意肯定你的答案,那你彻底踩坑;直接说“我不知道,能否换个问题”,给面试官印象分是不增不减;说“不知道,但能否凭我现在掌握的知识推测一个答案”,然后给出推测,是加分行为,体现出愿意努力解决这个问题,并展现了思维的过程。
  • 手撕算法注意边界参数。
  • 手撕算法最好的做法是先写蠢解答,再描述优化思想,再写出最优解。
  • 手撕算法撕不出来了自己先别慌,跟面试官坦诚目前写不出了,自己目前思路描述给面试官听,再寻求面试官能否给点Hint,至于给到什么程度,看面试官把握。手撕算法交流过程和能否撕出来题目本身一样重要。
  • 面试结束时面试官一般都会问:“你有什么问我的吗?”,回答没有是减分,怎么发问,Github上有个专门的repo讨论这个,在网站上搜索“reverse-interview”以查看。

面试后一定要做的事有一件:面试期间有不会的问题,全部簿记下来,在两次面试的间隔时间内,确保全部弄透。因为下一次面试有一种提问套路:“我们从上一次面试/笔试的xxx问题延伸一下,讨论……”,而这个问题一般都是你上一次答得不好的题目。

我完整面完的公司,截至写这篇博文的时间,只有字节跳动。这家公司处理面试事务的流程真的算很规范很快速的了,但因为太想能进入,所以短时间的等待也让我挺难忍受。由此引出如何催一下HR,让他给个痛快的问题。模板拿去:敬语 + “我现在有另外一个公司表达了录用意向,目前在等待我的答复,希望您可以告知下一次面试/通告结果的最晚时间,我方便进行回复” + 敬语。这个方式至少我试用还是挺不错的,短信询问后HR当天把HR面+offer发放全安排了,终于能睡个安稳觉。

HR面说是交流感情,其实也有刷人的可能性。怎么避免被刷→_→

把握住HR面的目的——考察候选人对于工作是否能做到稳定、勤奋、热爱。记着这三个关键词。那么回答任何问题都要考虑下,自己的回答是否和这三个词有关系。把HR面当成拉家常的,不折不扣的傻子……记住,HR都是人精”( ̄_, ̄ )”。具体的问题嘛,网上能搜到不少类似“HR100问”这种总结,随便找一个,预先准备下答案,差不多够用了。

拿到字节的实习Offer之后和我的Mentor沟通了一下,了解了会做啥工作,离crud有点远,是为公司性能需求,在指导下改造一种开源GPU列式数据库存储引擎的,技术含量很足,切实感到自己离几年之前对未来的期待,距离无比近了。也祝愿意看到现在的友人,能在日后的实习寻找过程中,顺遂实现自己的种种期待U•ェ•*U