Colin’s Blog

A C++ Programmer

如何准备程序员面试

本文既讲解国内和北美面试中间的共同点,也对于两地不同的情况进行单独讲解。例如国内的八股文和北美的BQ。

本文主要面向的读者是还没参加过正式工作的学生群体。作者也没有跳槽或者高级别的工作经验。如有不合理、不详尽之处,请联系本人改正。十分感谢。

首先讲解一些互联网上常见的术语。本文可能用到其中的一些。如果你在本文阅读过程中看到看不懂的词语,请使用ctrl+F搜索。

术语表

JD: (Job Description) 工作岗位描述

bar: 招人的标准。类似高考的分数线。一般用来形容难度高低。

DP: (data point) 数据点。一般含义就是指自己or身边朋友的例子。例如我GPA2.0被牛津录取了,我就可以在网上说,给大家贡献一个DP,GPA2.0被牛津录取。或者我在面试谷歌的过程中遇到了Leetcode1234这道题,我就可以说贡献一个DP,谷歌面试会考Leetcode1234.

OA: (Online Assessment) 在线笔试

BQ: (behavioral question) 和代码无关的问题。例如你在工作中遇到难题会怎么办?

VO: (Virtual Onsite) 电话或者视频面试。

HC: (Head Count) 人头数。也就是岗位计划招几个人。例如你面试了一个组,表现很好,但是他们这个组今年的hc只有1个人,而他们在面试你之前,已经签了1个人。那么这个时候由于hc不够,你就无法被录用。

CV/Resume: 简历

IC: (Individual Contributor) 个人贡献者,与之对应的是Manager。IC指的就是写代码的,Manager指的是管理岗位。

toxic: 有毒。往往用于形容令人不适的团队氛围或公司文化。

NG: (New Grad) 指刚毕业的学生。

ROI: (return on investment) 投资回报率

Skip: 你老板的老板。你也可以分别称呼他们为skip manager和 direct manager.

RA: (research assistant) 研究助理,你本科在实验室打杂也可以称自己做了2年的RA。

corner case: 写代码的时候遇到的极端or边界情况。

写在前面的话

心态

我们作为面试者,在求职的过程中,最终目标当然是拿到工作。因此很多时候你没有必要准备到万无一失了再投递简历或者面试。或者由于自己的不自信而不敢去投递或面试。哪怕心里很慌,也要先拿下offer再说。一般对于学生求职者来说,在拿到offer到正式上班中间还有好几个月的时间,如果你真的觉得自己不能胜任这份工作,那么你还有好几个月可以继续学习钻研相关领域。你如果总是想让自己的技术水平先达到高级工程师水平再去求职,那永远也准备不完。

所以,第一点,永远不要胆怯。

重要概念

Match大于一切. 即你和这个职位是否匹配是大于一切的,大于你的学历,能力。你再有优势,如果和职位不够匹配,那也很难拿到offer。

简历

推荐使用网上的现成模版来写。例如https://github.com/skyzh/chicv.

简历上没必要写GPA,除非这是你的优势。

简历大概分为教育经历,工作经历,项目等部分。

工作经历可以包含实习或者RA的经历。描写一下自己主要做了什么工作。要写出自己的impact并突出自己的技术点,不要只写自己做了什么。如果你做出来的东西对于公司没有任何影响,那等于没做。

(impact: 你对这个世界的影响)

例如写我在字节跳动开发推荐系统。就不如写:我在字节跳动的XX部门,使用C++和python语言,使用XXX技术框架,独立/和团队一起,使用XXX算法,改进了推荐系统在XX方面的性能,最后经过统计,使得性能提高了30%。

一般建议写上一些数字,例如使得效率提高了30%等,可以增强可信度和说服力。

重复一下就是,主要两点。一是体现自己的能力,二是体现自己的impact。

项目部分,有github链接是最好的。自己平常写的个人项目建议上传到github上面。项目就主要是突出自己的技术栈了。个人自己写的开源项目一般很难产生impact。

