阿里巴巴的2014实习生面试刚刚结束。饱食终日无所用心,抱着试试看的态度,去游荡了一圈,把经历分享在这里,难免言不及义看官见谅。我面试C++后台开发、前端开发。在这里总结一下经验教训。

我报名了研发工程师实习,报名要填的内容好多,填了很久,阿里给了我在线笔试的机会。

笔试题目大多是数学逻辑基础和数据结构的题目,不太偏重计算机基础概念。成功通过。因为误报了北京面试,通知我去中科院blablabla(报名网站右bug,在选择面试城市之后就不能改了,什么都能改,就是面试城市不能改)。后来经过沟通,让我去广州大学城面试。

然后就赶到广州的大学城。这里邻近黄埔军校旧址,大学城被河水围绕,也是个好去处。很快就叫我进去了,里面有十几个小桌子,面试官和应聘者成对交谈。

首先,当然是自我介绍,然后稍微问了一下简历上的项目。面试官很nice,循序渐进。然后问了一些操作系统的问题,诸如线程和进程有什么区别(面试必问!),这部分没有很深入。 然后主要进入C++部分。

  1. 写一个自动锁,当时我不知道什么是自动锁,他便给我写了一个示例,大致就是利用对象的构造析构行为自动管理资源锁。 然后我在构造函数里写了lock(sth),析构函数里写unlock(sth)。后来才知道他希望我回答与操作系统交互的那部分,我说操作系统提供的锁的系统调用无非两种情况,一是直接返回truefalse,我们进行忙等待;二是在该调用处阻塞该进程,直到获得了锁。至此面试官说OK。

  2. 构造函数里调用虚函数会出什么问题。我说编译错,回答错了。不会有任何问题,只是此时的虚函数表指针指向的永远是当前类型。Effective C++ 中指出不要这样做以免引起困惑。

  3. 单链表反向,给定 head 指针,写出 C++ 函数。我一直以为这件事极其容易没有认真看过,没完全写出来。面试官很nice地让我描述给他怎么做,居然瞬间想出来了。维护两个链表head,一个指向已反向的链表头,一个指向仍未反向的链表头。遍历一次就好了。

  4. 找出链表的中间节点。使用两个指针,一次循环中A走两步,B走一步,A到头时,B即是中间节点。其实让一个指针遍历两次其时间复杂度是一样的,只不过代码冗余。面试官不关心这个~

  5. 快速删除链表中某节点,有指针。用其next节点覆盖该节点内容,然后把后面链表接上。

  6. STL相关的知识。STL 容器的参数 allocate 是用来做什么的?这是一个函数对象,用来指定小于运算过程。Map 的 Key 有什么要求?开始我答不能重复,他继续问,答必须重载 < 运算符,OK。

  7. 智能指针是怎么实现的,你来实现一个智能指针。在构造函数里进行指针赋值,析构里 delete。其实还有很多的,比如实现 get方法,拷贝构造函数、赋值运算符行为。

  8. static_castconst_castdynamic_cast区别,没有问reinterpret_cast。第一个是强制隐式转换,是比较安全的;第二个是去常量性的;第三个是安全向下转型(safe downcasting);最后一个是低级转换。当时没这么清楚。。

  9. 你用过哪些C++库?gsl。面试官表示没听过。Boost,貌似他们整天在用。

然后让我出去等,接着二面。面试官有点忙,经常打电话进来。看了我的项目经历,问了很多。然后告诉我去面前端怎么样,我说好啊(注意,这是一个错误)!于是继续面前端一面。 我做过很多web开发,js开发,但对于前端我没有系统的学习。结果很糟糕。我就把这几个问题罗列一下:

  1. 你认为一个好的前端开发者应具备哪些素质?

  2. 你对HTML5和CSS3了解多少?他会继续问的。

  3. 实现一个三栏布局,两端固定宽度,中间自适应。

  4. JavaScript优化可以怎么做?

  5. 怎么处理跨域请求限制。

  6. 最后,你有要问我的问题吗?

我问了我应如何学习前端。面试官很严肃,是个值得尊敬的技术男。告诉我要多读最新的前端博客和文章,多了解新技术。然后,基础的书籍要学习,面试中问的基本都可以回答。

最后总结一下感受,首先要知道自己想干什么;简历一定要对口;自我介绍是需要准备的;不到最后一刻不要懈怠。

OK~ 结束了。预祝后来的同行们成功。祝君好运!

本文采用 知识共享署名 4.0 国际许可协议(CC-BY 4.0)进行许可,转载注明来源即可: https://harttle.land/2014/05/05/ali-intern2014.html。如有疏漏、谬误、侵权请通过评论或 邮件 指出。