面试前非常重要的一步,就是准备简历了。什么样的简历,对初筛更有利呢?我们来从简历的「专业技能、工作经验、工作项目、个人亮点」四大部分,逐一说来。

第一,专业技能

这部分,主要跟大家分享几个一定要避免的点:

1. 一定要避免写人人会用的基础技能

举个例子:一些基础知识,Java 集合,垃圾回收,多线程,IO等,这些属于我们必知必会的。放上去特意强调反而没有亮点。更好的方式是,可以把上述换成做过线上JVM性能调优,我使用过某些工具或者组件进行过线上抓包和工具分析。并且深入我们对应的源代码进行问题排查,修复了某个问题,消除了oom相关问题,这些既包含了我们对基础知识的掌握,又体现了我们对线上排查问题的能力。

2. 慎重使用“精通”

面试官通常看见对某方面知识写到“精通”二字,一般都会对该知识和面试者进行深入的讨论和研究。从点到面扩展到各个部分。主要会看面试者是否真的精通,如果面试者只是了解一小部分或者只是知道个概念,这样在面试官心里的印象分会大减。比如曾经面试过的同学写对netty精通。我会针对于 netty 的实现,比如 netty 线程模型,ByteBuf,nio 部分,select epoll,poll 区别,甚至于多线程,锁等相关知识发问。然而此同学只是看到过一些概念或者写过一些小的 demo,甚至于对 api 的使用都不甚了解。一问三不知,这样是严重减分项。

大家切记:一定按照自己真实情况来描述自己对某知识的了解。一般对于自己用的顺手的一些知识点。大家可以项目中应用过或者有过研究和了解。如果真的很精通想做为加分项可以列举一些自己的总结(最好有自己的博客或者文章)。这样一目了然。如果针对于自己知识用过的知识或者只是看过概念。建议写了解甚至于不写。这样避免给自己造成不必要的面试麻烦。

3. 可以突出关键字和技术,但切忌堆砌
曾经看过很多同学简历上列举了很多当前比较流行的框架和技术。比如 rpc 框架,自己经历过的很多公司都会有自己内部的一些框架。大家也都列举上去了。比如之前遇到过的一个同学写了自己熟悉 dubbo,grpc,motan,dubbox,spring cloud 等等。这样通常会给面试官蜻蜓点水的感觉。都了解,但是都不深入的错觉。建议大家只重点写 1-2 个。区分类别。
比如针对于这位同学的建立描述。我可以换成:深入了解过一些 rpc 框架的实现,深入学习过 dubbo 的相关架构设计,对于其他同一类型框架自己也做过相关的技术调研和对比。这样会更好一些。重点会明确和突出。

4. 尽量避免主观表述,少一点语义模糊的形容词,比如说”有点熟悉”,”可能”,”大概”之类的词语。
这些语义模糊的词放上去就本身证明了自己对知识或者自己做过的项目的有些环节并不是很了解。试想一下,如果自己都不了解。怎么让面试官来相信你的能力和在项目中有过优异的表现。所以大家在建立中一定要避免诸如此类的词语。如果是自己了解和认为有把握的。一定要给出肯定的结论和答案。必要的时候把自己的总结或者成果展示。

第二 ,工作经验

我会通过工作经验部分,去初步判断候选人的技术能力。因此,在准备自己工作经验时,可以阐明最近几份工作经历中所参与过的产品、项目、角色 ,毕竟,最让人信服的,是真材实料的项目经历和过硬的技术。

怎么体现自己的技术实力呢?可以介绍:

  • 在工作中做的项目的技术细节
  • 克服过的技术难点与细节
  • 感兴趣的技术
  • 在程序马拉松上参加的项目或者是业余的个人项目(+link)
  • 如果领导过技术团队,写下带的团队的规模与管理风格

    第三,工作项目

    一些情况下,项目经验和工作经验是可以合并到一起的,但作为有几年工作经验的程序员来说,一定经历过几家公司,每一个公司里面担任什么样的角色,做过的项目也很多,为了条理清晰,逻辑清楚,分开写是明智的选择。而对于刚刚毕业参加校招或者社会招聘的实习生来说,没有过多的经验和项目,则合并在一起。