简历以一页为宜。如果你想写的太多,你可以针对不同岗位写多份简历。例如你投后端的岗位,就没必要花大量篇幅写前端的东西。

投简历

能早投就早投!

能早投就早投!

能早投就早投!

能早投就早投!

大公司,大家都耳熟能详。直接进入官网投递即可。

小公司,国内可以使用boss直聘等软件。国外可以使用simplify等软件。

内推: 内推建议多找自己身边认识的人、学长学姐、网友等。

领英直接联系hr: 这也是一种方法。首先你需要先把自己领英的界面搞好,然后找hr进行私聊。

OA(笔试)

最好在收到的当天就做了。不然别人做的早,可能先把hc占了。

珍惜每一个OA。

技术面试

从面试官的角度看面试

在你面试的时候,往往你会注意到面试官在敲键盘。他是在记录你面试时候的表现。一份面试官的记录可能如下:

8:00pm 开始

8:10 自我介绍太啰嗦

8:12 给出问题。面试者询问一些clarification

8:15 面试者给出暴力解法,有效。时间复杂度太高,让面试者先实现暴力算法,再问面试者能否提高。

8:25 实现暴力算法,完成。

8:30 通过了几组样例,让面试者自己书写样例。自行书写的样例不错。

8:35 面试者分析了暴力解法的时间复杂度。

8:40 面试者无法想到如何优化。给出提示XXX。

8:50 面试者实现了提示。

这些记录是面试官日后向公司提交关于你的报告的时候所需要参考的。因为人的记忆力是有限的,所以需要记录。

此外,面试官一般还会对你在不同的维度进行打分。例如代码、解决问题、沟通能力等方面。

解决问题包括你对这个问题的理解、分析和表达。你是否真正理解了题目?你能否分析不同的解决方案之间的优劣和时空复杂度?你能否清晰的讲述自己的想法?

代码包括代码质量,是否有bug,变量命名和代码风格等。

沟通能力包括你能否把自己的思路讲清楚。能否逻辑清晰地回答面试官的问题?

总而言之可以分为下面几点:

  1. 通过例子和反问来理解题目。 例如涉及图的题,就可以反问面试官,这是一个联通图吗?
  2. 描述自己的思路
  3. 把思路变成数据结构和算法
  4. 描述自己的代码逻辑
  5. 思考是否覆盖所有的corner case
  6. 解法不是最优解的时候,发现哪一部分重复计算了or发现了新的思路,从而进行优化。

最重要的点是让面试官觉得他的思路和你是同步的

自我介绍

不要太长。简要说明自己的身份和优点就可以了。

Resume Deep Dive

面试官会对着你的简历询问相关的问题。例如你用C++写了一个项目,他可能会问你在这个过程中用到了C++的哪些特性。或者针对你的实习经历,他会问你能再描述一下你做了什么吗?你当时遇到的困难是什么?

这些只要自己对着简历,把自己想象成面试官,然后自己问自己一些问题进行准备就可以了。

Coding

写代码部分。推荐的网站是Leetcode.

https://www.techinterviewhandbook.org/grind75 这个网站上面对Leetcode的题目做了分类精选。非常推荐。如果时间紧,就先刷这个上面的题目。

做题重要的是学习思想,而不是死记硬背。算法题是背不完的。

System Design

这个属于北美的特殊要求。国内的同学可以跳过这一段。

看书,DDIA。解决所有问题。

八股文

这个国内比较多,北美偶尔也有考的。

推荐的方法是首先分类。计算机网络,操作系统,编译原理,数据库。然后自己针对薄弱的地方学习。时间够的话直接在B站看南京大学或者MIT的课程,把整门课都复习一遍。这是正道。时间不够的话看这个网站,https://www.xiaolincoding.com/.

BQ

北美向

https://sugarac.gitbooks.io/high-frequency-interview-questions-and-answers/content/bq-by-xiao-tu-dao.html

