首页 > 笔经面经 > 阿里巴巴内推(菜鸟驿站)一面总结

阿里巴巴内推(菜鸟驿站)一面总结

头像
爆流破
编辑于 2017-03-10 22:04:43 APP内打开
赞 10 | 收藏 151 | 回复9 | 浏览24602

原文在我的博文中:2017年春招阿里巴巴内推(菜鸟驿站)一面总结

2017年3月6日,我本来想通过同学的师兄内推去阿里中间件部门,这个师兄应该很忙,没有时间帮我内推(可能嫌弃我太菜了)。无奈之下,我只好在3月7日,通过我在菜鸟网络上班的师兄,内推下菜鸟驿站部门,整个过程很顺利。我将简历发送给师兄几分钟后,就收到了阿里巴巴的完善简历和参加测评的内推邮件。收到邮件那一刻,还是蛮开心的,毕竟是BAT啊!然后我就通过邮件里的链接去做测评了。测评由素质测评和编程测评两部分组成,由于自己能力有限,没有完成编程测评的题目,本来以为自己挂了,结果在大概在3月8日晚上7点20左右,接到阿里巴巴打过来的电话,说要进行电话面试!哎,当时惊呆我了,然而我刚去澡堂洗完澡,还在穿衣服穿鞋子,肯定不合适面试啦),于是就推迟到3月9号晚上的7:20左右电话面试。我在3月9号晚上6点钟吃完晚饭,就在等啊等啊,一副生无可恋的过程(请原谅我从来没有参加过电话面试),到了7点20左右,电话没有准时打来,然后我估计阿里巴巴那边在忙或者搞忘了,就让师兄问问咋回事,后来又等了1个小时,大概在8点20的时候打了过来,一次才有了我与阿里巴巴的第一次面试。由于面试过程太紧张了,太着急了,有些问题没有回答清楚。

下面是我面试时的问题和我的回答,内心过程,以及我面完后的分析。

1.擅长什么开发

回答:Web服务器开发。

2.对服务器端开发的理解

回答:服务器端开发应该支持高并发,高可用,可伸缩的系统,比如使用多线程,缓存,数据库连接池等(此处省略几百字,全是废话)。

内心:脑袋比较懵,这个问题太大了,不好找一个切入点,就随便扯了上面的回答。

分析:回答太着急,没有思考,表述不清楚,有点偏题。

3.影响单台服务器的并发量的因素有哪些?如何优化?

回答:线程并发数限制啊,缓存啊等之类(此处省略几百字,全是废话)

内心:估计要跪了,哎呀,平常没有修炼内功啊

分析:我对自己的这个回答非常不满意,不但面没到,点也没有达到,简直了。如果当时从并发编程的挑战的角度出发,就可以回答的更好点。比如:线程上下文切换,死锁,受限于硬件和软件的资源限制问题。其中:

  1. 上下文切换:CPU通过时间片分配算法来循环执行任务,当前任务执行一个时间片后会切换到下一个任务。但是切换前会保存上一个任务的状态,以便下次切换回这个任务时,可以再加载这个任务的状态。任务从保存到再加载的过程就是一次上下文切换。上下文切换会影响多线程的执行速度,因此并发线程数并不是越多越好,需要合理控制并发线程数。减少上下文切换的方法有:

  2. 无锁并发编程:多线程竞争锁时,会引起上下文切换,所以多线程处理数据时,可以用一些办法来避免使用锁,比如参考ConcurrentHashMap的实现思想,将数据的ID按照Hash算法取模分段,不同的线程处理不同段的数据。

  3. CAS算法。Java的Atomic包使用CAS算法来更新数据,而不需加锁。

  4. 使用最少线程。避免创建不需要的线程。

  5. 协程:在单线程里实现多任务的调度,并在单线程里维持多个任务间的切换。

2. 资源限制方面。硬件因素有服务器的带宽,磁盘读写速度和CPU的处理速度。软件资源限制有数据库的链接数和socket链接数等。

PS:如果我当时能够讲出这些因素,面试的质量应该能够更上一层楼,可惜啊,不知道有没有二面了,大哭……

4.你用过哪些缓存

回答:redis,mem***d,eh***

内心:糟了,面试官是顺着我的回答继续深入了,我在给自己挖坑……