通常来说,面试官只会对你的 1-2 段经历感兴趣,然后通过你对项目的描述,再对你所使用的技术或者你主导的技术方案深挖。所以我们在简历项目介绍上,一定不要大而全,而是要挑选重点的、有亮点的项目介绍。

怎样算是比较有亮点的项目呢?比如你从 0 到 1 搭建的项目,或者你作为主要项目框架的搭建者,再或者数据量和访问量比较高的项目。这些项目最好能体现出用到的技术比较新颖,或者是你主导解决了若干技术问题。

另外,每个公司建议放 2-3 段项目经历。如果项目中有一些比较明确的成果,比如稳定性、开发时间,或者给业务带来突飞猛进的增长,以及个人获奖等,一定要补充上去。这说明你完成的项目是有始有终,能看到结果。

对于项目介绍,给大家介绍一个比较重要的法则,star法则:https://baike.baidu.com/item/STAR%E6%B3%95%E5%88%99

简言之,项目介绍一定要围绕着这 4 个原则:

  • Situation::事情是在什么情况下发生
  • Target:你是如何明确你的目标的
  • Action::针对这样的情况分析,你采用了什么行动方式
  • Result:结果怎样,在这样的情况下你学习到了什么

一个好的样例:
项目背景(Situation):
我们目前的订单系统访问量和数据量日益增长(此处可列举数据:订单表单表过亿,系统的 pv 和 uv 多少)。目前的系统出现了大量的慢 sql 和接口超时问题,用户客诉较多。针对于当前系统的新需求上线和改动耗时过高(比如rd研发需要一周+qa 验收回归需要一周),时间成本较高。所以我们准备花1个月的时间对系统进行重构。提升订单系统的性能,稳定性,和可扩展的能力

项目目标(Target):
新的重构系统消灭慢 sql 问题。接口平均响应时间在 50ms 以下。系统可用性大于等于 4 个 9。新的需求开发加测试上线在一周之内。要支撑未来 2-3 年的一个扩展

项目角色和行动(Action):
我的项目角色:项目负责人和核心架构开发人员
我作为项目负责人参与了和 pm 的需求讨论工作。制订了项目排期和资源锁定。召开项目立项会。每天的站会组织,项目成员日报,周报的收集。定时检查项目风险和代码 review。组织上线工作。

作为项目核心架构开发人员,我规划了订单系统的拆分。对分库分表技术做了相关的技术调研和预演,对当前订单表进行了重新的模型设计。带领团队开发了数据迁移组件(全量和增量)。并且对新的订单存储模块进行了全方位压测。

项目成果(Result):
系统比预期时间提前一周完成上线。上线之后客诉率相比之前降低百分之 95,接口性能在 40ms 以下,系统稳定性稳定在 4 个 9 以上。我个人获得技术部优秀个人奖。

第四,个人亮点(加分项)

工作之后,大家可以在简书和知乎上写博客,并且留下自己的联系方式,如果技术博客在网上流传广泛,或者自己的开源项目被很多人 star,相信这些加分项,可能让你不需要简历,就获得一些应聘的机会。

常见的加分项:
1)一般能力:语言能力(比如英语四六级证书, 托福雅思分数.日语等级),全国计算机等级证书(比如网络工程师、数据库工程师、软件测试工程师、信息安全工程师),ACM 竞赛等
2)技术博客,GitHub 项目,尤其是有亮眼或者高star的项目
3)自己写的电子小册,书籍,运营的公众号等

上面说完了简历的准备,咱们继续来说说面试

【什么时间投递简历被查看率较高?】

我们都知道投简历是由我们自己决定的,但在简历投递后,HR 能不能看到那就是另外一回事了。