https://www.youtube.com/c/DanCroitor/videos

反问

反问环节一般出现在面试最后,面试官会说,我的问题问完了,你有什么要问我的吗?这是一个常规流程。

反问适用的常见问题

以下问题有的只能用来询问组长(team leader),不要用他们去询问做IC的面试官。例如您对我未来2年的期望是什么?这应该很好区分。

下面是总结的常见反问:

  1. 你的/我入职后的 每天的工作流程是什么?

可以了解对方和自己的工作流程。常规反问。

  1. 我该在未来几个月(入职前),继续学习哪些知识来准备这份工作?

表示自己对工作的重视。但是不要把语气说成自己目前还不能胜任这份工作的样子。

  1. 团队的氛围怎么样?有没有什么活动?
  2. 团队内的人数如何?有几个人?分别角色是什么?

摸清团队情况,有助于了解这份工作的前景。例如这是一个新创建的团队,就要考虑自己未来的职业规划是否打算加入一个新创建的团队。如果是一个人很多的大组,那可能竞争比较激烈。要记住你加入的是一个团队,而不是一个公司。 你的日常工作、心情、升职等机会都是和团队直接相关的。学生思维常常会只看公司,而忽略团队。

  1. 我们团队未来1-2年的规划是什么?
  2. 如果我加入团队,那么我的职责会是什么?你期待我立刻产出什么内容?你期待我在未来1-2年产出什么内容?

了解面试官对你的期望,和你自己的职业规划是否相符合。例如你没打算做前端,最后却给你分配到做前端去了。也可以了解老板对你未来的发展是不是有一些想法,有的话说明对你还是比较重视的。

  1. 我的哪一段经历最让你感兴趣?
  2. 你怎样评价一个项目是否成功?

可以看一下老板属于哪种类型。更看重速度还是质量?喜欢创新一些还是稳定?可以看一下自己的工作风格和老板是不是一致。

  1. 你如何评价一个工程师的表现是否优秀?你最在乎哪一点?

  2. 你觉得我哪些地方可以提高?

可以从回答中了解自己的面试结果。但是问这个要慎重,有的面试官不喜欢别人问这个问题。(他也知道回答这个约等于提前告诉你面试结果)

  1. 你对于像我这样的新手程序员有什么人生经验可以传授的?
  2. 你怎么样处理和其他人的冲突?
  3. 你每天工作中最大的挑战是什么?

HR面

HR面常见的出现时间是投完简历之后的第一轮面试,或者技术面全部通过之后的最后一轮面试。这点不同公司差别很大。阿里的HR权力较大,一般HR面在最后需要认真准备。有的公司技术面全通过之后的HR面基本就是走个过场了。有的公司第一轮就是HR面,这属于一种初步筛选。

常见问题

  1. 你为什么对本公司的这个职位感兴趣?
  2. 你有没有做过什么项目?
  3. 你在过去的项目中经历过最难的事情是什么?你是怎么克服的?有什么收获?
  4. 你最满意的项目是什么?
  5. 你做过的失败的项目里面印象深刻的是哪一个?
  6. 你对加班的看法?
  7. 你最大的缺点是什么?
  8. 你最大的优点是什么?
  9. 你对薪资的要求?
  10. 你在未来2年/5年的职业规划是什么?
  11. 在完成某项工作时,你认为领导要求的方式不是最好的,自己还有更好的方法,你应该怎么做?
  12. 你对跳槽的看法?

回答策略

STAR方法:

STAR原则是结构化面试当中非常重要的一个理论:

S—Situation:事情是在什么情况下发生;

T—Task:你是如何明确你的任务的;

A—Action:针对这样的情况分析,你采用了什么行动方式;

R—Result:结果怎样,在这样的情况下你学习到了什么。

面试官会按照STAR方法来问你,你也按照STAR方法来回答就好了。

写在后面

天生我材必有用,千金散尽还复来。

相信自己。