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