记录一次壮烈的阿里面试经历

对于面试,对于选择一家心仪的公司,是每个求职者都要经历的。但是越是一些互联网大企业,面试时需要注意的事项就会越多,严格度相对也较高,这不嘛,一位在结束了阿里面试的程序员,把面试的心里路程分享了出来~

今天本是一个阳光明媚,鸟语花香的日子。于是我决定在逛街中感受春日的阳光~结果晚上七点的时候,蚂蚁金服后端大佬来了电话,要进行一轮的技术面试。我一脸黑人问号???现在的面试都流行突袭吗?

于是我的这一次面试之旅,就此壮烈的展开。

自我介绍

首先呢,大佬让我用两分钟自我介绍。我本以为自己能滔滔不绝,将对方视作相亲对象般全方位介绍自己。结果不到半分钟,我就介绍完了==。

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

感觉自己的脸上堆满了尴尬而不失礼貌的微笑。

最近的项目经历

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

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

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

Spring

大佬:我看你用过这个Spring啊,你来聊聊为什么我们要使用Spring呢?

扫描二维码关注公众号,回复: 6171275 查看本文章

我:(因为大家都说好啊)首先呢,spring是一个庞大的框架,它封装了很多成熟的功能能够让我们无需重复造轮子。其次呢,它使用IOC进行依赖管理,我们就不用自己初始化实例啦。

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

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

大佬:那我们可以直接使用工厂模式呀。工厂模式也可以管理实例的初始化呀,为什么一定要使用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接口编程,解除了调用类和指令之间的强耦合。

总结

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

一、高性能架构:成为互联网架构师,你要的都在这里

有了大牛的代码功底之后,接下来可以更好地学习分布式架构技术。
透彻理解分布式架构的好处和优点必然性,适应市场需求,能够去找一些更大的平台发展,提升自己的综合技术能力和薪资。
了解从传统架构到分布式架构演变过程所带来的技术变革,将理论和实战相结合,透彻理解分布式架构及其解决方案。
从分布式架构原理,到分布式架构策略,再到分布式架构中间件,最后在加上分布式架构实战,让程序员可以在技术深度和技术广度上得到飞跃的提升,成为互联网行业所需要的T型人才。

二、架构筑基:深入内核、直击故障、拒绝蒙圈

大家都知道,性能一直是让程序员比较头疼的问题。当系统架构变得复杂而庞大之后,性能方面就会下降,如果想成为一名优秀的架构师,性能优化就是你必须思考的问题。
所以性能优化专题从JVM底层原理到内存优化再到各个中间件的性能调优,比如Tomcat调优,MySQL调优等,让你洞悉性能本质,全面认识性能优化,不再只是旁观者。

三、开源框架:站在巨人肩膀,收获不一样的视野

这张图详细介绍了源码中所用到的经典设计思想及常用设计模式,先打好内功基础,了解大牛是如何写代码的,从而吸收大牛的代码功力。
结合Spring5和MyBatis源码,带你理解作者框架思维,帮助大家寻找分析源码的切入点,在思想上来一次巨大的升华。

四、微服务:你还不知微服务?那怎么加(zhuang)薪(bi)

随着业务的发展,代码量的膨胀和团队成员的增加,传统单体式架构的弊端越来越凸显,严重制约了业务的快速创新和敏捷交付。为了解决传统单体架构面临的挑战,先后演进出了SOA服务化架构、RPC框架、分布式服务框架,最后就是当今非常流行的微服务架构。微服务化架构并非银弹,它的实施本身就会面临很多陷阱和挑战,涉及到设计、开发、测试、部署、运行和运维等各个方面,一旦使用不当,则会导致整个微服务架构改造的效果大打折扣,甚至失败。

五、团队协作开发专题:让你的团队开发效率提高十倍

一名优秀的架构师必须有适合自己的兵器,也就是工欲善其事必先利其器,不管是小白,还是资深开发,都需要先选择好的工具。工程化专题的学习能帮助你和团队提升开发效率,让自己有更多时间来思考。
Git:可以更好地管理你和你团队的代码。
Maven:可以更好地管理jar包和项目的构建等。
Jenkins:可以更好地持续编译,集成,发布你的项目。
Sonar:一个开源的代码质量分析平台,便于管理代码的质量,可检查出项目代码的漏洞和潜在的逻辑问题(提升代码的质量,更加高效地提升开发效率)。

六、B2C项目商城实战:撸起袖子干实事,项目经验那点事

电商项目目的是把所学的分布式,微服务,性能调优等知识运用起来,只有在项目中你才能巩固知识,提升自己。实践电商项目会利用云服务器搭建真实的开发和部署环境,让你从零到项目实战,体验真实的企业级项目开发过程,让你具备独立开发和搭建分布架构系统的能力。

可以说是涉及范围非常广了。不过其实要想成为一名优秀的后端开发,是需要这些知识面的,只能说自己还是太菜了。要继续深入学习!


本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。同时我经过多年的收藏目前也算收集到了一套完整的学习资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、Jvm性能调优、Spring,MyBatis,Nginx源码分析,Redis,ActiveMQ、、Mycat、Netty、Kafka、Mysql、Zookeeper、Tomcat、Docker、Dubbo、Nginx等多个知识点高级进阶干货,希望对想成为架构师的朋友有一定的参考和帮助

需要更详细思维导图和以下资料的可以加一下技术交流分享群:“708 701 457”免费获取




猜你喜欢

转载自blog.csdn.net/qq_42982923/article/details/89955121