学生党成功拿到阿里技术offer:面Java开发,却是C++考官,几个意思?

简介: 这是我为大家分享的如何拿到阿里技术offer系列文章中的第一篇,今天分享的文章的作者是一位在2015年阿里的校招中成功得到offer的美女学姐,从学姐的这篇文章中我们能学到很多在阿里面试的宝贵的经验和技巧。接下来,让我们一起分享吧

作为一枚计算机软件专业的学生党,从进入大学校园的第一门课程《职业发展概论》上就明白一个道理:“在计算机软件行业,学不到老那就活不到老”。我们的专业是当下世界中发展最快的,我们不得不紧跟时代的脚步,不断学习,只有站在行业的前沿,才能保证自己不被行业淘汰。


作为软件攻城狮的学生党,我的业余时间往往用于来逛技术论坛,在阿里云栖社区这样的技术论坛上收获了很多,不仅丰富了视野,也对专业也有了更为清晰认识,更重要的一点是在论坛上从很多的技术大神身上学到了技术和知识。一篇篇技术博文中,唤起了我对一家公司的向往——阿里巴巴。而更让我产生仰慕之情的是,他们的奋斗精神。


24282db8085c4b80f0ba13ba77d1d331c66e1f90

双十一时,宿舍里全线熬夜往购物车里加商品还在讨论,“阿里的服务器不能爆了吧…”,买完商品后,宿舍里一群作为软件攻城狮的我们就开始躺在床上脑补,从“哎,什么技术能让天猫接受这么大的高并发量?”聊到“我去,刚不到40分钟,成交量就突破百亿了!这是要逆天么…”。后来我们看到一条微博上面的照片是阿里许多工程师的合影,备战双十一。才明白也许就是当我们在疯狂抢购的时候,这群阿里人在为了用户体验,彻夜未眠。


总之,我非常希望未来能去阿里工作,和我有一样想法的小伙伴应该不少吧。所以,假期中,我特别找了几篇有关阿里校招的文章做成一个系列在这里和大家分享一下咯。


第一篇是一个学姐(程序媛学姐,肯定美美哒)在成功拿到阿里offer后写的博客(原文链接)。


以下为正文:

《阿里2015校招面试回忆录(成功拿到offer)》


1. 阿里面试回忆

在说具体的面试场景之前,一个小插曲很有必要说一下:


由于我面的是Java开发,但当时负责人员给我安排了一个C++面试官(桌上有牌子),然后我就跟负责人说“我是面Java方向的,不是C++方向的”,结果那个面试官笑呵呵的说“没关系,在我这面一样的,如果你不懂C++,我可以不问你C++语言方面的细节问题”,当时我心里想:虽然我C++学的和Java差不多,就算面C++也没有问题。但是既然面试官这么说了,肯定不问C++了,Java估计也不会问(C++方向的工程师不一定懂Java呢),应该是问数据结构、算法、网络、操作系统方面的问题了。虽然都有所准备,面起来也可以,但是鉴于两个方面的原因,我还是没答应在这面。


(1)据说阿里90%都是招Java工程师,如果在这面后面肯定会以为我是面C++的,胜算就少了;

(2)我这几个月基本上都在专研Java方向的知识,也研究了不少JDK源码和Java相关的项目,感觉自己的Java方向知识有了一个质的提高,因此希望面试官能够考查和检验我这方面的知识。


因此我当时跟那个面试官说“不好意思,我还是希望能面Java方向的知识”,那个面试官依旧笑呵呵“如果你对Java知识的确非常自信,那么可以给你换个Java方向的面试官”,然后我只能说“是的,我有研究过很多JDK源码,也做了不少Java项目”。最后,我出去找负责人给我安排Java方向的面试官,负责人说“那你要等会儿才行,估计要半个小时”。“哦,没关系,那我等会吧”,心里想:等不怕,方向搞错了才要命。


