範文齋

位置:首頁 > 職場範文 > 面試

程序員面試寶典及攻略

面試2.84W

猛批爛書 程序員面試寶典 上

程序員面試寶典及攻略

最近看到一本爛書,本來忽略過去就是了,可惜這本爛書還挺流行,爲了阻止它繼續誤人子弟,我不得不花點時間出來,猛批此書,請大家不要上當,買了此書的趕快銷燬不要扔掉,以免別人撿去上當,打算買的先來看看我的意見再做決定,把此書借給別人的趕快要回來銷燬,從別人那裏借了此書的趕快還回並且告訴人家我的意見。

我自己在面試和被面試上都有一些經驗,在本文最後,我會給出自己在這方面的建議,希望能對大家有所幫助,尤其是那些因爲我的文章而放棄了這本爛書的同學,我希望我的建議能填補你這方面的需要。

爛書的書名

中文名:程序員面試寶典

英文名:BEST PRACTICE FOR PROGRAMMER INTERVIEW

(小瀋陽:我的中文名字是 小瀋陽,英文名字是 Xiao Shen Yang)

爛的原因

這本書的目的是賺錢,完全不是爲了提高大家的面試筆試水平,所以出現下面的情況,也是理所當然的了:首先,這本書名字起的好,營銷也做的好,否則不會這麼流行;可惜內容不好,屬於有能力沒道德類型的壞人,能力越大,破壞越大。其次,這本書基本上是以一種應對考試的方式來應對找工作的筆試和麪試,剛剛從學校出來的同學們正是考試的好手,如果還以這種心態來應對筆試面試後果是很不妙的。最後,這本書當中講解的東西大部分基礎簡單的內容都是對的,比較高級的內容偏偏是錯的,屬於隱蔽的很深的壞人,倒黴了還不知道是誰幹的,最壞。

這本書我隨便翻了翻,幾乎氣死,哪裏有這樣介紹東西的?自己都是一知半解,就來編制寶典,真個是以己之昏昏明人之昭昭啊。還忽悠那麼多剛剛或者即將步出校門的同學從微薄的生活費裏擠出三十九塊錢買來上當。編書的賺到錢了,同學們找不到工作他們可不管本來我也不用管,可是我的女朋友也在找工作,也買了這本爛書(可以吃多少個排骨啊!),我就不能不管了!

下面,我會把這本書當中的錯誤、混亂、語無倫次、矇混過關之處,只選擇我隨便翻翻出來的一小部分羅列出來,讓大家看看這本書的真面目是如何的爛。這並不是說這本書就只有我列出來的這些問題,還有更多我看到了沒有寫(沒功夫,也不想把他們教聰明瞭),更多更多的是我沒發現的。另外,我個人只對C/C++/STL有深入的認識,所以,我也只對這方面揭批一下,請對其他方面精通的好同志在其他地方揭批其他方面,也請精通C/C++/STL的好同志對我的錯誤不吝賜教。

爛的方面

對第六章到第九章,我隨手翻了翻,第十章我看的比較仔細,因爲我對C++面向對象很感興趣。後面的,由於第十章裏面錯誤太多,我沒有看以免氣到自己(很多地方寫的,態度非常成問題!完全是在敷衍,我真懷疑他們寫這麼一厚本書花的心思,有沒有我寫這篇短文的心思多?)

6.4 內聯函數和宏定義,在這一個小節當中的問題如下:

首先,這個小節的寫作態度不認真水平很馬虎:這個小節大概是在網上搜了搜關於inline和宏就寫完了,所以只是語無倫次的介紹了基本概念,但是沒有涉及任何高級特性他們絕對不是爲了避免讀者無法理解而不涉及高級特性的,而是他們自己不懂,否則的話,我不相信這幫人會不抓緊賣弄一下自己的“學識”。如果你想知道這個小節有多垃圾,就去看看msdn上關於inline的介紹,或者TPCL當中對inline的介紹就可以了。

其次,羅嗦得語無倫次且不着重點:內聯函數和宏定義的區別,大概只要幾句話就可以說清楚,這本書用了幾段話反而說糊塗了,而且最重要的一句話,沒說(參見第五)。

第三,把清楚的解釋糊塗了:原文當中有這樣一句“對於短小的代碼來說,inline可以帶來一定的效率提升,而且和C時代的宏函數相比,inline更安全可靠。可是這個是以增加空間消耗爲代價的。”按照這兩句話的意思,inline增加空間消耗換來的是比宏更加安全?知道的自然明白是書上漏了一句話,不知道這不就被蒙了?讀爛書還是馬虎點好,不是被蒙就是被氣。實際情況是,inline增加空間消耗換來的是效率提高,這方面和宏是一模一樣的,但是inline在和宏相比沒有付出任何額外代價的情況下更安全。

第四、例子像漿糊一樣,註釋像例子一樣:唯一的一個例子,我不厭其煩的抄錄如下、

inline fac(float i) {return i * i};//沒有寫返回值

printf("bb = %d", fact(8));//調用時就是執行printf("bb = %d", 8 * 8);

這個例子和其中的註釋,想說明什麼問題?能說明什麼問題?

