引言
阿里巴巴这四个字对于一个技术人来说,是一个朝圣对地方,是一个制造梦想的地方。看过无数次马老师对演讲视频以及纪录片,在惊叹于马老师的商业眼光的同时也萌生了去看看阿里巴巴到底是一家什么样的公司的愿望。本文主要阐述了作者如何在繁忙的工作中通过三个月的准备拿到阿里offer的过程,希望对想进入阿里巴巴的同学有所裨益。面试准备经历适用于将要走出校园寻找人生第一份Java开发工作的应届生,也适用于工作好几年的老司机。
为什么换工作
作者的最主要的工作经历是在一家领域内排名全球第一的公司工作,但是这家公司是以硬件为主的,软件只是配套。虽然一直谋求在软件道路上的突破,形成新的利润增长点,但是转型是痛苦的,作者经历了整个转型的过程,但是越越发现自己遇到的技术上以及发展上的瓶颈,逐渐进入了舒适区以及温水煮青蛙的状态,因此萌生了离职换工作谋求发展的想法。由于对于阿里巴巴的盲目向往,给自己定了去阿里的目标,于是开启了自己三个月的面试准备之旅。
面试准备
面大厂的技术岗,还是需要好好准备,最好不要打无准备之仗。因为每次面试都是有面试记录的,如果没有准备好就面试,很有可能留下不好的面试记录,后面再面试其他部门的时候,面试官会参考之前的面试记录对你进行初步的评判,影响后面的面试。因此如果想要面试大厂必须好好进行面试准备。
另外大家在准备面试的时候不能光看,要学会自己总结,用输出倒逼输入,无论写文章还是思维导图,都是需要自己总结沉淀的。
我把面试内容主要分成了三大部分,分别为技术知识,项目经验以及HR面试。下面我就针对这三大部分分别进行详细说明。
技术知识
1、 Java功底
扎实基础知识是一切的基础,因此无论是应届生还是老司机都需要具备。在准备面试的时候这部分还是不可以偷懒的,因为一般第一面都是会从基础知识入手考察面试者的技术底子如何。
Java的基本数据结构,像List、HashMap、ConcurrentHashMap,这些源码都要烂熟于胸,常见的问题就是HashMap为什么线程不安全?Volatile关键字原理,可不可以从硬件层面进行分析描述。
2、JVM
JVM是java程序运行的基础,因此是非常重要的基础知识。建议大家在准备的时候,可以通过画图来进行理解。如果有实际的JVM调优经验那就更好了。像下面的这种流程图我们可以凭借自己的记忆可以画出来。对于常见的OOM如何分析?fullGC如何分析我们都要非常熟练。
3、并发
我们都知道大厂由于业务规模非常大,经常会有高并发的场景。面试官对于候选者的在高并发方面的沉淀也是非常看重的。首先我们要明白并发安全的原因是什么?我们的解决方案是什么?在分布式场景下如何解决并发安全问题?
https://blog.csdn.net/Diamond_Tao/article/details/117617457?spm=1001.2014.3001.5502
4、Spring框架
Spring框架是我们每天都会用到的开发框架,因此我们需要对它的原理、设计思想以及如何扩展都要非常熟悉。AOP、IOC的原理?Bean创建流程、循环依赖如何解决的?有哪些设计模式?有哪些扩展点?
https://blog.csdn.net/Diamond_Tao/article/details/82736787?spm=1001.2014.3001.5502
中间件
中间件是分布式系统中必备的基础组件,作为一名优秀的工程师,我们不仅需要熟悉各个中间件的原理,还要明确知道他们的使用场景以及如何进行选型对比。比如同样是MQ中间件,为什么你的项目中使用的是RabbitMQ而不是Kafka?其中的选型思考是怎样的?这些都是面试中经常碰到的,面试官其实更想听到的是你的思考是什么。
另外建议大家在面试前好好准备一些生产上面的遇到的问题以及解决问题的小案例,这样面试的时候可以信手拈来而不是当场去想,避免面试过程中可能由于紧张一下子想不起来的尴尬场面。当然必须是质量较高的案例。
数据库
虽然各种数据库层出不穷,但是实际工作中,我们大部分的业务数据还是存储在关系型数据库中。因此对于数据库的掌握是面试关非常重视的。就拿Mysql来说,我们可以先按照如下的结构进行梳理,Mysql的存储结构我们得清楚,一条SQL的执行过程我们能用自己的语言描述出来,在实际项目中的数据量有多大?如何进行分库分表?索引怎么设计的?有哪些设计规则?有没有进行SQL优化?怎么优化的?
https://blog.csdn.net/Diamond_Tao/article/details/117340176?spm=1001.2014.3001.5502
Redis
Redis作为当前分布式系统中最常用的缓存基础组件,也是面试中的重点考察对象。我们在准备过程中,需要梳理下我们平常在使用Redis的过程中遇到过哪些问题,比如数据缓存后,Redis数据与数据库的数据一致性如何保证?项目中如何保证Redis的高可用的?使用的是主从模式还是哨兵模式?为什么?
MQ
MQ是微服务架构的必备基础中间件,因此非常重要,大家务必好好准备。主要包括MQ在微服务架构中的作用是什么?Kafka、RabbitMQ、RocketMQ等消息中间件的选型对比是怎样的?消息如何存储的?怎么保证消息中间件的高可用?MQ的网络通信模块如何实现的?
通过以上的描述,大家知道如何准备中间件的面试了吗?如果再学习到一款新的中间件,大家也可以按照如下方法进行准备。
中间件是在什么场景下使用的?有没有做过选型对比?为什么项目中使用RabbitMQ而不使用Kafka?中间件的高可用怎么保证的?中间件的高性能怎么实现的?
项目经历
在面试前一定要把自己做过的项目重新梳理一遍,重点是你负责的部分,一定要非常熟悉,同时串联下自己的上下游服务,形成完整的业务闭环。把项目中最具有技术挑战的问题提炼出来,在面试前准备好,这是面试必问的问题。准备好项目中最大的技术挑战是什么(问题描述清楚),自己是怎么分析问题的(自己的分析过程),如何解决的(实际解决过程),解决的结果是怎样的(拿到什么样的结果),这就是我总结的问题回答公式,即W(What)A(Analysis)H(How)R(Result)回答法。面试准备中按照这样的方法论去套你的回答,肯定会惊艳全场。
算法
这个没什么好说的就是要多练多写,甚至可以用白纸写出来基本的快排算法、LRU等。这里推荐Leetcode。一定要把常见的题目弄的很熟。如果现场写不出来,但至少自己要有对应的思路。
HR面试
经历了前面多轮技术面试之后,恭喜你终于来到最后HR面试这一关。虽然不是技术面试,但是也是非常重要的一轮面试,像阿里这样的大厂,HR拥有一票否决权。
HR面试一般会让你先介绍下自己的经历,如果是学生的话就是自己的求学经历,做过哪些项目。如果是社会招聘,则重点说下自己的工作经历以及为什么换工作。HR面试问题主要有以下几类,大家可以根据自身的情况进行准备。
1、自我介绍,尽量简要而不简单,整段介绍要有记忆点,让HR对你有个基本的印象。
2、自己目前在团队中的角色以及现状。
3、为什么想要换工作,现在发展不顺利还是有什么其他原因?
4、展现自己能吃苦、愿意接收挑战的倾向,最好辅以具体的小故事加以说明。
5、为什么想来XX,手上有其他offer吗?
总结
面试准备是一场修行,是对自己知识体系、技术体系以及自身价值对全面总结和梳理。无论最后的结果如何,我觉得都会让自己得到一些提升。就拿我自己来说,在准备面试的过程中,总结了自己梳理知识的方法论,改掉了睡懒觉的习惯,已经可以每天六点半起床了,这些小而美的改变都是在这个过程中修炼获得的。同时希望大家明确一件事情,面试准备不是背Java八股文,而是需要进行技术思考,技术思考力是大厂非常看中的重要品质,多问自己几个为什么?我想你会收获到更多。
最后和大家分享一句话,真正的大师永远怀着一颗学徒的心,人外有人,山外有山,时刻保持一颗谦卑的心,保持一种空杯状态,你才会收获更多。努力不一定就有回报,但是不努力肯定不会有回报。预祝大家都可以找到自己心仪的工作。