投了阿里巴巴暑期实习的岗位,过了几天就收到了电话面试,第一次是周六的下午,难道阿里巴巴的员工周六都还要加班,太恐怖了...当时在外面逛街,就重新约了另外的时间。周一的晚上就收到的电话,想想这个时间应该正常。作为程序员平时还是要以公司的事情为重的,闲下来了之后才能做一些面试的工作,所以他把时间安排在了周六或者晚上,接下来简单写写面试到的问题吧,范围挺大的,很多都答不上来,不知道还能不能有后续。
数据结构的知识:
1.数组和链表的优缺点,随机访问,方便增删。
2.一个元素和在数组和链表中查找它的时间复杂度...我怎么觉得这个问题没什么意义,我怎么感觉都是O(n)呢。
3.改进为一个有序的数组,那就是二分了嘛,有序的链表?单链表是O(n),双链表呢,好像还是O(n)...
4.怎么在O(1)的时间内查找到某个元素在数组中的位置,我答的需要hash表的辅助,接着问题扩展到hash表上,hash表存在的问题,我只知道一个冲突,冲突的解决方法有哪些?二维数组解决,另外找最近可用的存放...其实也记得清很多解决方案了。
数据结构知识好像就只问了这么多,接下来问了数据库的知识,其实这方面的知识我只保留了会写sql语句了...
1.数据库的索引的数据结构,我大概知道是B+树或者B树,能不能描述下它的结构...这个就虚了。记得不是很清楚了,随便瞎说了一通。
2.数据库中某个字段创建索引,模糊查找的时候能够索引吗,完全不懂呀...
数据库真心忘得差不多了,幸亏你没继续问,第一范式,第二范式,第三范式的定义,我都不记得了。
然后问到了一个设计模式的问题,举例一个设计模式应用场景,
这个问题一时半会没想起来,随口说了一个看到的代码里用到的单例模式,然后就被继续问了单例模式下什么情况会失效。我仅仅只记得如果不加锁会在多线程的时候失效...显然这不是他想要的答案,后来他问我了解不了解分布式下对象共享有没有接触过,我没有接触过这方面的东西,所以给补了他想要的答案了...
网络方面,TCP的三次握手的具体过程,这个我没答上来,回来自己复习了一下。这个经常会被问到,建议熟记于心,TCP释放的四次握手过程也应该熟记于心。又问了一些socket的知识,虽然我了解了一点ACE的东西,但是我知道这方面我不熟,我就说我简单的用过socket。
C++方面,虚函数的具体使用场景,我只记得主要是配合多态使用,继承的时候析构函数声明为虚函数...,还有智能指针的问题,我只记得auto_ptr和boost的smart_ptr的策略不同,一个是保留的,一个是计数的策略。然后就是内存泄露的问题,new和delete不匹配,异常导致泄露,怎么预防内存泄露,RAII,都是简单了解,就随便说了一下,应该答的也不是太好。
然后问了简历上的一些项目的事情,问到linux下查看文本行数的命令,这个真心不记得,我说vim可以查看行数的...然后被鄙视了,说那是可视化的。另外问了一些软性问题,同学怎么评价你的,性格如何。
大约一个月前申请了阿里巴巴2013研发工程师的实习生,申请时发现淘宝账号被盗了,折腾来折腾去最后在保证帐号已经安全的情况下,让它自生自灭了。。半个月前接到hr的电话,参加了第一批笔试,笔试内容涵盖语言基础、操作系统、数据结构、算法等(题目分、分析:http://www.cr173.com/html/20299_1.html),题目不是很难,但是由于缺乏训练和对时间掌握不好,自以为效果不好,结果昨天下午在公交车上接到了面试的通知,对面的阿里gg很是霸气,直接问当时能否接受电话面试,无奈在公交车上,于是推到了今天。(ps,昨天在北京嗨皮,今天早晨赶回上海,完全裸面)。
今天下午大概3点钟接到了电话,由于天气热吧,我觉得面试一开始就不够兴奋,加上面试gg入题较快,感觉不太适应。我第一次电话面试,就这样尴尬的开始了~
1.首先问了我熟练哪种语言,简历上我有写c和python,不过感觉他一直在往c++上引导,可惜我是真不太会。最后他问了一个很简单的问题:让我介绍一下static。
听到这个问题一下有点懵,感觉范围太大了反而有点觉得不知该怎么回答,只答了静态变量和全局数据区分配内存两点,有点措手不及,这题就这么过去了。
2.第二道题目继续往c++上引,这个gg总是会反问我这个你会吧?然后虽然抛出了一些面向对象的基本问题,但是由于我的确不会c++,这些题目就一带而过了。
3.接下来考察数据结构和算法,题目是两个大数据集求交集,这个题目以前看过,但是忘了(囧)(具体可以参考http://blog.csdn.net/v_july_v/article/details/7382693),说了个思路,但是由于细节不完善我觉得答得不好。
4.前面3道题不是特别顺利让我有一点慌,然后他问我会不会平衡二叉树,我说一般,然后他就跳过了(再囧)。
5.接下来是操作系统,这门课基本都忘干净了,不过笔试中操作系统的题目答得还不错让我有点信心,问题是线程间通信和进程间通信,线程间答出了全局变量,消息和事件;进程间答出了管道(我是根据linux命令想出来的,他倒是挺吃惊我搞.net竟然还会linux)
6.操作系统过后是数据库,问我acid是什么,要是问我数据库事务正确执行四个基本要素我想还能答出来,缩写之前确实没听说过或者说一切对英文不sensitive,说了句不知道他就告诉我答案了(狂汗)。
7.此外还考了几道网络题,tcp的三次握手这个太简单了,很容易就过了,然后又问我对网络编程了解过少,我说只用过socket,别的不会。。
8.由于写了研究方向是数据挖掘,问我对分布式的数据挖掘了不了解,然后简单聊了聊分布式就过去了。最后提醒我分布式数据挖掘一定要关注,这是大趋势!
9.最后问我有什么问题,我问了研发工程师做什么,除了写代码有没有真正研发或者带有研究意义(如数据挖掘、建模等)的工作,答案是基本没有,算法工程师负责这部分。
以上问题大概面了25分钟,然后我的第一次电面就这么悲剧的结束了。专业知识上的巨大差距是显而易见的,离毕业还有一年,还有很多东西要补。
还有一些感悟吧,软件工程师真是苦逼,必须三头六臂,样样精通。虽然面试过程中不会问太多时髦的东西,但是基础知识涉及c语言,数据结构,算法,操作系统,计算机网络,里面的知识点要都比较清楚。好久不看这些书了,确实有点吃不消。。不过这不是借口,基础必须打扎实。
最后想说说这次电话面试。面试开始没有任何寒暄,直接进入正题,我甚至都不知道对方叫什么名字(也许这不重要,但是我觉得不太礼貌)。面试的过程仿佛按着一张题目清单进行着,没有提示,没有其他交流,过程感觉很生硬,打一枪换一个地方。
就这样吧,感谢这些面试让我看到自身的差距,我觉得未雨绸缪总比期待着船到桥头自然直强,离正式找工作还有1年,经过这次面试,对未来和方向有了更深入的深入。知易行难,继续努力。
堆排序
B+,B-
怎么判断平衡树
怎么判断一个链中有环
io包与nio包,nio包新增了什么
servlet的理解
项目中费了九牛二虎之力解决的问题
Spring中有哪几个关键技术
join,left join,right join。。。
操作系统的死锁
集合类,什么是线程安全的
加入Hashset中的对象有什么要求
谈谈什么是线程安全问题。
垃圾回收机制的理解,在什么时候回收垃圾,有没有什么规则或算法
常见的运行期异常
编译器异常与运行期异常的区别
谈谈HttpSession
cookie和session的联系
工厂方法模式的类图
自己对哪个方面掌握的比较好。
String,StringBuffer,StringBuilder的区别
servlet的生命周期
对ThreadLocale类的理解
post,get方式的区别
数据库中表的关联关系的理解
索引是怎么提高查询速度的,为什么能够提高查询速度
以上就是一次阿里电话面试的大致内容,希望对那些想去阿里面试的朋友有帮助。
之前说到阿里巴巴推荐我去阿里云,我并没有报什么希望。结果今天很突然,没有任何预兆地就在我准备出去吃晚饭的时候来了电话,说大概要占用半个小时到一个小时的时间。开始就瞎扯了几句,还让我做了自我介绍。
顺着简历,从我的软件设计师证书开始,问了下软件设计是一个怎样的过程(好泛...);接着又扯到设计模式,问我知道哪些设计模式,适配器和工厂模式有什么区别;之后又扯到面向对象,问了面向对象有哪几个特征,并分别就三个特征继续发问:封装有什么好处(我没有完全答到点上);C++中多态是怎样实现的(他刨根究底地问来问去让我招架不住了);关于继承竟然问了一个地址对齐的问题(类A有一个整型的成员变量a,类B继承类A有一个字符型的变量b,问类B的实例在内存中是怎样存储的,半天我才反应过来他要问什么)。总之前面答得不怎么样,我都想快点结束去吃饭。
看到我得过两次ACM的三等奖,就问比赛时做了几道题内容都是什么。然后就出了一道所谓的算法题,大致意思是有很多台计算机在计算一个任务,现在需要随机重启其中的若干台,但是有些计算机不能重启。要写一个函数,输入是一个包含机器名的字符串数组,需要重启的计算机台数,以及不能重启机器名所包含的子串(就是那些机器名包含这个字符串的机器不能重启)。疑惑了半天,等到终于弄明白他想怎样的时候发现好简单。接着他又问如果要测试这个函数要哪些测试用例,要尽可能的列出所有情况。
关于数据结构,问我知道哪些数据结构,线性表和链表各有什么优缺点,各有什么应用。问我有没有用过STL,用过哪些。
又问了些Linux的问题,包括显示当前路径名的命令是什么,自己使用Linux的有效时间(以月为单位来计算)等等
看到简历上说会网络编程,就问了个比较实际的问题,上得了QQ却打不开网页可能是什么问题(我回答说可能是80端口被封)。接着又问了TCP/IP网络有哪几层,分别是什么,刚刚这个问题可能出现在哪一层上面。DNS是什么,这时候他提醒我说DNS配置错误也会出现能登录QQ却打不开网页的情况。
最后问了一道算法题,一个二维矩阵,里面只有0和1,问怎样求指定某一个格与它数字相同的连通格子个数(只考虑上下左右四个方向),我说可以用深搜,他问能不能写出代码,需要多长时间,我说应该很快,他就给我十分钟时间说十分钟之后再来电话让我念代码。这个深搜还是很简单的,所以我很快就搞定,他也表示没问题,于是又讨论了一下其它解法,包括不使用递归的解法。
轮到我问问题,我就了解了一下阿里云的基本情况和下一次面试可能的时间,也顺带表达了一下对杭州的向往。只是直到这个时候我才知道他要招的是测试人员,有点尴尬。
放下电话,差不多两个小时,月亮都升得老高了。总体感觉面试我的是位牛人,C++、各种算法数据结构、操作系统、网络无不精通,加上其公司本身确实是在做技术含量很高的云计算,所以虽然只招测试,但还是值得一去的。
刚刚接到阿里的一个电话面试,提到这个问题,一时间没回答上来。
这里对此问题作下分析:
首先这应该是一个发散性问题,考察面试者的问题分析能力和处理能力。
前提条件:
1:淘宝平台,与支付宝平台必然是解耦的。也就是说在淘宝创建订单过程中不可能是同步调用支付宝创建订单接口(同步调步使用两系统耦合太紧,支付宝创建出错,将导致淘宝订购失败,这无法接受)。
2:虽然是异步调用,但实时性要求很高。(因为大量用户在淘宝订购之后会立即支付)
我的思路:
1:淘宝创建订单时,异步调用支付宝的创建订单接口。(或者使用消息中间件,如kafka)。支付宝收到订购消息,则创建订单(这期间会有一定的延迟)。
2:用户选择支付宝支付时,同步调用支付宝创建订单(应为订单有效性检查,这时就必须要求支付宝订单创建成功了,但此时并不会系统造成很大压力,因为已经有大部分订单已创建成功。这里支付宝只须判断,如果订单未创建成功,则创建订单。)。
这里有一个难题:如何保证支付宝异步创建订单的及时性(用户在淘宝下订,到支付宝订单创建成功的时间),我觉得这个延时最多不能超过2秒钟(此时间是考虑用户在淘宝的操作流程和操作时间间隔)。这里考虑kafka主要是因为其它牛B的性能和消息不易失(消费完还能找回,保存时间长)。
================================================
补充:考虑到淘宝有货物库存的问题,如秒杀系统,必须严格要求先到的请求优先创建订单,后到请求如果库存不够,则不能创建订单。
由于不可能为秒杀系统单独建立一套订单流程。所以要求:必须保证订单的顺序一致性。
这一点kafka无法满足要求,刚查到的资料:淘宝开源的消息中间件:Metamorphosis (MetaQ) 则可以保证顺序性。