背景¶
首先作为一个有技术追求的人来说,面试绝对不等于跳槽。面试本身对于我们来说应该是一个自我检验与学习的方向性的指南。面试在刨除其找工作的原始目的之后,它更像是一个对于自身的考试与回顾。既然面试如此的重要,那我们如何全面的准备面试就显得尤为重要了。本文针对的都是技术性面试,其他类型的面试本文意义不大。另外本文主要关注技术,至于面试找工作中的一些面试技巧不会进行过多阐述。
面试时间的选择¶
- 永远把自己暴露在招聘市场上
- 入职时就要开始面试
这不是为了跳槽,而是为了了解现在公司需要什么样的人才以及现在行业发展趋势以及对自己技术的检验。再加上现在越来越多倒挂现象的出现,我们需要更多的面试来让自己在真正跳槽的时候实现利益最大化。在入职时就准备面试是基于将面试作为自己学习目标制定与检验的环节。那么自然而然的就引入面试的第一步,如何写一个简历。
如何写简历¶
简历对于 自己是一份学习计划,对于HR是一份筛选条件,对于面试官是一个引导提问的工具。本质上是对你职业生涯的发展规划!简历是面向未来的,而不仅仅是复盘的!
自己:在入职的时候就可以写一份简历作为自己的OKR。采用一种以终为始的思想,明确自己在工作中需要学到什么,用到什么,做到什么成效,有什么产出,是否便于知识迁移,以此产生一个学习计划,并一步步落地。
HR:在简历中需要有HR对应岗位的关键词。
面试官:突出自己的优势或者实现上的困难点,让面试官对此感兴趣。
基本注意点¶
- 不要造假。
- 使用PDF,避免文件格式导致的问题,简洁工整即可。
- 简历要倒叙,最新的经历放在前面。
- 姓名,手机号,邮箱,博客,开源贡献,技术分享等放在最前面。
- 工作十年以下不要超过两页,最多做多两页半。
自我介绍¶
- 准确,简单,通过博客与code展示自己
- 符合职业的一句话自我评价会让人印象深刻,这个远比放一个头像重要
没人在乎你长什么样子,做技术主要考虑的只是这个人以后想不想一起共事。有一个明确的自我介绍非常重要,突出自己在职场上的价值。可以显示一个心理暗示的作用。
项目经历¶
挖掘项目亮点¶
- 思考和积累
- 领域定位:明确自己的定位,并将视野放开,不要局限于现在自己所处的模块或者单一的工作性质,而是以一个更高维度的角度思考自己工作的意义,并以此思考和解决问题。提高自己的视野与格局。
- 请教牛人:在明确自己的领域定位之后,去主动了解前沿的知识与技术,请教牛人。
- 技术分享:参与一些技术分享与技术论坛,不要寄希望于其有很多细节或者价值,但是依旧能有一些收获。多看一些大厂的技术分享。推荐一下大厂技术分享途径:
- 美团技术团队
- 阿里技术(公众号)
- 阿里巴巴中间件(公众号)
- 阿里数据库内核月报
- ThoughtWorks 洞见
- 小米信息部技术团队
- 360 核心安全技术博客
- 伴鱼技术团队
- 字节跳动技术团队
- 滴滴技术(公众号)
- 以终为始
- 从效率,效果,质量,成本四个方向反推技术亮点
- 如果系统最终的演进是这个样子,那么我做了什么可以使其推进?,反向push自己持续进化。或者自己想要转型,将自己想学的知识落地到项目中或者工作中,优化某个环节或者实现某种功能。
- 融合目标岗位的招聘要求
- 对招聘JD分析,从中找到与自身项目结合点
- 不是简历去找匹配的JD,而是让简历匹配JD
使用STAR原则描述项目¶
背景 | 任务 | 行动 | 结果(效率,效果,质量,成本) |
---|---|---|---|
简练描述(几个字说明这是什么业务) | 在这个业务中主要负责什么,不要写自己没做过的,因为简历是引导面试官提问的工具 | 做了什么事,适当写一些技术点,不要写怎么做和为什么做,适当留白给面试官 | 先有基数后有比例,用绝对值而不是相对值,将数值转化为钱 |
直播系统 | 营收接口开发 | 优化接口性能 | 延迟从400ms降低到200ms,单位时间内可以刷更多礼物,增加约一倍收入 |
测试平台 | 测试效率工程 | 编写测试用例 | 编写500个测试用例,自动化测试比例从20%提高到80%,节省800测试人日 |
信息流推荐 | 算法工程 | XXX策略上线 | 升了用户留存率,每月200w新用户留存率从20%提高到35%,相当于节省推广费580w |
存储系统 | redis集群运维开发 | 空间压缩算法优化 | 每日写入1亿条数据,占用内存1T缩减到800G,减少20% |
面向简历工作¶
积极主动的去做事,带领团队推进架构演进成为 tech leader
面试的根本目的不是跳槽,其主要作用是晋升。面试只是一种晋升的手段,检验能力的一个手段。使用晋升来解决倒挂,只要我晋升的足够快,倒挂就追不上我。
管理的晋升是有限的,而技术的晋升是无限的。但是技术的晋升必须要做到把技术引进入,做到真正的突破才行。技术本身具有创新性。
不要投当前等级的面试,例如现在是D5,那就去投对应D6的岗位,而不要找D5对应的职级岗位。
使用面向简历工作,推进架构的演进,实现自驱进步。最终的目标是将自己变成一个技术领导者的身份,带领团队去解决技术问题,成为团队的核心人物。
如何投递简历¶
现在我们已经有了一份像样的简历,那么如何投递就成了最直接的问题。以下给出表格进行分析:
熟人内推 | 半熟人内推 | 猎头 | 招聘网站 | |
---|---|---|---|---|
机会 | 少 | 中 | 多 | 最多 |
信息 | 多 | 中 | 少 | 最少 |
在对以上表格建立共识的基础之上,给出一些相应的建议:扩大半熟人交友圈,交流群水群,技术论坛,开源社区,参加公司社团。
如何准备后端技术面试¶
在知道了所有面试的前置知识之后,自然而然的就诞生了一个新的问题。那就是,如何准备后端技术面试。以下分点进行阐述:
计算机科学¶
首先计算机不能简单的理解为一个工程,而应该是一门科学。虽然大家戏称计算机科学家,但是基础的计算机科学都不了解万万不行。
首先写在书上的知识都属于常识,不要认为看了书就万事大吉。这才是学习的第一步,构建我们学习的基础而已。
以下两本书帮助我们构建对计算机世界的基本世界观,列出的章节可以作为面试时应急看的章节,这只是鉴于书本内容较多。有时间的时候,必须读完。
- 深入理解计算机系统(原书第三版)
- 第一章:计算机系统漫游
- 第二章:信息的表达和处理
- 第四章:处理器的体系结构
- 第五章:优化程序性能
- 第六章:存储器层次结构
- 第九章:虚拟内存
- 第十二章:并发编程
- 计算机程序的构造与解释(原书第二版)
- 全书
- 计算机网络自顶向下(原书第七版)
- 第一章:计算机网络和因特网
- 第二章:应用层
- 第三章:运输层
- 第四章:网络层
- 第五章:链路层
- 理解了实现在谈网络性能(全书)
- CS144-LAB 实现一个TCP协议栈
- 现代操作系统:原理与实现(银杏书)(全书)
- 6.S081-LAB
- 数据库系统实现(全书)
- 15445-LAB
- MIT6824课程
数据结构与算法¶
面试的时间有限,因此不会考察过难的算法。主要针对编码能力的考察,主要是看思路与预编是否正确,代码风格是否良好等。就算遇到了自己刷过的题目,也要假装思考一下,不然可以让面试官觉得你是背过得,需要重新换一题。
- 先看 leetcode 简单和中等难度的前500题的最优解,能用自然语言描述清楚。
- 在大脑中训练出一个决策树。
- 训练自己估算空间和时间复杂度的能力。
- 对每类题随机抽取两道题,限时编写(要求15分钟AC),统计成绩。
- 反复上述练习,直到所有类型题目都可以在15分钟内AC通过。
系统设计¶
多关注和积累一些大厂的设计分享。比如IM系统设计,秒杀系统。怎么做思考,怎么去权衡。
开源技术¶
编程语言,redis,mysql,kafka,zookeeper/etcd,rpc,HBase,es等等
- 深入语言的底层源码,看sdk
- Redis 设计与实现
- MySQL是怎样运行的
- 深入理解Kafka:核心设计与实践原理
- 深入理解 RPC : 基于 Python 自建分布式高并发 RPC 服务
- Raft 分布式一致性(共识)算法 论文精读与ETCD源码分析
- Zookeeper/etcd 官方文档
专业领域¶
- 深挖项目经历中所运用的技术(开源组件,理论知识),绘制思维导图的方式,逐步深入。
- 融合目标岗位中的招聘要求
- 逐一完成知识的学习,制定计划(书,视频,源码,论文)。
- 输出博客 -> 展示你在本专业领域的权威性
面试表现¶
简历挖掘¶
- 对涉及的知识点深度学习,录音进行模拟面试。
- 绘制思维导图,对简历中可能被问的知识点建立一个DFS遍历的知识点树。
- 想象面试官可能关心的问题,并向自己提问,回放自己的录音,找到改进点。
场景分析¶
好的面试是涉及出来的。
编码考察¶
- 提前沟通思路,题意不明及时询问,不要上来就写代码
- 写代码要仔细,自己没有推敲完善时,不要着急邀请面试官review,自己需要加入一些bad case进行边界判断。一旦请面试官review代码,发现bug会严重影响面试。
- 自己的代码要能讲明白,也要经得住挑战
- 如果不能写出代码,也至少明确给出思路或合理猜测,甚至可以请面试官换一个题目
最简单的bad case比如输入int,考虑负数,0,1是不是都可以;如果是字符串,空字符串可不可以,特别长的字符串可不可以。
专业领域¶
- 速不要太快,讲明白技术亮点(为什么,有什么价值,怎么做,原理是什么,还能怎么改进)
- 遵循金字塔结构,采用总-分结构,先讲业务背景,再说技术架构,再说组件接口交互,再细化到具体数据结构和算法。
- 业务背景,和技术架构如果面试官没有多问,应该快速介绍完毕,并重点突出你自己在这个项目中的技术亮点与成长(性能优化,排查问题,架构决策能力),用一些技术指标来衡量自己的实现效果
- 如果是资深研发面试,可以将更多精力放在,前沿技术的落地过程讲解(如何推进架构升级)
系统设计¶
注意平时积累,观察日常使用的app,去思考这些app是如何设计的?然后去找资料印证。
- 描述题目,确定问题边界,问题的约束条件。
- 容量预估,DAU * 每人平均使用接口次数 / 86400 -> qps ,ptc99,存储空间,cdn消耗,平均值,峰值预估等等。
- 寻找一般解, 一台服务器,一台数据库,实现基本功能的逻辑交互
- 寻找更优解,逐步考虑约束条件,改进设计方案。注意具体问题具体分析,不要上来给一个庞大的系统架构设计。根据约束条件进行特性化分析。
基础知识¶
- 适当扩展,而不是问一句说一句。
- 说的越深越好,越多越好,直到面试官打断。
- 认识到,基础知识的考察,是对程序员综合素质的考察,会说明一个人的潜力。
品质考察¶
- 抗压 非自己一点也不会,否则绝对不能放弃,要努力给出方案,识别出这是压力测试。至少想十分钟,尽量想的全面,不要想到那里说到那里,给出的方案一定要靠谱
- 沟通 准确的表达出观点,需要不断练习,在准备阶段想清楚所有可能的提问
- 情绪 编码,设计方案时一定要想清楚,不要反复找面试官review,避免做事急躁
- 稳定性 提前准备好,为什么跳槽,以及未来职业发展规划的说辞
- 积极性 对这份职业的看法与态度,一定要有一个积极乐观的说辞。
如何谈薪¶
- 你这次跳槽是为了啥? 钱不到位 OR (工作没有挑战,换城市,职业发展)。立足于要么钱没到位要么职级没到位。涨薪超过百分之50才算突破。
- 手里有哪些offer? 不要交出offer,只是口头沟通。不要交薪资截图,因为offer的法律效益就是你泄露出去就失效了。
- 期望薪资是多少? 利用锚定效应,超出JD上限30%。不然就被倒挂。
如何养鱼与拒绝offer¶
- 不要说太多offer,只说几个关键竞品公司offer。
- 不要截图等任何形式交出offer原件,这样才有回旋余地。
- 在没有offer的时候,可以空手套白狼。
- 管理预期,那就是我很热爱技术,但是现实情况必须要向钱看
结束也是开始¶
- 开始写更高职级的简历
- 在当前岗位,把简历上的规划一一实现
- 结合业务发展不断调整
- 去面更高级别的岗位
- 做上一职级的事情,可能会让你在本岗位晋升,那就直接把简历改成晋升PPT
- 时刻让自己暴露在招聘市场中,只有晋升才是王道。
Tips¶
费曼学习法¶
参考文献¶
- 飞书,如何准备一场服务端的技术面试,2021
- MBA智库百科,费曼学习法