不得不说阿里巴巴的工程师有多厉害,问的问题也是谆谆善诱。
一面:进入正题, 3月29号晚上,一面面试官准时打来了电话,他先说自己是金蚁客服的,然后和一般的套路一样,“先做个自我介绍吧”。我说了下自己的大学、专业、从高中开始学习编程的经历,还有将来的规划,没什么特别的。然后面试官直接开始问基础知识了,包括C++和Java的优劣(你为什么选择C++)、重写与重载的区别、STL包括什么、STL容器和迭代器(当时根本还没用过STL,一脸懵逼)、TCP/IP协议族、TCP和UDP的区别、TCP的拥塞控制、多线程、临界资源的互斥访问、设计模式(我就说了个单例模式的设计方案)、进程与线程、系统调用是怎么实现的(只知道怎么添加,并不知道它的工作原理啊, /摊手)。。。大概就是这些。最后问我能不能用英文介绍一下自己,说了两句就不行了,面试官说:“没事, 我就这些问题了, 你还有什么要问我的吗?”我问了一下阿里在人工智能这方面的发展打算。一面就结束了, 总长30多分钟。
总结一下, 一面主要就是问计算机专业的基础知识,从操作系统到网络、从高级语言到底层实现都有。发现要学的东西还有太多太多,多线程方面的知识还一概不知,操作系统、内核、硬件之间的关系也还没学好。没别的办法, 继续学吧!
二面: 本来已经不抱希望了,没想到在4月1号打来了电话问我有没有时间进行二面,我说今天就可以,然后约在了下午4点。四点过十分,二面面试官打来电话,是阿里云部门的(高大上了许多, 看来是部门缺人)。还是照常,先来一段自我介绍,二面一般偏向项目,于是说了一点自己的项目。然后面试官问RBAC那个项目是什么, 我说是访问控制里的概念(基于角色的访问控制),当时从0开始学习Qt,三天之内开发出了可以使用的GUI客户端;面试官说这些基本上都是Qt帮忙做好了的库,直接用就行,没怎么涉及到C++的底层(的确是这样!)。
接着面试官问我为什么选择C++而不是JAVA,在我说到“内存泄漏”这方面的时候,他继续追问:“你有没有在什么项目的过程中遇到内存泄漏, 然后你是如何解决的?”(插入一句, 博主并不是研究生, 而只是一名大三本科生, 所谓项目就是课程设计而已!)我说, 先是发现有的变量变得很大, 和预期完全部分, 然后开始单步调试排错, 但是在某一步赋值发现了不可能的错误, 于是去stackoverflow网站上寻找解答, 最后发现其实就是栈溢出造成的(申请了一个100000*100000的数组, 能不溢出吗 /大哭大笑)。他说:“你有没有试过其他测试方法?”,我说自己知道Linux下面有bash来自己编写测试脚本,不过还没尝试过(/尴尬)。
最关键的部分来了,面试官问我:“你觉得vector和map容器有什么特别好的地方?或者有什么不足之处?”听到这个问题,瞬间懵逼,人家资深程序员团队花了4年搞出来的东西,我才刚看了2天的源码,如何感受得到!我理了下思路回答:“vector相当于一个链表,它的最神奇的地方在于迭代器, 类似指针但是又完全不像指针……”,“而map,实际上就是反过来的vector,把索引当做下标,而数字作为值,它的底层是红黑树实现的……”然后又问我红黑树是怎么构造的、vector的push_back()在内存里的详细操作过程,好在我还算看过一点源码、数据结构也特意学过红黑树,勉强回答出来了。
迅速进入下一个难点,“说说系统调用是怎么实现的吧?为什么要有系统调用这个东西?”我就知道会问这个!不过忘记去查阅资料了,于是这么说了:“不好意思这个不太知道,不过我想系统调用既然是在内核里的,就是用来直接管理硬件的,使得程序员可以直接管理硬件,同时也可以让不懂硬件的shell层次使用者避免直接管理硬件,防止计算机故障。”他说这也算是个原因。(这回我一定要去看,不能忘了!!!/大哭大笑)
还没完,“那么来考你一个问题,你知道timer()吧,如果你要实现timer()该怎么实现?如果一个窗口有多个线程需要在不同时间点执行,该怎么解决?说说数据结构和详细的操作过程。”拍了拍脑袋,还好以前用Qt的时候用过QTimer,知道这是个啥玩意。我详细回答了用链表的数据结构并且让生产者插入排序的方案(这是在面试官谆谆善诱之后挤出来的方案,没直接pass掉真是太感谢了Orz),回答的不是很好。面试官说:“实际上一般来说让消费者维护链表才是合理的做法, 而且你这个数据结构还可以优化一下, 回去之后也要看看多线程方面的书籍。”我心想,必须看啊!不看玩球球!!问问题的时候还插入了信号灯、临界资源的互斥访问之类的操作系统基础知识,都答上来了。
主要就是这些问题了,以后想起来了再添上来。二面一共进行了接近50分钟,后面半段完全是顶着巨大的压力说话的,对于博主来说真是太难啦!
二面给人的压力是非常大的,面试官会问一些实际问题该怎么解决,在C++这个方面自然就是问底层实现和操作系统的基本原理了。不管怎么说,只看了2天STL就能答成这样,自己已经很满意了,能不能过就看阿里那边缺不缺人吧 (/大哭大笑 ) ! 反正不报太大希望。要学的东西真的很多,操作系统和硬件是C++离不开的东西,必须再好好细读,还有人家贝尔实验室研究出来的STL源码也必须仔细阅读,多线程什么的赶紧学吧!(╯‵□′)╯︵┻━┻希望对后面几家的笔试能准备的不错,加油吧!