1. 写在前面
2. 如何获取面试机会
在校园招聘中,后端可以说是要求最宽的职位了。你如果去面试 iOS,肯定要做过 App,如果去面试前端,肯定要写过 JS,如果要面试算法,肯定要做过机器学习。但是面试后端,却不一定要做过后端。在实际面试中,我们遇到过各种专业的同学,通信、自动化已经算是关联性较高的了,化工、机械之类的工科也不少,很多同学都完全没有接触过后端开发,但是拿到了后端 offer。
在面试中,我会按照三个方面去考察:
- 手写代码
- 计算机基础
- 后端开发
3.1. 手写代码
计算机基础通常指的就是考研的四门课,计组一般不会有人问,但是如果没学好计组的话操作系统、数据库之类的题可能会理解不深。另外三门课也都是计算机和软件学生应该具备的基础知识。
数据结构的水平可能在算法题里体现出来,如果直接问的话一般不会问太难。有可能问链表和数组的区别这种热身题,也可能出二叉树前中后序遍历这种简单的动手题。
计算机 络可以考察的内容主要集中在 TCP/IP 协议上。还可能问 DNS、七层模型之类的问题。 络这门课很多同学偏向于死记硬背,对原理性的东西掌握不足,面试的时候一般会先问是什么,然后问为什么,能把协议设计的原理讲明白才算是合格。
操作系统主要是问进程线程模型,进程间通信,内存模型,pv 操作之类的。和计算机 络类似,这门课也有很多同学死记硬背,面试的时候一般会结合编程问,例如问 Java 中的进程线程实现之类的问题。来考察是背下来的还是真的理解。
3.3. 后端
在标准的确立上,有的 leader 会非常看重候选人的学习能力,只要表现出来很强的学习能力,就算基础知识很差也可以。还有的 leader 要求基础必须好,就算很聪明,对计算机基础没有足够的了解也不行。如果想多收 offer,而不是碰运气捡一两个 offer 的话,最好能把自己的短板都补齐,在所有的领域都做到有基础,然后有突出的优点。
手写代码是最最基本的要求,面试软件工程师不写代码肯定是不行的,但是不同的面试官也有不同的要求。有些公司的面试会让候选人手写二分查找,冒泡排序之类的,作为正在找工作的应届生,很多人都会把常见的查找和排序算法背下来,所以考察效果一般。
面试官一般都有自己得题库,我也是会准备几道题,上来会先写一个单向链表空间复杂度 O(1) 的翻转,这道题应该说足够简单,从我的经验看,80% 的人都能写出来,写不出来的话如果还有时间可能会再出一道简单的题,两道题都写不出来就可以找题目杀时间了。第一道题写出来就会再出一道稍微难一些的题,如果两道题都能写出来,代码就算合格了。第二道题一般有很多种解法,也有一些扩展问题,如果思路很清晰,能直接找到最好的解法,扩展问题也回答的很好,在代码部分就算是表现优秀。如果思路不是很清楚,但是经过提示之后想到了方法,这轮只能算是勉强过关。
一般的后端面试,写代码都不会出很难的题,一来时间有限,太难就没办法问别的了。二来比较难的算法题,思路都十分的精巧,面试的时候能做出来的人,大部分都是刷题的时候做过,而不是水平高到能在几分钟之内想出来。其实在后端开发中,只要对常见的数据结构理解充分,能够灵活应用就够了。
计算机基础知识的三个方面,学计算机的同学通常都了解的不错,跨专业的同学在这方面可能会适当放宽,但是也不能一无所知。一般数据结构是必须掌握的,操作系统和 络如果没学过可以不了解。
举一个例子:TCP 建立和断开连接的过程候选人一般都能写出来。写出来之后我会问,为什么 TCP 断开连接要比建立连接多一次操作问题听起来很傻,但是不是所有人都能答出来。如果这个问题回答不出来,可以说 TCP 的知识只是死记硬背的,根本不理解。还有一个知识点是 2MSL,知道这个时间是怎么推算出来的,差不多就是所有候选人中的前 30% 了。
除了手写代码和计算机基础,剩下的方面都是可选项,很多硕士应届生,研究生期间和导师做某个方向的研究,从来没写过后端应用,那只要基础知识很扎实,研究做的也不错就可以了。还有一些同学正好相反,基础知识比较差,但是动手能力很强,自己做过许多东西,这类就要求关于项目的问题回答的很好,表现出很强的自学能力才能通过。
代码、计算机基础、后端这三个方面都合格,或者某一方面有缺陷,但是有优势能补上的同学就能拿到批发价的 offer 了。批发价的范围很广,从刚刚及格,到能力相当全面但是没有突出亮点的同学都会拿到批发价。
SP 根据不同公司的情况差别就很大了,有的公司求贤若渴、品牌不够或者批发价给的低,都有可能导致 SP 比较水。我在美团的时候见到的 SP 很少,很多在 BAT 拿到 SP 的同学在我们这里都没拿到。通常来说拿到 SP 的同学都有一两个大公司的实习经历,并且对自己实习时的工作非常熟悉。
关于实习,我看到有很多同学说实习没有用,其实并不一定。实习很看公司,如果是去小科技公司改页面或者做做 CRUD,给什么任务就做什么任务,对公司的框架、技术体系、业务运转都一片模糊的话,实习的作用确实不大。但是如果有在一二线互联 公司中,深度参与到项目中的实习经历,可以在项目这部分远远超过在校园里自己做练手小项目的同学。
要想从实习经历中表现出很强的学习能力,实习的时候一定要积极,不光交给你的任务要完成,还要努力了解整个系统的架构,最好还要知道架构设计的原因,在了解原因的时候还会触及到业务背景。实习是一次很全面的考验,勤奋的同学可能会努力干活,但是没有足够的好奇心和自我驱动力很难了解到面试官想问的那些问题。
对于没有实习的同学,也不是没有办法,比如参加竞赛。ACM 自然最好,没有参加 ACM 的也可以参加一些比较偏向动手的比赛,我印象很深的是有一个同学参加阿里中间件竞赛,虽然没进决赛,但是讲初赛的几轮改进已经表现出很好的学习能力,在 Java、操作系统、数据结构方面都有明显的进步过程。另外还有一个同学参加微软的创业大赛做了一个 App,比一般同学练手做的 App 完成度高很多。另外,如果有兴趣,自己钻研一些开源系统也是很好的加分项,比如有些同学精读 Linux 源码,面试官问不出极限,肯定会给很高的评价。
在面试的时候,因为要考察候选人的学习能力和自我驱动力,所以难免对计算机专业的同学的要求更高,对研究生的标准比本科生更高。同理,工作之后再考研的同学,我们也会有更高的要求,如果研究生期间只是沿着工作时的老路做些类似的系统,连技术栈都没有换,那工作经历对候选人肯定是减分项。同样在 招时,我们对候选人参加工作的时间也会有一些考虑,对于工作八九年还在做初级工作的工程师,也会考虑他是否学习能力不足。
这篇文章写了这么多知识点,但是大部分都是在校园里会学到的内容,我也不觉得应届毕业生拿到一份年薪 20 万的 offer 是多么难的事情,至少相比其他行业 8-10k 的 offer 来说难度没有高很多。对于非计算机专业的同学,要想拿到 offer 一般都提前两三年开始准备,并且付出了很多的努力。参加三四个月的培训拿到 offer 的例子,不是没有,但是真的很少。互联 公司的面试一般超过两个小时,我不认为培训的时候教的那些技巧能够骗过面试官,所以想去一线公司的同学,最好还是早点准备,把基础学扎实了,再实实在在的做几个项目。
感谢阅读到这里的同学,祝大家都能拿到满意的 offer~
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!