Author: Fox
昨天越俎代庖面試了一個(gè)家伙。
看完了他的筆試題目,感覺(jué)后背有點(diǎn)涼,但這些東西看看也就過(guò)去了,說(shuō)實(shí)話,那些C++的題目多少有點(diǎn)BT。
但我一直覺(jué)得DS的東西,如果你當(dāng)初學(xué)的時(shí)候是很認(rèn)真學(xué)習(xí)過(guò)并思考過(guò)的,其實(shí)是不需要去記憶的,所以我就問(wèn)了一個(gè)關(guān)于穩(wěn)定排序和不穩(wěn)定排序的問(wèn)題。我想,只要你理解了各種排序算法的思想,很easy。
只是這哥們兒忘記了什么是穩(wěn)定排序,我還以為他把快速排序、堆排序當(dāng)作穩(wěn)定排序只是沒(méi)記住。看來(lái),老師從小教育的"一道題目你即使不會(huì)也要盡量去答"這種思想遺毒頗深。如果抱著這種思想做程序員,公司多半要垮掉。
想一想穩(wěn)定排序的概念吧:兩個(gè)同值元素(不知為什么,我一直記得嚴(yán)老師書(shū)上用的是49,看來(lái)我還是在讀死書(shū)、死讀書(shū),最后可能會(huì)讀書(shū)死L)在排序前后相對(duì)位置保持不變,即本來(lái)在前面的還在前面(所謂"塵歸塵,土歸土",看來(lái)最近思想有點(diǎn)消極,難怪沒(méi)有激情L)。再想想各種排序的思想,我們很容易得到這樣的結(jié)論:最普通的O(n2)的算法,一個(gè)一個(gè)從前比到后,自然不會(huì)影響到同值元素的相對(duì)位置,而O(nlogn)的算法,由于多路比較,可能導(dǎo)致本來(lái)相對(duì)位于后面的元素先比較和移動(dòng),造成不穩(wěn)定。這樣一想,自然知道簡(jiǎn)單的插入、選擇、歸并排序都是穩(wěn)定的,而改進(jìn)的高效率的算法則不穩(wěn)定。
后面另一個(gè)同事在詢問(wèn)他做的Demo的事情,因?yàn)槭荄X的東西,我不懂,沒(méi)插嘴,就隨便看他的簡(jiǎn)歷。
看到其中一項(xiàng),有提到他曾經(jīng)給大一、大二的學(xué)生做過(guò)C++培訓(xùn)。我本沒(méi)打算提他筆試中的C++部分的,但既然曾經(jīng)為人師表(因?yàn)槲以?jīng)做過(guò)學(xué)生、也做過(guò)老師),C++基礎(chǔ)掌握到這種程度就不對(duì)了。尤其對(duì)于一個(gè)空的C++類默認(rèn)生成哪些成員函數(shù)居然寫的一塌糊涂(友情提示:你也不用BS他,如果你沒(méi)有看過(guò)Lippman的《Inside of the C++ Object Model》,建議你先不要發(fā)言J)。
我一般對(duì)語(yǔ)言特性不太敢發(fā)表觀點(diǎn)(因?yàn)槲业腃++基礎(chǔ)不扎實(shí)L),但我對(duì)簡(jiǎn)單的算法或思想小有興趣(沒(méi)有你想象中那么高)。可是,筆試中唯一的一個(gè)需要coding的題目他又沒(méi)寫。我只好說(shuō),C++的東西你掌握怎么樣我也可以不看,但這個(gè)memcpy的實(shí)現(xiàn),你怎么也得有點(diǎn)想法吧?不然怎么去寫代碼呢?剛好在面他之前,還和同事討論過(guò)memcpy的問(wèn)題(如果你給出one byte by one byte的實(shí)現(xiàn)會(huì)遭BS的J,因?yàn)槟憔尤粵](méi)有考慮過(guò)計(jì)算機(jī)系統(tǒng)本身的數(shù)據(jù)處理)。
本來(lái)還想問(wèn)他一個(gè)關(guān)于sizeof()的問(wèn)題,后來(lái)覺(jué)得也沒(méi)什么必要,關(guān)于union的對(duì)齊,要按照單位最長(zhǎng)的成員對(duì)齊這一點(diǎn)自己都覺(jué)得有點(diǎn)BT就算了。
其實(shí),我想說(shuō)的是,很多東西,你不能認(rèn)為你掌握的很好(除非你真的掌握的很好),所謂很好,拿C++來(lái)說(shuō),就是把你認(rèn)為你好的地方,你可以不翻其他東西,把它寫下來(lái),基本跟ISO C++保持90%以上的相似度就可以了。當(dāng)然,這樣說(shuō)有點(diǎn)賤了。
畢竟,做游戲程序員(其他也差不多吧)需要的是:
帶著激情去編碼,帶著虛心去學(xué)習(xí),帶著挑戰(zhàn)去交流,帶著壓力去工作。
激情,能讓你的思維滿具創(chuàng)意,代碼極其飄逸;
虛心,能讓你的知識(shí)不斷積累,從而達(dá)到厚積薄發(fā);
挑戰(zhàn),能讓你的團(tuán)隊(duì)充滿活力,交流活潑嚴(yán)謹(jǐn);
壓力,能讓你的心態(tài)保持平衡,勝不妄喜,敗不惶餒。
因?yàn)樽约哼@兩周心態(tài)受到非智力因素干擾,日子過(guò)得有點(diǎn)渾噩。寫下來(lái),主要是為了放松一下,也提醒自己。
不怕無(wú)知,但怕無(wú)畏。
-----------------------------------------------------------------
PS:補(bǔ)記于2008/03/26
還是把上午寫的一個(gè)mymemcpy放上來(lái)吧。里面沒(méi)有對(duì)des < src + len的重疊情況進(jìn)行討論,因?yàn)榇笾耮oogle了一下,似乎很少人這樣做(倒不是因?yàn)椴荒軐?shí)現(xiàn))。
void *mymemcpy( void *src, void *des, size_t len )
{
?char *tempsrc = (char *)src;
?char *tempdes = (char *)des;
?size_t offset = len / 4;
?for( size_t i=0; i<offset; ++i )
?{
??*(unsigned long *)tempdes = *(unsigned long *)tempsrc;
??tempdes += sizeof(unsigned long);
??tempsrc += sizeof(unsigned long);
?}
?
?offset = len - len % 4;
?for( size_t i=0; i<offset; ++i )
?{
??*tempdes++ = *tempsrc++;
?}
?return des;
}
剛才想求證一下memcpy在地址重疊的情況下,是否會(huì)考慮從后往前copy的情況。結(jié)果看到云風(fēng)的blog上很早的一篇文章,也是講memcpy的,角度不同。
我想澄清一點(diǎn),我寫這篇blog的初衷只是總結(jié)幾個(gè)技術(shù)問(wèn)題,因此就沒(méi)有把面試的前因后果講一下,反倒讓很多朋友誤解,以為我怎么怎么樣了。
事實(shí)情況是,這幾個(gè)問(wèn)題都是本來(lái)的筆試題目當(dāng)中的,面試的TX從上午10:00前后做到11:30過(guò),等我和另一個(gè)同事13點(diǎn)過(guò)去的時(shí)候,我一直沒(méi)怎么說(shuō)話。只是在一邊看他的簡(jiǎn)歷和題目,文中已經(jīng)說(shuō)了,是看到他的簡(jiǎn)歷之后才提的問(wèn)題。當(dāng)時(shí)是有10道左右的C++題目,他做對(duì)的其實(shí)只有一道。
而且,我在提問(wèn)題的時(shí)候也都將問(wèn)題跟他一起分析了的(除了memcpy之外),自我感覺(jué)說(shuō)話還是很得體的,寫文章的風(fēng)格是另一碼事兒。
我沒(méi)有絲毫瞧不起這位TX的意思,也完全沒(méi)有顯擺的想法。
PS
:忽然想到自己最近為什么癖性十足,因?yàn)樽罱陉P(guān)注一個(gè)家伙的
Blog
,如果不侵權(quán),我想用用他的
Blog
的名字《
不許聯(lián)想
》,作者是帶三個(gè)表的王小峰(《三聯(lián)生活周刊》記者)。所以,如果有人想拍我,建議先看看他的東西,學(xué)習(xí)一下措辭
J
。一個(gè)同事,說(shuō)天涯也行,我個(gè)人覺(jué)得天涯有點(diǎn)相互吹捧的味道。
惡心,但沒(méi)有惡意
J
。