发新话题
打印

一位大四程序员的面试经历和体会【转】

本主题由 xg218 于 2007-12-10 21:24 设置高亮

一位大四程序员的面试经历和体会【转】

   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];
}

    最后得到计算值!呵呵,典型的空间换时间的算法!
这些总共花了50分钟的时间,还有十分钟我就跟他很随意的聊聊天,聊了一些编程以及生活 的问题,那时的我已经很放松了,因为我知道这次面试结果只有一个:失败。5:30的时候面试官要我等通知,于是我离开了他们公司。这就是面试的整个经过!
本帖最近评分记录
  • xg218 威望 +10 学习C++的同学都该看一看 2007-12-10 21:00
……我们要昂起不屈的头颅,挺起不屈的脊梁,燃起那颗炽热的心,为了明天,充满希望地向前迈进!……

TOP

    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(),好多没有必要的变量,可以用简单语句完成工作的我使用华丽的算法,大量使用全局变量.....,说不好听的话,六百多行的程序除了能运行之外就是一陀屎!如果一年前我能听到一些反面意见的话,大概我能早一点觉悟,但是自原代码在 网站发布以来听到的都是赞美之词,没有一个人向我提出程序改进的意见,这又说明了一个什 么问题呢?很值得思考啊!

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

TOP

此人不是一般的牛啊! 程序员的饭不好吃  唉
……我们要昂起不屈的头颅,挺起不屈的脊梁,燃起那颗炽热的心,为了明天,充满希望地向前迈进!……

TOP