总结来看,周三早上是投递简历的最佳时间。星期一是本周的开始,HR 部门正在总结前一周的工作,计划本周的安排。跟很多人一样,星期一,HR 们极大可能是在会议和计划中度过。所以,这一天 HR 的情绪,可能并不是特别好。他们没有多余的时间来仔细阅读你的简历,因此简历的要求可能会更高。

而到了周五,HR 部门可能需要进行一周的总结,而且临近周末,心灵相对宽松,所以周五收到的简历很少在同一天读到,通常会累积到下周,但周末邮件积累两天,你的简历已被压在他们的邮箱底部。

因此,尽量在周二~周四去投递简历,最佳的时间,是周三的早上。

【技术面试阶段】

一般来说技术面 2-5 轮:

1)一面面试官一般是面试部门的核心开发人员,有可能是你入职以后的 mentor(导师)角色。
2)二面面试官一般是面试部门的组长级别,一般是项目负责人或者小团队的组长级别。
一面和二面通常是所有级别面试者必经的环节。

如果你级别较高(P6 或者 P6+)或者面试表现优异,就会经历三面四面甚至五面:

3)三面面试官:第三面一般是直属部门的技术 Leader。
4)四面面试官:这一面一般会是交叉面或者技术委员会的同学进行面试,考察综合能力。
5)五面面试官:这一面一般会是 CTO 或者大公司业务部门负责人。

不同公司可能会根据组织架构或者面试流程有所不同。通常来说,一般都是:一线开发人员——项目 Leader——业务部门技术 Leader——交叉面——CTO 或者业务部门总负责人这几个环节。

【我通常会如何考察候选人?】

首先,肯定会考察算法。

通过一个人算法题的能力,确实能看出他的基本功水平、未来的学习能力,以及,是不是有认真的准备面试。如果算法这部分答得很不好,我多半会觉得这位候选人准备不充分。按理来说,常考的算法点很多同学都知道,下下功夫,是能够准备好的。

那数据结构和算法部分,我会考什么呢?

比较基础的如快排、归并、二分查找的题目,我希望候选人能分析出时间和空间复杂度,并展示出相关推演的过程。对于高级一些的内容,我最低的要求是有思路,知道什么情况下用什么样的数据结构和算法,并写出模板即可。比如我会问:

  • Redis 底层数据结构设计,引申出跳表的原理,再扩展到Hash的实现及扩容实现,希望考察候选人是否了解跳表优缺点, 以及 Redis 为什么这么设计。
  • MySQL B+ 树索引结构的时间复杂度以及选型原因,希望考察为什么使用 B+ 树而不是红黑树或 Hash、跳表。

关于手写算法:

对于大多数需要面试的初级和中级程序员来说,作为技术面第一轮的白板算法题,一般会出 LeetCode 上 easy 到 medium 的题目,这类题目一般可以暴力求解、能够优化,有多种解法和思路,同时候选人最好能够展示一些软件工程方面的实力。

在做题过程中,有几点需要注意:

  • 理解题目,在这个过程中要和面试官沟通,澄清题目的要求和相关疑问,而不是一上来就开始写程序。
  • 设计算法,在这个过程中和面试官不断互动,一步一步探寻最优解,而不是一声不吭,一个人”埋头苦干“。
  • 实现算法,在这个过程中可以展示你对软件开发和测试的理解。
  • 代码完成后,酌情可以和面试官讨论一些相关东西,比如 TDD、BDD、CI/CD 等。

算法面试后,就是技术面试部分。我的提问会分为两个环节:

首先是工程实践。这部分我会结合项目经验和所用到的技术来综合考察,考察候选人知识的深度和广度。

拿后端工程师的技术栈举例,就会包括但不限于以下这些:

