校招回忆录
按照我找工作的顺序来讲吧,找工作是一件非常辛苦的事情,除了少数的大牛外,没有谁可以毫不费力的找到工作,这期间在精神上以及身体上的摧残都是巨大的。我尽量回忆,希望可以给后面的人一些简单的启发。
华为
一面:华为我走的是提前批,一面面试官很和蔼,问的比较广泛,但是主要是自己简历上的,问了我的数模,项目,专利,实验室的工作情况。感觉因为是IT产品线的提前批,并且面向的是我们这边的几个实验室,所以相对还是很宽松的,整个过程比较融洽。
二面:华为二面,面试官应该是个总监或者项目经理吧,他问到了一个问题,你是做分布式文件系统,你了解hadoop吗?然后讲项目的时候,又问,现在好像都是元数据和数据放在一起了,为什么你们做这个还要把元数据和数据分离,然后我就给他讲了,元数据和数据合久必分,分久必合的前世今生。并且对于不同的应用场合,不同的方式都可以表现出更高的性能,应用场合不一样。最后提到工作地点,我直接就说,我只考虑深圳,其他地方不考虑,他说没问题。然后都是扯淡。
HR面:这个蛮奇怪,很多人都没有,当时吓了我一跳,坐下之后他才说,不用担心,你的offer没有问题,我就是像你了解一下情况,然后就是各种标记大牛,标记某些导师的研究方向以及麾下的学生情况。
总结:华为提前批是IT产品线,是一个华为着力发力的部门。并且非常用心,标记到我们实验室的每一个人,然后告诉我,去年有几个大神没有到他们那去,因为工资是固定的,所以只能给安家费3-10W不等,今年他们政策调整,薪水调整为13K-17K,变成13-17K*15。并且上不封顶,就是为了把各大神们收到麾下。个人觉得,时候一个很好的去处,设想,去小公司钱多但是没有安全感,去大公司有安全感但是钱少,现在有个部门,可以给你创业公司的钱同时给你大公司的安全感;已收到口头offer目前正在等HR过来谈工资。
腾讯
一面:
感觉自己的一面是压力面,首先让我讲项目,但是中间打断了10次都不止,毕竟是行家,面腾讯开始感受到巨大的压力感。面试官直接戳,你做的东西这里有问题,这里也有问题,很多点,项目的鄙视的很厉害。但是实际上,他并不是说因为你做的东西渣,就会拒掉你,他提到的地方,你要给出合理的解释。比如,你证书为什么缓存在本地?答:因为,首先我要快速的去读取他,其次,虽然行话有密匙不落地的说法,但是实际上你本地一定会有,即使再加密一次,密匙还是需要存起来,他不像windows下有专用的证书管理区域,linux没有,我又不能自己实现一个,最后,我当时考虑过再设置一个密钥管理管理中心,但是这样会增加了额外的延迟,我们构建的是一个高速的云存储平台,所以,认证方式都采用了尽量精简的模式,意在得到更高的聚合带宽,所以,后来就打消了这种做法。项目聊了很多,很深,感觉就是,不是自己的东西尽量不要写,如果写了,一定要搞的很清楚,从原理上搞清楚。。。然后问完项目,他说,看的出来,你还是确实做了很多东西的。bingo! 面试时间:大概50分钟
然后问了我几个常规的问题
1.linux下如何查看内存使用情况。答案是free,我回答的是top,使用top可以看到内存,cpu的使用情况,内存的话,按m就可以切换。
2.100亿个浮点数,求最大的10000个,内存只有几百兆。经典topk问题,直接hash+堆。
3.epoll的ET模式和LT模式的区别,也是经典问题,复用I/O都会用到的东西。 我回答的时候是结合自己的项目来作答的,答案不一,网上一大把。
4.select的跟epoll比,有什么优势或者缺点。我的回答是,select除了好用,不容易出错,就相当于epoll的LT模式外,没有其他优点了。关于select以及epoll的最大支持的描述符数,我说的是,可以直接查看 /proc/sys/fs/file-nr 可以看到第一个数据就是机器支持的select数目我的是2500多,第三个就是支持的最大epoll数目,基本上1G==10W个。
4.网络编程这块,能不能简单讲一下你的了解。我直接说,估计你面了好多,很多都写的是socket通信,我就讲一些其他的吧,我给你讲一下netlink通信,netlink可以再本机,路由,以及用户态和核态之间通信,我讲一下用户态和核态之间的通信,下面就是bulabula一大堆,然后我引申到内核部分,告诉他,在netlink.c里面的定义,他问我,你还直接看了内核啊。我说是啊,我喜欢直接读源码得到解决方法,晚上很多东西都很乱,版本什么都可能会出现问题,唯一不出问题的就是查看本机的接口,直接读源码。。。我觉得,这个答案,他很满意。
基本上面试到这就算完了,意外的是,面完之后,他直接跟我说,明天或者今天下午,我会安排你给我们总监面。。。真是意外惊喜。。。big surprise。
一面面试官是个非常温暖的人。后面我会说。
二面:时间大概60分钟,大部分时间都在扯犊子。
二面面试官也是,很犀利,我讲项目的时候,同时指出来我的几个问题,然后问我有没有考虑过如何修改。我一边答应着说,这地方确实有问题,刚开始不清楚怎么下手,都是边学边做,学的话都是从最基础最简单的开始做,这里确实每次用户认证都单开一个进程,频繁的分配和释放内存,浪费很大,对于不使用slab/slob/slub管理的机器来说,会导致内存极大浪费,可以写一个守护进程,然后当有请求过来的时候,再开一个线程去处理。然后他接着说,最好是直接维护一个线程池。我表示认同。我觉得可能是一面面试官对我评价比较高,聊完项目,基本上没有问什么问题。都是在聊我以后的工作方向,以及整个部门的大致方向。然后聊到数据挖掘,说每天他们要处理鹅肠产生的200T-300T的数据。乱七八糟一大堆。
一面之后等了一天,还没有消息,我很急,当时一面面试官给我留了电话和QQ,我就给他发qq,他说没问题的,然后说,咱们部门今天上午才转给hr,刚才他在跟总监一起筛选,说你的简历已经被转过去了。然后告诉我,HR面一般问题不大,现在看来你的offer应该没问题。。。。真是温暖啊,大哥哥!点个赞。
HR面:
跨BU的,他是TEG的HR,这个HR竟然让我讲技术,并且,他懂得技术还蛮多,最后他说他们是搞整个存储的,拥有腾讯三分之一的服务器,20w台,聚合带宽达到10TB/s我表示非常你们真是牛逼,,,然后问他,SAN内部是不是都用光模块通信的,然后他说他不知道,他是搞HR的,我去,戳中了。。。然后我接着说,我觉得你懂好多,以为你之前是搞技术的呢,懂得好多,其他公司的hr基本上都不懂技术,你能知道这么多,说明跟搞技术的关系走的都很近,那你们部门的同事们关系肯定非常融洽。然后他数,毕竟做了十几年的HR了嘛,还是聊了一些。整个过程很快,20分钟。
总结:腾讯是个很好的公司,很喜欢,文化氛围非常好,希望自己可以拿到offer,老天保佑。
百度:
百度14号开始在武汉面试,我是16号才收到通知17号去面试,基本上每天一面的速度。(排的靠后是因为笔试成绩低,,,61分,你懂得)
一面:60分钟
一面我在531,面试官看起来跟我差不多大,不修边幅,一看就是技术大牛,整个过程很严肃,没有笑过。
首先是自我介绍,没有问项目,然后就开始考知识点。我尽量回忆。
1.手写代码;问题描述:有一个文本文件,里面记录了用户的登入登出时间,注意,时间可能有重叠。比如用户A在10:30登入,然后11点登出,然后又在10:40登入,在1:00登出,就是因为网络的原因,可能有重叠,需要去掉重叠部分。最后,让你求某一个用户的总的在线时间。我首先问了,时间是标准时间,还是time_value类型的,他说,有什么区别吗?我说也没有大的区别,就是我想先排个序,所以具体的比较函数需要用到,他说就去无符号长整形。然后我就写了代码,在一个函数里面处理了,给他讲了思路。。。然后被他一顿鄙视啊,说你这明明可以分成两部分,一部分对重叠处理,一部分对普通情况处理。还有,你写了这么多判断语句,看起来很乱(听说了百度的面试官对代码质量要求高,所以写了很多保证健壮性的判断)。。。。(⊙﹏⊙)b
2.线程和进程的区别。我是结合自己的理解说的。
3.linux内核同步通信机制。我说我自己常用的就是俩,mmap,spin_lock,rw_lock_bh,然后第一个是做一个内存映射,第二个自旋锁,第三个是读写锁并且禁止掉软中断。然后他问了我mmap的具体使用,我讲了。malloc的实际上就是mmap映射到一段匿名的存储区(对于大于128KB),小于128kb的直接brk()系统调用。。。。然后扯淡了很多,这个问题复习过,所以胸有成竹啊,各种扯。
4.还俩问题,忘记了。
二面:70分钟
二面给我的印象非常深刻,非常和蔼,一直在笑,很随和,最重要的,他像一个导师一样,一直在指点我,挖掘我。705房间。
问题非常多,从很多方面全面的问,怪不得说百度的二面是最难过的的。。。。太全了问的。
1.语言基础问题,我说了我C++不太懂,还是让读了两段代码。第一段大致是.在一个类里面定义了一个指向该类的指针类型,然后再析构函数中释放掉该指针指向的内存,问会不会有问题。。。。我考虑了很久,不知道啊,然后我说,可能会出问题,如果这个地址指向了一个对象,但是你调用自己的析构函数,把人家释放了,会调用人家的析构函数,这样会出现问题(胡扯的),然后他说,假设他对指向的类有完全的拥有权。然后他给我提示,你想一下有没有特殊的情况,比如重载赋值运算符的时候,你第一步考虑什么?我一下明白了,自身问题,就是该指针可能指向的是自己。
2.还是语言问题,内容忘记了,大致意思是一个类,他传递的 fun(C * ptr),就是,然后问这样使用会不会有问题,然后我直接说,我一般不这样用,我都是直接传引用,objective C++上建议能用引用的地方用引用,这样就节省了很多复制的开销,他点头表示默认。然后让我直接分析,这样做是否可行。我想了一会看,告诉他,应该也是可行的,看不出来到底有什么问题,也不会导致构造函数中不能传指针或者类的非引用变量,会导致循环的调用构造函数的情况。但是这里只是个一般的成员函数,应该是不会出问题了。。。他表示了赞同。
3.写代码,定时器,定时器是一个这样的东西,首先,可能设置了很多个定时器,每个定时器都有一个触发的时间戳,以及一个callback函数,然后让我去实现这样一个定时器,时间为1970年开始的标准时间(就是 Unsigned long int); 然后我思考了一下,我说,这里面要做两件事情,第一件事情,排序,按照时间戳由小到大排序,然后依次唤醒,有心得定时器请求的时候,插入序列中。第二件事就是写回调函数,根据你的id做不同的事情,调用不同的回调函数。用select可以实现这个。
然后他立马问,用什么来进行排序,卧槽,原来梗在这里,我脑袋里飞快的想,这个定时器的数量不会很大,好像用什么算法性能都相差不大,都会很快。但是他居然问,肯定是不仅考我对是不是会写算法,而是是否可以再适当的地方用合适的算法。问题出在,在已经排序的数组中,插入一个数据,使数据重新有序?我开始想,插入排序,冒泡麦序,简单选择排序,这些都差不多,因为最后都会平均移动2/n个元素,应该不是最优的,快速排序,直接失效,基本有序的情况复杂度最高(其他算法做了优化还可以达到0(n),单指插入一个元素后排序)。。。后来我想,为什么要排序,或者对于计时器来说,根本就不需要排序,只需要维持一个小顶堆,因为我这个定时器,只需要关心最小的那个时间戳,最小的输出之后,我再重新调整成一个小顶堆,如果有需要插入的元素,那么我也只需要做一次调整,也就是只需要比较和移动logn和元素,因此非常适合。。。然后我就说了,用堆排序,讲了我的思路,他表示赞同,然后跟我说,chrome实现的定时器就是一个小顶堆。。。。百度重视的是你对算法的了解,以及如何运用,而不是简单机械的会背个快排堆排的代码。。。。点个赞。
4.如何判断一个二叉树是不是满二叉树?我说了从定义出发,就是一个一个编号,如果一个节点有做孩子,做孩子应该是2n+1,右孩子是2n+2;然后就判断,如果一个节点的的左孩子是2n+1,而2n+1这个节点如果不是该节点的左孩子,这就说明顺序不对了,一直检查到最后一个节点。。。然后我说完这个几乎同时想到另一个,,,层次遍历,刚才做的几乎就是层次遍历了,只需要依次层次遍历,找到第一个叶子节点,或者第一个没有左孩子或右孩子的节点,(没有左孩子,只有右孩子的,已经不是了),然后后面的节点,都只能是页节点。
5.linux基础,如果一个进程想让他后台执行,怎么做?我说加个&,然后又问我,如果一个进程创建了一个子进程,然后父进程先与子进程退出,会发生什么?我说子进程会成为孤儿进程,然后其父进程会变为init进程,然后他说,如果我想让他独立运行呢?就是在后台独立执行。我说你说的是守护进程吧,主要用setsid实现,服务启动后加上nohub就可以了吧。。。
6.linux基础,top命令,直接让我看,我说我主要用这个就是看cpu看内存的,然后其他很少看,然后他说,你看这个内存使用情况,最后一个是cached的大小,这个是什么意思?这个我之前了解过,直接说:linxu内存管理者认为,内存浪费是一种不可取的行为,因此,会将没用的那部分内存作为一个cache,根据局部性原理将某些内容读入内存中去,作为cache,这样可以提高访问速度。。。。他表示赞同。
7.应该还有俩问题实在想不起来了。
三面:
惨烈的一面,面试官估计是个总监。612房间。
1.介绍项目,直接戳中项目中的不足。我介绍了师兄之前在这个项目上做的东西。时间大概是50分钟。
2.逼着我介绍师兄的工作,主要有:热点迁移,负载均衡,条带化,元数据集群及副本。其中关于热点迁移,问我怎么实现的,我说主要是基于读写的块以及访问文件的频度,然后进行迁移。然后他问我,为什么不直接监控网卡,我解释了一下他的想法以及实现方法及可能性,然后赞同这个方式。但是提出了自己的质疑,表示这样可能会存在一个问题,就是可能一块盘只有几个文件读写频度很高,那么如果我监控网卡,会发现这台机器数据量很大,那么我可能需要直接dd这个盘,这个开销很大,所以最终的性能如何,可能还是需要代码实现然后测一次的。。。。(其实我当时想的是,你他妈扯淡啊,扯淡啊。。。)。
3.问我对搜索引擎的了解,从前往后,如何处理这种高并发的东西。。。各种扯犊子,首先做个CDN啊,然后做冷热数据区分,搞个topk啊,然后把topk的东西全部搞到内存啊。。。都是胡扯。
4.问问题,介绍他们的工作,感觉面试官懒得鸟我。
网易游戏CC语音研发工程师。
只面了一次,就跪了,感觉并不缺人,很快,刚坐下就告诉我,不来虚的了,直接写代码吧。然后就是连着三道题,一道题你还没考虑两分钟,他就一直催你,很烦,感觉就像说:会不会,不会就滚。。。。问了我三道算法,第一道手写,后面都是描述算法。
1.朋友还是敌人关系,比如
A B 1
B C 1
C D 0
D F 1.
那么问你,A和F是什么关系,要输出0敌人关系。要快速实现。
2.变异的树,树的内容是随机的。树的形态就像下面这样。
1
2 3
4 5 6
其中1连接2,3,2连接4,5,3连接5,6,往下依次类推,长的跟杨辉三角似的,但是数字内容是随机的。要求找到从根开始到最后一行叶子的最大路径(走过的路径对应的数字求和最大)。
3.给你一个数组A,让你求B,满足B[i]=sum(A)-A[i],i=0,len-1.要求不能出现减号。
第三题没搞定,第二天接到短信,跪了。
中兴的,这个非常简单,有兴趣的可以去虐面试官,,,明天HR面,不想去了。
最后:我觉得百度的面试时最累人,也最考验一个人的基本功底,没法突击,只能平时积累。想比较而言,腾讯要简答一些,注重你做的东西。所以百度确实是网络了国内非常优秀的一批人,从面试过程就可以看到,气势逼人,一个程序员该有的素养,一个搞技术的该有的态度,都表现的淋漓尽致。然后,我这种技术渣渣,还是想,搞技术我不行,所以,我希望以后万一技术搞不下去,公司可以给我开启另一条通道,走一些管理路线,所以我还是更倾向于腾讯。。。。华为这个IT产品线,级别很高,好想去,,,,只要米多,我就去!中兴不考虑了,觉得里面人太渣,,,居然说我女朋友,你搞后台为什么用C/c++,你这么多年就不会学习android,java吗????还说他们的后台都是java和C#做的,,,我去,java我还算可以接受,一般的小公司都是租服务器,中型公司会用java做一些后台工作,比如唯品会,聚美优品等。。。但是你用C#是几个意思???
我面过携程的直接内推总监面,面到最后问我有啥问题,我直接问,你们开发环境是什么?他说C#,语言不太好,但是是历史遗留问题,我们也没办法,我表示理解。。。最起码人家知道,C#不太好,,,而不是像中兴,觉得我们这搞后台的用C#,你们都要用C#,,,懒得说,二面不去了,中兴太没意思,去了也憋屈。