某高级程序员的几点建议

                       
                                                                       

                          来源:Java学习技术论坛  日期:                                2006-08-14                       

                                                                          我始终认为,对一个初学者来说,IT界的技术风潮是不可以追赶的,而且也没有能力去追赶。我时常看见自己的DDMM们把课本扔了,去卖些价格不菲的诸如C#, VB.Net这样的大部头,这让我感到非常痛心。而许多搞不清指针是咋回事的BBS站友眉飞色舞的讨论C#里面可以不用指针等等则让我觉得好笑。C#就象当年的ASP一样,“忽如一夜春风来,千树万树梨花开”,结果许多学校的信息学院成了“Web 学院”。96,97级的不少大学生都去做Web了。当然我没有任何歧视某一行业的意识。我只是觉得如果他们把追赶这些时髦技术的时间多花一点在基础的课程上应该是可以走得更远的。
  
  几个误区  
  初学者对C#风潮的追赶其实也只是学习过程中经常遇到的几个误区之一。我将用一些实际的例子来说明这些现象,你可以按部就班的看看自己是不是属于其中的一种或者几种:

  认为计算机技术等于编程技术:

  有些人即使没有这个想法,在潜意识中也有这样的冲动。让我奇怪的是,许多信息学院的学生也有这样的念头。认为计算机专业就是编程专业,与编程无关的,或者不太相关的课程他统统都不管,极端的学生只要书上没带“编程”两个字他就不看。
  
  其实编程只是计算机技术应用过程中一种复杂性最低的劳动,这就是为什么IT业最底层的人是程序员(CODER)。计算机技术包括了多媒体,计算机网络,人工智能,模式识别,管理信息系统等等这些方面。编程工作只是在这些具体技术在理论研究或者工程实践的过程中表达算法的过程。编程的人不一定对计算机技术的了解就一定很高。而一个有趣的现象是,不少大师级的计算机技术研究者是不懂编程的。网上的炒作和现实中良好的工作待遇把编程这种劳动神秘化了。其实每一个程序员心里都明白,自己这些东西,学的时候并不比其它专业难,所以自然也不会高档到哪里去。
  
  咬文嚼字的孔已己作风:
  
  我见过一本女生的《计算机网络原理》教材,这个女生像小学生一样在书上划满了横杠杠,笔记做得满满的,打印出来一定比教材还厚。我不明白的是,像计算机网络原理这样的课程有必要做笔记?我们的应试教育的确害了不少学生,在上《原理》这一类课程的时候许多学生像学《马列原理》一样逐字背诵记忆。这乃是我见过的最愚蠢的行为。所谓《原理》,即是需要掌握它为什么这样做,学习why,而不是how(怎样做)。极端认真的学生背下以太网的网线最大长度,数据帧的长度,每个字段的意义,IP报头的格式等等,但是忘了路由的原则,忘了TCP/IP协议设计的宗旨。总之许多人花了大量的时间把书背得滚瓜烂熟却等于什么也没学。
  
  在学习编程的时候这些学生也是这样,他们确切的记得C++语法的各个细节。看完了C++教程后看《Thinking in C++》(确实是好书),《Inside C++》,《C++ reference》,this C++, thatC++……,然后是网上各种各样的关于C++语法的奇闻逸事,然后发现自己又忘了C++的一些语法,最后回头继续恶补…。有个师弟就跟我说:“C++太难了,学了这里忘了那里,学了继承忘了模板。”我的回答道:“你不去学就容易了”。我并没有教坏他,只是告诉他,死抠C++的语法就和孔已己炫耀茴香豆的茴字有几种写法一样毫无意义。你根本不需要对的C++语法太关心,动手编程就是了,有不记得的地方一查MSDN就立马搞定。我有个结论就是,实际的开发过程中对程序语法的了解是最微不足道的知识。这是为什么我在为同学用Basic(我以前从没有学过它)写一个小程序的时候,只花了半个小时看了看语法,然后再用半个小时完成了程序,而一个小时后我又完全忘记了Basic 的所有关键字。
  
  不顾基础,盲目追赶时髦技术:
  
  终于点到题目上来了。大多数的人都希望自己的东西能够马上跑起来,变成钱。这种想法对一个已经进入职业领域的程序员或者项目经理来说是合理的,而且IT技术进步是如此的快,不跟进就是失业。但是对于初学者来说(尤其是时间充裕的大中专在校生),这种想法是另人费解的。一个并未进入到行业竞争中来的初学者最大的资本便是他有足够的时间沉下心来学习基础性的东西,学习why而不是how。时髦的技术往往容易掌握,而且越来越容易掌握,这是商业利益的驱使,为了最大化的降低软件开发的成本。但在IT领域内的现实就是这样,越容易掌握的东西,学习的人越多,而且淘汰得越快。每一次新的技术出来,都有许多初学者跟进,这些初学者由于缺乏必要的基础而使得自己在跟进的过程中花费大量的时间,而等他学会了,这种技术也快淘汰了。基础的课程,比方数据结构,操作系统原理等等虽然不能让你立马就实现一个linux(这是许多人嘲笑理论课程无用的原因),但它们能够显著的减少你在学习新技术时学习曲线的坡度。而且对于许多关键的技术(比方Win32 SDK程序的设计,DDK的编程)来说甚至是不可或缺的。
  
  一个活生生的例子是我和我的一个同学,在大一时我还找不到开机按纽,他已经会写些简单的汇编程序了。我把大二的所有时间花在了汇编,计算机体系结构,数据结构,操作系统原理等等这些课程的学习上,而他则开始学习HTML和VB,并追赶ASP的潮流。大三的时候我开始学习Windows操作系统原理,学习SDK编程,时间是漫长的,这时我才能够用VC开发出象模象样的应用程序。我曾一度因为同学的程序已经能够运行而自己还在学习如何创建对话框而懊恼不已,但临到毕业才发现自己的选择是何等的正确。和我谈判的公司开出的薪水是他的两倍还多。下面有一个不很恰当的比方:假设学习VB编程需要4个月,学习基础课程和VC的程序设计需要1年。那么如果你先学VB,再来学习后者,时间不会减少,还是1年,而反过来,如果先学习后者,再来学VB,也许你只需要1个星期就能学得非常熟练。

  几个重要的基础课程
   
  如果你是学生,或者如果你有充足的时间。我建议你仔细的掌握下面的知识。我的建议是针对那些希望在IT技术上有所成就的初学者。同时我还列出了一些书目,这些书应该都还可以在书店买到。说实在的,我在读其他人的文章时最大的心愿就是希望作者列出一个书单。
  
  大学英语-不要觉得好笑。我极力推荐这门课程是因为没有专业文档的阅读能力是不可想象的。中文的翻译往往在猴年马月才会出来,而现在的许多出版社干脆就直接把E文印刷上去。学习的方法是强迫自己看原版的教材,开始会看不懂,用多了自然熟练。吃得苦下得狠心绝对是任何行业都需要的品质。
  
  计算机体系结构和汇编语言-关于体系结构的书遍地都是,而且也大同小异,倒是汇编有一本非常好的书《80x86汇编语言程序设计教程》(清华大学出版社,黑色封面,杨季文著)。你需要着重学习386后保护模式的程序设计。否则你在学习现代操作系统底层的一些东西的时候会觉得是在看天书。
  
  计算机操作系统原理-我们的开发总是在特定的操作系统上进行,如果不是,只有一种可能:你在自己实现一个操作系统。无论如何,操作系统原理是必读的。这就象我们为一个芯片制作外围设备时,芯片基本的工作时序是必需了解的。这一类书也很多,我没有发现哪一本书非常出众。只是觉得在看完了这些书后如果有空就应该看看《Inside Windows 2000》(微软出版社,我看的是E文版的,中文的书名想必是Windows 2000技术内幕之类吧)。关于学习它的必要性,ZDNET上的另一篇文章已经有过论述。
  
  数据结构和算法-这门课程能够决定一个人程序设计水平的高低,是一门核心课程。我首选的是清华版的(朱战立,刘天时)。很多人喜欢买C++版的,但我觉得没有必要。C++的语法让算法实现过程变得复杂多了,而且许多老师喜欢用模块这一东西让算法变得更复杂。倒是在学完了C版的书以后再来浏览一下C++的版的书是最好的。
  
  软件工程-这门课程是越到后来就越发现它的重要,虽然刚开始看时就象看马哲一样不知所云。我的建议是看《实用软件工程》(黄色,清华)。不要花太多的时间去记条条框框,看不懂就跳过去。在每次自己完成了一个软件设计任务(不管是练习还是工作)以后再来回顾回顾,每次都会有收获。
  
  Windows 程序设计-《北京大学出版社,Petzold著》我建议任何企图设计Windows程序的人在学习VC以前仔细的学完它。而且前面的那本《Inside Windows2000》也最好放到这本书的后面读。在这本书中,没有C++,没有GUI,没有控件。有的就是如何用原始的C语言来完成Windows程序设计。在学完了它以后,你才会发现VC其实是很容易学的。千万不要在没有看完这本书以前提前学习VC,你最好碰都不要碰。我知道的许多名校甚至都已经用它作为教材进行授课。可见其重要。
  
  上面的几门课程我认为是必学的重要课程(如果你想做Windows 程序员)。
  
  对于其它的课程有这样简单的选择方法:如果你是计算机系的,请学好你所有的专业基础课。如果不是,请参照计算机系的课程表。如果你发现自己看一本书时无法看下去了,请翻到书的最后,看看它的参考文献,找到它们并学习它们,再回头看这本书。如果一本书的书名中带有“原理”两个字,你一定不要去记忆它其中的细节,你应该以一天至少50页的速度掌握其要领。尽可能多的在计算机上实践一种理论或者算法。
  
  你还可以在CSDN上阅读到许多书评。这些书评能够帮助你决定读什么样的书  

  一日三省 

  每天读的书太多,容易让人迷失方向。一定要在每天晚上想想自己学了些什么,还有些什么相关的东西需要掌握,自己对什么最感兴趣,在一本书上花的时间太长还是不够等等。同时也应该多想想未来最有可能出现的应用,这样能够让你不是追赶技术潮流而是引领技术潮流。同时,努力使用现在已经掌握的技术和理论去制作具有一定新意的东西。坚持这样做能够让你真正成为一个软件“研发者”而不仅仅是一个CODER。
  
  把最多的时间花在学习上

  这是对初学者最后的忠告。把每个星期玩CS或者CS的时间压缩到最少,不玩它们是最好的。同时,如果你的ASP技术已经能够来钱,甚至有公司请你兼职的话,这就证明你的天分能够保证你在努力的学习之后取得更好的收益,你应该去做更复杂的东西。眼光放长远一些,这无论是对谁都是适用的。
……我们要昂起不屈的头颅,挺起不屈的脊梁,燃起那颗炽热的心,为了明天,充满希望地向前迈进!……

TOP

我感觉这个人进入编程的惯性思维!
提倡使用学校教育网网站
http://www.hitwh.edu.cn

TOP

我认为不是程序员得把这种小算法搞透……



凡是计算机专业的都得学好……

TOP

以后要是我去面试  会不会也考我的编程啊! 再仔细读读
……我们要昂起不屈的头颅,挺起不屈的脊梁,燃起那颗炽热的心,为了明天,充满希望地向前迈进!……

TOP

好麻烦~

TOP

发新话题