
破解程式面試
蓋兒.拉克曼.麥道爾
內容重點
透過這本完整的指南,深入探索程式設計的世界。書中提供 189 道程式題目的解答,幫助你為各種程式面試做好準備。
您將學到
重點
01這不是考試,是場有規則的遊戲
欸,你是不是也這樣想過?「我學校成績不錯啊,專案也做得很用心,為什麼每次去面試那些大公司,總是在白板題那一關就卡住了?」或者,「面試官問的那些題目,什麼反轉二元樹、尋找陣列中點,這在平常工作根本用不到啊!到底是在考什麼啦?」 如果你有這些疑問,恭喜你,你不是孤單的。幾乎每一個想挑戰世界頂尖科技公司的工程師,都曾經歷過這種被演算法題目按在地上摩擦的挫敗感。我們在學校學的是知識的深度,是如何把一個系統做得完整、做得穩定。但技術面試,尤其是在那些指標性的大公司,它考的卻是另一種完全不同的能力:在極大壓力下,展現你清晰的邏輯思維、溝通能力,以及解決陌生問題的SOP。 所以,我們首先要建立一個最重要的心態:技術面試不是一場傳統的考試,它更像是一場有明確規則可以遵循的「遊戲」。考試考的是你會不會「答案」,但這場遊戲玩的是你懂不懂「玩法」。你不需要是百年難得一見的程式奇才,但你必須是個懂規則、懂策略的玩家。 那這場遊戲的規則到底是什麼?作者蓋兒.拉克曼.麥道威爾(Gayle Laakmann McDowell)可不是隨便說說的,她自己就曾在谷歌、微軟、蘋果等公司擔任過面試官,面試過上百位工程師。她從面試官的視角告訴我們,當他們給你一道白板題時,他們想看的,從來就不只是一個「正確答案」。 他們真正在觀察的是一整套「表演」: 1. 你聽懂問題了嗎? 你會不會主動提問,釐清問題中模稜兩可的地方?例如,題目說「一個字串」,你會追問「是ASCII還是Unicode?」「需不需要考慮大小寫?」「如果字串是空的怎麼辦?」這展現了你的細心與嚴謹。 2. 你會自己生測試案例嗎? 在動手寫程式之前,你會不會先自己想幾個簡單的、極端的例子來測試自己的想法?例如,輸入是 `[1, 2, 3]`,輸出應該是什麼?輸入是 `[]`(空陣列)呢?輸入是 `[5, 5, 5]` 呢?這代表你具備了測試思維。 3. 你有沒有先求有再求好的概念? 你會不會先提出一個雖然效率不高、但確定能解決問題的「暴力解」,然後再一步步優化它?很多面試者想一步到位,結果卡在那裡動彈不得。先提出一個笨方法,至少證明了你具備解決問題的基本能力。 4. 你懂不懂分析自己的程式碼? 當你寫出一個解法後,你能不能分析它的時間複雜度和空間複雜度(也就是我們常聽到的 Big O)?你知不知道你的解法在哪種情況下會變慢?這是在考察你的電腦科學基礎功。 5. 你的溝通能力如何? 這點超級重要!你能不能在寫程式的同時,像個說書人一樣,清楚地跟面試官解釋你「為什麼」要這樣寫?你的思路是什麼?你卡關的時候,會不會把你的困難點說出來,引導面試官給你提示?一場沉默的白板題,就算最後寫對了,分數也絕對不會高。面試官想找的是未來的同事,不是一個只會埋頭苦幹的獨行俠。 你看,這五個觀察重點,真正寫出「完美程式碼」只佔了其中一小部分。更多時候,面て試官在乎的是你的「思考過程」。這就是為什麼很多人明明在家刷題刷得滾瓜爛熟,一到現場,題目稍微變個花樣就當機了。因為他們背的是「答案」,而不是在練習「玩法」。 把這個觀念轉過來,你就成功了一大半。接下來的每一步準備,都會變得更有方向。你練習的不再只是一道道孤立的題目,而是在模擬一次又一次完整的「面試表演」。你會開始意識到,拿到題目時,第一反應不是「這題我寫過嗎?」,而是「好,表演要開始了。第一步,釐清問題…」。 這本書就像是這場遊戲的攻略本,它把遊戲的每個關卡、每個大魔王(各種資料結構與演算法)、甚至是如何跟NPC(面試官)互動的技巧,都幫你拆解得一清二楚。所以,先深呼吸,放下你對那些演算法題目的恐懼。我們不是要去背誦一本字典,我們是要去學習一套能應對所有挑戰的思維框架。準備好了嗎?我們一起來把這場遊戲打到破關!
02你不是來寫程式的嗎?
「聊聊你遇過最大的技術挑戰是什麼?」 「可以分享一個你跟同事意見不合,最後怎麼解決的經驗嗎?」 「你為什麼想加入我們公司?」 是不是覺得這些問題很耳熟?當你好不容易在白板上寫完一段自認完美的程式碼,心跳還沒平復下來,面試官卻冷不防地拋出這些「軟性問題」,瞬間讓你腦袋一片空白。心裡OS可能是:「等一下,我不是來應徵工程師的嗎?為什麼要問這些像是身家調查的問題?我程式寫得好不就得了?」 如果你真的這麼想,那就太危險了!在科技巨頭的面試流程中,所謂的「行為面試」(Behavioral Interview)跟技術面試佔有幾乎同等重要的地位,有時候甚至更關鍵。為什麼?你想想看,一間公司要找的,是一個活生生的「同事」,而不只是一台會寫程式的機器。他們想知道,你這個人好不好合作?遇到壓力會不會崩潰?有沒有團隊精神?對寫程式這件事有沒有熱情?你的價值觀跟公司的文化符不符合? 這些問題,光從你的程式碼裡是看不出來的。所以,他們才會設計這些情境題,來「挖」出你過去的經驗,藉此預測你未來的行為模式。這就像是透過你的「過去」,來判斷你的「未來」。 面對這類問題,最多人犯的錯就是回答得太過空泛、太過簡短。 例如,面試官問:「可以分享一個你跟同事意見不合的經驗嗎?」 NG回答:「喔…之前有一次跟同事對於要用哪個技術方案有不同看法,後來我們就討論了一下,最後達成共識了。」 這個回答聽起來很安全,但對面試官來說,這等於什麼都沒說。他不知道當時的「情況」有多複雜、你的「任務」是什麼、你採取了什麼具體的「行動」,以及最後產生了什麼「結果」。這完全展現不出你的溝通能力與解決衝突的智慧。 這時候,書中提供了一個超級無敵實用的萬用框架,叫做「STAR原則」。這四個字母分別代表: S (Situation) - 情境: 事情發生的背景是什麼?當時的專案、團隊、時間壓力等客觀環境長什麼樣子?用一兩句話把舞台搭建好。 T (Task) - 任務: 在這個情境下,你被賦予的具體任務是什麼?你的角色與職責是什麼?你要解決的核心問題是什麼? A (Action) - 行動: 這是整個故事的核心!你「個人」採取了哪些具體的步驟來完成這個任務?你說了什麼?做了什麼?你是如何思考的?記得,要強調「我」做了什麼,而不是「我們」做了什麼。 R (Result) - 結果: 因為你的行動,最後產生了什麼具體的、最好是可以量化的結果?專案提早完成了嗎?產品的效能提升了多少百分比?團隊的合作氣氛變好了嗎? 我們把剛剛那個NG回答,用STAR原則重新包裝一次看看: S (情境): 「在我之前的公司,我們正在開發一個新的電商推薦系統。當時我是後端工程師,負責資料處理的部分。我們的時間很緊,要在兩個月內上線。」 T (任務): 「我的任務是設計一個能快速處理使用者行為資料的管線。當時我和另一位資深的同事,對於要使用 Kafka 還是 RabbitMQ 這兩個訊息佇列技術,產生了不同的看法。他比較熟悉 RabbitMQ,認為比較穩定;但我調研後發現,我們的應用場景資料量非常大,Kafka 的吞吐量表現會更好,更適合未來擴展。」 A (行動): 「我沒有直接否定他的想法,畢竟他是資深前輩。我先是花了一個下午,把他提的 RabbitMQ 的優點都整理出來,也承認在某些情境下它確實是更好的選擇。接著,我針對我們『推薦系統』這個特定需求,做了一個小型的效能測試(PoC),用數據證明在模擬我們預期的流量下,Kafka 的處理速度是 RabbitMQ 的三倍,而且延遲更低。我把這個測試結果、數據圖表,還有我的程式碼整理成一份簡短的文件,然後主動約他開了個三十分鐘的會議,一對一地跟他解釋我的發現。在會議中,我特別強調我非常尊重他的經驗,只是想從數據角度提供另一個觀點來做對團隊最有利的決定。」 R (Result) - 結果: 「他看完數據後,也同意在我們這個案子裡,Kafka 確實是更未來的選擇。他不但被我說服,還稱讚我做事很嚴謹。後來我們一起合作完成了這個系統,上線後系統的穩定性跟效能都非常好,成功支撐了比預期高出50%的尖峰流量,也為公司帶來了15%的營收增長。這次經驗也讓我們之後的合作更有默契。」 你看,是不是天差地遠?第二個回答活脫脫就是一個故事,它不僅回答了問題,更在故事中巧妙地展現了你的多種優點:技術調研能力、用數據說話的習慣、尊重同事的溝通技巧、主動解決問題的態度,以及追求卓越的工程師精神。 準備行為面試,就像在準備你個人的「故事庫」。你可以事先預測一些常見的問題,例如:「最有挑戰性的專案」、「失敗的經驗」、「團隊合作的例子」、「如何面對壓力」等等,然後為每一個問題,都準備一到兩個符合STAR原則的精彩故事。這些故事不必驚天動地,但一定要真實、細節豐富,而且能夠凸顯出你的正面特質。 記住,面試官也是人,人都喜歡聽故事。一個好的故事,能讓他對你留下深刻的印象,讓他相信你加入之後,不只會是一個能幹的工程師,更會是一個好相處、能為團隊帶來正面影響的好同事。所以,別再害怕這些軟性問題了,把它當成一個讓你大放異彩的舞台吧!

使用 LeapAhead 應用程式繼續閱讀
完整摘要正在應用程式中等您
03. 程式碼的龜兔賽跑
04. 你的程式工具箱有啥?
05. 白板前的完美演出
06. 結語
關於 蓋兒.拉克曼.麥道爾
蓋兒.拉克曼.麥道爾(Gayle Laakmann McDowell)是軟體工程師與作家,長期專注於科技業的人才招募與技術面試領域。她曾任職於 Google、Microsoft、Apple 等國際科技公司,對工程師招募流程與面試評選具有深厚實務經驗。她同時創辦了 CareerCup,提供技術面試準備與職涯發展相關資源。蓋兒.拉克曼.麥道爾畢業於賓夕法尼亞大學,取得電腦科學工程學士與工程碩士學位,並擁有賓夕法尼亞大學華頓商學院的 MBA 學位。