程序员面试 企业急聘      免费注册      个人登陆     企业登陆  
中国程序员人才网
精确职位: 高级程序员 程序员 经理 网络管理员 美工 技术总监 网站编辑 网络工程师
专业招聘: powerbuilder ASP JSP PHP Java .Net Delphi oracle C/C++ VC/MFC VB C#
省份分站: 广东 湖南 湖北 浙江 福建 江苏 江西 四川 山西 辽宁 黑龙江 山东 河南 吉林                  直通所有>>
城市分站: 苏州 无锡 珠海 厦门 青岛 合肥 郑州 南宁 海口 南昌 太原 昆明 大连 西安                      直通所有>>
首页 北京 上海 天津 重庆 杭州 南京 武汉 沈阳 济南 成都 福州 长沙 东莞 佛山 石家庄 长春 哈尔滨 宁波 深圳 广州
中国程序员人才网 > 程序员资讯 >

程序员面试

发表日期:2008-1-30 22:50:13 人气:1172

一位大四程序员的面试经历和体会
1.面试经过

大约在年前我接到了台湾瑞晟(Realtek)苏州公司的面试通知,通知我2月21日到苏州工业园区面试,接到面试后的几天我把一些专业课温习了一遍,特别是C++和数据结构,由于大学几年里,我一直专研这些方面,加上通过了高级程序员的考试,对于一些常用的算法我差不多也 达到了烂熟于胸的地步,当时的感觉是如果问了我这些方面的问题我应该是没有问题的!

21日那天我被安排在4:30面试,由一位技术人员单独给我面试,在问了一些简单的问题之后 ,他给我出了一道编程题目,题目是这样的:

(由于具体面试的题目比较烦琐,我将其核心思想提取出来分解成……(乱码)

1) 写一个函数计算当参数为n(n很大)时的值 1-2+3-4+5-6+7......+n
哼,我的心里冷笑一声!没想到这么简单,我有点紧张的心情顿时放松起来!
于是很快我给出我的解法:

