随着各大公司春招的开始,很多小伙伴都行动起来了,我有幸能够加入百度并和大家分享自己的经验心得。由于我面试的都是比较大的公司,所以自然也是做了这方面的准备,因此这篇总结并不一定适合想去创业公司的同学。另外,由于经验本来就是主观性极强的东西,加之笔者水平有限,所以如果有不认可的地方,万望诸君呵呵一笑,抛之脑后。
接下来,我就斗胆分享一下自己在准备和参加面试的过程中的收获、对面试的思考,以及一些可能对大家有用的建议。最后附赠一份大礼包,希望能帮助每位读者找到自己心仪的工作。
什么是面试
有些人可能会把面试看的太重,觉得面试过了就能进入大厂,技术和财富兼得……
我倒是觉得,面试没有这么夸张,它其实是一次你和面试官互相了解的绝佳机会,借此机会你还可以对未来的工作有初步的了解和现在行业的情况。
面试本身并不能完全评价一个人的实力。面试通过的人,也许只是恰好在面试时遇到了自己熟悉的问题,面试不通过,也有可能是面试官自身的问题,并非每个面试官都具备客观评价别人的能力。
换句话说,面试没通过也许是面试官没有发现你的才华,面试通过了也并不代表你就能胜任工作,因为进入企业之后可不是每天负责回答面试题!
所以从这一点来看,面试有点像相亲。你满意我,我满意你,王八对绿豆——看上眼了,那就一拍即合,否则就分道扬镳。我本人非常希望能够多几轮面试(实际并不总是能做到),这样大家都有充足的时间互相了解,决定去留。
网上某些面经中,介绍了一些“装逼”的方法,还有所谓的“面试技巧”,我是不太认可的。技巧需要有,这是为了让你更好的展示自己,而非坑蒙拐骗,无理取闹,无中生有。我更想展现一个真实的自己,如果面试官不认可,说明我们没有缘分,或者说自己的能力还不够。
面试要准备什么
不知道有多少读者和我一样有过这样的困扰:“我知道某些东西很重要,所以去百度查了资料,但是查到的文章质量很差,正确率没有保证”。这其实是正常的,优秀的文章一般都放在优秀的作者的个人博客上,这恰恰是搜索引擎的盲区,所以一般只能搜到 CSDN、博客园这种地方的文章。自然就无法保证文章质量。
出于这种考虑,我在文章最后的复习资料中,提供了用于学习相关基础知识的书籍,如果您恰好是 Java开发者,还可以阅读我收集的一些高质量文章,正确性比较有保证。
面试
如果说腾讯的面试是挥金如土(毕竟每个面试官都配了一件单独的房间),那华为就是戒奢宁俭。两个大会议厅坐满了面试官,其中一个是初面面试区,另一边是综合面试区。初面区的面试官会来等待区一个一个叫我们过去面试。
面试桌采取一对一的形式,技术岗的面试通知短信虽然没有通知说要带简历,但是仍然带了一份以免中途需要。(事实证明这是一个明智的选择)
初面
初面面试官点到我的名字之后,我跟着面试官去他的那个位置。
面试流程和大多数互联网公司流程差不多,首先让自己介绍一个比较满意的项目。(可能想通过这个项目了解我们的技能程度)在我面试准备时,其实我就纠结过这个问题。因为在我的项目中,有两个项目是我比较满意的,第一个主要做后台,第二个主要做虚拟环境和数据交互。
“我有两个项目是比较满意的”,我先抛出这句话,希望面试官能够给机会让我将两个项目都讲一下,“我先讲一下第一个我们当时做的换课平台,当时本来是一个课程项目,但是我们在这个课程项目之上,结合当时校内急需换课这个需求,做出了这么一个换课平台”,(首先提出项目目的),“然后这个项目大概实现了一个怎样怎样的功能”(抛出产品功能),“我在项目中主要负责后台开发和数据库交互功能”(说下在项目中的角色),“整个项目的架构大致如下。。。。”(项目如何实现),我拿着纸笔在草稿上给面试官画着后台所有的系统架构和数据流动方式,同时将涉及到的重要点和技术点都说了下。
按照之前整理过的描述流程,我将整个换课平台项目描述了一遍,中途偶尔面试官会问一下技术细节,不过都不是很难,可能因为我没有***H”三大框架,而是使用纯JSP进行的底层开发,所以面试官也不是太好提问。
不过有意思的是,在我介绍到项目中实现了实时聊天的时候,面试官提了两个小问题,是我之前项目中没碰到,而实际生产产品中可能遇到的问题:第一,我们的实时聊天是直接P2P,这样需要双方在同一子网下,那如果现在双方不在同一子网下,外网某个移动端客户A可以访问后台服务器B,这时候某个web端C同时也可以访问服务器,这个时候A和C是互相不同的,现在如果我们仍然想让他们通信怎么办;第二,考虑大量用户同时访问后台服务器的时候,该如何处理。
第一个我首先考虑到用服务器作为中介,但是当时老是想着可能打两个聊天信息会对服务器造成压力,所以一直很犹豫要不要用后台服务器作为中转,以及,作为中转该如何操作。不过面试官稍微提醒我可以用服务器作为中转,这时候我突然意识到只要服务器收到之后,立刻将消息转发出去就可以了,不用走数据库。这时候我也才一直到为什么我以前分析微信的聊天服务时,会将所有的文本消息和图片消息发送到微信的后台服务器,而且简单的直接P2P对话,主要还是为了克服网络问题
第二个不难,考虑云计算中的负载均衡,我大致说了下思路,选取一台主机作为负载均衡调度机,其他的作为工作机即可。
第一个项目大概讲了十分钟,不知道是因为刚开始面试还是我项目确实对面试官的胃口。
第一个项目完了以后,面试官翻了下我的简历,“你要不说下你另一个项目?”我有blabla说了一通。
“有什么难点?”“项目中遇到过哪些问题?”
说完之后,初面基本也就结束了,整个过程十分和谐(可能我遇到的面试官比较nice)。最后让我提一个问题,我大概问了下投递的这个岗位今后具体会是什么工作,面试官大致给我讲了下。(我投递的云计算开发岗,PaaS方向)
综合面试
初面完之后,面试官指引我去综合面试区等待综合面试。
综合面试整体感觉和初面差不多,不过在综合面试阶段面试官首先问了我的籍贯,工作意向和理想的工作地点。
这里我表示并不挑,因为作为一个外省人,自从一个人出省读书以后,就已经对在哪生活在哪上班没有太多顾虑。
接着面试官问了我一些成绩怎样,家庭情况之类问题之后,开始问我的项目经验。(虽然我不太明白,为什么综合面试还会问初面中问过的关于项目经验的问题)这里我就不在重复了,何处是一样,我大致和面试官交流了一下我们的项目内容。
这一块内容完成之后,感觉综合面试整个流程已经基本结束了,面试官开始跟我介绍他们项目组的工作地点(深圳),工作内容,以及平常的一些工作,同时还给我介绍了一些将来工作中需要了解的基本知识——比如docker容器,k8s,部分国内国外的公有云的运行原理,让我回去之后提前自学一下。(到这里我开始感觉有戏了)
其实,综面和初面差别其实没有太大,不过感觉这还是和面试官有关系,因为在我同行的队友中,他们有的就被问到了一些比较底层的知识点比如Java有什么特点之类,也有被问及面向对象的优点等等(这些我都没被问到)。
综述
总的来说,其实华为的面试并没有我想象中的困难(因为听说华为今年缩招,我还以为面试会故意很难)。简历准备很重要, 尤其是项目经历,个人blog,github这类容易加分的内容,最好能够写出来。两场面试相比较同伴更加顺利,有一定程度上就是简历给我加了分。
因为我面试的是云计算开发岗,所以我在项目中重新添加了很多Java相关的项目经历,虽然不是很重要,但是至少能让面试官从中了解我在Java方面有不少经验。
面试时候不用太紧张,在之前腾讯面试中我就明显很紧张,脑子一片发蒙,而这次华为面试就感觉稍微舒服很多,不知道是因为已经经历过几次面试,还是因为面试官带动的比较好。
最后还挺重要的要能够及时清楚地描述自己想说的内容。毕竟将来工作岗位中,少不了和同事的交流。另外清晰的描诉对面试官了解你,了解你的项目会很有帮助。因此,不论是在给面试官讲述自己项目的时候,还是在回答面试官问题,亦或是想表达自己观点的时候,都需要清晰的表达。如果一时语塞,可以尝试停顿一下,整理下思路然后重新描述,只要面试官能够理解你的话,一般有些停顿是不会有什么大碍。
最后的最后,希望能够收到华为的offer吧(:зゝ∠)目前正在“排队待录取”中。
给大家看一下我面试的时候资料的Java题目(如需参考原件 pdf 学习+刷题点击此处获取)
- Java多线程
- 说一说自己对于 synchronized 关键字的了解
- 说说自己是怎么使用 synchronized 关键字,在项目中用到了吗
- 讲一下 synchronized 关键字的底层原理
- 说说 JDK1.6 之后的synchronized 关键字底层做了哪些优化,可以详细介绍一下这些优化吗
- 谈谈 synchronized和ReenTrantLock 的区别
- 说说 synchronized 关键字和 volatile 关键字的区别
- 为什么要用线程池?
- 实现Runnable接口和Callable接口的区别
- 执行execute()方法和submit()方法的区别是什么呢?
- 如何创建线程池
- 介绍一下Atomic 原子类
- JUC 包中的原子类是哪4类?
- 讲讲 AtomicInteger 的使用
- 能不能给我简单介绍一下 AtomicInteger 类的原理
多线程面试专题与答案
JVM的设计目标是提供一个基于抽象规格描述的计算机模型,为解释程序开发人员提供很好的灵活性,同时也确保Java代码可在符合该规范的任何系统上运行。JVM对其实现的某些方面给出了具体的定义,特别是对Java可执行代码,即字节码(Bytecode)的格式给出了明确的规格。这一规格包括操作码和操作数的语法和数值、标识符的数值表示方式、以及Java类文件中的Java对象、常量缓冲池在JVM的存储映象。这些定义为JVM解释器开发人员提供了所需的信息和开发环境。Java的设计者希望给开发人员以随心所欲使用Java的自由。
JVM
内存模型以及分区,需要详细到每个区放什么。
GC 收集器有哪些?CMS 收集器与 G1 收集器的特点。
Minor GC 与 Full GC 分别在什么时候发生?
堆里面的分区:Eden,survival (from+ to),老年代,各自的特点。
简述 java 垃圾回收机制?
java 中垃圾收集的方法有哪些?
类加载器双亲委派模型机制?什么是类加载器,类加载器有哪些?
简述 java 内存分配与回收策率以及 Minor GC 和Major GC
Redis
为什么要用 redis /为什么要用缓存?
为什么要用 redis 而不用 map/guava 做缓存?
redis 和 memcached 的区别?
上述 Redis 分布式锁的缺点?
redis 常见数据结构以及使用场景分析
redis 内存淘汰机制(MySQL里有2000w数据,Redis中只存20w的数据,如何保证Redis中的数据都是热点数据?)
redis 持久化机制(怎么保证 redis 挂掉之后再重启数据可以进行恢复)?
缓存雪崩和缓存穿透问题解决方案?
如何解决 Redis 的并发竞争 Key 问题?
如何保证缓存与数据库双写时的数据一致性?
Redis面试专题与答案
Spring一般是不可避免的,如果你的简历上注明了你会Spring Boot或者Spring Cloud的话,那么面试官也可能会同时问你这两个技术,比如他可能会问你springboot和spring的区别。 所以,一定要谨慎对待写在简历上的东西,一定要对简历上的东西非常熟悉。
另外,AOP实现原理、动态代理和静态代理、Spring IOC的初始化过程、IOC原理、自己怎么实现一个IOC容器? 这些东西都是经常会被问到的。
Spring
Spring Bean 的作用域?
如何用基于 Java 配置的方式配置 Spring?
请说下 Spring Bean 的生命周期?
Spring Bean 的作用域之间有什么区别?
请举例说明如何在 Spring 中注入一个 Java Collection?
Spring 框架中有哪些不同类型的事件?
Spring 框架中都用到了哪些设计模式?
开发中主要使用 Spring 的什么技术 ?
Spring面试专题与答案
“RabbitMQ?”“Kafka?”“RocketMQ?”...在日常学习与开发过程中,我们常常听到消息队列这个关键词。这也是面试经常被问到的