4月18号晚,收到了腾讯面试的通知,心里异常的兴奋。在笔试高达6000+的人海中,我还是幸运的被眷顾了,听说笔试刷了将近2/3的人数。于是乎,第二天早上,我6点45分早早起了床,逃掉了星期五早上的四节jsp课程,来到了大学城的中心酒店。本来通知是9点钟叫我到的,可是本人习惯早到,结果早了差不多半小时,在那里摸索了一下环境,拿了面试条,就上去“开战”了。
到了酒店5楼,还是不出所料的,面试官虽然已经醒了,但是由于房间未打扫,所以,我就在门口站了15分钟,等阿姨把面试官的房间清理了一下。(PS:面试真的很有礼貌,在期间,用非常和蔼的语气说了两次叫我稍等一下,相比,我还是自愧不如)大约9点钟,面试官把我叫了进去,然后主动伸出手,示意跟我握手,好吧,我又傻眼了,这种事情不是应该是我主动的吗。。。本人小白,第一次面试,其实我很紧张的,也不知所措,所以我就顺势的跟他握了手,然后叫我请坐,我掏出自己准备已久的简历,于是面试就这么开始了:
首先,面试官叫我自我介绍下:因为之前听宿舍的人说不用自我介绍,所以我也没想过要怎么说,就糊里糊涂说了下:我叫黄景沛,我来至揭阳市惠来县,是潮汕人,我本人比较踏实,喜爱编程,梦想是成为“技术大牛”。(PS:这个自我介绍感觉有点废,那个踏实,是我临时蹦出来的,不过“技术大牛”也真是我的梦想)。
接着我的自我介绍,他就问,那你觉得什么才是“技术大牛”(果然和舍友说得一样),你说到什么,面试官就喜欢问什么。然后我就简单的回答了下,我说,“技术大牛”应该是能帮很多人解决bug,还谦虚,并且能不断的去学习新的技术(其实,我是想说我的一段经历的,因为之前有去听过一个讲座,我觉得那个主讲人,说了几句话,让我记忆很深刻,他说了程序员三境界:1、代码是最重要的,2、代码是挺重要的,3、代码是最不重要的。那我想到达了第三境界可能就离“技术大牛”不远了)
第二题,他问我学过C++吗,我说我们学校是没有给我们专业开C++课程的,但是我之前也有用暑假的时间自学了。然后他就问我,知道STL吗,刚开始有点紧张,没有听进去,后来我说是:STL吗?他说是的,我就说大二数据结构课程设计,我们老师有布置一道题目,就是叫我们运用STL库。
第三题,他就问,那你知道MAP的内部实现机制吗?我头脑发热就摇了摇头,表示不知道。(其实后来出来的时候,想了下,我应该能大致的描述下的,我记得map的实现是一种映射机制,有键值,靠建来拿值)。
第四题,他就说,好吧,我们聊一聊数据结构,然后他问我,知道堆排序吗?我说数据结构有学过,大顶堆和小顶堆。他就问我,他的内部是怎么存储的,我说,其实堆里面的元素是存储在数组中的,每次的删除和插入都要进行重新建堆,然后他就问,怎么建堆的,你在纸上画出来看看,然后我又头脑发热了,在纸上乱涂了下,画不出个所以然,就说,我记得是一种递归的算法,他就问,怎么递归的。。。汗颜,我说我忘记了。(PS:当初学数据结构,应该算学得还不错,但是放置了一年半,很多都忘光了。。。)
然后,接着问,堆排序的时间复杂度是怎样的,我说是O(nlogn),他就说,那还有其他排序是这个时间复杂度的吗?我快速在脑海转了下,就冒出了个希尔排序(我也不知道,为什么我会对这个排序情有独钟,凡是想到排序,我的第一感觉就是它,后来回来,查了数据结构的书,才发现,原来这个排序为不稳定排序,即相同元素会调换位置,并且这个排序的时间复杂度是O(n^3/2))汗,自己弄错了,但是面试官并没有纠正我,只是接着问我,你能说说他的实现原理吗。这个我还是懂的,于是,我就纸上写了个例子,然后大致的描绘了下,大概意思,先将这个序列按照一定的间隔分割为几个子序列分别进行排序,然后缩短间隔,知道间隔为2,然后排序就完成了。(后来,回宿舍翻了下数据结构的书,发现O(nlogn)的排序算法是归并排序、堆排序还有快速排序。。。瞬间有种跪了的感觉= =)
第N题,他问我知道哈希表吗,我说知道,他就问我哈希表的时间复杂度,我说哈希表的时间复杂度取决于他的哈希函数和冲突处理,因为采用哈希函数,如果直接映射,那么就是O(1)的常量时间。然后他就问,哈希表是怎么存储的,(汗,都喜欢问怎么存储的)我说建表,他又强调是怎么存放,存在哪里。。。我有点紧张,就说内存上(。。。其实我想说,也是可以放在数组)然后我还在纸上大概了画了下,一段连续的存储空间,然后通过简单的MOD key来存储,如果冲突,可以采用几种方式,例如简单的线性探测再散列的方式,通过+1+2...等操作来寻找没有存储的位置。然后他看了下,也说什么。就进入了下一个话题。
第N+1题,他问我学过计算机网络吗?我说我们现在正在学这个课程,也教到了第四章,网络层。然后他好像觉得我不够格,就没问我更详细的问题,就接着说你知道HTTP协议吗?我说,我这学期是学了JSP,但是具体的HTTP协议也没有了解,只知道它是无状态的协议。然后他就问,知道HTTP状态码吗?这个,我之前也有所涉及,就说,状态码有2XX、3XX、4XX、5XX。然后说2XX表示成功,3XX忘记了,4XX表示请求无效,如最常见的404 NOT FOUND、5XX为服务错误。后来查了下网站,原来还有1XX消息。。。然后3XX表示重定向,⊙﹏⊙b汗!
第N+2题,他问我,学过计算机网络吗?我说正在学,他就说,知道TCP的三次握手吗,这个以前听过,也上网百度过,大概知道,所以我就说,大概了解,然后在纸上画了个C和S,然后说,C发送一个数据包过去给S端,这是第一次握手,然后S端收到后解析,再发送一个确认信号给C,这是第二次握手,C收到后,再发送一个确认包给S端,形成连接,完成三次握手。。。大概意思应该就是这样,具体各位有兴趣可以百度下。
第N+3题,他问我,知道linux的进程通信是怎样的吗?汗,其实,在面试之前,我是有搜过腾讯面经的,然后也看到了这个问题,但是没有深入的去了解,现在想想,真后悔。。。然后我就说了,我没学过linux,只玩过它的系统,学过一些简单的命令,也只知道linux进程通信,有个叫管道的。(linux进程通信方式有很多,主要是 管道、消息、共享内存等,想具体了解,自己百度或google吧)然后是N+4题,面试官问我学过操作系统吗?我说学过,然后他就说知道读写问题吗,就是现在写优先,你给我描述下,要怎么写优先。然后我就说利用PV操作可以实现,他说,怎么实现的,你写出来看看。⊙﹏⊙b汗,我就凭借我当年的记忆,写了两个进程。如下:
process W() {
p(mutex);
write();
V(w);
V(mutex);
}
process R() {
p(mutex);
p(w);
read();
v(mutex);
}
然后,我就解释了下,读者在读之前,应该先申请w这个信号量,申请到了,才能进行读。。。然后他说,你这样只能一个读者读,如果有多个读者呢,咕~~(╯﹏╰)b,发现也是,然后他叫我再想想,好吧,我确实已经想不出个所以然,其实我们当时操作系统是有讲过的,多个读者,一个写者问题,不过当时教的是读者优先。他看我也蹦不出个东西,就说,那算了。这个问题就放放。
然后下一个问题,你学了C#和JAVA吧,我点头,那你说说这两者的优缺点吧。然后我就说从IDE上来说,我认为vs2010做得比eclipse好很多,很多细节都挺不错的(汗,答非所问),然后从语言的层面,c#和java其实相似度很高,然后我就扯当年微软想收买java,让其只支持windows,但是最后没成功,所以就仿照java开发了c#...(还是答非所问),然后我说可以在c#下嵌入c++代码,所以效率上比java快(呃,有点乱扯,不过在非托管的情况下,c#是可以使用指针的,这个是当时上课听老师讲得,具体怎么非托管,我就不知道了)。其实,当时面试官应该是想让我比较下这两个语言,然后我就扯了一些无关紧要的。。。应该在他心里大打折扣,两个都是虚拟机上运行的,一个在CLR,一个在JVM,但是java可移植性高,而c#就依赖于windows。
最后,他又一次伸出了手,好像说,留言短信,稍后会有通知。然后我又一次尴尬的伸出了手,出来,觉得没戏了。。。整个表现,就是一个长颈鹿和一只有礼貌的狼呆在同一个房间里,然后任其宰割,毫无反手之力。
大概的面试,感觉进行挺快的,出来的时候,看了下表,整个流程好像10分钟不到。问到不会的,摇头示意,面试官也没嘲笑我,只是就换下一个问题。
最后,也就如我所料,被刷啦~。不过我的处女面试献了腾讯,哈!以后有机会再见啦。(其实走的时候,很想问他我的笔试成绩是多少分来的,本人其实就是想去看看自己的水平到哪里去了,也没抱多大的希望,不过单从面试来说,我这水平,还真是渣到不行啦)
海哥说得很有道理,是该总结下的。其实本次的面试,是可以得到很多启发的,首先,面试的时候,我确实是紧张了,头脑转得不行,面试官可能也觉得我的表达能力不太行,其次,基础真的是很重要的。来的时候,我是看了一下数据结构和之前做过的那些项目,因为听华工的校友说,面试官会问一些你项目上的内容,并且会深入,所以我侧重点放在了项目上,不过最终结果是面试官关于我项目的一个字都没提到,数据结构问得是最多的。所以数据结构和C++真的很重要,基础不扎实啊。。。所以下次,去那些大公司的面试,这两点,我觉得应该放在首位。我觉得海哥说的,加上个人理解,应该是很多方面都要有所涉猎,但是要有一门精通,可以拿出来见人,并且深入交谈,而我觉得我是太杂了,杂而不精。。。
whatever,“技术大牛”仍然是我的梦想,我会坚持下去的,一步一脚印。