long fn(long n)
{
long temp=0;
int i,flag=1;
if(n<=0)
{
printf("error: n must > 0);
exit(1);
}
for(i=1;i<=n;i++)
{
temp=temp+flag*i;
flag=(-1)*flag;
}
return temp;
}

搞定!当我用期待的目光看着面试官的时候,他微笑着跟我说,执行结果肯定是没有问题! 但当n很大的时候我这个程序执行效率很低,在嵌入式系统的开发中,程序的运行效率很重要 ,能让CPU少执行一条指令都是好的,他让我看看这个程序还有什么可以修改的地方,把程序 优化一下!听了这些话,我的心情当时变的有点沉重,没想到他的要求很严格,之后我对程序 进行了严格的分析,给出了改进了的方案!

long fn(long n)
{
long temp=0;
int j=1,i=1,flag=1;
if(n<=0)
{
printf("error: n must > 0);
exit(1);
}
while(j<=n)
{
temp=temp+i;
i=-i;
i>0?i++:i--;
j++;
}
return temp;
}

虽然我不敢保证我这个算法是最优的,但是比起上一个程序,我将所有涉及到乘法指令的语 句改为执行加法指令,既达到要题目的要求而且运算时间上缩短了很多!而代价仅仅是增加了 一个整型变量!但是我现在的信心已经受了一点打击,我将信将疑的看者面试官,他还是微笑 着跟我说:“不错,这个程序确实在效率上有了很大的提高!”我心里一阵暗喜!但他接着说这个程序仍然不能达到他的要求,要我给出更优的方案!天啊!还有优化!我当时真的有点崩 溃了,想了一会后,我请求他给出他的方案!然后他很爽快的给出了他的程序!

long fn(long n)
{
if(n<=0)
{
printf("error: n must > 0);
exit(1);
}
if(0==n%2)
return (n/2)*(-1);
else
return (n/2)*(-1)+n;
}

搞笑,当时我目瞪口呆,没想到他是这个意思,这么简单的代码我真的不会写吗,但是我为 什么没有往那方面上想呢!他说的没有错,在n很大很大的时候这三个程序运行时间的差别简 直是天壤之别!当我刚想开口说点什么的时候,他却先开口了:“不要认为CPU运算速度快就 把所有的问题都推给它去做,程序员应该将代码优化再优化,我们自己能做的决不要让CPU做 ,因为CPU是为用户服务的,不是为我们程序员服务的!”多么精辟的语言,我已经不想再说 什么了!接着是第二个问题:
他要求我用一种技巧性的编程方法来用一个函数实现两个函数的功能n为如:

fn1(n)=n/2!+n/3!+n/4!+n/5!+n/6!
fn2(n)=n/5!+n/6!+n/7!+n/8!+n/9!

现在用一个函数fn(int n,int flag)实现,当flag为0时 ,实现fn1功能,如果flag为1时实现fn2功能!他的要求还是效率,效率,效率!说实在话, 如果我心情好的话我应该能给出一种比较好的算法,但我那时真的没有什么心思再想了,我在纸上胡乱画了一些诸如6!=6*5!的公式后直截了当的跟他说要他给出他的答案!面试官也没有 说什么,给出了他的思路:

定义一个二维数组 float t[2][5]存入[2!,3!,4!,5!,6!},{5! ,6! ,7!,8!,9!]然后给出一个循环:

for(i=0;i<6;i++)
{
temp=temp+n/t[flag][i];
}

最后得到计算值!呵呵,典型的空间换时间的算法!
这些总共花了50分钟的时间,还有十分钟我就跟他很随意的聊聊天,聊了一些编程以及生活 的问题,那时的我已经很放松了,因为我知道这次面试结果只有一个:失败。5:30的时候面试官要我等通知,于是我离开了他们公司。这就是面试的整个经过!

2.由面试想到的

真的是很失败啊!我记得那天下好大的雨,气温也很低,我边走边想,从5:30一直走到7:30 ,全身都湿透了,又冷又饿,但是我只是一直走,脑子里面充满了疑惑,我也想让雨把自己淋 醒!看到这里有些朋友可能觉得那些面试题目不算什么如果让自己做的话肯定能全部答对,我 肯定相信你,因为我从未怀疑过中国程序员的能力,我认为中国有世界上最好的程序员,我也 从未认为自己是高手,所以我做不出来不代表中国程序员比台湾或者别的地方的程序员差,所以我就从我的角度,我的所见所想来谈一些感想:

不错全世界都有优秀的程序员,中国也不例外,但是我疑惑的是:到底中国和台湾或者国外 的优秀的程序员的比例到底是多少?台湾我不知道,中国100个程序员里有几个是优秀的呢?我 根本算不上,从上面的表现就足以说明一切了!是1个?5个?10个?50个?这个数字我不敢乱 猜,恐遭网友一顿痛骂,那么我们国内有多少人学习计算机呢?拿我们学校来说,计算机97级 4个班,98级5个班,99级10个班,2000级17个班,人多了,老师怎么办?我们学校的做法是让 研究生上课,然后呢?补考一抓一大把,大把大把的补考费落入了学校的口袋,还说现在的学生素质低!真是好笑,我都不知道学校这么做是为了什么,为国内培养大量的程序员吗?学生 们能真正学到计算机知识吗?好了,我敢讲,在我们学校学习编程学生和优秀程序员(注意我 指的是优秀,只会编几个糟烂程序的人算不上)的比例应该是100:0.1 在这种比例下虽然我们中国学习编程的人铺天盖地,但是想想有多少个人能真正为中国软件 业发展作出贡献,有多少人能真正写出优秀的程序名扬海外!

我从学习编程以来,不管是自学还是老师指导,从来都是解决问题就好,编出程序来就行, 我的疑惑是:我们有真正的强调过程序的效率,程序的质量吗?我们有仔细分析过我们写的东 西,看看有没有可以改进的地方,看看有没有简单的方法来达到同样的目的呢?我问心自问, 我发现,我从来没有对我写出来的程序进行过优化,最多就是进行详细的测试,然后Debug, 但是这就足够了吗?
这些天我偶尔发现我曾经写过的一个游戏,那是一年做为 其中一员时候,感觉应该拿点东西出来,然后花了一个星期的时间写出来的!程序不算复杂,但是用到了不少数据结构的东西,也用到了一些精彩的算法,加上windows的界面和游戏的可 玩性,写完后受到了不少好评,我当时真的很佩服自己!
但是现在看呢:没有一句注释,好多 丑陋的函数名比如:void chushihua(),好多没有必要的变量,可以用简单语句完成工作的我 使用华丽的算法,大量使用全局变量.....,说不好听的话,六百多行的程序除了能运行之外就是一陀屎!如果一年前我能听到一些反面意见的话,大概我能早一点觉悟,但是自原代码在 网站发布以来听到的都是赞美之词,没有一个人向我提出程序改进的意见,这又说明了一个什 么问题呢?很值得思考啊!

还有一个疑惑是:我们说的和做的真的一样吗?我在学校的时候曾经受学院指派承办过一个 计算机大赛,请了一个老师出决赛的题目,主要是一些算法题目,这个老师可能是我上大学以 来唯一敬佩的老师了,从程序调试到打分,对于每个程序都仔细分析其时间效率和空间效率, 然后综合打分,四十个人的卷子,老师从下午三点一直调试到晚上十点,在有些写的精彩的语 句后还加上批注。我真是高兴很遇到这样的老师并且和他做深入的交流,但在事后,却发生了 一件不愉快的事,在比赛中获得第二名的学生找到我,说他程序全部调试成功应该给他满分, 并且应该得第一,我说不过他,最后调出了他的原程序和第一名的原程序对比,错,两个程 序都运行的很好,这时,那个同学开口了:“我的程序写的十分简捷明了,仅仅数行就完成了 题目要求,而他的却写了一大堆,为什么给他的分多过给我的分。”我当时很是气愤,如果不 是老师负责的话,那么现在第一名和第二名的位置真的要互调了,拜托,不是程序的行数越少 程序的质量就越高,我记得我跟他大谈这方面的道理,最后说服他了!哈哈,但是我,只能说 说而已,我不知道还有多少人一样,说起来头头是道,但心里却压根就从未重视过它!

程序员面试

程序员面试不重要关键看实力

首先看看两本书,程序员面试、还有一本高质量c/c++编程。 前者告诉你一些细枝末节怎么做后者告诉你怎么写代码。最重要的是目前很多公司都是用这套题目的。面试程序员要看一下试做哪方面的,如果是做嵌入式系统或者操作系统的,劝你好好复习以下指针及内存管理,这两个内容是非常重要的。
  
   所谓的考c语言大部分是关于这个的,能看出来你真实实力。由少部分会考你一些简单的算法、数据结构。有些公司会出很变态的题目,事先最好做好准备。如果是做一些商业软件的公司反而题目会简单点。大部分是问些宏观上的问题,比如各种平台的优劣、各种语言的优劣,有的都是选择题,做好的话很容易。
  
  不过别高兴得太早,一般考官都会等你考完之后,让你一道一道说题目的思路。所以如果你是蒙的,那最好索性不要写答案。

  个人碰到的关于面向对象的方面的题目有关于继承、多态、无非是做几个类,其中有继承的关系然后每个类的构造函数之中都有打印函数,最后要你调用其中的。然后看打印结果。

  难者不会,会者不难。关键不是面试,还是自己的实力。面试通过了,实力不行到最后还是要淘汰的。


程序员面试
我们应该如何面试程序员/技术人员?
看到我在GTEC的同事的一封email,说的是他在面试别人的时候一些心得。其中有这么一段话,写得非常好:

在以后的面试中,建议大家认真阅读应聘者的简历,在应聘者擅长的领域里去问问题,去了解应聘者在软件技术支持方面的潜力。避免问一些只有我们自己才可能知道答案的技术问题,并以能不能答得上来为标准进行取舍。

我曾经犯过这样的错误。我在GTEC工作最初的大半年时间里面,我学了很多很多微软的东西,包括编程的、包括产品的,长进极大。也同样是在那段时间前后,我发现我对几乎所有的被我面试的人(大部分是大四或者研二的实习生)的comment都是“技术很一般”或者类似评语。突然有一天我发现了这个情况,当时就想通了一个道理:我当初应聘微软时的水平,未必比现在那些被我评价为“技术一般”的应聘者的水平高。

我还犯过一个错误。去年(可能是前年了,忘了),当时我们招实习生,为开发一些内部的Web平台招。最后剩下两个,A和B。A在面试时对ASP.NET、CSharp以及SQL的一些中等级别的技术问题答得很不错;B只对ASP有经验,对.NET还刚刚入门。当时我选择了A,选择的理由是技术不错,来之能战。而B去了另外一个team,也是做ASP.NET的开发。结果我发现,开始工作后,与A的交流非常困难,缺乏commitment和accountability,对take ownership的理解也很差,缺乏主动性,技术上遇到了阻碍也不向别人咨询;而B在另一个team融入得非常好,交给他的工作总是能按时完成,.NET的技术也很快补上了,至少足够用了。

从这个错误里面我学到的东西是:千万别太看重技术。技术是可以学的,没有任何技术是一两个月学不会的——那时候我头一次到CSDN答帖子做支持的时候,刚刚接触C#才两个礼拜;相比之下,人品、commitment & accountability、沟通能力、提问技巧、quick learning等,却是无法在几个月内迅速改变的。类似的,如果招一个Consultant,也应该更看重对行业的了解,而不是看重对产品的了解。产品知识容易学,行业经验积累就难了。

因此,面试程序员/技术人员的时候,最关键(也是最难的)是看应聘者的“人品”(广义的)。尤其是对于像微软这种公司来说,更是如此。因为如果单论技术,恐怕任何应聘者的技术都是不qualified的。比如说,测试方面,本来嘛,微软产品组的测试就已经做的非常好了,在整个业界是领先的,而且大大领先于国内软件业的测试水平,因此,从国内招人招不到合格的测试工程师是很正常的——反之倒是不正常的:如果国内高水平的测试工程师很多,那么国内的软件测试水平也不会是现在这个样子了。同样道理,对于一些微软的技术来说(比如Windows操作系统,比如.NET,一些具体的实现,比如CLR上的),微软产品组和技术支持部门的人一定是最牛的,因为本身这些技术就是他们自己公司的同事搞出来的,他们能够比外部获得多得多的资料(包括文档、问题集、培训材料等)。因此,如果觉得来应聘的人对操作系统或者程序语言的原理懂得不多,那是很正常的。

还是回到我同事那段话:"建议大家认真阅读应聘者的简历,在应聘者擅长的领域里去问问题,去了解应聘者在软件技术支持方面的潜力。避免问一些只有我们自己才可能知道答案的技术问题,并以能不能答得上来为标准进行取舍"。


程序员面试

《程序员面试攻略》

【内容简介】
本书对程序员面试中的各种注意事项、常见题型和常用解答技巧进行了介绍,书中的面试例题都取材于顶级计算机公司的实际招聘面试题,每道例题的后面都紧跟解决方案的思路和逻辑分析步骤。它不仅能帮助求职者快速复习有关的知识,也对如何给面试考官留下一个良好而又深刻印象的面试技巧进行了指导;而这些能帮助读者获得一份真正的高薪工作。本书适合于所有正在找工作或将要找工作的程序员。

详细信息请看: http://www.china-pub.com/computers/common/info.asp?id=9835

程序员面试

程序员面试宝典
本书取材于各大IT公司历年面试真题(笔试、口试、电话面试、英语面试,以及逻辑测试和智商测试)。详细分析了应聘程序员(含网络、测试等)职位的常见考点。本书不仅对传统的C系语言考点做了详尽解说,包括面向对象、size of、const、数据结构等,还根据外企业出題最新特点,针对设计模式C#、网络、数据库、.NET等问題做了深入说明。最后本书着力讲述了如何进行英语面试和电话面试,并给出了大量实际英语面试中的面试題除了有详细解析和回答外,对相关知识点还有扩展说明。

详细信息请看: http://book.csdn.net/bookfiles/107/