如何更好地准备面试
讲清楚这个项目是满足什么需求的,开发过程中遇到哪些困难,自己怎么解决这些困难的。
# 简历
用简历争取到更多的面试机会
- 阅读职位介绍上的技能要求年限,在简历上的醒目位置标明你有足量的相关技术项目经验
- 仔细阅读职位介绍上要求的技术,也列在第一页的醒目位置
- 写些你的亮点,怎么写看下面的范例。
(java web 后端方向)如何让你的简历为你争取到更多的面试机会,内容来自 java web 轻量级开发面试教程 - hsm_computer - 博客园 (opens new window)
# STAR 法则
STAR 法则是情境(situation)、任务(task)、行动(action)、结果(result)四项的缩写。STAR 法则是一种常常被面试官使用的工具,用来收集面试者与工作相关的具体信息和能力。STAR 法则比起传统的面试手法来说,可以更精确地预测面试者未来的工作表现。
Situation: The interviewer wants you to present a recent challenge and situation in which you found yourself.
情境:面试官希望你能描述一个最近遇到的挑战或情况。
Task: What did you have to achieve? The interviewer will be looking to see what you were trying to achieve from the situation.
任务:你必须要完成什么任务?面试者想要知道的是你在上述情境下如何去明确自己的任务。
Action: What did you do? The interviewer will be looking for information on what you did, why you did it and what were the alternatives.
行动:你做了什么?面试官想要了解的是你做了什么?为什么做?有没有替代方案?
Results: What was the outcome of your actions? What did you achieve through your actions and did you meet your objectives. What did you learn from this experience and have you used this learning since?
结果:你行动的结果是什么?从你的行动中,你得到了什么?有没有完成你的目标?你从中获得了什么经验教训?之后有没有用到这些经验?
# 项目
自我介绍时,立即全面抛出技术栈和亮点
先说技能点和 jd 的匹配度,然后说自己的亮点
介绍自己的项目商业项目或者至少看起来是商业项目
由于你在自我介绍阶段已经涉及到最近项目了,所以面试官一定就会再问下去。不过不管怎么样,面试官总会问及你最近的项目,所以你总是有机会通过介绍项目经验来验证自己能胜任这份工作。
当面试官让你介绍下最近的项目时,你可以先大致先说下项目背景。因为有些候选人在简历上的项目经验看上去就像学习项目(其实我知道不少项目经验还真是),但你可以通过如下的说辞,证明这个项目是商业项目经验。
我最近是在 xx 公司(以此突出商业项目)里做了 xx 项目,这个项目的客户方是 xx,已经上线(但如果是 web 项目面试官大概率会去核对)。这个项目用到了敏捷开发模式(提一下别展开,算抛出个提问点), 这个项目组人员是 xx 人,做了 n 个月,我在里面做了 xx 和 xx 模块。
你这样一说,能通过项目所在公司和客户方等要素,说明这个项目不是你编的。有人会问了,如果项目真的是编的,该怎么说?这块我不管,你自己想办法说。
但你这样说之前,事先需要做好如下的功课。
- 了解敏捷开发模式,比如站会每个人该说什么,用 jira 管理进度,一年定好若干个发布日期,一个月发布一次等,因为你提到了,面试官大概率后继会问到。
- 如果你说的是 xx 财务系统 xx 图书馆系统等,一些资深的面试官可能会问,这块有现成的项目,为什么你们公司还要自己开发?所以说你在准备项目描述时,不能夸张,比如把一个数据收集模块的维护项目夸张成 xx 财务系统。不过我也遇到过一些候选人,他们就说这是公司接的项目,为什么人家还要下订单做此项目他们管不着。
- 你一旦说了这个项目,那么面试官就会认为你真实做过,所以其中每个业务需求,比如数据从哪里收集,客户从哪个前端发请求,客户请求处理的流程,以及数据表的规模等信息,你得知道并且事先准备好回答预案,我就经常用此来确认候选人的项目是真实项目还是编的项目。
项目管理工具,说明你不仅会写代码 在介绍项目背景之后,你更可以说些项目管理的工具,以此证明你在项目里还做过其它事情,不仅是仅会写代码,具体的说辞范例如下:
在这个项目里,我们用到了 maven,用 git 来管理代码,用 jira 来管理任务和 bug,用 jenkins 工具来发布。我还用过 junit 编写过单元测试,我们还用 sonar 来统计代码的测试覆盖度,我们项目经理要求,只有当“行覆盖率高于 80%”,代码才能提交。
上文提到 maven,Git 和 junit 这块不难,jira 管理 bug 和 task 这个也没什么可问,但你要事先了解下 sonar 管理代码质量的基础知识以及行覆盖率等要点,至于 jenkins 发布脚本,这个无需一般开发操心,你说下就行了。在上文里你仅仅提到的是工具,但你更要通过这些工具,来进行自我表扬。
我在使用 junit 时,不会敷衍地编写案例,而会根据真实的业务数据来编写案例,并且我还会着重考虑各种边界情况(这些哪怕初级开发也有本事做到),而且在编写代码时,我会非常注意编码规范,比如定义变量时会让人一看就理解 ,在关键代码地方多写注释,在 if 等条件里不会写太复杂,一个方法不会写太长,或者你可以再说些其它好的编码规范。而且,一旦遇到我的 bug,我会第一时间跟进,并会和相关对应的人一起解决掉。
项目基本面以及可能会遇到的后续提问 然后就需要介绍项目里用到的技术,哪怕你的亮点说辞再说,你也得保证技术的基本面说辞,这里就用当前 Java 项目的主流框架 Spring Boot 为例,告诉大家如何以此展示 Java 开发的基本功。
我们这个项目用到了 Spring Boot 框架,其中用 JPA 连接 Oracle(或 MySQL 等)数据库,在控制层里用到了@RequestMapping 注解来编写业务处理方法。在业务代码里,是用@Autowired 注解来以 IOC 的方式引入类,还用到了@Service 和@Component 注解。当我们从数据库里拿到数据后,会用包含@Entity 和@Table 注解的模型类来映射数据。在这个项目里,我们还用到了@Transactional 注解来定义事务,这个注解是作用在 Service 层上的,在这个项目里,我们还用到多个 Java 集合类和异常处理类。
通过上文的范例,大家应该可以很好地展示 Spring Boot 的基本技术面,其实对大多数 Java 初级开发而言,日常工作也就是用 Spring Boot 写一些增删改查的工作,所谓根据现有的业务再编写新的业务,所以上述说辞足够了。但是由于你提到了 Spring Boot,所以在提问阶段,面试官大概率会问及如下的问题。
- @Service 和@Component 注解的差别?
- 各种 Restful 请求格式以及各种 http 请求返回码。
- @Transactional 事务里的事务隔离级别和事务传播机制概念。
- Spring 依赖注入概念和@Autowired 的用法。
- Spring Bean 的生命周期。
- 甚至可能还会问 Spring Boot 启动流程以及底层源码。
对 Java 0 到 3 年的初级开发而言,其实能按本范例给出的说辞,并结合网上题目说好前 4 个问题,应该就足以应对大多数的面试了。
用实例说明你在内存调优方面的经验 突出四点:
- 强调你有内存调优意识
- 说明你有排查 OOM 的经验
- 说明你写代码的时候也会注意内存性能
- 说明你还了解 JVM 结构和 GC 流程的知识。
但这里依然要强调,你尚在项目介绍阶段,你说明要点即可,别展开,如果这里你展开说明内存调优的做法,面试官会认为你思路不清晰,不过既然你提到了,面试官可能立即就打断你介绍让你详细说明,或者你介绍完项目后会继续问,总之你是有机会详细展示内存调优亮点技能了。
展示你在数据库调优方面的经验
在本项目里,我参与过数据表设计,所以会考虑用反范式来避免因大表关联而导致的性能损耗,同时我们会合理地设置索引以提升数据库的访问性能,并且我还有过用执行计划优化语句的经验,同时在使用事务的时候,我会非常注意配置事务隔离级别和事务传播机制,以免造成锁表。
针对以上描述可能面临的提问
- 你去看下索引的数据结构(比如 B+树),建索引的语句,索引的种类,尤其是复合索引以及对应的回表和最左匹配原则
- 事先看下索引的正确用法,以及哪些情况下用不到索引,比如 where a != 'xx'可能就用不到。
- 索引的代价(会占硬盘,以及大批量读写时会重建索引,所以性能慢),以及在小表里,无需建索引。
- 执行计划的概念,以及通过执行计划排查慢 sql时该注意的点(避免全表扫描,设置合理的关联表方式等)。
- 三范式和反范式相关概念,因为你提到了。
- 事务隔离级别里的脏读等概念,以及事务传播机制,尤其地,你要具体说出你项目里用的是哪个。
这里根据上文给出的要点,整理下介绍项目经验的说辞。
实例
(介绍项目背景)我最近的项目是在 xx 公司做的 xx 社区爱心超市项目(项目别说太大),客户方是 xx 公司,项目组里是 6 个人,开发了八个月,最近还在开发,在其中我做了删除和更新订单模块的业务 (如果是在校阶段做的项目需要再加上如下的话),这个项目是我从大三开始,外面找 xx 公司做的兼职项目,做项目的时候我每月还能拿到钱。
(介绍项目技术,JD 上列的尽量说全)这个项目用到了 Spring Boot 框架,数据库是 Oracle,用 JPA 连接 Oracle(或 MySQL 等)数据库,在控制层里用到了@RequestMapping 注解来编写业务处理方法。在业务代码里,是用@Autowired 注解来以 IOC 的方式引入类,还用到了@Service 和@Component 注解。当我们从数据库里拿到数据后,会用包含@Entity 和@Table 注解的模型类来映射数据。在这个项目里,我们还用到了@Transactional 注解来定义事务,这个注解是作用在 Service 层上的,在这个项目里,我们还用到多个 Java 集合类和异常处理类。
(介绍项目管理工具)这个项目用到了敏捷开发模式,用 Maven 框架,用 sonar 管理质量,用 git 管理项目版本,用 jenkins 发布,用 logback 打日志, 我在这个项目里,除了写代码外,还有用 Junit 进行单元测试的经验。我们还用 sonar 来统计代码的测试覆盖度,我们项目经理要求,只有当“行覆盖率高于 80%”,代码才能提交。
(最后抛出亮点)在这个项目里,我用到了单例和工厂设计模式,在这个项目里,我做过 JVM 调优和数据库调优的的事情,在做项目时为了加深理解,我还看了 ArrayList 快速失效的底层代码,也看过 HashMap 关于 HashCode 以及 put 和 get 部分的底层源码。这个项目后期进度比较紧,我也能通过加班等手段保证项目能正常上线,而且一旦遇到线上问题,我也会尽量参与并解决。
大家在面试前,可以根据上述范例合理地准备说辞,次序和内容上可以做调整,但包含的几个要素尽量都说全。如果可以,事先要多练习几遍,确保能足量地抛出你的相关技能和亮点。
不过千万注意,在介绍项目时,对具体的点,比如内存调优,你点到为止别展开,否则的话,面试官一定会认为你思路不清晰。总之在介绍项目时,需要遵循的要点是:第一要尽可能全面地说明你用过 JD 上的技能,第二要抛出亮点话题,等待面试官提问。
# 常见提问及目的
提问方式 | 目的 |
---|---|
让你描述工作经验和项目(极有可能是最近的),看看你说的是否和简历上一致 | 看你是否真的做过这些项目 |
看你简历上项目里用到的技术,比如框架、数据库,然后针对这些技术提些基本问题 | 还是验证你是否做过项目,同时看你是否了解这些技术,为进一步提问做准备 |
针对某个项目,不断深入地问一些技术上的问题,或者从不同侧面问一些技术实现,看你前后回答里面是否有矛盾 | 深入核实你的项目细节 |
针对某技术,问些项目里一定会遇到的问题,比如候选人说做过数据库,那么就会问索引方面的问题 | 通过这类问题,核实候选人是否真的有过项目经验(或者还仅仅是学习经验) |
# 回答及后果
回答方式 | 后果 |
---|---|
我在 XX 软件公司做了 XX 门户网站项目,这个项目做到了 XX 功能,具体是 XX 和 XX 模块,各模块做了 XX 功能,客户是 XX,最后这个项目挣了 XX 钱 | 直接打断,因为我不需要了解业务需求,我会直接问他项目里的技术 |
(需要招聘一个 Java 后端开发,会 Spring MVC)最近一个项目我是用 C#(或其他非 Java 技术)实现的,实现了……或者我最近做的不是开发,而是测试……或者我最近的项目没有用到 Spring MVC | 提问,你最近用到 SSH 技术的项目是什么时候,然后在评语上写:最近 XX 时间没接触过 SSH |
在毕业设计的时候(或者在读书的时候,在学习的时候,在 XX 培训学校,在 XX 实训课程中),…… | 直接打断,提问你这个是否是商业项目,如果不是,你有没有其他的商业经验。如果没商业项目经验,除非是校招,否则就直接结束面试 |
描述项目时,一些关键要素(比如公司、时间、所用技术等)和简历上的不匹配 | 我们会深究这个不一致的情况,如果是简历造假,那么可能直接中断面试,如果真的是笔误,那么就需要提供合理的解释 |
# 回答模板
要素 | 样式 |
---|---|
控制在 1 分钟里面,讲出项目基本情况,比如项目名称,背景,给哪个客户做,完成了基本的事情,做了多久,项目规模多大,用到哪些技术,数据库用什么,然后酌情简单说一下模块。重点突出背景,技术,数据库和其他和技术有关的信息。 | 我在 XX 公司做了 XX 外汇保证金交易平台,客户是 XX 银行,主要完成了挂盘,实盘成交,保证金杠杆成交等功能,数据库是 Oracle,前台用到 JS 等技术,后台用到 Java 的 SSH,几个人做了 X 个月。不需要详细描述各功能模块,不需要说太多和业务有关但和技术无关的。如果面试官感兴趣,等他问。 |
要主动说出你做了哪些事情,这部分的描述一定需要和你的技术背景一致。 | 我做了外汇实盘交易系统,挂单成交系统,XXX 模块,做了 X 个月 |
描述你在项目里的角色 | 我主要是做了开发,但在开发前,我在项目经理的带领下参与了业务调研,数据库设计等工作,后期我参与了测试和部署工作。 |
可以描述用到的技术细节,特别是你用到的技术细节,这部分尤其要注意,你说出口的,一定要知道,因为面试官后面就根据这个问的。你如果做了 5 个模块,宁可只说你能熟练说上口的 2 个。 | 用到了 Java 里面的集合,JDBC,……等技术,用到了 Spring MVC 等框架,用技术连接数据库。 |
这部分你风险自己承担,如果可以,不露声色说出一些热门的要素,比如 Linux,大数据,大访问压力等。但一旦你说了,面试官就会直接问细节。 | 这个系统里,部署在 Linux 上,每天要处理的数据量是 XX,要求是在 4 小时,1G 内存是的情况下处理完 5 千万条数据。平均访客是每分钟 XXX。 |
# 避免回答
要避免的情况 | 正确的做法 | 原因 |
---|---|---|
回答很简单。问什么答什么,往往就用一句话回答 | 把你知道的都说出来,重点突出你知道的思想,框架 | 问:你 SSH 用过吗?答:用过。问:在什么项目里用到?答:一个保险项目问:你做了哪方面的事情?答:开发 我直接不问了 |
说得太流利 | 适当停顿,边思考边说 | 让面试官感觉你在背准备的东西,这样后面问题就很难 |
项目介绍时什么都说, | 就说些刚才让准备的一些,而且要有逻辑地说 | 会让面试官感觉你思路太乱 |
别太多介绍技术细节,就说你熟悉的技术 | 技术面点到为止,等面试官来问 | 你说到的所有技术要点,都可能会被深问。面试官一般会有自己的面试节奏,如果你在介绍时就太多说技术细节,很有可能被打断,从而没法说出你准备好的亮点。 |
可能导致直接出局
错误类型 | 导致的后果 |
---|---|
前后矛盾,后面的回答无法证明你的项目描述,比如一开始说用到了 Spring MVC,后面没法说出最基本的实现,比如不知道 Spring 有哪些类,或者没法说出项目的细节。 | 我会怀疑这个项目的真实性,我就会进一步问:数据库用什么,数据量多少?多少人做了多少时间,一旦再出现明显漏洞,比如一个小项目用到非常多的时间,那么就不仅仅是技术问题,而是在面试过程中企图“蒙混过关”的性质了。 |
项目里一定会用到的基本概念性问题都回答不上,Spring 的依赖注入概念是什么,怎么用的,或者 Hibernate 的一对多怎么实现 | 一旦被我发现概念不知道,我就会通过更多问题确认,如果被我确认很弱,这就相当严重,因为技术能力差和技术没用过是两个截然不同的状况,技术没用过会导致直接出局。 |
面试时说出的工作经验和简历上的不一致 | 我会直接怀疑简历是编的,我会让候选人解释,即使是说简历写错了,我也会问比较深入的问题来核实他的技能和能力。 |
简历上的技能描述和回答出来的明显不一致,比如明明是只会简单的 Linux,但吹得天花乱坠 | 我会通过一些比较深的问题核实其他技能,找出其他方面吹嘘的水分。所以建议,你可以适当夸张,但别过分,比如你在项目里没搭建框架但平时学习时搭建过,你可以写“XX 项目的框架是你搭建的”,但你不能说你是一个架构师,非常了解项目的底层。 |
让面试官感觉你不稳定,很浮躁,比如说话不庄重,或者面试时打扮非常不正规,就穿背心来。 | 即使你技术再好,这个会可能导致你直接出局。我对油嘴滑舌的候选人一般会直接写上不好的评语,这样很难过后面项目经理的面试。我还遇到一个人,简历上工作是半年一换,我问他为什么经常换,他直接说是待遇问题,这个人我是直接 Fail 掉。 |
明说不能加班,不能出差 | 其实虽然有这一问,但公司里未必真的会加班会出差。但听到这类回答,说明这个人不能承受大压力的工作,或者责任心不强,大多数公司是不会要这种人的。 |
# 应该
主动表现项目中的亮点
不论在介绍项目还是在回答问题,你当前的职责不是说明亮点而是介绍项目,一旦你详细说,可能会让面试官感觉你跑题了。
主动扩展
可以引导,但不能自说自话,面试官不主动问,可能就是对这个不感兴趣或者项目中不需要用到。
逻辑清晰,避免虚词
否则会被认为对技术使用深度不够
ref:
- 如何在面试中介绍自己的项目经验 - hsm_computer - 博客园 (opens new window)
- 如何在面试中介绍自己的项目经验(面向 java 改进版) - hsm_computer - 博客园 (opens new window)
# 高级开发
- 刚开始一定得通过一些小公司练手
- 投简历前,微调简历描述的技巧
- 在换工作前,需要定下预期目标,同时要观察公司的情况
- 面试前,要查看职位介绍,以此准备项目介绍
- 准备项目介绍时,我是如何准备值钱技术的
- 事前评估好自己的薄弱点,想办法让面试官忽略
- 和猎头和人事的沟通要点
- 不能常跳槽,但得经常更新自己的技能
ref:
- 以我的亲身经历为例,告诉大家写简历和面试的技巧(面向高级开发和架构师) - hsm_computer - 博客园 (opens new window)
- 进大厂也就这回事,工作后 2 到 3 年进大厂操作指南 - hsm_computer - 博客园 (opens new window)
- 最全干货:从写简历,到面试、谈薪酬的那些技巧和防坑指南 (opens new window)