推薦《程式設計之美》
我很早知道鄒欣計畫要寫這樣一本書,也能夠預計到這本書定會廣受歡迎,因為它符合當前大量求職人員的需求,畢竟於他們而言,誰不想知道微軟亞洲研究院在招人時候問些什麼問題呢。另一方面,把考察軟體技術人員專業知識和相應技能的各種手段加以歸納和整理,這本身也是對業界的貢獻,所以,我相信,一旦這本書如計畫般完成,其對業界的影響將是深遠的。
在我的面試經歷中,通過一些具體的程式問題來考察人,往往是最有效的,即使是一些人所皆知的問題,也往往能夠挖掘出被面試者的亮點或弱點,原因在於,每個問題都有不同層次的解答之辭,面試者總是可以刨根究底地問下去。我們在看一段程式的時候,思路固然重要,細節也是不可忽視的,比如整數是否越界、指標是否為空,等等。這些細節可以用於考察基本功,毫無疑問,基本功不紮實的人通常很難得到面試者的青睞。
當拿到這本書的樣稿時,我迫不及待地放下手頭工作,閱讀起來。有些題目的內容會引起強烈的共鳴,尤其是那些自己非常熟悉並且又深知解答的題目;也有一些題目讓我異常驚詫,原來除了我所知道的解答思路之外,還有更好的解答以及更深層次的原因。還有一些題目是從來沒想到過的。閱讀過程是一次愉快的享受,也是腦細胞持續活躍的過程。
充滿好奇心的人們總是能從生活的點點滴滴中想到或找到各種優化的餘地,比如說,樓宇中的電梯常常顯得很「傻」(微軟研究院所在的希格瑪大廈的電梯是乙個典型的例子),更智慧型或更有效的排程策略完全有可能;近距離內的交通燈聯動可以有效地提高行車效率。程式設計師在玩電腦遊戲的時候常常會想著怎麼自動完成一些過程,比如說,本書中提到的俄羅斯方塊遊戲中如何有效地旋轉和移動可快速地消除積木塊、24點遊戲如何自動求解、推箱子遊戲如何自動求解,掃地雷遊戲如何自動完成,等等。實際上,這些自然的疑問正是訓練程式能力的好**,本書採錄了不少此類題目。因此,閱讀本書可以滿足很多人的好奇心,這也正是我自己的體會。
儘管作者在前言中聲稱「雖經過幾輪審核,不少解法仍可能有漏洞或錯誤」,但事實上,在絕大多數題目的講解中,作者已經由淺入深地把問題分析透了,而且,作者也為讀者指出了進一步思考這些題目的方向。不同背景的人在看到這些題目的時候,可能會有不同的解法,甚至完全不同的思路。舉例而言,鄒欣曾經問過我如何控制cpu佔用率曲線的問題,我當時的直覺是,直接擷取taskmgr呼叫的相關api函式,從而達到隨意控制cpu佔用率曲線的目的。顯然這不是規範的做法,本書的分析揭示了這個問題背後的本質道理以及考問要點。另一種情況,即使有的問題你深知其理,但看過本書仍然很有收穫。例如,在斐波那契數列問題中,我知道直接遞迴法的缺陷,也知道如何簡化成迭代法來改進效率,還會推導通項公式,但是,書中的細緻講解仍然讓我對這個問題有了更進一步的認識。這是本書的深度所在,如果讀者更加在意所選題目背後的深層次道理,相信書中的講解不會讓你失望。
除了趣味性以外,本書中的題目講解之中也融入了大量專業知識。這使得本書可以作為計算機資料結構課程或演算法課程的輔助參考書。比如,有些問題的解答涉及到貪心演算法或動態規劃方法,演算法的複雜度分析更是無處不在。資料結構教科書中介紹的鍊錶(list)、佇列、hash表和二叉樹等常用資料結構也多有提及。因此,對於正在學習資料結構或演算法課程的學生來說,本書中的問題正是對課程中所學知識的一次檢閱,通過本書他們可以看到這些知識是如何用於解決實際問題的。從我自己的教學經驗來看,這樣的題解分析有助於提高學生的學習興趣。
另一方面,閱讀本書也需要有必要的計算機演算法和程式設計知識作為基礎,否則閱讀的效果會大打折扣。
我大致了解本書的成書過程,從策劃階段到題目收集,再到成稿和改稿,我能體會到鄒欣和他的寫作團隊傾注了大量的精力來寫作這本書。他們盡了最大的努力來編寫這本書,無論是原創的題目,還是傳統的題目,他們都努力把題目分析透徹並提供擴充套件思考的餘地。
鄒欣在傳送樣稿給我的信中說道:「
our goal is to ship a top quality book. i can't say "world class", but definitely "best in china" level.
」以我閱讀這本書的體會來講,他們做到了這一點。我相信,這本書的出版會符合我當初的預期,它會影響到很多人。
潘愛民2023年2月
程式設計之美 推薦序
我在卡內基梅隆大學畢業找工作的時候,經常和其他同學一起交流面試的經驗。當時 聞面色變 的公司有微軟,研究所有dec的src。每次有同學去微軟或src 面試回來都被其他人追問有沒有什麼有趣的面試題。我也是那時第一次聽說下水道井蓋為什麼是圓的。我 自己申請微軟美國研究院時被面試了兩天,見了15個人,感覺...
程式設計之美摘錄
第1章 遊戲之樂 遊戲中碰到的題目 1.1讓cpu佔用率曲線聽你的指揮 int main return 0 解法二 使用gettickcount 和sleep 解法三 能動態適應的解法 1.2中國象棋將帥問題 1.3一摞烙餅的排序 1.4買書問題 1.5快速找出故障機器 1.6飲料供貨 1.7光影切...
程式設計之美 2 2
1 階乘確實是乙個讓人頭疼的問題,其本身的實現很簡單,它的問題在於結果膨脹式的增長會造成n!的結果的溢位。2.2給出了幾種從數學角度出來的思路,可以避免上面的問題發生。首先要清楚的乙個問題就是質因數分解 給定任意乙個整數w,那麼w一定可以分解成w 2 x 3 y 5 m 這種形式,這個數學理論是解決...