【矽谷求職戰】「聽說你最近在刷題」:軟體工程師一定會遇到的面試關卡 (文末分享 LeetCode 折扣)

「刷題」幾乎已經成為(準)矽谷軟體工程師們求職、轉職時必經的過程──這無非是為了如今多數科技公司,在面試階段時必考的「資料結構及演算法」(Data Structures & Algorithms)難關。但「刷得多」、「刷得快」就真的能增加成功機率嗎?
【矽谷求職戰】「聽說你最近在刷題」:軟體工程師一定會遇到的面試關卡 (文末分享 LeetCode 折扣)

Photo Credit:wutzkohphoto@Shutterstock

【矽谷求職戰】系列,是我從軟體工程師美國找工作經驗分享開始,陸續從自身找工作的經驗出發、到探討矽谷為主的美國求職現狀與各種求職技巧的文章,希望提供有意赴美工作的你一些參考。

這篇文章,要介紹的是軟體工程師在應徵美國知名科技公司時,進入面試階段後,必會遇到的「資料結構及演算法」(Data Structures & Algorithms)考試難關。

由於美國多數科技公司,在這項「必考」的入職測驗上都行之有年,「題庫」也在大家口耳相傳下越積越多。因此如今許多工程師在計畫求職或轉職前,也都會花上好一陣子時間「刷題」。

在此要先強調一下,我現在並沒有在為了準備轉職「刷題」(這樣講絕不是怕很多同事會看到我的文章 XD),但周遭不乏在求職時「刷」數百題、甚至題庫中每題都練習 2-4 次的人──我很佩服他們為此投入的時間及毅力,也自知無法做到,有小孩後更連「刷一遍」都難。但說實在的,我覺得大家好像太過度強調刷題的「刷」,來回刷很多遍考古題雖然比較心安,卻若沒有藉此培養出正確的解題邏輯 / 習慣 / 步驟,未必真能在臨場應試時得到高分。

「刷」題。圖/半路出家軟體工程師在矽谷 提供

因此,本文將從個人和朋友們的經驗出發,分享一下「資料結構及演算法測驗」的準備方式, 如果你想要了解「有效率」的刷題方式,或覺得自己實在無法刷數百題很多遍,歡迎往下閱讀:

一、 3 步驟確定「考題要問的是什麼」

先簡短介紹一下我自己半路出家成為軟體工程師的「刷題」經驗:2015 年上完 Coding Bootcamp 到找到工作,我大概做了 60 題左右的 LeetCode 問題; 2016 年底找工作時比較認真,大概共完成了 100 題左右。

2015 年上完 Coding Bootcamp 後,我陸續有一些電話面試, 每天可能會有 1~3 個電話面試, 所以既要研究公司、依照職缺來做面試的複習,同時因為面試前端相關的職缺,所以也有一部分的精力在前端的資料複習。關於資料結構及演算法(Data Structures & Algorithms) 的練習,我大概僅維持一天練習 1-2 題的步調;到了 2016 年底的面試,因為還要上班,所以基本上也只有晚上有時間,可能一天只能練習 1 題,假日有比較多時間才可以多做幾題。在如此有限的練習機會下,我因此培養出自己一套「解題原則」:

首先,在看到題目的時候,我會先確保自己「確實了解題目的意思」──畢竟在真正面試的時候,第一步通常也是確認面試官真正想問的問題,和我們的認知是否一致,不要花了一大段時間回答後,才發現一開始的理解及假設就是錯誤的。因此,我通常會在一看到題目時,立刻判斷並寫下:

1.題目給予的 input 有什麼;
2.格式是什麼;
3.(題目的)期望結果(
desired output)又是什麼?

確認好 input & output 後,再來思考題目可以用什麼類型的資料結構或演算法來解。在實際面試的時候,我通常會向面試官說明自己會先就一個「大概可行」的方式來做解答,如果他 / 她覺得沒什麼問題的話,我再做後續的優化。

在我開始有一些思路後,也會先寫下 pseudo code,用來大致說明我的解法會是怎麼樣。每個步驟和面試官確認沒有問題後,才會正式開始寫 code 。

二、「卡住」時不用擔心,重點在思考過程

當然,有些時候也會遇到「不論怎麼想都解不出來」的困境:如果是自己練習的時候,我大概在 「卡關」15 分鐘後,才會開始看一些討論,嘗試學習別人的思路;如果再花 10 分鐘還是解不出來,才會參考別人的解法;即使看完別人的解法,我還是會用自己的 code 再實現一次。

