阿里巴巴面试经历


首先呢,大佬让我用两分钟自我介绍。我本觉得本身能口若悬河,将对方视做相亲对象般全方位介绍本身。结果不到半分钟,我就介绍完了==。mysql

五秒钟的沉默后,大佬嗯了一声。linux

感受本身的脸上堆满了尴尬而不失礼貌的微笑。面试

最近的项目经历

这时大佬问我最近从事了什么项目,研究生阶段都进行了什么样的工做。spring

那必须吹一吹!从JAVA的起源到Spring的发展再到jenkin的使用顺便提一嘴dva+antd,结果半分钟一到,又说不下去了==sql

大佬颇有耐心的听我说了一堆语无伦次的话,开始进入正题。mongodb


Spring

大佬:我看你用过这个Spring啊,你来聊聊为何咱们要使用Spring呢?数据库

我:(由于你们都说好啊)首先呢,spring是一个庞大的框架,它封装了不少成熟的功能可以让咱们无需重复造轮子。其次呢,它使用IOC进行依赖管理,咱们就不用本身初始化实例啦。编程

大佬:(我就知道你会说IOC啦)那你解释一下IOC吧后端

我:IOC就是依赖控制转化,利用JAVA的反射机制,将实例的初始化交给Spring。Spring能够经过配置文件管理实例。centos

大佬:那咱们能够直接使用工厂模式呀。工厂模式也能够管理实例的初始化呀,为何必定要使用Spring呢?

我:啊........由于.......方便?(仿佛看到大佬凝固的表情,为了避免那么尴尬,我决定转移话题)。并且spring的IOC是单例模式呢。

大佬:默认的是实现是单例模式吗?

我:对的。

这里查了一下为何不用工厂模式而使用IOC。其实本质上仍是由于IOC是经过反射机制来实现的。当咱们的需求出现变更时,工厂模式会须要进行相应的变化。可是IOC的反射机制容许咱们不从新编译代码,由于它的对象都是动态生成的。


数据库

大佬:你使用过哪些数据库呀?

我:mysql还有sqlight。(被遗忘的mongodb在角落里无声哭泣)

大佬:那你使用的ORM框架除了hibernate还有哪些,好比IBatis?

我:我用过MyBatis

大佬:哦,那你能讲一下你对两个框架使用后的感觉吗?

我:当时使用Mybaits的时候,也有去社区了解了一下两个框架的口碑,发现你们的战队都坚决而对立。对Hibernate的不满一般是由于它在复杂关联中每每会带来严重的性能问题,也就是N+1的问题。可是它是面向对象支持的最好的框架了。而Mybatis则相对而言比较易于使用,只须要会SQL语句就好了。可是也意味着会破坏一些面向对象的规则。

大佬:(彷佛有点承认)那你了解数据库的事务吗?能讲一下数据库的事务级别吗?

我:(忘得一干二净)emmm很差意思我记不太清楚了。

大佬:那你还记得数据库的加锁吗?好比乐观锁,悲观锁?

我:(求您别问了T T)

大佬:(持之以恒)那我如今假设有一张用户表,你也知道,正常的表只能存放大概一千万或是两千万左右的数据。可是阿里巴巴有上亿的用户?你会怎么存储呢?

我:能够纵向分割与横向分割。

大佬:那你以为这里应该纵向仍是横向呢?

我:纵向(载入史册的嘴瓢)

大佬:(颇有耐心)但是这样个人数据库仍是放不下啊

我:(仿佛忽然睡醒)应该是横向分割,把表拆分红多个表而后分布式存储

大佬:那你以为咱们怎样分割比较合适呢?

我:(还能再问?)能够根据地域,可是根据用户分布的状况来讲,仍是会有某些地域访问稠密而有些地域比较稀疏的问题。难道按照用户等级?

大佬:不,用户等级会变更,不合适。你这个阶段暂时没有考虑这个问题

我:(谢谢您的台阶啊!)


Linux

大佬:大家服务器用的是什么操做系统啊?

我:(呀,送命题)咱们用的是阿里云上的centos系统

大佬:那你对linux熟练吗?

我:不是很熟悉,仅仅是入门,可以敲一点指令。

大佬:好,那你知道库函数和内核调用吗?

我:内核调用是指进入内核态而后执行指令而后再回到用户态吗?

大佬:对

我:我知道的大概就这么多了,只了解一些概念上的内容。(凉凉送给本身)

大佬:那你知道如何查看进程吗?

我:啊...记不得了,我通常都查一下指令(因而大佬果断放弃了其它linux问题)。


JVM

大佬:你了解JAVA虚拟机吗?能解释一下底层的模块吗?

我:(若是你通知我明天面试,我就了解了><)很差意思,这一块知识我不熟悉,可是我很愿意去了解(赶忙表忠心啊!)

线程

大佬:你知道什么是线程安全吗?

我:(乌鲁乌鲁说了一堆)就是好比若是同时有两个线程访问同一个变量,那么它们对变量形成的修改所带来的结果多是不肯定的。

大佬:那你知道JAVA有什么方法来实现线程安全吗?

我:(前几天还翻译了博客,可是一问起来忘得比啥都快)首先是synchronized修饰词,而后JAVA还本身实现了一些封装好的类好比LatchDown,Atomic系列(????????后来一查是CountDownLatch!还有大明湖畔的final关键字呢?还有小明湖畔的Lock呢?还有那些实现线程的collections好比ConcurrentHashMap呢?)

大佬果真开启了下一个问题。


分布式

大佬:你有写过度布式的业务吗?

我:我写过一个基于HDFS分布式存储的KVStore,上层使用Hadoop的API实现。

大佬:那个是分布式存储,我想了解一下分布式业务?

我:(赶忙纠正)那dubbo算吗?(因而介绍了一下本身了解的dubbo)

大佬:ok。那你以为分布式的话会遇到什么问题呢?

我:那就是经典的CAP问题了。没有数据库可以同时知足这三个问题

大佬:那你能具体解释一下CAP表明什么吗?

我:(紧张到一片空白)Consistency?Atomic?P...Persistency???

大佬:。。。。。。

CAP:是指Consistency一致性,Availability可用性,Partition Tolerance分区容忍性

点击打开连接

设计模式

大佬:你了解过设计模式吗?

我:了解了解

大佬:那你了解过哪些设计模式呢?

我:blablabla

大佬:那你解释一下指令模式吧

我:这个有点像函数式编程的思想。指令模式就是指将各个操做封装为统一的接口,而且提供各个操做的实现类。这样咱们只须要面向command接口编程,解除了调用类和指令之间的强耦合。

总结

最后固然和大佬话一话家常,进行最后的挣扎。总结来讲,要想成功进行一次阿里巴巴的面试,你须要了解甚至掌握如下内容:

  • JAVA语言,尤为是线程

  • JVM原理

  • 数据库(事务,加锁,ORM)

  • Linux

  • Spring(重点!)

  • 分布式

  • 设计模式

能够说是涉及范围很是广了。不过其实要想成为一名优秀的后端开发,是须要这些知识面的,只能说本身仍是太菜了。要继续深刻学习!

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------