我估計,想說明的問題是inline和宏一樣可以展開,但是那個自作聰明的註釋,實在費解,幹嘛不寫返回值?在華爲這樣寫函數連看門的大爺都會上來鄙視一下,這本書裏還當例子拿出來。我估計寫這個例子的作者,根本不知道如果一個函數不寫返回值的話編譯器是如何處理的(本科二年級C語言80分以上的都應該知道),他的意圖是向讀者展示inline函數確實僅僅是擴展開,即使沒有返回值也沒有關係,因爲inline函數僅僅擴展開就可以了,不需要返回值他的意圖完全錯誤。而且,調用時候執行的根本不可能是註釋當中寫的那樣,也根本不是例子裏面展示的那樣會展開,具體如何,請看第五條罪狀。

第五、inlinle函數最重要的一個特性沒有說到:這個特性是什麼?請你自己先寫一個程序(或者複製我的):

#include

inline int fact(int i) { return i * i;}

int main()

{

printf("%d", fact(8));

}

把這個程序在VS2003當中編譯一下,然後分別在Debug和Release模式下進行調試,斷點放在printf那一行,程序暫停以後點擊右鍵,選擇“Go to disassemlby”,進入到彙編碼,在Debug模式下,你會看到這樣的情況:、

printf("%d", fac(8));

00411D3E push 8

00411D40 call fact (41168Bh)

00411D45 add esp,4

00411D48 push eax

00411D49 push offset string "%d" (42B01Ch)

00411D4E call @ILT+1500(_printf) (4115E1h)

00411D53 add esp,8

在release下你會看到這樣的情況:

printf("%d", fac(8));

00401000 push 40h

00401002 push offset string "%d" (4060FCh)

00401007 call printf (401012h)

0040100C add esp,8

如果你還沒有體會出來,提示一下,在debug模式下有一個call fact,fact?怎麼那個inline函數被調用了?不是說展開麼?但是在release模式下,你看到8 * 8了沒?只有一個40h,把這個十六進制的數字換算成十進制同樣,爲什麼也沒有展開呢?總之,是沒有按照那本書例子當中註釋說的執行,爲什麼呢?

原因在msdn裏說的很清楚:The ion (called inline expansion or inlining) occurs only if the compiler's cost/benefit analysis show it to be profitable. 編譯器只在計算之後認爲值得的時候纔會擴展inline函數。

這麼小一個知識點就能犯這麼多錯誤,也只有這本爛書能做到了。

7.1節 面試例題3

這只是一道例題,但是非常典型的展示了這本書是如何的避重就輕的解釋問題和作者自己的C++真實水平。題目如下:

Which of the following is NOT true about the "this" pointer of class X?

A. It lets each object of class X to access its address. (讓X類的每一個對象指向它的地址)

B. It will be implicitly passed as argument of every non-static member function of class X. (可以隱性傳遞this指針)

C. It can not be used explicitly in memeber function of class X. (不能在類的成員函數裏明確的聲明)

D. Its type is const X* in const member function of class X. (它是常量函數中的一個常量指針)

答案是C,原書的解釋我就不抄了,僅僅解釋了this的用法,還給出了一段完全不着調的例程,對於問題當會考察的`四個要點,都沒有介紹原因,僅僅解釋了一下this的用法,就算解析完成了?這和告訴讀者,this指針的拼寫是t-h-i-s有什麼區別?這還不是最大的問題。

最大的問題在於添加的那些翻譯,這些翻譯是書的作者添加的,不是我加的。如果對着那些翻譯,你能選出C來嗎?ACD都可以選,B之所以不選是因爲不知所云。我來給個翻譯:

A. this指針讓X類的對象能夠訪問自己的地址(關鍵點:every和each的區別,access的詞義)

B. this指針會被隱性的當作一個參數傳遞給X類的每一個非靜態函數(關鍵點:翻譯以前要看懂原文)

C. this指針不能在X類的成員函數裏顯式聲明(關鍵點:恰當使用專業術語,漢語可以沒有賓語但是不能沒有主語)

D. 在X類的經過const修飾的成員函數裏,this指針的類型是const X*(關鍵點:翻譯以前不可以誤解原文)

想到6.4節裏那個莫名其妙的註釋,這裏出現歪曲原意的翻譯也是很自然的了,這幫人莫非是用金山快譯翻譯的?還是盜版的?

8.1節 面試例題1

這個題目給出了一個計算階乘的例子程序,是錯的,首先編譯無法通過,有語法錯誤;其次邏輯有錯誤,沒人能預料到它的輸出是什麼;最後編碼風格很爛,這樣寫代碼的人,只能去此書編輯部上班,其他公司都不會要的總之錯的我很無語,這還是示例,我看這是典型錯誤示例還差不多!寫出這樣程序的人,需要回爐重造,從if-else開始重學四年編程再說;而把這樣程序當例子做示範的人麼,只能去編書,對,就是編一本英文名字是“BEST PRACTICE FOR PROGRAMMER INTERVIEW”的書。

來吧,買書了的請把書翻到83頁,看“答案”兩個字下面的東西;沒書的看這裏,我抄上來了:

int n,t;

int find(int n);

{

if (n=1) t=1;

else

{

return find (n-1) * n;

}

}

main()

{

cin >> n;

find(n);

printf('N!=', t:1:0)