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