一直想写一篇文章来总结一下今年的校园招聘面试,工作这么多年了,还是第一次参加校园招聘,很有
纪念意义,当年作为学生参加校园招聘的场景还是历历在目,没想到转眼间好几年就这样过去了,废话少说
转入正题。
这次校园招聘我参与了其中三个城市的,武汉,北京,南京,一路马不停歇,是连着跑了三个城市。
公司这次面试给技术面试官的自由度比较大,自己出题考察面试者,所以出发前还好好准备了一翻,看了
历年各个公司的面试题,心中了大概的思路,决定从以下几个方面考察面试者。
1)考察项目经历,在项目中所承担的角色,以及主要的贡献。
2) 考察计算机基础知识,操作系统,网络,语言基础等。
3)考察算法以及手写代码能力。
4)考察一些简单的智力题,这部分是可选的,看时间是否允许,主要看看应试者思维是否敏捷。
一轮面试大概半个小时到四十五分钟,如果实在不能确定的,可能会延长到一个小时左右,但是原则上要在45
分钟内解决,面试者太多,过分拖延会打乱面试安排,接下来讲讲应试者在面试中各个环节所出现的问题。
首先项目经历方面,应试者最容易犯的错误:
1)滔滔不绝的讲述项目细节问题,抓住一个细节点淘淘不决,听的我都想睡觉,最后只有打断他,把他
重新引入到正轨。
2)有些应试者还是准备不足,没能把事情说到点子上,通常情况我都会问说说你最得意的是哪个项目,
结果有些研究生应试者居然拿本科的毕设来讲,搞定我心理瞬间不爽。
在说说好的应试者的表现:
1) 这类童鞋一般项目经历丰富,有些项目还有些亮点,能够围绕这些展开描述,让人感觉这个童鞋动手
能力较强。特别是对于一些对自己以前从来接触过的东西,表现出很强的学习能力,这点就让面试官感觉很爽。
2)准备充分,即使不是自己的模块,也会去熟悉了解,能够与自己东西很好的衔接起来,这就展现了这个人
的协作能力,而且能够不守着自己的那一亩三分地,多关注和向别人学习。这样就能让面试官感觉此人有潜力。
其实说说基础知识方面,这次面试的主要是JAVA程序员和C++程序员,所以语言基础一定要掌握好,这个
是可以好好准备的,因为在短短的时间也不会很深入的问题。
1)语言方面,主要是一些编程中的细节,一些常见的面试宝典之类的都有提到过的。
2)操作系统,进程与线程,死锁,进程间通信等,linux常用命令等。
3)网络编程,tcp/ip协议,socket编程,epoll/select模型等。
4)其他诸如设计模式,一些常见的开源软件如apache旗下的有没有了解。
接下来是算法和手写代码能力,这个也是重点考察的项目,这个是所有环节里重头戏,我一般会出两道算法题,
一道简单的,一道稍微难一点的,为什么这样出呢,受到面试时间的限制,但是这一项比较花时间的,首先简单的
算法题必须写出代码,稍微难点的写出代码最好,其次是写出伪代码,最次点起码要能够把算法实现能够较为准确
的描述出来,如果不是最优解,还需要提出优化方案(这个看情况面试官都会给予一定的提示)。
这个还是举个简单的例子来更好描述一些,对于简单题,以二分查找为例吧,这个大部分人还是能写出来,但
是能完全写对的寥寥无几。大部分人的是这样子的:
1 int binarysearch(int *a,int n,int k) 2 { 3 int low=0,high=n,mid; 4 while(low<=high&&i==0) 5 { 6 mid=(int)((low+high)/2); 7 if(k==a[mid]) 8 return mid; 9 else if(k>a[mid]) 10 low=mid+1; 11 else 12 high=mid-1; 13 } 14 return -1; 15 }
可能有些童鞋会认为这个代码没有什么问题啊,自己也是这样的写的。当我们写完一个函数的时候,接下来最
重要的一步是什么?是单元测试,这个函数如果要你单元测试你就会发现,其实还有两个很重要的问题没有解决
1)参数检测,这是所有的防御性编程都是做的。
2)数值范围越界,整数加法会出现越界的情形,所以这个算法用加法是会有问题的,如果数据量很大的情形。
所以正确的代码应该是这样子的:
1 int binarysearch(int *a,int n,int k) 2 { 3 if( a == null || n == 0) //参数检测 4 return -1; 5 int low=0,high=n,mid; 6 while(low<=high&&i==0) 7 { 8 mid= low + (high - low)/2; //改为减法实现 9 if(k==a[mid]) 10 return mid; 11 else if(k>a[mid]) 12 low=mid+1; 13 else 14 high=mid-1; 15 } 16 return -1; 17 }
对于最后的智力题,也都是一些比较简单的,还是举个例子说明吧,比如有一个三升水的容器和一个五升水的
容器,怎么倒出四升水来。这个三升和五升的容器都是没有刻度的,只知道它们分别是三升和五升。
这个其实可以抽象为一个简单的数学题,3+1 = 4 或者 5-1 = 4,关键是这个一升水怎么给弄出来。
3+1方式:先把三升容器水倒满,然后倒入五升容器,再把三升容器倒满,倒入五升容器2升,五升容器满了,这样
三升容器就剩下一升,五升容器的全部倒掉,把三升容器中的一升倒入五升容器,再三升容器倒满,倒入五升容器,五升
容器中就是四升了。
5-1方式:把五升容器倒满,倒入三升容器,三升容器满后倒掉,五升容器中的剩下来的两升倒入三升容器,再把五
升容器倒满,五升容器再往三升容器倒,三升容器满了后,五升容器就剩下四升了。
最后总结一下,说到底就是考察计算机基础掌握程度,动手能力,学习能力,表达能力,以及思维是否敏捷等。