准备就要知己知彼
1.1 面试官为什么要面试算法
算法面试是互联网巨头招聘时的硬性条件
,这也充分说明了数据结构与算法不仅是名企面试行之有效的招聘手段,也是程序员的必备的基础技能
——既是程序员的内功
,也是编程的基础。对于没有项目经验或项目经验很少的应届生
,对于数据结构和算法的掌握程度几乎决定了一次面试的成败
1.2 编程语言
学好算法之前更要学好编程语言
有的人说算法主要体现编程思想,和编程语言关系不大。其实不然,算法是使用编程语言实现的,如果对编程语言不够了解,那么时间复杂度为O(n)的算法可以写出O(n2)的效果,所以熟悉自己所使用的编程语言,理解其内部实现机制,才能实现高效的算法!本文章统一使用C++
实现相关算法,在涉及编程语言特性的地方都会有详细说明。
代码规范
现在软件开发都是团队合作完成的,自己写的代码是要给别人阅读的,同时也要阅读别人写的代码,这时就需要规范代码规范了。如果在一个团队中,有一位开发者不按统一代码规范编写代码,那么这位开发者就是团队中的“隐形bug制造器”
。
-
变量命名
三种主流命名方法:-
小驼峰、大驼峰名法
小驼峰命名法要求第一个单词的首字母小写,后面其他单词的首字母大写
大驼峰也叫帕斯卡命名法,它把第一个单词的首字母也大写了int myAge; int MyAge;
-
下划线命名法
下划线命名法指变量名称每一个逻辑断点都用一个下划线来标记,下划线命名法是随着C语言的出现而流行起来的,如果读过Linux内核源码,就会发现源码中大量使用了这种命名方法
int my_age;
-
匈牙利命名法
变量名=属性+类型+对象描述,这种命名方式在没有IDE的时代可以很好的提醒开发人员每一个变量的意义,这种方法的缺点是,一旦修改源码变量的属性,整个项目中这个变量都要改动,增加了后期代码维护的困难度int iMyAge;
-
-
代码留白
很多没有经验的程序员写出来的代码都堆在一起了,看起来很不美观,读起来也费力,有的程序员甚至为了让代码精简,把所有的空格都省略了
本文章中的C++代码严格按照Google C++编程规范编写,看起来会让人清爽一些
操作符左右一定有空格i = i + 1;
分隔符(“,” 和",")的前一个没有空格,后一位有空格
int i, j; for (int fastIndex = 0; fastIndex < nums.size(); fastIndex++)
花括号和函数位于同一行并且前面有一个空格
while (n) { n--; }
控制语句(
while
,if
,for
)后都有一个空格while (n) { if (k > 0) return 9; n--; }
以下代码来看一下整体风格
void moveZeroees(vector<int>& nums){ int slowIndex = 0; for (int fastIndex = 0; fastIndex < num.size(); fastIndex++){ if (nums[fastIndex] != 0) { nums[slowIndex++] = nums[fastIndex]; } } for (int i = slowIndex; i < nums.size(); i++) { nums[i] = 0; } }
这里不是说一定要按照Google的代码规范,如果是自己编写代码,那么就保持风格统一;如果是团队开发,那么就和团队保持统一。
代码规范没有谁对谁错
,只有适合与否
1.3 如何写简历
程序员的简历力求简洁明了,在设计上不要过于复杂。对于应届生,一页简历足够了,对于社招人员,两页简历便可。如果是技术岗位,参加校园活动的内容最好一笔带过。
1)谨慎使用精通
应届毕业生在写简历的时候,切记不要写精通
某语言,推荐写熟悉
或者掌握
。但一些程序员可能仅仅使用Go或者Python写了几个Demo或者只了解一些语言语法,就直接在简历上写了熟悉C++、Java、Go、Python
,这也是大忌。如果C++学得更好,那么建议写熟悉C++,了解Java、Go、Python
词语的强烈程度:精通>熟悉(推荐使用)>掌握(推荐使用)>了解(推荐使用)
一旦我们写了熟悉某语言,该语言就一定是面试中考查的重点。例如,写了“熟悉C++”,那么继承、多态、封装、虚函数、C++的一些特性和STL就很有可能被问到。所以,简历上写了熟悉哪种语言,在面试前一定要重点复习相关知识
2)拿不准的内容绝对不要写在简历上
不要为了使自己的简历看上去很丰富,就写很多内容上去,内容越多,面试中的考点就越多。在简历中突出展现自己技能的几个点,而不是面面俱到。想想看,面试官一定是拿着你的简历开始问问题的,如果只是因为自己想展示自己会得很多,就很多内容都写在简历上,那么等于给自己挖了一个大坑
3)项目经验应该怎么写
首先是在做项目的时候要时刻保持对难点
的敏感
。很多时候我们费尽周折解决了一个问题,如果不做记录
,那么将很容易忘记。如果及时将自己思考过程记录下来,那么这个思考过程就是面试中的重要素材,养成这个习惯非常重要。很多面试者埋怨自己的项目没有难点,其实不然,找到项目中的一个点,深挖下去就会遇到难点,然后解决它,而这种经历就可以在面试中拿来说了。例如,使用Java完成的项目,深挖一下Java的内存管理,是不是可以减少一些虚拟机上内存的压力?
很多时候不是自己的项目没有难点,而是自己准备得不充分。不是每一个面试官都会主动问项目中有哪些亮点或者难点,这时就需要我们自己主动
说出来。
这里说一个面试中作为面试者如何变被动为主动的技巧。例如,自己的项目是一套分布式系统,我们在介绍项目的时候主动说:“项目中的难点就是解决多态服务器数据一致性的问题”。此时就应该知道面试官一定会问:“你是如何解决多台服务器数据一致性的问题?”如果你对数据一致性协议的使用和原理足够了解,就可以和面试官侃侃而谈了,这样就相当于你把面试官引导到自己熟悉的领域,被动为主动!
所以写简历的时候要突出自己技能的重点
,这样相关的问题相当于等着面试官来问,这也是面试时变被动为主动的关键。真正好的简历是当把自己的简历递给面试官的时候,知道面试官看着简历会问哪些问题,然后将面试官引导到自己最熟悉的领域,这样才会有主动权。
4)博客的重要性
在简历上可以写上自己的博客地址、GitHub地址甚至微博地址(如果发布了很多关于技术的内容),通过博客和GitHub,面试官可以快速的判断面试者的水平、对技术的热情,以及对学习的态度如果有很多高质量博客和GitHub项目,即使面试现场发挥不好,面试官通过博客也会知道这位面试者的基础很扎实,只是发挥不好而已。由此可以看出记录和总结的重要性
任何人都可以通过博客记录自己的收获,每个知识点都可以写一篇博客,这方面要切记懒惰!同时对GitHub不要畏惧,我们很容易找到一些小的项目来练手。
面试过程只有短短的30分钟或者1个小时,如何把自己掌握的技术更好的展现给面试官呢?博客、GitHub都是很好的选择,这些都是面试中的加分项
1.4 企业技术面试流程
比较大的企业一般通过几轮技术面试来考查面试者的各项能力,流程如下:
- 一面——机试面:一般考查选择题和编程题
- 二面——基础算法面:考查基础算法与数据结构
- 三面——综合技术面:考查编程语言、计算机基础知识,以及项目经历等
- 四面——技术leader面:查考面试者解决问题和快速学习能力
- 五面——HR面:主要了解面试者与与企业文化相不相符、面试者的职业发展、Offer的选择,以及介绍企业提供的薪资待遇,等等
一面——机试面
机试通常考查选择题和编程题,还有一些公司的机试只考查编程题
- 选择题:计算机基础知识涉及计算机网络、操作系统、数据库和编程语言
- 编程题:一般时
代码量
比较大的题目,比如字符串、二叉树、图或者一些复杂模拟类的题目
在校招中,比较大的企业通常会提前发笔试题邀请电子邮件,邮件里规定了开始时间和结束时间。一定要慎重对待机试面,如果没有通过机试面,那么就没有后序的面试机会了
二面——基础算法面
二面中也会考查算法,但和机试面中对算法的考查的侧重点有所不同,机试面注重的是正确率
,而儿面中面试官更想了解面试者思考
的过程。通常一面的题目是代码量比较大的题目,而二面是一些基础算法。面试官也会放面试者在白纸上写代码或者是给面试者一台计算机来写代码
一些面试官喜欢让面试者在白纸上写代码,所以简单代码一定要能手写出来,不要过于依赖IDE的自动补全。例如,实现一个反转二叉树的函数,很多面试者平时都是在OJ(Online Judge)上练习算法的,但是OJ上一般都把二叉树的结构定义好了,可以直接写函数的实现,而面试的时候要在白纸上写代码,一些面试者一下子不知道二叉树节点的定义应该如何写——不是结构体定义得不对,就是忘了如何写指针
三面——综合技术面
一般考查如下三个方面
- 编程语言。面试官会考查面试者编程语言的掌握程度
- 计算机基础知识考查面试者计算机方面综合知识,不同岗位的侧重点不一样,如果是后台开发的岗位,那么操作系统、计算机网络、数据库相关的知识是一定要问的
- 项目经验。主要用以下三个方面对面试者进行考查:技术原理、技术深度、应变能力
- 在技术原理方面,主要考查技术实现背后的原理,比如某个项目中接口调用的原理
- 在技术深度方面,如果是后台开发的岗位,则可以从系统的扩容、缓存和数据存储等多方面对面试者进行考查
- 在应变能力方面,如果面试官针对某个项目问面试者一个应用场景的问题,那么最忌讳回答:“我没考虑过这种情况。”这会让面试官对面试者的印象大打折扣。即使这个场景没考虑过,也要随机应变,思考出一个方案。然后与面试官讨论出一个可行的方案,这样会让面试官对面试者的好感倍增
四面——技术leader面
技术leader面主要考查面试者的两个能力——解决问题能力和快速学习的能力
1.解决问题的能力
面试官经常问的相关问题有:
- 在项目中遇到的最大技术挑战是什么,是如何解决的?
- 给出一个项目问题让面试者分析
如果是应届生,那么会问面试者在学习中遇到哪些挑战。可能面试官可能还会给出一个具体的项目场景,问面试者如何去解决。
这里面试官主要针对项目问题考查面试者是如何思考、解决问题的
2.快速学习能力
面试官经常问的相关问题有:
- 如何快速学习一门新技术或者语言?
- 读研之后发现自己和本科毕业有什么差距?
再具体一点,面试官会问:如果有一个项目这两天要启动,而这个项目使用了你没有用过的语言或者技术,你将怎么完成这个项目?也就是如何快速学习一门新的编程语言或技术。所以平时要总结自己学习知识的技巧,面试官喜欢有自己一套学习方法论的面试者
如何面试者是研究生,面试官还喜欢问:读研之后发现自己和 本科毕业有什么差别?这里要体现出自己思维方式和学习方法上的进步,而不是用了两三年的时间又多学了哪些技术。因为IT行业是不断变化的,面试官在意的是面试者思维方式的成长和进步
五面——HR面
终于到了HR面了,是不是感觉万事大吉了呢?
事实上这里万万不可大意,否则到手的Offer就“飞”了。HR是有选择权的,不一定要录用所有通过技术面试的面试者,而是要选择符合公司文化和价值观的面试者
这里列举一些关键问题:
- 为什么选择我们公司?
这里一定要有所准备,不能被问到之后一脸茫然,然后说就是想找个工作。最好从技术氛围、职业发展和公司潜力等方面来说明自己为什么选择这家公司 - 有没有职业规划?
如果是应届生,那么可能并没有明确的职业规划,但尽量给自己制定一个职业规划,至少当被HR问到的时候,不要哑口无言。对于社招的面试者,一般都应该有自己的明确规划,这里就不多说了 - 期望薪资XXX能否接受?
如果面试者感觉自己表现得很好,给面试官留下来很好的印象,那么可以在这里争取Special Offer,也就是更高的薪酬。前提是对自己信心十足 - 前一家公司给你的薪水是多少?
这里切记不要虚报工资,因为入职前是要查工资流水的,这是比较严肃的问题
评论区