【學長姊帶路】如何準備軟體工程師 Code Interview?
原標《希望能陪伴你程式職涯的Code Interview攻略》
文/CraftsmanHenry
一提到LeetCode(a.k.a 刷題)相信跟我一樣的軟體人對它肯定是又愛又恨,愛在「也許」可以幫你換更好的工作,恨在工作用不太到且無聊乏味,而且刷題時間一久不禁還會懷疑自己,因此不論大家認為刷題是洪水、猛獸還是那盞可以讓你許三個願望的神燈都好,我想我們該從「為什麼」這個問題開始思考,就跟我過往的文章一樣,我試著說明我自己的想法,或許大家不認同也沒關係,但請大家試著思考一下,「為什麼」自己會想接受這個無聊乏味的挑戰
我的為什麼
我想有些人也跟過去的我一樣認為,為什麼自己要刷LeetCode,明明自己就有能力處理得了公司面對的所有問題與需求,不需要透過這種與自己工作無關的技能來證明自己,但換位思考若今天我身為一個面試官,我該如何就面試者過去與自己公司無關的經驗來知道面試者能否解決我們公司的問題呢?況且還需要在短短的60分鐘內判斷,其實很困難甚至無法,因此
Code Interview(LeetCode)正是最簡單且快速的方式來試探一個人的分析問題思維
所以我無法否定它的用處,且若想改變這個制度,也需要我透過「走過這個過程深入其中並理解這個程序的問題後,再來尋求改善的方式」,因此Code Interview是改變這個制度的門票,更重要的是能避免被大家冠上「吃不到葡萄嫌葡萄酸」的臭名(也許我很在意這個 😂),但這些正是我的原因。
如果我的想法並不能說服正在看這篇文章的你,那也許讀者該想想自己做這件事的理由,或許這件事真的就無法協助你達成你的目標,那這篇文章或許不是屬於你的。甚或是你沒遠大的理想只是想利用Code Interview的技巧獲取進入大公司的機會,這些都很好,只要確定自己有足夠強的理由給自己動力支撐這整個乏味的過程,當自己失去動力時,記得回頭想想自己的初衷。
你是大神嗎?
來看這篇文章的人,我想會有人有這個疑問,想知道為什麼我有資格寫這篇文章,因此我在一開始就直說「我不是什麼大神」,也沒有在什麼很厲害的公司任職,只是最近又有重新刷題的需要,因此想回顧一下自己過去查的資料,並回想過去路上碰過的釘子,總結一些自己這次刷題時要把握的心法和原則,同時分享給看到這篇文章的讀者。在這篇文章中,我只會是個陪大家一起struggle、一起踩地雷的網友,並分享一些自己解的題目跟解法,希望大家不會太失望。
想跟大家分享的解題經驗
相信大家在網路上可以查到不少影片,而一些基本概念、心法與誤區像是
- 別背題,而是學會解決問題的思維
- 別海量亂刷題,而是有重點的刷
- 別用 IDE 尤其是有 auto complete 的那種,因為面試都 white board
這裡就簡單帶過,不過老實說這些誤區我都踩過,因此下面想與各位分享的是我如何建立一套練習的系統,這套系統最主要是能幫助我建立信心去面對白板題面試並培養我覺得最重要的能力
分析問題,並能由簡入深以漸進式的方式提出並改善解決方案,同時思考到解決方案的效能
而這套系統是由三個步驟所組成
- 選題
- 追蹤
- 答題方法
那就廢話不多說從重點選題的方法開始吧!
選題
為了避免胡亂寫題目,首先就是要從面試常會遇到的演算法和資料結構來選題,我統整以下一共有 14 種
接著知道 14 種類型後,接著針對每一個題型去 top interview questions 這個 filter 分別挑選 4 題簡單、4題中等加上 2 題困難(easy : medium : hard = 2 : 2 : 1),在挑選的過程中有些演算法和資料結構在 top interview questions 裡面並沒有那麼多題可以選,這時候就挑選一些 top interview questions 外的題目或你想採用其他的 filter 挑選也是可以,這樣你就會擁有 140 題的題目。有了題目後,接下來最重要的是如何讓這些題目寫得有效率。
追蹤
寫題目是個長期奮戰的過程,因此要有方法能夠評估效率,其中最重要的部分就是要能量化並追蹤,讓自己心裡產生有在進展的感覺避免失去動力,因此接著將選出來的 140 題打亂,不要依照類型排序,並利用看板軟體或服務做紀錄,類似 Trello 或是 Notion Board ,在 Board 中我們分為四類
▲notion 的 board view
- 未完成(Not started)
- 進行中(In progress)
- 不熟悉(Do again):已經寫完並 submit 成功,但心裡很虛,認為下次看到還是不能反應出來
- 已完成(Completed):完成並 submit,而且有自信的認為,這題的思考模式下次出現能想得出來
打亂題目的原因是面試官在出題時,通常不會顯示偏好(bias)給你知道,而且不會一開始就告訴你出的題目是什麼類型或需要用到什麼演算法,因此為了模擬隨機出題的狀況,每次寫的時候請從 board 上隨便拉個一兩題到進行中,完成就移到已完成或是不熟悉。
這樣做的目的是為了追蹤自己的進度,不然做一做很容易沒有方向性跟目標性,這樣反而會讓自己怠惰、拖延,如果想要更進一步保持動力可以考慮每完成一定的題數給自己一些獎勵,像我自己這次就打算利用網銀帳號,每完成幾題就存個250元,目標是存到3萬可以為自己換一套新桌椅,這樣希望能做起來更有動力? 畢竟刷題就是件無聊的事情(也許有些人樂在其中),必須要找方法讓自己保持在正軌上並持續給自己動力。
答題方法(怎麼寫)
知道選題跟追蹤方法後,終於要開始寫題目,由於一般面試通常給你寫題目的時間會介於20~45分鐘,因此在寫的時候最好也給自己限時大概35分鐘左右,將題目分析並寫出來,當然是寫在紙上或是google doc也可以,或你想如 Joma 一樣寫在 word 上也可以 😂,總之不要利用code snippet auto complete的功能。
值得提到的是,如果一開始簡單的題目寫起來也非常的困難千萬不要感覺挫折,因為大家都是這樣過來的,換個方式思考,過去在老師教你三角函數前,你也不會三角函數,絕對不是你不夠聰明,而是還沒學過這樣的解題思維,解題思維正是我們要在刷題的過程中要培養出來的部分。
在面對題目時,大概有下面三種狀況:
- 思考5~10分鐘左右還沒有任何想法,那就看看題目有沒有提示(Hint),若完全沒有提示那就直接討論區找找答案吧
- 看過提示後能有想法,那很好,不過建議利用card紀錄一下自己用到幾個提示
- 5~10分鐘內就能自己有想法
以上三種情況是根據對題目的熟悉程度由低到高排序,但不管是哪種狀況,自己coding的時間頂多只能是35分鐘左右,除非真的離完成只剩一步之遙,否則就直接去討論區找答案,因為透過LeetCode的練習要建立的是
- 對題目的思維方法
- 閱讀題目的技巧
- 迅速判斷題目所需的Algorithm的能力
以上這些技巧是需要題數去累積的,因此別執著在自己尚不熟悉的題目上太久。
若有需要從討論區看解答,建議找有標示 Easy to Understand, with Explanation 或是 clean code 看,要盡力去了解作者解題的思考方式,最後根據那樣的思考方式將程式寫出來,再寫一次是很重要的過程,有時候思維要轉換成程式碼也是一項困難的工作,所以理解後也務必要將程式寫出來。
另外如果和我一樣是個記憶力不算很好的人,那我會建議每一題解完都將該題的核心想法寫下來,前面提到要用 board service 的好處就在這,照理說每一題都會是一張 card,如此一來就可以針對每個題目在 card 內做一些筆記,更進一步甚至可以將這些筆記整理出來,變成面對不同類型的題目有哪幾種思考方式這樣的筆記。這才是刷題過程中我所獲得最重要的部分。
後記
在理解以上練習的系統後,最後也是最重要的一步驟就是設定期限(deadline),畢竟
沒有期限的想法只能被稱為夢想,無法稱為目標
而期限的設定要合理,而合理的時長我想會因人而異,大致上會取決於過去對資料結構和演算法的熟悉程度,對我而言以140題來說,我會給自己設定大概3個月的期限,並且這次想學一下Golang來寫這140題,畢竟用熟的語言寫有些無聊對吧?😂,而且原因不明最近新來的同事們對Golang似乎都有偏好,為了跟大家聊天只好來學一下😆。
相信能看到這裡的讀者們,都是有決心想要好好走一輪這個流程,進一步提升自己職涯的可能性。這邊想跟大家分享幾個小小的心得
- 千萬不要放棄,我能了解寫到後來會想問自己,這樣努力是不是有用
- 在寫的途中就可以鼓起勇氣去面試看看
- 難題留到假日在寫,寫不出來可以外出散散步,可能就想出來了
- 工作還是要好好做,真的不要一心只寫這個,不然可能兩頭皆空
以上幾點大概是我前一次寫完後的小小體悟,希望能在大家努力的路上幫助到大家。
最後算是想給自己打點小廣告,我知道前面要求大家選140題是個繁瑣的過程,可能才開始就放棄 😭,畢竟我自已也花了好多時間才收集好這些題目,為了減低大家的阻力,最後將收集的問題用Notion分享給大家
※本文由 CraftsmanHenry 授權勿任意轉載,原文《希望能陪伴你程式職涯的Code Interview攻略》
___________
你也有經驗想分享嗎?快來投稿賺稿費吧!
瀏覽 624 次