1)分布式分层架构设计理解
2)LB 负载均衡、前端压缩/CDN 缓存/DNS相关知识
3)多级缓存、MQ 异步解耦
4)无状态化设计 -> 快速扩缩容
5)DB Sharding 、读写分离、分库分表、SQL 和慢查询优化、JVM 优化等措施
6)ES检索、数据异构、大数据处理
7)一致性设计:批量异步、串行改并行、同步改异步
8)数据协议、通信协议
9)微服务相关概念,DDD,容量预估规划、全链路压测、灰度发布设计、降级/熔断/限流的设计、RPC服务治理
10)分布式配置、注册、监控
11)CI/CD:“Docker + Kubernetes”架构

有时候,我喜欢在一个点上去扩展,检查面试人的技术深度和全面性,举个例子:

比如你的简历在项目中用到了Redis,我可能就会发散很多点去问:

  • 为什么选取Redis做缓存:考察的是你技术选型能力。
  • 你都用到哪些Redis数据结构:考察的是你对Redis数据结构的了解。
  • Redis的底层实现机制是什么样的:考察的是你对数据结构知识的了解。
  • 如何处理缓存失效,一致性问题,雪崩的问题:考察的是对Redis以及缓存相关工程实践的了解。
  • 大key,热key的处理:考察的是你的技术方案,比如序列化,数据拆分,本地Cache等。
  • 缓存的cluster,主备,以及AOF和RDB的实现原理:考察的是你的运维能力以及分布式的设计能力。

第二部分,是软素质考察:

  • 学习能力:一般会考察一个新技术你是如何去学习,去应用,如何处理学习过程中面对的问题。
  • 带队能力:目前带几个人。组内成员分布,如何管理,组内制定技术规划等
  • 项目管理能力:你带过的一个项目,如何分配任务,如何做排期。面对可能出现的deley如何处理,如何保证项目质量。故障级别以及如何处理故障。项目复盘等
  • 责任心和owner意识:一般会通过问如何看待加班来体现
  • 业务理解能力:如何看待你现在的业务。以及你要面试岗位的业务了解,b端c端业务区别等等。

下面还原一个真实的面试过程:
面试准备:
我作为面试官接收到了一个面试同学的简历。这个简历是hr同学提前几天发过来的。会简单介绍一下当前同学的背景。然后安排面试时间。我作为面试官会提前查看面试者资料:

关注点:
1)个人简介(年龄,毕业学校,每段工作经历时长)
2)经历过行业公司背景(此处大厂会有些亮点),相关职位
3)是否有个人博客和开源项目
4)所做过的项目经历,项目中的角色,项目中的架构,使用到的技术,项目取得的成果
总体来说作为2面面试官对上面的1和2点只是作为了解和参考。重点关注于 3 和 4。