分析:回答面试官的问题,不能太着急,想清楚再答。这里我给自己挖了个坑,mem***d我不太熟,只是曾经使用过这个来测试Tomcat集群时的会话共享,果然,面试官就有了接下来的问题,大哭!

5.谈谈对Mem***d的认识

回答:我对Mem***d不是很熟,只知道是基于内存的KeyValue数据库,我拿这个做过Tomcat的会话(Session)共享,用的比较多的是Redis。

内心:妈呀,不会的,赶紧转移话题吧

分析:这个地方还好,没有太大的失误。

6.那谈谈Redis吧

回答:Redis也是基于内存的KeyValue数据库,我曾经用这个做过数据缓冲区(拿了一个项目做例子),有两个Redis实例组成。(面试官:这个两个实例是什么关系?)相互独立的。(面试官:那为什么不用集群了?)我用的是Redis 2.6版本,这个版本还不支持集群,2.8才开始支持为集群,3.0以后才开始支持真正的分布式集群,使用2.6版本的已经可以完成任务了,所以就没有使用集群了,后来就没有在关注Redis了,就没有继续深入了(当时应该没有这么说,忘了说啥了,大概的意思就是这样的,大哭……)

内心:果然是自己坑自己啊,上来就这样坑自己,不太合适啊

分析:果然简历上写的东西都要熟悉,自己讲出来的东西都要熟悉,能够圆回去!接下来应该好好学习和准备

7.那你现在在做什么工作

回答:主要是在学习Java并发方面的东西(到底是Java的虚拟机还是Java并发编程,不记得了,太紧张了)

内心:终于开始转移话题,松了一口气。

8.Java类加载机制

回答:Java默认提供了三个类加载器,第一个是c(其实应该是C++实现的,太紧张了,快语无伦次了)实现的Bootstrap ClassLoader,该加载器负责加载Java运行时的rt.jar等jar包,第二个是Extension ClassLoader加载扩展的系统类库,第三个位System ClassLoader(应该是Application ClassLoader)也就是我们通常使用的App ClassCloader(应该是Application ClassLoader),用于加载classpath路径下的类库或者.class文件。

内心:很忐忑,因为回答不是很准确。

分析:上面的答案只是面到了,但是点没到,比如,我应该回答Bootstrap ClassLoader 负责加载放在<JAVA_HOME>\lib目录中的,或者被-Xbootclasspath参数所指定的路径中的,并且是虚拟机识别的类库加载到虚拟机内存中。Extension ClassLoader负责加载<JAVA_HOME>\lib\ext目录中的,或者java.ext.dirs系统变量指定的路径中的所以类库。Application ClassLoader负责加载用户路径上所指定的类库。这样应该更好点。如果在讲讲双亲委派模型就更好了。

9.JVM如何确立每个类在JVM的唯一性

回答:类的全限定名和类加载器。

分析:回答不准确,应该回答类的全限定名和加载这个类的类加载器的ID。

10.对JVM的垃圾回收的认识

回答:JVM的有三种垃圾回收算法,第一种为复制算法,将内存分成两部分,一部分使用,一部分未使用,垃圾回收时,将存活的对象全部复制到另一块未使用的部分,原来那部分待用;第二种是标记清除算法,这种算法在垃圾回收时只标记非存活的对象,没有复制过程,会造成内存碎片;第三种是标记整理算法,这个算法在垃圾回收时,标记非存活对象,同时将存活的对象向同一个方向移动,整理内存碎片。在Hotspot JVM中采用分代回收,在1.7之前有6中垃圾回收器,在1.7时增加了一个新的垃圾回收器Garbage First,即G1。

内心:越说自己越心虚,自己的脑子里对这些只有零星的记忆,没有做到完全吸收和理解。

分析:表达不是很准确,太着急了!如果这样准确的回答就好了,比如:标记-清除算法,分成两个阶段,第一阶段是标记出所有需要回收的对象,第二阶段是在标记完成后统一回收所有被标记的对象;缺点是会造成内存碎片。复制算法,将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活的对象复制到另一块上面,然后再把已使用的内存空间一次清理掉;优点是实现简单,运行高效,缺点是内存代价太高。标记-整理算法,也分成两个阶段,第一阶段和标记-清除算法一致,第二阶段不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存。这样回答估计效果更佳好点。

