如何更好地准备面试
讲清楚这个项目是满足什么需求的,开发过程中遇到哪些困难,自己怎么解决这些困难的。
# 简历
用简历争取到更多的面试机会
- 阅读职位介绍上的技能要求年限,在简历上的醒目位置标明你有足量的相关技术项目经验
- 仔细阅读职位介绍上要求的技术,也列在第一页的醒目位置
- 写些你的亮点,怎么写看下面的范例。
(java web 后端方向)如何让你的简历为你争取到更多的面试机会,内容来自 java web 轻量级开发面试教程 - hsm_computer - 博客园 (opens new window)
# 项目
自我介绍时,立即全面抛出技术栈和亮点
先说技能点和 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)