面试阶段(1-2 个小时):
我提前会到会议室,或者打开坐在电话机旁。准备当场或者远程的面试,一般会提前 5-10 分钟
面试人进入会场或者接通电话以后:
1)我通常会做自我介绍:
我是来自xx公司xx部门的某职位的面试官,很高兴今天参加你的面试工作
2)首先我通常会让面试者做自我介绍( 5 分钟):
我的关注点基本在于通过面试者介绍自己的履历,判断是否符合大概的简历经历。以及简单的了解一下面试者的沟通和汇报总结能力。一般 5 分钟之内结束。这一段我比较希望面试者能提炼出自己最近1-2段的经历和亮点,
3)一道笔试题(30 分钟之内):
在上面我已经介绍了关于手写算法的一些需要注意的点。我作为面试官基本会给出半个小时时间让面试同学完成笔试题的代码编写和运行过程。
首先第一个要点,我们要能够正确的写出代码。能够在各种 case 下正常运行。在面试同学思考的过程中我会观察面试同学的反应,如果针对于题目不清楚或者没有思路的情况下我适当的进行一些提示。在这里有一个点是加分项,有些同学会做一些算法推演,包括画图或者伪代码。这些是我比较欣赏的。如果实在没有思路我会考虑降低题目难度或者要求写伪代码。
如果实在写不出来我这边会适时终止笔试流程,进行下一个环节提问。
如果面试者能够写出代码。我会检查一些边界条件是否考虑。一般来说笔试题的解法会有好几种。一般我会要求面试者说出自己写出的算法的时间空间复杂度。如果面试者的算法不是最优解。我会让他进一步考虑一些最优解法。这个步骤一般就是加分项。考虑时间因素一般伪代码即可
4)项目部分考察(30 分钟之内):
项目部分我通常会要求面试者首先基于 star 原则的介绍。上面也提到了 star 原则。大家可以重温一下。针对于每个项目我会尽量要求面试者画出对应的架构图。以及简单说出项目的一些技术数据指标。作为一个研发人员我觉得应该全面了解我们的项目。而不是简单地只是做编码工作。
如果你是项目负责人,我会了解你的项目组组成情况。业务理解能力,项目管理能力,包括时间的把控和进度的检查。如何控制代码质量。
技术方面的考察我会针对于项目中的技术点,比如你用到的存储,rpc,消息中间件,缓存等每个点去考察,由点到面。在上面工程实践的讲解中我提到了一些我经常会问的。我通常会举一个实际的场景。比如如何做一个分布式限流。如何做一个秒杀系统,结合上面的工程实践考察。全面的了解面试者对一个系统的技术实践把控。
5)基础能力的考察(20 分钟内):
项目考察完成后我适当的考一些语言和数据库方面的基础知识。比如设计模式,java 集合,多线程,锁,反射,mysql 索引实现,数据库所,事务隔离级别,io 方面的知识等等。重点考察面试者对于一些基础知识是否能熟练应用。在这个阶段通常会针对于我们通用的一个框架深入的来探讨,比如 spring 的 ioc 和 aop 怎么实现。动态代理有几种实现方式等等

上述面试完成以后我会给面试者一个向我提问的一个过程(5 分钟)
通常会问你有什么想了解我们公司,团队以及业务的,通常我会介绍一些公司和团队背景。以及组内成员的一些简单情况。尽可能的向面试者来正向反馈我们目前的业务和团队情况。让面试者对我们也有一个好的印象。

面试官的评判标准:
面试流程完成后。我会给出面试者的一个综合评价。结合上述面试流程面试者的表现:算法面试。项目考察,基础能力考试,软素质几部分给出自己的评论。一般是 1-5 分。通常来说各个方面要达到及格水平。没有明显的短板。比如笔试写码题。最低标准一定要顺利完成并且正常运行。这是及格状态。如果给出时间和空间复杂度较好的解法。算是优秀的评分。所以大家一定要在算法上下功夫。这是第一道关。项目考察和基础考察至少要对于项目中用到的知识点能够清楚地说出如何使用,如何调优或者踩过坑。针对于技术点的原理也要概念性的了解。至少不能出现明显的错误。优秀的评分是能够做到举一反三,能够深入源代码,或者进行过技术调研等。如果架构师至少是能够说出为何项目采用这种架构和选用技术,包括领域模型设计思路等等。软素质就是项目管理能力,学习能力,沟通能力以及分享这些。至少要体现出相关素质的一部分才能达标。

结束语:
以上是我从一个面试官的角度来给大家分享一些面试的环节和套路。不同的公司有不同的面试环节和流程。大体上来讲不会脱离我上面讲的。希望能够给大家一些启示和思路。在这里一定要强调一下我们算法学习的重要性,在我自己做面试官的体会来讲,大家通常都是在算法题目的笔试阶段没有好的发挥,导致面试不能顺利通过到下一轮。这个真的比较可惜。作为极客大学算法训练营的助教,给大家推荐一下我们的算法训练营。我带过很多学员在反复的算法训练和覃超老师的悉心指导下都拿到了满意的 Offer。这里欢迎大家踊跃报名,和覃超老师还有助教一起来学习算法,大家一起攻克难关。课程目前也有各种各样的优惠。课程内容也在不断地更新和迭代。非常实惠。在最后也希望大家能够进入自己心仪的公司拿到满意的 Offer,谢谢大家。