11.进程与线程的区别

回答:从操作系统的角度来说,在引入线程之前,进程作为系统资源分配和调度的最小单位,在引入线程后,进程不再作为调度的最小单位,只作为系统资源的分配的最小单位,线程开始作为系统调度最小单位,线程共享进程的资源。

内心:还好,当时看过进程方面东西。

分析:有几点没把握好,应该把最小单位换成基本单位,然后在加上一句话,进程内可以包含多个线程,即整理后应该这样回答比较好点:进程和线程的主要差别在于它们是不同的操作系统资源管理方式。从操作系统的角度来说,在引入线程之前,进程作为系统资源分配以及调度和分派的基本单位,在引入线程后,进程不再作为调度和分派的基本单位,只作为系统资源的分配的基本单位,进程内可以包含多个线程,线程作为系统调度和分派的基本单位。相比于线程切换来说,在进程切换时,耗费资源较大,效率要差一些。

12.数据库的悲观锁和乐观锁

回答:乐观锁,认为在读的时候是安全的,不上锁;在更新的时候,在更新前设置标志位,更新比较标志位有没有发生变化,如果没有发生变化,则更新成功,否则再做别的处理。悲观锁:总是认为操作时不安全的,总是上锁,只有自己更新完成才运行别的线程进行操作。

内心:还好,下午刚刚看过的知识点。

分析:但是还是没有回答准确,用词不好,条理不清晰,没有讲明白悲观锁和乐观锁。应该这样讲:

悲观锁:对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态。悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则,即使在本系统中实现了加锁机制,也无法保证外部系 统不会修改数据)。

乐观锁:大多是基于数据版本( Version )记录机制实现。何谓数据版本?即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是通过为数据库表增加一个 “version” 字段来实现。读取出数据时,将此版本号一同读出,之后更新时,对此版本号加一。此时,将提交数据的版本数据与数据库表对应记录的当前版本信息进行比对,如果提交的数据版本号大于数据库表当前版本号,则予以更新,否则认为是过期数据。

13.JVM的同步锁

回答:主要有synchronized和Lock。

分析:这个比较简单,也没用深入问,故只回答了这些东西。

14.你有什么问题吗?

回答:你们部们主要是做什么业务的?(面试官:物流这块,具体的我们也不方便细说)

内心:真的是没有准备任何问题,一下脑子空白了……

分析:果然在面试的时候需要准备些问题,问面试官。

15.你想去哪个部门?

回答:我最想去阿里中间件部门,因为这个部门的技术在阿里,乃至在中国都是顶尖的,……(此处省略几百字)

内心:在回答最想去的部门的时候,我这也太耿直了

分析:这个估计跟自己的职业规划有莫大的关系,还是想清楚在回答,不然面试官会觉得你比较冲动。大哭,没办法,面试前没有什么规划啊,这里也讲不了什么内容,大哭,真想抽自己一巴掌。

总结

这次面试,如果让我给自己打分的话,我给自己打50分,就是不及格。原因在于,回答面试官问题时,太着急了,没有思考,显得很浮躁,讲出来的话,漏洞百出,知识点总是面到点不到,说明自己对这些知识点没有完全消化和理解,不能清清楚楚的表述自己的观点和看法。自己脑海里没有形成一个知识图谱或者树,很难做到有条不紊,娓娓道来的讲出来,同时没有人生职业规划,总是得过且过,这种生活方式在目前看起来是很悠闲和舒服,但是在看到有关华为的裁员的报道和这篇博文《阿里感悟》- 技术人员的职业规划里面讲的东西后,发现有必要好好做下职业规划,迫使自己的不断的去成长,去进步。现在的我只是做到使用技术,没有做到研究技术的层面。所以我现在还需要不断地学习技术和总结经验,同时锻炼的自己的表达和概括能力,做到有效沟通,增强自己的软实力。勉励下自己:比你优秀的人还在努力,你为何还停滞不前?奋斗吧,莫等闲,白了少年头,空悲切!

转载请注明原文链接:2017年春招阿里巴巴内推(菜鸟驿站)一面总结

9条回帖

回帖
加载中...
话题 回帖

笔经面经近期热帖

历年真题 真题热练榜 24小时
技术(软件)/信息技术类
查看全部

近期精华帖

热门推荐