如果面試中卡住的話,則務必先不要擔心「評價」,請儘快和面試官討論:我會把我對題目的理解、可能的解法直接告知面試官,同時也說明在這個情況下自己不確定的部分有哪些,讓面試官在適當的時候可以給予提示。許多人會擔心「求助面試官」會導致考時成績低落,實則不然:一般來說,公司還是希望有順利的面試經驗,面試官也都願意在溝通正常下給予協助。畢竟真正到了職場上,遇到難解問題時同事互相討論、協助,都是再正常不過的事情。

自己練習完題目之後,我會再寫出解法的空間及時間複雜度(Space & Time Complexity): 通常正式面試時也會詢問這個部分,所以每個練習後最好也練習「自我歸納」一下。如果我發現自己的解法可能不是太理想,也會再參考不同人的討論,研究更優化的解法──接著再練習自己寫出不一樣的解法。

有些比較棘手的問題,我甚至可能會寫出 2 到 3 個解法,並比較彼此的優缺點。 

三、重點不在「多」或「快」,而在解題的邏輯思路

在之前密集準備求職面試的時候,我買了一本筆記本,每次寫完問題後,我會寫下自己在哪一天寫了哪一個問題,並用很精簡的方式總結問題及解法;隔天要做下一題之前,我會先看一下前一天的問題,嘗試回想自己是否可以再次想出大致的解法。如果不行的話,重新看我自己的總結並做上記號,隔天再做一次同樣的步驟,直到我可以順利複習出「解題的邏輯思路」為止。 

如果實際參加面試,不論是電話或 onsite,面試完後我會再檢查自己遇到的題目是否和過去做過的題目類似:如果有的話,就檢討我的思路在面試中是否清晰及正確;如果沒有的話,我是否利用正確的觀念來解答。面試結束後,會花時間在盤點及複習,從面試中的題目和過往的練習做統整。

你可以看到我的練習方式,都不強調(速度)「快」、(解題)「多」。這是因為我希望在做完問題後,可以對題目有很深的理解,所以花很多時間在整理、複習與確認上──複習及思考的次數多了,才能真正把題目真正想要考的「觀念」融會貫通。

畢竟儘管題庫中有千百題,但到了實際面試時很難真的遇到「原題」──重點在我們對資料結構及演算法的理解,以及遇到難題時如何應對的思考過程。 

以上就是我個人在「資料結構及演算法測驗」上的準備方式,由於之前的系列文章好像沒有特別提到這塊,所以特別再寫出來分享。

當然,「條條大路通羅馬」,每個人準備面試的方法、習慣都不太一樣,沒有絕對「正確」的模式。我也不是每次可以動輒收割 5 到 10 個以上 offer 的「大神」,所以本文僅供你參考,請斟酌評估最適合自己的學習方法。 

文末分享:知名演算法題庫優惠

我在 2015 、2016 年準備面試的時候,有許多練習演算法的網站;但到了今日,似乎 LeetCode 和練習演算法的關係,已如同  Google 和搜尋一樣,大部分準備面試的人都在用 LeetCode 來「刷題」了。最近剛好認識一位在 LeetCode 工作的朋友,因此 LeetCode 特別優惠讀者, 只要使用這個連結購買 Premium, 就能有 15% 優惠 (幾乎和一年一度的感恩節特價差不多)。 

LeetCode 優惠頁面。圖/截自 LeetCode Premium

綜合周遭朋友意見, Premium 最大的好處就是可以看到「問題」和「公司」的標註(即這個題目來自哪家公司)——以過去拒絕我 2 次的 Google 為例(XD), LeetCode 上面就有 925 道題目,被大家回報有在 Google 面試中看到(925 道好多啊!@@)──當你正要 phone or onsite interview 的時候,可以相對快速地鎖定你要面試的公司進行練習。

我當初也想在自己的粉專上,直播訪問在 LeetCode 工作的這位朋友,近一步探討矽谷的「刷題」趨勢,可惜目前這位朋友還沒有意願。如果大家對這個題目有興趣的話,歡迎請在文章下方留言, 讓她可以看到大家的意願,加強她現身說法、和我們分享經驗的動力(XD)。 

2021 年,如果你要找工作的話,祝你轉換順利,拿到許多理想的 offers!如果你有什麼面試準備的技巧及心得,也歡迎留言分享。 

歡迎關注我的粉絲專頁,了解更多矽谷經驗、矽谷人物專訪,及各式矽谷新奇事物。

備註:本文授權轉載編輯自「半路出家軟體工程師在矽谷」blog,以上內容均為作者個人經驗與觀點分享,不代表其任職公司立場。

執行編輯:蔡文晴
核稿編輯:張翔一

關聯閱讀

作品推薦

你可能有興趣的文章

#廣編企劃|新北街舞大賽的魔力,就是能讓所有人都被這股精神感染!

歡迎回來《換日線》!
您可以使用此天下雜誌群帳號,盡情享受天下雜誌的會員專屬服務,詳細內容請參考此連結