- 相關(guān)推薦
一位大四程序員的面試經(jīng)歷和體會(huì)
1.面試經(jīng)過(guò)
大約在年前我接到了臺(tái)灣瑞晟(Realtek)蘇州公司的面試通知,通知我2月21日到蘇州工業(yè)園區(qū)面試,接到面試后的幾天我把一些專業(yè)課溫習(xí)了一遍,特別是C++和數(shù)據(jù)結(jié)構(gòu),由于大學(xué)幾年里,我一直專研這些方面,加上通過(guò)了高級(jí)程序員的考試,對(duì)于一些常用的算法我差不多也 達(dá)到了爛熟于胸的地步,當(dāng)時(shí)的感覺(jué)是如果問(wèn)了我這些方面的問(wèn)題我應(yīng)該是沒(méi)有問(wèn)題的!
21日那天我被安排在4:30面試,由一位技術(shù)人員單獨(dú)給我面試,在問(wèn)了一些簡(jiǎn)單的問(wèn)題之后 ,他給我出了一道編程題目,題目是這樣的:
(由于具體面試的題目比較煩瑣,我將其核心思想提取出來(lái)分解成……(亂碼)
1) 寫(xiě)一個(gè)函數(shù)計(jì)算當(dāng)參數(shù)為n(n很大)時(shí)的值 1-2+3-4+5-6+7……+n
哼,我的心里冷笑一聲!沒(méi)想到這么簡(jiǎn)單,我有點(diǎn)緊張的心情頓時(shí)放松起來(lái)!
于是很快我給出我的解法:
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;
}
搞定!當(dāng)我用期待的目光看著面試官的時(shí)候,他微笑著跟我說(shuō),執(zhí)行結(jié)果肯定是沒(méi)有問(wèn)題!但當(dāng)n很大的時(shí)候我這個(gè)程序執(zhí)行效率很低,在嵌入式系統(tǒng)的開(kāi)發(fā)中,程序的運(yùn)行效率很重要,能讓CPU少執(zhí)行一條指令都是好的,他讓我看看這個(gè)程序還有什么可以修改的地方,把程序優(yōu)化一下!聽(tīng)了這些話,我的心情當(dāng)時(shí)變的有點(diǎn)沉重,沒(méi)想到他的要求很嚴(yán)格,之后我對(duì)程序 進(jìn)行了嚴(yán)格的分析,給出了改進(jìn)了的方案!
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;
}
雖然我不敢保證我這個(gè)算法是最優(yōu)的,但是比起上一個(gè)程序,我將所有涉及到乘法指令的語(yǔ)句改為執(zhí)行加法指令,既達(dá)到要題目的要求而且運(yùn)算時(shí)間上縮短了很多!而代價(jià)僅僅是增加了一個(gè)整型變量!但是我現(xiàn)在的信心已經(jīng)受了一點(diǎn)打擊,我將信將疑的看者面試官,他還是微笑著跟我說(shuō):“不錯(cuò),這個(gè)程序確實(shí)在效率上有了很大的提高!”我心里一陣暗喜!但他接著說(shuō)這個(gè)程序仍然不能達(dá)到他的要求,要我給出更優(yōu)的方案!天啊!還有優(yōu)化!我當(dāng)時(shí)真的有點(diǎn)崩 潰了,想了一會(huì)后,我請(qǐng)求他給出他的方案!然后他很爽快的給出了他的程序!
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;
}
搞笑,當(dāng)時(shí)我目瞪口呆,沒(méi)想到他是這個(gè)意思,這么簡(jiǎn)單的代碼我真的不會(huì)寫(xiě)嗎,但是我為什么沒(méi)有往那方面上想呢!他說(shuō)的沒(méi)有錯(cuò),在n很大很大的時(shí)候這三個(gè)程序運(yùn)行時(shí)間的差別簡(jiǎn)直是天壤之別!當(dāng)我剛想開(kāi)口說(shuō)點(diǎn)什么的時(shí)候,他卻先開(kāi)口了:“不要認(rèn)為CPU運(yùn)算速度快就把所有的問(wèn)題都推給它去做,程序員應(yīng)該將代碼優(yōu)化再優(yōu)化,我們自己能做的決不要讓CPU做,因?yàn)镃PU是為用戶服務(wù)的,不是為我們程序員服務(wù)的!”多么精辟的語(yǔ)言,我已經(jīng)不想再說(shuō) 什么了!接著是第二個(gè)問(wèn)題:
他要求我用一種技巧性的編程方法來(lái)用一個(gè)函數(shù)實(shí)現(xiàn)兩個(gè)函數(shù)的功能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!
現(xiàn)在用一個(gè)函數(shù)fn(int n,int flag)實(shí)現(xiàn),當(dāng)flag為0時(shí),實(shí)現(xiàn)fn1功能,如果flag為1時(shí)實(shí)現(xiàn)fn2功能!他的要求還是效率,效率,效率!說(shuō)實(shí)在話,如果我心情好的話我應(yīng)該能給出一種比較好的算法,但我那時(shí)真的沒(méi)有什么心思再想了,我在紙上胡亂畫(huà)了一些諸如6!=6*5!的公式后直截了當(dāng)?shù)母f(shuō)要他給出他的答案!面試官也沒(méi)有 說(shuō)什么,給出了他的思路:
定義一個(gè)二維數(shù)組 float t[2][5]存入[2!,3!,4!,5!,6!},{5! ,6! ,7!,8!,9!]然后給出一個(gè)循環(huán):
for(i=0;i<6;i++)
{
temp=temp+n/t[flag][i];
}
最后得到計(jì)算值!呵呵,典型的空間換時(shí)間的算法!
這些總共花了50分鐘的時(shí)間,還有十分鐘我就跟他很隨意的聊聊天,聊了一些編程以及生活 的問(wèn)題,那時(shí)的我已經(jīng)很放松了,因?yàn)槲抑肋@次面試結(jié)果只有一個(gè):失敗。5:30的時(shí)候面試官要我等通知,于是我離開(kāi)了他們公司。這就是面試的整個(gè)經(jīng)過(guò)!
2.由面試想到的
真的是很失敗啊!我記得那天下好大的雨,氣溫也很低,我邊走邊想,從5:30一直走到7:30 ,全身都濕透了,又冷又餓,但是我只是一直走,腦子里面充滿了疑惑,我也想讓雨把自己淋醒!看到這里有些朋友可能覺(jué)得那些面試題目不算什么如果讓自己做的話肯定能全部答對(duì),我肯定相信你,因?yàn)槲覐奈磻岩蛇^(guò)中國(guó)程序員的能力,我認(rèn)為中國(guó)有世界上最好的程序員,我也從未認(rèn)為自己是高手,所以我做不出來(lái)不代表中國(guó)程序員比臺(tái)灣或者別的地方的程序員差,所以我就從我的角度,我的所見(jiàn)所想來(lái)談一些感想:
不錯(cuò)全世界都有優(yōu)秀的程序員,中國(guó)也不例外,但是我疑惑的是:到底中國(guó)和臺(tái)灣或者國(guó)外的優(yōu)秀的程序員的比例到底是多少?臺(tái)灣我不知道,中國(guó)100個(gè)程序員里有幾個(gè)是優(yōu)秀的呢?我根本算不上,從上面的表現(xiàn)就足以說(shuō)明一切了!是1個(gè)?5個(gè)?10個(gè)?50個(gè)?這個(gè)數(shù)字我不敢亂猜,恐遭網(wǎng)友一頓痛罵,那么我們國(guó)內(nèi)有多少人學(xué)習(xí)計(jì)算機(jī)呢?拿我們學(xué)校來(lái)說(shuō),計(jì)算機(jī)97級(jí) 4個(gè)班,98級(jí)5個(gè)班,99級(jí)10個(gè)班,2000級(jí)17個(gè)班,人多了,老師怎么辦?我們學(xué)校的做法是讓研究生上課,然后呢?補(bǔ)考一抓一大把,大把大把的補(bǔ)考費(fèi)落入了學(xué)校的口袋,還說(shuō)現(xiàn)在的學(xué)生素質(zhì)低!真是好笑,我都不知道學(xué)校這么做是為了什么,為國(guó)內(nèi)培養(yǎng)大量的程序員嗎?學(xué)生 們能真正學(xué)到計(jì)算機(jī)知識(shí)嗎?好了,我敢講,在我們學(xué)校學(xué)習(xí)編程學(xué)生和優(yōu)秀程序員(注意我指的是優(yōu)秀,只會(huì)編幾個(gè)糟爛程序的人算不上)的比例應(yīng)該是100:0.1 在這種比例下雖然我們中國(guó)學(xué)習(xí)編程的人鋪天蓋地,但是想想有多少個(gè)人能真正為中國(guó)軟件 業(yè)發(fā)展作出貢獻(xiàn),有多少人能真正寫(xiě)出優(yōu)秀的程序名揚(yáng)海外!
我從學(xué)習(xí)編程以來(lái),不管是自學(xué)還是老師指導(dǎo),從來(lái)都是解決問(wèn)題就好,編出程序來(lái)就行,我的疑惑是:我們有真正的強(qiáng)調(diào)過(guò)程序的效率,程序的質(zhì)量嗎?我們有仔細(xì)分析過(guò)我們寫(xiě)的東西,看看有沒(méi)有可以改進(jìn)的地方,看看有沒(méi)有簡(jiǎn)單的方法來(lái)達(dá)到同樣的目的呢?我問(wèn)心自問(wèn),我發(fā)現(xiàn),我從來(lái)沒(méi)有對(duì)我寫(xiě)出來(lái)的程序進(jìn)行過(guò)優(yōu)化,最多就是進(jìn)行詳細(xì)的測(cè)試,然后Debug, 但是這就足夠了嗎?
這些天我偶爾發(fā)現(xiàn)我曾經(jīng)寫(xiě)過(guò)的一個(gè)游戲,那是一年做為 其中一員時(shí)候,感覺(jué)應(yīng)該拿點(diǎn)東西出來(lái),然后花了一個(gè)星期的時(shí)間寫(xiě)出來(lái)的!程序不算復(fù)雜,但是用到了不少數(shù)據(jù)結(jié)構(gòu)的東西,也用到了一些精彩的算法,加上windows的界面和游戲的可 玩性,寫(xiě)完后受到了不少好評(píng),我當(dāng)時(shí)真的很佩服自己!
但是現(xiàn)在看呢:沒(méi)有一句注釋,好多 丑陋的函數(shù)名比如:void chushihua(),好多沒(méi)有必要的變量,可以用簡(jiǎn)單語(yǔ)句完成工作的我使用華麗的算法,大量使用全局變量…..,說(shuō)不好聽(tīng)的話,六百多行的程序除了能運(yùn)行之外就是一陀屎!如果一年前我能聽(tīng)到一些反面意見(jiàn)的話,大概我能早一點(diǎn)覺(jué)悟,但是自原代碼在 網(wǎng)站發(fā)布以來(lái)聽(tīng)到的都是贊美之詞,沒(méi)有一個(gè)人向我提出程序改進(jìn)的意見(jiàn),這又說(shuō)明了一個(gè)什 么問(wèn)題呢?很值得思考啊!
還有一個(gè)疑惑是:我們說(shuō)的和做的真的一樣嗎?我在學(xué)校的時(shí)候曾經(jīng)受學(xué)院指派承辦過(guò)一個(gè)計(jì)算機(jī)大賽,請(qǐng)了一個(gè)老師出決賽的題目,主要是一些算法題目,這個(gè)老師可能是我上大學(xué)以來(lái)唯一敬佩的老師了,從程序調(diào)試到打分,對(duì)于每個(gè)程序都仔細(xì)分析其時(shí)間效率和空間效率,然后綜合打分,四十個(gè)人的卷子,老師從下午三點(diǎn)一直調(diào)試到晚上十點(diǎn),在有些寫(xiě)的精彩的語(yǔ)句后還加上批注。我真是高興很遇到這樣的老師并且和他做深入的交流,但在事后,卻發(fā)生了一件不愉快的事,在比賽中獲得第二名的學(xué)生找到我,說(shuō)他程序全部調(diào)試成功應(yīng)該給他滿分,并且應(yīng)該得第一,我說(shuō)不過(guò)他,最后調(diào)出了他的原程序和第一名的原程序?qū)Ρ,錯(cuò),兩個(gè)程序都運(yùn)行的很好,這時(shí),那個(gè)同學(xué)開(kāi)口了:“我的程序?qū)懙氖趾?jiǎn)捷明了,僅僅數(shù)行就完成了題目要求,而他的卻寫(xiě)了一大堆,為什么給他的分多過(guò)給我的分。”我當(dāng)時(shí)很是氣憤,如果不是老師負(fù)責(zé)的話,那么現(xiàn)在第一名和第二名的位置真的要互調(diào)了,拜托,不是程序的行數(shù)越少程序的質(zhì)量就越高,我記得我跟他大談這方面的道理,最后說(shuō)服他了!哈哈,但是我,只能說(shuō)說(shuō)而已,我不知道還有多少人一樣,說(shuō)起來(lái)頭頭是道,但心里卻壓根就從未重視過(guò)它!
【一位大四程序員的面試經(jīng)歷和體會(huì)】相關(guān)文章:
一位實(shí)習(xí)生面試騰訊的招聘經(jīng)歷03-16
面試與offer 面試經(jīng)歷11-19
成都PS一面面試經(jīng)歷和建議11-20
愛(ài)普生的面試經(jīng)歷11-19
Hulu面試經(jīng)歷11-19
下午的面試經(jīng)歷11-19
網(wǎng)通面試經(jīng)歷11-21
成功的面試經(jīng)歷11-09
沃爾瑪?shù)拿嬖嚱?jīng)歷11-21