(以下内容,如有疏误,敬请指正。谢谢!如果有什么问题,也可以相互交流。)
先讲一下结果:腾讯和百度都给了offer。
最后签了腾讯的offer。2015届毕业季求职生涯就此告一段落~(2014.9.29)
想着之前在应届生、itmian4等网站看过不少师兄师姐的笔经、面经。现在,也是回馈的时候了。
在这里,我不会介绍解题的具体方法、思路(这不是我的强项)。并且鉴于本人所学知识的特点,下面所讲的可能会偏向于C++和Linux。
个人觉得我的经历对现在还是大二大三的学生来说,还是比较好复制的。
在这里,我主要想介绍的有:
1.笔试面试的基本情况(不是为了给大家提供面试的题目(网上从来不缺题目),而是让大家知道,笔试面试考的主要都是基础的东西,笔试面试并不难!!)。
2.简单说说如何准备笔试面试。
一、笔试面试的基本情况。
这个秋招,我只面了bat三个公司。
8.25 阿里巴巴网上笔试
阿里巴巴今年的笔试我觉得有点不靠谱。。。不多说了。印象中有很多概率论的题目。
9.16下午 阿里巴巴一面挂了
总共问了我三个问题:
1.一个只有一个数字的字符串。用尽可能多的方法将其转化成对于的数字。
2.写一个vector。实现resize\opertor[]\clear。
3.快速生成4亿个随机数。
整个过程感觉面试官很冷漠~连我的简历都不看。简单地挂了,不多说。 说实话,当时阿里巴巴的面试结果对我打击很大。。。毕竟,一面就挂了…… 我差点对后面的笔试面试失去信心。
9.20上午 腾讯笔试
腾讯笔试的特点:25个不定项选择题。难度不高,但是范围很广:涉及编程语言、数据结构、操作系统、设计模式、数据库、计算机网络、概率论~还涉及一些对新技术的了解。
9.20下午 百度笔试
百度笔试的特点:没有选择题。一般分为:简答题、编程题、系统设计题。都比较常见和基础~有认真准备过的同学基本都没问题。
基本上每次笔试的具体题目可以上itmian4查找。大家自己动手~
9.21上午 百度一面(技术面试)
一面的问题都是很基础的:
1.class和struct的区别。
2.写个max的宏(这个我跟面试官说我写不了)。
3.计算两个链表的交集、并集。
4.链表的排序——用什么排序算法?
5.如何找到一个链表的中点,写代码
6.如何求一个整数的二进制1的个数——编程之美的题目。
……(后面还有一点,记不是很清了。)
百度一面的问题都非常非常基础。感觉不错。当时看得出面试官很满意。
9.23下午两点百度二面(技术面试)
9.23下午三点腾讯一面(技术面试)
两次面试的时间有点小冲突。当天中午十二点就出发了,先去腾讯的面试地点踩下点,再去百度面试。
百度二面的问题偏算法,但是不会很难。
一上来,面试官拿了个pad叫我先把上面三道题做一做。我扫描了一遍,都是比较基础的编程题。
当我做完第一题的时候,面试官就叫我开始面试了(当时真不是我写得太慢~)。
我只记得前两题:
字符串以单词为单位进行逆转。
合并两个已排序的链表。
聊了一下项目。(我的都是自己写的渣渣项目,没什么好说,可以看出面试官也没多大兴趣,问了一下,便没再问了。)
问我觉得笔试怎么样?然后和我讨论最后一题(tinyurl)。这道题讨论了很久。
又问了我两个题目:
用1*2的瓷砖铺3*N的地板有几种方法。
求二叉树两个节点的最低公共祖先。
二面结束,感觉不是很好。。主要是因为我刷题太少了。整个过程,面试官老是嫌弃我是本科生,似乎是故意的。。哈哈
百度二面完成已经三点多了。。到了腾讯那边,迟到了将近一个钟。。不过,腾讯还是很快给我安排面试了~
腾讯一面的面试官给我的感觉很好,问的问题都是基础的
1.自我介绍
2.给我几道题,叫我做一做。都是C++的题,涉及指针、数组。
3.写一个网络编程客户端与服务端的伪代码。
4.write或者read返回-1怎么办?
5.返回0代表什么?
6.对socket可写的理解?
7.设计文件传输协议。两种情况:传输图片,每张大小约50KB。传输热门(top10)的电影(很大,GB级别的)。
8.设计管理定时器的数据结构(堆)。
因为之前在百度那边已经被“折腾”了一个多小时,在腾讯这边的时候,我感觉有点打不起精神。结果,腾讯一面的时间不是很长,只有半个小时左右,中间有一些简单的问题我答得实在不好。还好晚上十点多,收到腾讯的二面通知。
9.24下午腾讯二面(技术面试)
我也不知道结果会如何。
2014年4月份的时候,我参加了腾讯的实习生招聘,很意外,第一次参加招聘竟然一路从笔试,到一面,二面,hr面。更意外的是,最后还是被刷了。
这次,感觉笔试,一面的成绩应该都不是很好。运气好进了二面,也不知道接下来会怎么样。——做最好的期望,做最坏的打算吧。
我在门口等面试的时候,面试官忽然走出来——问我是不是参加他的面试的。然后让我在外面先做一道题——设计一个内存池(其实和笔试的附加题差不多)
我在外面简单写了写。
进去之后,面试官,简单看了看代码。叫我谈谈思路。然后就在这道题目上增加条件,让我改进。不知怎么聊的,聊到内核的内存管理里面去了(不过都是很浅的知识)。然后,面试官说,好吧,这道题先这样。
设计一个cache要考虑什么问题?如何解决?
用UDP实现文件传输要注意哪些问题?(主要是超时重传和乱序)
求最长回文子串——动态规划常见题目,可是我竟然不会。给了非最优的解法。
还有一些问题,记得不是很清了。。。
二面的最后,面试官说:咱们来聊点非技术的东西好吗?
1.你觉得你最大的优势是什么?最大的劣势是什么?
2.你有没有遇到过什么难以相处的人?
3.你喜欢和什么人一起工作?
4.你对考研和工作的选择?喜欢工程技术还是科研?
然后,面试官问我有什么问题。开始向我说腾讯内部怎么样、怎么样。。。地好!!
最后,面试官说:“接下来,我还要安排你走一次hr资格面。你到5楼……”
9.24下午腾讯三面(hr面试)
好吧,等了老半天。见到hr了 —— 是个人看起来不错的大叔。
hr没问我什么问题。
一上来,简单看了一个我的简历。
问我知不知道我现在要去的部门具体是干嘛的?我说,不是很清楚。然后他就简单地跟我讲了讲。
然后,问我的职业规划。
然后,随便聊了聊。
最后,他跟我说,你的面试现在是比较早的。xxxxxxxxxx。。
腾讯二面+三面,感觉不错。但是,作为一个曾经被“吓破胆”的人,还是不敢有百分之一百的把握(我是不是有点不自信啊??)。
面完腾讯,回到宿舍。放下书包,手机就响了,百度通知三面。
9.25下午百度三面(综合面试)
百度三面不像腾讯是hr面,而是一次综合的面试——技术和非技术问题穿插进行。
百度三面,我真的很紧张。因为,我是到了最后才知道三面也是有技术问题的……面试官是个看起来很高级的人,应该很牛逼。
技术和非技术问题穿插得很乱,我下面只能回忆一部分,不一定是按顺序的:
主要的技术问题。
1.read和write、fread和fwrite的区别。什么情况下,哪个效率高?
2.写个vector,实现构造函数、push_back、pop_back,operator=。
3.STL中的容器。
4.一个概率题:足球比赛的时候,裁判会扔硬币,决定双方队伍的球门。有一次,裁判掏出一个硬币,结果发现硬币变弯了(即出现正反面的概率不一样了)。请你设计一种方案,让这个硬币可以继续使用。
主要的非技术问题:
1.对工作地点的选择。为什么?
2.有没有人对你有什么影响?具体?(根据这个问题展开了不少其他问题,都是和具体的回答相关的,不多说)。
3.除了技术,你平时做什么?
4.做技术,你不觉得无聊吗?
二、笔试面试小结
先总结一下上面这几次笔试面试:
虽然上面的面试过程我只能回忆个大概(那几天面试太多了),但是很明显可以看出70%~80%的题目、问题都是基础知识,所以基础很重要。可以说,只要你的基础够硬,offer就离你不远了。
剩下的20%~30%要看:
1)你的状态和发挥。笔试面试和我们平时在学校里的考试一样,不仅要看你会不会,还要看你发挥得好不好。
2)你和面试官的缘分了。说到底,和面试官的缘分,就是运气。这也是整个求职的唯一你不可控的因素。但是,只要你的技术够硬,心理素质够好,这个似乎也不用担心。
下面讲讲基础知识的学习。
笔试面试的基础知识主要分成一下几个方面:
1)编程语言。
选一门自己喜欢的编程语言。不过按照目前的情况,你只有两个选择:C++ or Java。
2)算法与数据结构。
这个不用我多说。算法与数据结构是一种修养,可能你在实际工作中不会直接用到,但是它就是会影响你的代码。
3)操作系统。
我想把操作系统的知识分成两大部分:基本原理和特定平台(如Linux、Android、Windows、IOS等,我做的是后台,所以学的是Linux)。
4)计算机网络。
主要是TCP/IP协议。互联网行业主要考的是传输层(TCP和UDP)和应用层(常见应用层协议协议,HTTP最常见)。IP基本没考,至少没考深入一点的。
5)数据库。
数据库一般考得比较简单。一些基础概念、范式、SQL。
6)概率论、排列组合。
我没有专门准备过这方面的知识,只是在网上刷几个题,熟悉熟悉而已。
下面针对上面几点,讲些具体的(主要是根据我个人的经历)。
先上两张图。
这些是我大学期间买的书(小部分是从学校图书馆借的)。当然里面有的还没怎么看过的,有的看过一部分但是看不懂,有的看了一遍,有的已经看了两遍甚至三遍。此外还有部分书已经还给图书馆(看完或者没看完)。
大一大二浪费了两年,我是从大二的暑假才开始决定要找互联网行业的工作的(之前一直在数电模电方面的东西)。不过幸运的是,我很快就知道自己想做服务端的开发。
大二的暑假
在此之前,我只学过C语言和数据结构。
整个暑假看了几本书:
《Unix环境高级编程》——这是我学Linux编程的第一本书,那个暑假把上面的代码敲并运行了一遍。后来又陆陆续续再次看了一些重要的章节。再后来,遇到不懂就到上面查。不过现在觉得看man page更好。当然入门还是得看这本书。
《程序设计实践》—— 这一个老师给我推荐的,很不错。上面的C、C++的例子我都在电脑上敲过。
《Linux内核设计的艺术》—— 讲Linux0.11的源代码。但是我还根据这本书注释了Linux0.11的内核。可惜后来电脑出了问题,代码不见了。
还看了一本操作系统原理的入门书,书名似乎叫《计算机心智——操作系统之哲学原理》,讲得很通俗易懂(不过现在觉得《现代操作系统》更好)。
大三第一学期
也看了几本书:
《Unix网络编程 卷1》—— 这本书主要讲的是套接字(socket)编程,敲了大部分例子。唯一的缺点就是,书上的例子实在是太无聊了……
《Unix网络编程 卷2》—— 主要讲的是进程间通信(IPC)和同步。这本书我只挑了部分学习而已。
开始看《深入理解Linux内核》,不过基本看不懂。。。。
当时,我也开始纠结我是否应该学习C++,当时我还只学过C而已。
后来,我买来了《C++ Primer》第四版的开始学习(其实当时第五版已经出了。。。不过第四版当时打折便宜几十块……)。C++入门的时候有点痛苦,所以我也是断断续续的学。
寒假的时候,找个和简单的web服务器的源代码,看和注释了一遍。顺便看了《浪潮之巅》,哈哈。
大三第二学期
C++学了一段时间,似乎没什么进展。主要是因为我总觉得现在没必要学习C++。反正C对当时的我来说已经够用了……
这个学习我开始看《TCP/IP协议详解 卷一》。《深入理解Linux内核》看不懂,所以我换了本《Linux内核设计与实现》,这本讲得简单一点。看点计算机原理的书——看了《深入理解计算机系统》。
四月份的时候,参加了腾讯的实习招聘。因为基础还不是很扎实,整个笔试面试的过程确实让我认识到了自己的短板,也渐渐明白了笔试面试是怎么一回事。
后来面试了几家公司,都不顺利。我开始反思自己,暑假,是随便找个实习,还是安心在学校打基础呢?我的决定是,在学校学好基础,再好好准备秋招。当时我也不知道自己的决定对不对。
在大三剩下的时间里,我把《TCP/IP协议详解 卷一》看完了,也把《Linux内核设计与实现》看完了。因为经历过腾讯的实习招聘,知道他们很重视C++基础,也就有了学习C++的动力了,把《C++ Primer》扫了一遍又一遍。并且简单看了一下《Effective C++》、《深度探索C++对象模型》。
后来在Linux用C++写了个简单的FTP服务器,算是对C++和网络编程的总结了。
在这学期中间我自己还写过一个很简单的操作系统的demo(现在看起来觉得很简单,当初写的时候觉得挺难得),可以在虚拟机上面运行。
后来又买了一本书,陈硕大牛的著作《Linux多线程服务端编程:使用muduo C++网络库》。
大三的暑假
暑假回家一个星期,然后都待在学校看书、敲代码。主要做了以下这些事:
1、操作系统原理和Linux
《深入理解Linux内核》、《Linux内核设计与实现》和《现代操作系统》穿插着看。
2、Linux编程
再次看了《Unix环境高级编程》的重要章节。
看了《Linux多线程服务端编程:基于muduo网络库》,这本书可以学到很多东西,特别是作者提到的很多参考文献(我很多还没看)。
3、C++
《C++Primer》后面类、面向对象、模板部分再看了一两遍,敲了几个大一点的例子。
《Effective C++》《More Effective C++》《Effective STL》简单看了一遍。
4、算法与数据结构
《数据结构与算法分析:C语言描述》。
5、刷题
遗憾的是,我刷的题目并不多。
leetcode只刷了四五十道。
《剑指offer》和《编程之美》只简单看了一半,很多都是理解了思路,没敲代码。
大四前两个星期
刷题 —— 去网上找整套的笔试题,最好是你想去的公司的往年试题。
看书 —— 这个时候,缺什么就补什么了,比较零碎。
总结一下
暑假两个月做的事看起来比较夸张,主要是因为里面很多书之前都看过了,所以看起来比较快。有一些也是从大三第二学期期末开始看的。当然从大二暑假到现在,中间我还看了不少其他的书、博客,但是那不是主线,也很难一一列举出来。
十年磨一剑。大学也就只有四年。就算毕业了,路还很长。大家加油!!!
上面提到的很多书都可以再网上找到扫描版的(虽然有点侵犯知识产权,但是作为没有经济收入的学生党,就自己看着办吧!)。后面有时间我再陆续整理一些资料出来……
转载至:2015届求职经历
作者:_LJH_