程序员面试指北:如何更高效的准备面试
金三银四,今天从一个大厂面试官的角度,来聊聊技术面试那些事儿,帮助大家更好的准备面试,拿到心仪的 Offer,关注我的公众号「越哥聊 IT」,有最新的产品技术文章,
大厂都是怎么面试的
知己知彼,才能百战不殆,我从两个方面对互联网行业的面试进行拆解,一个是面试流程,另外一个是结构化面试。
面试流程
大部分公司的招聘流程可以分为简历投递、简历筛选、面试环节、沟通 Offer 几个步骤。
校园招聘比较特殊,是企业在统一时间到学校去进行宣讲,大批量的简历收集和筛选,其他的面试流程都是一致的。
简历投递
除了猎头等第三方渠道,求职的第一步就是简历投递。
你可能会说,简历投递就是去招聘网站上选择岗位,然后投递就好了,这个有什么特别的。
其实投递简历也有一些技巧,比如简历的文件名,可以使用“名字—求职岗位—教育背景—工作背景”这样的格式命名,突出自己的优势,方便 HR 快速评估。
选择合适的招聘网站投递,相比前程无忧等综合类网站,Boss 直聘等垂直招聘网站更适合 IT 类求职。
另外一个非常有效的简历投递渠道,就是内推,找到合适的人来内推,可以大大提高面试成功率。
多联系自己的师兄师姐,前同事等,或者去 V2EX,北邮人等 IT 人活跃的社区,都可以找到类似的内推机会。
简历筛选
简历筛选环节,就是如何在简历中突出自己的优势。
有些朋友明明项目很出彩,可落到简历上就一笔带过,要记住,除非你是业界大佬或者知名人士,对于大部分候选人来说,面试官了解你的最直接材料就是简历。
所以一定要认真对待简历的制作,特别是专业技能、项目经验等的描写。对于技术类岗位,一个坚持更新的博客、开源项目的代码贡献,都可以作为你的亮点。
面试环节
Talk is cheap,show me the code,面试环节直接决定面试结果,技术和业务实力始终是最重要的。
作为选拔性环节,互联网大厂一直有“面试造火箭,入职拧螺丝”的特点,毕竟内卷就是当下的国情,各位老铁们一路做题家过来也都清楚,能做的就是有针对性的不断提高和积累。
另外,一些公司比较看重企业文化和价值观等,会有对应的价值观和性格测评,像阿里巴巴,HR 有一票否决权,所以非技术的面试环节同样重要。
沟通 Offer
面试通过以后就是 Offer 沟通和背调环节,Offer 沟通说白了就是谈钱谈职级,这一点还是要多和身边有经验的朋友请教下。
从猎头、朋友、网络了解这个岗位的薪酬范围,根据自己的当前薪酬和跳槽期望综合考虑,自己有一个心理区间。
在和 HR 沟通的环节中,Hr 希望帮公司节省成本,你希望多涨点工资,信息不对称,求职者始终是缺乏信息的一方,不要相信太多的大饼,你的核心价值是你的业务能力和职业素养,而不是薪资的谈判能力。
最后一步 Offer 发放和入职,到这里整个面试流程就结束了。
结构化面试
各大互联网公司对面试官都是有要求的,毕竟在和候选人沟通的过程中,面试官就代表了公司的对外形象,所以一般都会有针对面试官的培训。
以阿里、字节跳动等为例,一般会采取「结构化面试」的方式。
结构化面试,指的是将各种知识技能做好划分,例如编程语言,操作系统,数据库,网络,算法,工程/架构设计,并通过几个面试官之间的多轮交叉面试来考查掌握程度。
这样的面试方法,可以避免某个面试官考察太偏,并充分挖掘候选人的亮点。
人力部门也会特别关注候选人的面试体验,每轮面试过后,都会通过调查问卷的形式来取得求职者对本轮面试的一些体验。
如何考察技术能力
程序员面试,当然技术是最重要的,不同公司对技术能力的考察会有一些侧重点。
一般来说,国内互联网公司更看重项目能力,国外公司更看重计算机基础。阿里的面试更看重你的项目经验,Google 和 Facebook 等北美公司的面试,每轮面试都需要手写算法,针对社招还会有 System Design 题目。
考察计算机基础,如操作系统、网络原理等
一线互联网公司在面试中更加关注计算机基础知识的考察,比如数据结构和算法,操作系统、网络原理。
国内公司在招聘上也越来越看齐 Google、Facebook 等海外企业,这方面比较典型的公司是今日头条,面试重点考察算法,不提前刷题很难通过。
深入技术栈,考察对原理和源码的掌握程度
深入底层实现,考察对相关组件的原理掌握程度,以及是否读过源码等。
互联网用户基数比较大,一个细微的优化可能会带来很大的收益,同样,一个很小的问题可能会对线上业务造成毁灭性的影响,所以要知其然还要知其所以然,对技术栈的掌握要求比较深入。
偏向实际问题,考察业务中的应用
面试中通常会结合实际业务场景来提问,其考察的是在真实业务中解决问题的能力。
条条大路通罗马,一个功能点,技术方案可能有很多,但是从落地到代码实现,就要限制于整体方案、上下游约束等,典型的比如秒杀系统、微博会员关注关系设计等。
重视分布式系统,稳定性等方向
大型互联网公司,特别是 C 端的业务,面对的是海量的用户和请求,牵一发而动全身,对系统可用性、分布式高可用等有极高的要求,所以在面试中会重点考察分布式系统设计,如何构建高并发高可用的系统。
考察业务积累,岗位匹配度
对于一些比较高级的技术岗位,会特别关注对业务的熟悉程度,比如支付行业,广告行业。
关注哪些软素质
除了技术能力的考察,面试官会关注候选人的一些软素质,比如沟通能力,抗压能力,自主学习能力等。
想继续深入的老铁可以了解下「行为面试法」和「STAR 法则」,这里我就不再展开了。
沟通能力
沟通是否顺畅
表达是否有条例
能否清楚表达自己负责做的事情
能否抓重点,系统的技术要点
学习能力
有没有良好的学习习惯
在工作之外是否有持续的积累
能否快速深入某个技术栈,业务领域
发展潜力
通过是否有良好的习惯
是否一直在学习来判断
是否热爱计算机,对编程有激情
自驱能力
有梦想,有较高的个人追求
是否敢做有困难的事情
是否敢做没把握的事情
抗压能力
是否有负责多件事情,多件事情如何并行处理
如果让你接手一个历史悠久的模块,你会怎么做
你说的 XXX 跟开源的 YYY 很像,是不是抄袭的
如何高效准备面试
聊完了互联网技术面试的特点,接下来聊聊如何高效的准备面试。
建议在面试之前,都去招聘网站上看一下,总结一些岗位要求,下面我从技术面试出发,总结下面几点。
提高计算机基础,加强算法和数据结构、操作系统等底层能力
计算机基础能力是校招的重点,社招也会着重考察。
操作系统和网络原理,比如基本的调度算法、文件系统,还有各种网络协议,比如 TCP/IP 协议也是必备的,操作系统推荐机械工业出版社的华章系列教材,网络原理也有几本大部头,可以看《图解 HTTP 协议》和《图解 TCP/IP 协议》。
数据结构方面,基本的数组、栈和队列、字符串、二叉树等结构,其中二叉树是面试中的重点,手写红黑树有点夸张,不过基本的遍历、二叉树重建、二叉树深度等必须掌握,没事就在白纸上写写代码,考的是白板编程能力。
算法方面,基本的排序和查找算法就不用提了,递归、分治、BFS、DFS、动态规划算法都在题目范围中。如果算法基础不太好,就刷刷《剑指 offer》《编程珠玑》、LeetCode 的高频题。
刷刷 LeetCode,对于大部分面试来说足够了,除非你在简历上介绍自己是 ACM,NOI 获奖选手,不会在算法上特别刁难。
深入一门编程语言,了解底层实现,各种语法糖和特性
工程师不管学习多少语言,都要有一门熟悉的主编程语言。
什么是主编程语言,就是对这个编程语言你可以达到深入的程度,不是只会用,要从代码编译开始就知道程序是怎么运行的。典型的主语言有 Java、C++、Golang 、PHP 及 Python 等。
针对 Java 语言,要了解 Java 语言的底层机制,字节码怎么用,为什么 Java 是平台无关型语言,这些都要搞明白。应用层面,对集合框架、网络 IO、并发编程、泛型、异常、反射等技术都要有比较深入的了解,一些常见的组件,还要学习源码,优化层面,Java 虚拟机调优、常见 JVM 问题的处理,都是面试经常考察的,也是一定要掌握的。
加强数据库和缓存应用,掌握各种 NoSQL 技术
数据存储是业务的基石,从关系型数据库 MySQL 到 NoSQL,从 Memcached 到 Redis 的各种缓存,这些都是面试的必考题,从应用到底层逻辑都必须了解。
数据库本身这块的知识点更是重要,Redis 也是面试的重点,作为应用最多的缓存,Redis 在开发中已经和 MySQL 一样重要。
学习高并发,高可用,分布式系统设计
高并发是技术人一直追求的,为什么我们说阿里的双十一是对系统架构的挑战?
就是天量的 QPS 请求,在这种情况下,一个很小的问题都会被放大,导致巨大的业务损失。如何保障系统的高可用,保证业务正常,是每个工程师都要思考的。要在工作中注意积累分布式系统架构,以及高并发和高可用知识。
增强软性指标,包括快速学习,良好的沟通能力
除了技术实力,软性指标也很重要,平时的工作中,要注意结构化和体系化的思考,学习下《金字塔原理》等表达技巧,养成良好的文档能力,在面试中就可以更好的表现自己。
版权声明: 本文为 InfoQ 作者【邴越】的原创文章。
原文链接:【http://xie.infoq.cn/article/6401c955d550083dfca8d3e43】。文章转载请联系作者。
评论