我们在学习Java Web开发技术的时候,老师告诉我们淘宝的架构都是使用Java写的,我怀着好奇心就开始搜索相关的问题,在知乎上看到这样一篇帖子《淘宝主要是用 Java 实现的,这是真的吗?》(
链接),其中回答者中有一位是支付宝核心域高可用架构师,他的回答可以说算是半官方的了,的确不光是淘宝,整个阿里系基本也是全线Java,而且水平在国际上也是一流的,世界上很少有Java的系统可以面对像淘宝支付宝这样的高并发,大数据的挑战,这里已经把Java技术发挥到了极致,比如自定制GC,编写针对CPU优化JVM等老外想做也没机会做的事,如果真想玩转Java,那就来阿里吧。
随着阿里全线Java的发展,阿里对于Java工程师的需求也越来越多,但是面试阿里的Java工程师需要什么样的技术能力和知识水平呢?什么样的技术人员才能面试阿里的Java工程师呢?
阿里的Java工程师招聘信息多达57页(果然多…),我找了阿里云方向的招聘要求和大家分享一下,大家参照这个可以有一个更加明确的努力方向:
好了接下来就为大家分享一篇阿里社招Java工程师的面试经历:
《阿里巴巴面试总结与感悟》
今天面试了阿里巴巴Java研发工程师,战况只能用一个字形容:惨,惨不忍睹! 昨天接到阿里巴巴面试通知的时候就已经没信心了,今天果真印证了 。
上午9点到了裕宁酒店在等待区没等多久就被领去面试了。阿里的一面是在大厅中分组一对一单面的。面试我的是一个二十七八岁的帅哥,面试过程也很友善。进去后,他首先看了我的简历,然后问我能不能说一下自己的特长优势什么的(都没有让自我介绍)。我简单的把在校三年来自己学习的技术和参加的项目介绍了下,然后拿出了自己准备好的《项目回顾表》以及自己做的《作品回顾》光盘和已经出版发行的两张光盘给他看。他看了说不错,然后就问我项目的事儿。
他说自己对3D开发不太了解,然后问我感觉在做《山海关虚拟博物馆》的时候有没有什么技术难点和重点。我说重点是在寻路上( 囧,说完我心里就哇凉哇凉的了,不应该说这个),然后他就问我是怎么实现寻路的,我给他画了下场景地图,然后解释了下我的做法(主要是用状态机)他可能不太满意,然后问我能不能用算法来描述。我没太明白他想要什么,然后他开始引导我回答这个问题,先问我学没学过图论,我说在数据结构和离散数学中学过,然后我明白了他想要什么了,我说可以用图存储各个目标点,然后通过判断各点之间的连通性来判断点是否可以到达,可以通过深度优先搜索来完成(说完我心里又是哇凉的,根本就没准备图这一块儿的数据结构)。然后他说让我写下深度优先搜索程序(= =,这个鄙视我吧,我真忘记了)。我想了会儿说记不清楚了,他问我图是怎么存储的,我说用临接表和临接矩阵,然后他让我给他画下,我就画完(这些还是会的)。他说再试试呢,我思考了下说记不清了(我怕写完他在让我写广度程序的和优化查找,这块儿真心没准备 )。
然后他让我写下自己用过的设计模式,我说有策略模式、单例模式、工厂模式、状态模式、适配器模式。然后他让我写下单例模式,我用了最简单的方式,static变量new自身对象。他说有没什么问题,比如变量被赋值呢。我说在C#中可以用访问控制符禁止set,在java中也可以用静态方法来屏蔽。他又问那你的类被别的类实例化,我说构造方法我用private的。(总之是没写全,写全他就不会问了)
设计模式谈完,他说来说下你的网站项目吧,我的简历里有写“系统架构”,他让我解释下,我就画了下MVC图,jsp页面作为视图,servelt作为控制层,然后建立model,建立service和dao,以及他们的作用。他说SSH和这些有什么不同吗?我说Struts2代替了servlet,hibernate代替了dao,spring贯穿他们,注入对象。他说那你说下spring的核心思想吧。我说主要是IoC,AOP,DI。他说说下IoC和AOP吧,我提到了IoC控制反转,通过配置文件将对象注入到程序中,他说你写下配置文件吧(又要写,= =,Spring半年没搞了早忘了)我说平时都是copy,忘记了。他可能以为我不会spring,然后问我那你都知道各个元素的作用吗,我说知道。(但是真心的忘记bean标签中都有哪些了,我发誓看见之后都知道有什么用,抓狂啊)
SSH告一段落(回答的太烂了,这些初级的学者都会,最主要的是很多都没记住),我有一个项目写的是已经上线了,他让我写下那个URL,我有点蒙,就写了域名,他说你们就用这个吗,我不知道他想要什么,我就又写了127.0.0.1:port,他问我用户可以访问?(当我是小白了- - ,哎前面回答的太烂了)我说当然不可以,我们的申请的IP是172.168.XX.XX:80这个是给用户的。他说服务器用的什么,我说tomcat,他问tomcat的端口号在哪里配置,我说在web.xml(说顺嘴了,其实我知道在server.xml中配置)。他说都可以配置什么,我说可以配置端口号,虚拟主机。他说还有吗,我说还可以配置一个监听端口号。他说默认的都多少,我说8080,他问我另外一个,我说不记得了。然后他让我写下JSP页面的标准头部是什么。我把page标签写上去了,我提到了页面编码,他问我用什么编码我说UTF-8,他说还知道其他的编码吗,我说还有GBK。然后他问我UTF-8和GBK的区别,我只说了表面的,他让我从计算机组成原理的角度说下GBK和UTF-8,我说我们专业没开计算机组成原理,然后他看了下我的简历。然后让我写下平时都看什么书,我大概写了下。最后他问我有什么要问他的吗,我让他点评了下。点评了啥就不说了,反正都在意料之中。
总结:今天阿里的面试非常烂,问题很简单,但是因为很久没搞Java了(有半年多了)所以很多都忘记了。基础太不扎实,这也是很多应届生的缺点吧。想要进大中型公司应该具备以下素质,留给各位准备面试和将来面试的人吧。
1.数据结构,这个不是懂了就行,刚学完数据结构,各种算法自己也可以很快写出来的,但是很久没写了都忘记了。数据结构这个东西必须能信手拈来,随手就能写出各种树、图的遍历以及排序、查找等算法,以及二叉树,B-树、堆的概念和程序(最好做到能当场写程序)。
2.明白Java API的源代码实现,比如LinkedList和ArrayList,不只是数据结构的区别(这个大家都清楚)还要能从源代码的角度,比如线程安全性,内部扩充方式,每次扩充的长度等等来表达。(你可以想想自己能不能说出String、StringBuffer、StringBuilder的区别;HashTable、HashMap、TreeMap的区别呢?属性类的安全性?等等,别查文档,也别说你知道,面试的时候不会听你啰嗦的,就说重点区别)。
3.设计模式,要明白各个设计模式的优缺点,应用场景,最好能说出哪些框架应用了这些设计模式。对于简单的设计模式,如单例等可能会被现场写。
4.SSH框架,只要搞Java的都会被问这三个框架的很多东西,Spring的IoC,DI,AOP,配置;Struts2的创建过程,Filter,配置;Hibernate的O/R Mapping,映射的配置,乐观锁、悲观锁等等。紧紧在项目中用还不行,最好要明白内部原理。
5.操作系统的一些知识,笔试的时候有考到LRU算法(差一点就忘了)。
总之大公司考的范围很广,绝大部分都学过,但是很多我们在学校中学一次就很可能不会再用(比如页面置换算法,存储过程等,学生项目不会涉及这么复杂底层的东西)。还有就是平时我们依赖IDE惯了,很多我们知道的东西,比如标签都有哪些属性什么的,当场写我们可能就写不出来了(比如各种配置文件,使用自动提示惯了,让自己写都不会了,这是平时注意自己敲吧)。
感想:其实阿里巴巴的技术面反映出来的最主要的问题不是自己的技术问题,而是自己真正想要做什么。
今天问的这些问题,如果放在大三上学期问的话,我能很自如的答出来,但是从专业实习之后自己一直就在研究Unity3D和Photon,这些很久都没看了,忘了很自然。自己现在真正应该思考的是到底想不想要做Java开发,做Java开发的话就要用SSH框架,自己又不太喜欢基于SSH框架的网站开发。(= =真是个纠结的问题,男怕入错行,如果你了解的也比较多还是慎重考虑吧,虽然招聘Java的很多,但是面试Java的比招聘的还多,Java发展了这么多年,想要说你精通Java要有一定实力哦,要不然随便一个细节问题,比如Java反射、序列化、反序列化等都可能问死你,不是你不行,是这个太细了)有侧重的复习面试很重要。想要深入游戏开发,又怕自己没学过C++和图像处理算法和别人差距太大。这几天要反思下。
正文完
有话要说:从这位学长面试失败的经历中可以看出一个问题,对于我们在大学中“学过”的技术知识,我们是不是真正地学到了、学懂了、学透了。回顾我们大学学过的东西有太多,有什么是我们融进自己技术中的,我们都应该及时反思自己的学习,我们是不是真的学到了东西,还是我们学的东西只是浮于表面,没有抓住知识的根基。还是“功夫用在平时”,努力和勤奋不会没有回报的。