说上面这段插曲的目的是想告诫大家,如果你有比较明确的方向,比如“我以后一定要做C++/Java方向的开发”,那么一定要强调出来。如果像阿里这样每个面试官都有个方向牌那很容易搞定,如果没有则可以在面试一开始的自我介绍或找其它机会说出来让面试官知道,可能有人认为语言不重要,关键是算法、数据结构、操作系统云云……是的,很多面试官都跟我说过:在以后的工作过程中,语言不重要,重要的是你以后做的东西是不是你感兴趣的,但是我认为语言在面试过程中是有非常大的关系的,如果你是C++方向,那么面试官可能会问你一些虚函数机制、Linux下的内存分配策略、内存管理、常用系统调用等这方面的知识;如果你主攻Java,可能会问集合类区别、可研究过jdk源码、数据库等方面的知识。


因此面试的第一步就是让面试官明确知道你主攻的语言方向(可能也有较好的面试官会在提问之前首先问你懂Java还是C++,如果你两个方向都非常懂并且没有比较偏爱的方向,那就无所谓了。


一面:技术面(大概40 minutes)

半个小时没到,终于给我安排了个Java方向的面试官,这次交流非常愉快。下面的“面”代表面试官。


第一阶段:自我介绍

面: 请简单自我介绍下。

我: 我是XX大学计算机专业的一名XX,我研究生期间的方向是XX,(方向简单描述)。12年暑期在XX公司实习了4个月,做的是XX(不知名小公司实习过)……(其它重要项目的简述)。另外,自己是名开源积极分子,有自己的Github,而且今年暑期参加了CSDN举办的开源夏令营活动,做的是XX。


阶段总结:上面只是我自己当时的一个简单自我介绍,经验不足讲的比较乱,而且忘了讲自己十分热衷技术,平时喜欢写技术博客等事情(有些情况下可以加分呢)。建议大家都定制好自己的版本,讲出自己的亮点。


第二阶段:介绍研究生期间的论文项目,针对介绍提出几个相关的技术问题


面: 好,我看下简历。(然后对着我的简历看了十几秒,指着我的第一个项目)这是你刚说的研究生的论文项目吧,那你把这个项目详细说下。

我: 我从项目的选题(为啥要做这个方向)、项目采用的技术、新颖的地方、最终达到的效果(由于我做的是某个算法的性能提高,那么我就会讲速度提高了多少?空间压缩了多少?)这几个方面详细介绍了自己的项目。接下来就是针对我的叙述具体问了几个技术相关点,这没什么好说的,因为每个人做的项目不一样,问的东西也不一样。


阶段总结:对于项目而言,语言就不是很重要了,关键是项目的架构、所采用的技术、能达到什么样的效果。面试官选的项目一般要么是简历中项目经验的第一个、要么是有他感兴趣的、要么项目做的时间比较长的,因此建议在写简历时,把你认为最有把握的项目放在第一位(而不是传说中的要按时间倒序来写项目经验),没太大把握的不要写(被抽问到就惨了)。


第三阶段:Java方向的知识,包括JVM原理、垃圾回收机制等

面: 你Java学的怎么样?

我: 还可以,有研究过部分JDK源码,比如常用的集合类如HashMap/Hashtable、ArrayList/LinkedList、Vector等,还有Java5之后的并发包JUC如concurrentHashMap、Executor框架、CopyOnWrite容器等。自己很欣赏Java巧妙的垃圾回收机制,看过周志明的《深入理解Java虚拟机》,因此对JVM相关的知识有所掌握……

面: 嗯,学的挺深的,那你把JVM的结构和类加载原理说下。

我: 马上拿起桌上的笔和纸,把虚拟机运行时包含的几个数据区和执行引擎画了下,包括方法区、虚拟机栈、本地方法栈、堆和程序计数器,然后介绍每个区域有什么作用,最后讲ClassLoader的类加载机制,还顺便说了下双亲委派机制。

面: (面试官点头表示满意)你刚刚说Java的GC机制很巧妙,那么它的巧妙之处在哪里?

我: 我从两个方面说下自己的理解:一是Java的内存分配原理与C/C++不同,C/C++每次采用malloc或new申请内存时都要进行brk和mmap等系统调用,而系统调用发生在内核空间,每次都要中断进行切换,这需要一定的开销,而Java虚拟机是先一次性分配一块较大的空间,然后每次new时都在该空间上进行分配和释放,减少了系统调用的次数,节省了一定的开销,这有点类似于内存池的概念;二是有了这块空间过后,如何进行分配和回收就跟GC机制有关了,然后我详细介绍了GC原理、画图表示年轻代(Eden区和Survival区)、年老代、比例分配及为啥要这样分代回收(我认为巧妙就在于这里),有了GC基本结构后,我又详述了下GC是具体如何进行内存分配和垃圾回收的。

面: (面试官一直点头表示对我回答的赞同)嗯,看来你对这块的确掌握了,对了,你说你参加的CSDN开源夏令营项目是阿里的是吧(我点头),这个夏令营是什么情况?

我: 我简单介绍了CSDN举办此次夏令营的目的,顺便说道此次夏令营活动当初有2000多人报名参加,最终只筛选出60多名,自己凭着开题报告和对开源的热爱赢得了导师的青睐得以入选。

面: 你导师是谁?

我: 淘宝的XX。

面: 哦,他啊,我认识呢,他是……(后面就简单闲聊了几句,该阶段结束,面试官让等会儿准备二面)


阶段总结:上面的对话有人看了过后可能会说:好简单啊,问的题目都是你会的,当然能过啦。是的,其实这是有技巧在里面的,就是要想办法“先下手为强”,啥意思?即让自己成为主动摊牌者而不是被动回答者,找机会跟面试官说自己熟练掌握了哪些方面的知识、自己喜欢专研什么等等,就像上面我所做的。


二面:技术面 + HR面(大概1 hour)

一面很轻松的就过了,但是二面就相对而言有些吃力,问的完全是项目相关,而且不是我最熟的研究生期间的论文项目,而是另外两个项目,由于复习不到位,某些地方回答的不完善。


第一阶段:自我介绍,同上

第二阶段:介绍面试官感兴趣的两个项目,一个与推荐系统相关,另一个与Java web相关。

面: 介绍下你简历上的这个电影个性化推荐引擎,使用的是哪种推荐算法?

我: 改进的基于用户的协同过滤推荐算法。

面: 那好,那你从项目的基本架构、所使用的算法原理、如何改进的、数据如何处理这几个方面介绍下你的项目吧。

我: 我首先画了下项目的架构图,据此图详细讲了下UserCF的原理及如何使用用户的社交数据和六维理论改进传统的UserCF,并写出了改进后的算法公式。然后又说这个项目的数据多大,代码中采用什么数据结构进行处理的。

面: (介绍原理中提到了利用用户相似性来作为推荐的一个参考,面试官追问)那用户的相似性你怎么算的?

我: (汗,这个有个计算公式,我不太记得了,最后根据自己的理解讲了下余弦相似性的计算方式,公式没写全,面试官问公式里的根号怎么算的,我说直接用Java的库函数)

面: 你这数据哪来的?有几类数据?数据的存储格式是什么?

我: (该项目时间有点久了,前几天只复习了项目的整体架构和算法原理,忘了看具体的数据了,这里只能凭自己的记忆讲了下数据的存储格式,回来后发现自己讲的虽然没错但不够具体)


附:该电影个性化推荐引擎我早已经放到了自己的Github上面,是自己在老师的指导下做的,纯算法,还比较简单有待于改进。


介绍完了这个项目,马上面试官又看中了另一个Java web相关的项目,马上追问。

面: 你这个XX系统是用ssh2框架做的,那你对这个框架熟吗?

我: 当时在公司实习时对ssh的掌握程度只是会使用级别,那时候没时间去研究框架背后的原理。后来有闲暇时间后,我就深入研究了下这几个框架的原理,还看了部分spring的源码,学到了不少知识。

面: 那你把这三个框架都介绍下。

我: 我开始按自己的理解按Hibernate、Struts、Spring的顺序开始讲,Hibernate讲到它的使用原理及与iBATIS的对比,顺便说了下现在似乎大家更倾向于使用iBATIS、myBATIS这样更加灵活的轻量级框架。struts讲了下它的作用就是“将请求与视图分开”,然后讲述从输入url到使用struts处理的控制流程(struts从tomcat那接管、action处理),然后也说struts现在似乎也不那么倾向于使用因为它有漏洞。最后重点讲了下重头戏Spring,详细讲述了它解耦的功能、AOP原理及自己有利用动态代理简单模拟实现过一个简单的AOP功能、IOC(DI)等。最后说,从web应用层面上看,Hibernate属于持久层,struts属于表示层,而Spring却贯穿所有于所有层(表示层、业务层、持久层),Spring也有自己的MVC模块、web模块及JDBC和DAO模块,只是很少使用,也就是只用一个Spring也是完全可以的。

面: (点头表示肯定)你刚说到struts有漏洞,那么Hibernate是安全的吗?有没有可能发生xss攻击和sql注入攻击?

我: (汗,这个问题真心没想过,对Hibernate的掌握没有Spring那么深,只能硬着头皮按自己的理解回答)这个问题没想过,不过我觉得框架没有绝对的安全,Hibernate是用来操作数据库的,hql语句里也有select、where判断,应该有可能发生sql注入攻击,xss攻击就不太清楚了。(这个回答太糟了)


面试官没说啥,一直在电脑上写着什么东西。这时候旁边的HR终于发话了。

HR: 你本科是哪的?为什么选择考研?

我: 开始说出我的“发家史”,从一所不知名的小二本考到了中科大,……

HR: 那你技术上是怎么学习的?

我: 又从本科说起,本科技术很差,到了研究生期间才真正开始技术上的修炼,……balabala

HR: 你的职业规划是什么?

我: ……(每个人的想法不一样)

HR: 你最大的优势是什么?

我: (自己吹吧,也要根据实际情况看)

……


阶段总结:再次说明项目的重要性,第一个项目有些记忆模糊,答的有瑕疵,这里要引以为戒(一定要对项目知根知底),第二个项目感觉答的还可以,不过Hibernate安全问题没答出来,我觉得只要你其它问题答的很好,有个别问题答不出来是不会影响最终的offer的。HR面也很重要,你得说通了,需要提前考虑好常见问题的回答。


第三阶段:到你提问了

自由发挥阶段,可以问问公司内部的培养计划、晋升机制、是否经常有大牛分享技术让我们学习等等。


3. 总结

(1)整个面试过程中没让写代码,没问Linux下的一些知识,也没问操作系统、计算机网络相关,我觉得可能是Java面试更倾向于从项目中问相关的技术问题,如果你没项目或项目不多,那么就可能问这些计算机基础知识了。


(2)由于之前内推电面的失败,让我丧失了一些小自信,因此在这次阿里的整体面试过程中还是有些紧张,大家请引以为戒,务必在面试中保持淡定的心态,就当是和朋友在一起交流技术问题。


(3)最后,希望我上面对话形式的面经能够给正在找工作或以后找工作的同学们带来一些借鉴意义,希望你们能够从中看出某些问题的答题技巧和所做的准备工作。


faccd562310e8eab1571a31e09c16f9d02830db0


写在最后


文章分享完了。从她的博客上也能看出来,研究生毕业后拿到了很多offer,最后应该是去了阿里。我分析一下核心要点:技术和知识储备上都比较过硬;面试的能力非常强,她非常清楚自己准备的技术方向,宁肯多等待半个小时的时间也要在Java方向的面试官那里面试;“先下手为强”,即让自己成为主动摊牌者而不是被动回答者,找机会跟面试官说自己熟练掌握了哪些方面的知识、自己喜欢专研什么等。而对于计算机软件专业的我们而言,对所做的每一个项目,都要善于总结和评价,这样才会有实质性的收获,当自己所做的东西都烂熟于心,融会贯通了,再回答别人的提问也就会显得游刃有余。而且从文章中能看出,无论是一面结束还是整个面试结束,学姐都有所总结,而且这些经验都非常有参考价值。


最后,自己也要提出的问题。我一直认为提问题永远是一门技术甚至是一门艺术,而很多的大学生直到现在还是不懂得如何提问,这一点也是我们要在平时积累锻炼的。


好了,这篇分享就先到这里了。我们下一篇再见!


阿里云技术专场招聘会-Java已经启动,特邀数位Java大牛担任面试官,两个工作日内高效回复。欢迎感兴趣的同学们来报名!链接点这里!!!


本系列文章:

学生党成功拿到阿里技术offer:面Java开发,却是C++考官,几个意思?

学生党如何拿到阿里技术offer:《阿里实习生面试经验(成功)》

学生党如何拿到阿里技术offer:《阿里面试经历-2014.4.18研发实习生面试经历(失败)》

学生党如何拿到阿里技术offer: 《阿里巴巴常考面试题及汇总答案(Java方向)上篇》 

学生党如何拿到阿里技术offer: 《阿里巴巴常考面试题及汇总答案(Java方向)下篇》

学生党如何拿到阿里技术offer:《阿里面试(失败+成功)》 

学生党如何拿到阿里技术offer: 《2016阿里巴巴校招内推offer之Java研发工程师(成功)》

学生党如何拿到阿里技术offer:《阿里面试(失败)》

学生党如何拿到阿里技术offer:《阿里面试(成功)》

相关文章
|
21天前
|
NoSQL Java 数据库连接
深入探索 Java 后台开发的核心技术
【4月更文挑战第5天】本文探讨了Java后台开发的关键技术,包括Spring框架与Spring Boot的使用,MyBatis和Hibernate的ORM选择,关系型与NoSQL数据库的适用场景,线程池与异步处理在并发中的作用,微服务架构及RESTful API设计。这些核心技术有助于开发者打造稳定、高性能的Java后台系统,适应不断发展的云计算和人工智能需求。
|
15天前
|
算法 Java C语言
C++和Java中的随机函数你玩明白了吗?内附LeetCode470.rand7()爆改rand10()巨详细题解,带你打败LeetCode%99选手
C++和Java中的随机函数你玩明白了吗?内附LeetCode470.rand7()爆改rand10()巨详细题解,带你打败LeetCode%99选手
|
2天前
|
SQL Java 数据库连接
Java从入门到精通:2.3.1数据库编程——学习JDBC技术,掌握Java与数据库的交互
ava从入门到精通:2.3.1数据库编程——学习JDBC技术,掌握Java与数据库的交互
|
2天前
|
设计模式 存储 前端开发
Java从入门到精通:2.2.1学习Java Web开发,了解Servlet和JSP技术,掌握MVC设计模式
Java从入门到精通:2.2.1学习Java Web开发,了解Servlet和JSP技术,掌握MVC设计模式
|
2天前
|
Java API
Java从入门到精通:2.1.5深入学习Java核心技术之文件操作
Java从入门到精通:2.1.5深入学习Java核心技术之文件操作
|
2天前
|
并行计算 算法 安全
Java从入门到精通:2.1.3深入学习Java核心技术——掌握Java多线程编程
Java从入门到精通:2.1.3深入学习Java核心技术——掌握Java多线程编程
|
8天前
|
Java 关系型数据库 MySQL
一套java+ spring boot与vue+ mysql技术开发的UWB高精度工厂人员定位全套系统源码有应用案例
UWB (ULTRA WIDE BAND, UWB) 技术是一种无线载波通讯技术,它不采用正弦载波,而是利用纳秒级的非正弦波窄脉冲传输数据,因此其所占的频谱范围很宽。一套UWB精确定位系统,最高定位精度可达10cm,具有高精度,高动态,高容量,低功耗的应用。
一套java+ spring boot与vue+ mysql技术开发的UWB高精度工厂人员定位全套系统源码有应用案例
|
9天前
|
存储 数据可视化 安全
Java全套智慧校园系统源码springboot+elmentui +Quartz可视化校园管理平台系统源码 建设智慧校园的5大关键技术
智慧校园指的是以物联网为基础的智慧化的校园工作、学习和生活一体化环境,这个一体化环境以各种应用服务系统为载体,将教学、科研、管理和校园生活进行充分融合。无处不在的网络学习、融合创新的网络科研、透明高效的校务治理、丰富多彩的校园文化、方便周到的校园生活。简而言之,“要做一个安全、稳定、环保、节能的校园。
34 6
|
9天前
|
监控 前端开发 算法
Java技术体系
Java技术体系(韩顺平老师整理)
10 0
|
20天前
|
存储 安全 Java
Java中实现高效的字符串拼接技术
【4月更文挑战第6天】在Java编程中,字符串拼接是一个常见的操作。然而,由于字符串的不可变性,频繁的拼接操作可能会导致性能问题。本文将探讨Java中实现高效字符串拼接的技术,包括使用StringBuilder类、StringBuffer类以及Java 8中的StringJoiner类。通过对比这些技术的优缺点,我们将为您提供在不同场景下选择合适的字符串拼接方法的建议。