一個剛結束面試地獄的人來分享一下個人心得,不過可能不適用於台灣職場...
很多人都以為面試跟考試一樣,給你一個題目,寫出正確答案就拿滿分,
然後拼命地刷累積題數,深怕考試考到自己沒看過的題目就掛掉。
但其實面試結果的評量並不是只有一個面向,並不是說你寫對就過,寫錯就沒過,
而是分成好幾個訊號來做評分:
1. 溝通能力:
我很喜歡敝公司人資找我去面試前說的一句話,他說「不要把面試官當考官,
而是把他當同事。」,面試其實就是讓面試官來評量看看你適不適合當他的同事。
當有一個新的問題出現時,你要怎麼和你的組員一起解決那個問題?你是不是可以跟
同事保持專業的討論,包容新的想法,不讓個人情緒影響工作?
所以當白板題出來時,第一件事情不是寫code,而是先跟面試官討論想法,確定問題
是否是你理解的那樣,然後提出你想到的解法,分析優缺點,是否有corner case,
最後雙方都同意了之後才需要開始寫code。
2. 系統性地解決問題的能力:
工程師最有價值的地方其實是找出解決問題的方法,而且可以系統化地運用工具去解決。
考演算法白板題最大的好處就在於這些題目通常scope不大,45分鐘或1小時通常就可以
提出一些解法。演算法本身就是一種工具,他們的存在就是為了解決一些常見的問題。
系統設計的題目也是要看你如何解決問題,只是題目更加開放性,通常不可能在短時間
內就提出完美的作法(現實生活中也不會有完美的做法),但可以提出一個大方向,
並對其中幾個部分有更深度的了解。
3. 化抽象為具體的能力:
身為一個碼農,要能把code寫出來是非常重要的事情,當你提出了做法的時候,你還需要
把你的想法轉化成實際的程式碼才行,如果你講得一口好演算法卻寫不出來,就很容易被
當作只會說說的人。另外,概念和實作總會有一點差距,例如程式語言的限制,機器資源
的限制等等,這些都是在面試寫code中很好的觀察與討論的點。
4. 產出具有Industrial standard結果的能力
這個對剛畢業的人比較比較無法體會。雖然每一家公司都有自己的標準,但還是一些共同
的基準可以當參考。如果你是個軟體工程師,從你寫的code裡面多少可以看出來是否達到
低標。最簡單的就是變數命名是否有意義,程式碼是否足夠精簡,沒有不必要的code等等
,現場考寫code的話可以讓面試官更快的得知這個訊息。
綜合來說,面試考現場寫code算是一個對公司來說CP值很高的作法,能獲得的訊號多,花
的時間又相對少,找進來的人又大多符合預期,所以很多公司還是會採取這樣的方式。至
於台灣的公司是不是只學半套就不知道了...
回到原文問的問題,刷leetcode的重點絕對不是刷了幾遍刷了幾題,而是你是否因為刷題
而改進你的“錄取我吧”的信號(第2和第3點)。比起題數,更應該注意的是你是否因為
這題而讓你對工具(演算法)的使用更加熟練,進而拿它來解決新問題。雖然目前題目數
已經增加到900題,但絕大多數題目都還是用常見的工具去處理,例如BFS, DFS, sort,
hash, binary search等等。如何能夠將這些東西用在提出解法,並且熟練的實作出來,
才是寫leetcode更重要的意義。之前一畝三分地有個題霸各種刷好刷滿,面試幾乎全都
秒寫最佳解,卻一個offer都還沒拿到。反而有許多寫2.300題的人拿了不少offer。
不能否認的確有些人靠著刷題背答案再加上運氣好遇到只出題庫的面試官而拿到offer,
但是不該把這些特例當作常態。沒有一個面試的系統是完美的,其中有很多trade off,
但是只要錄取進來的能有80%是符合預期的就已經很不錯了,剩下的就是利用淘汰機制
來處理掉面試系統過濾不掉的人。
至於有些人說考這些不如考工作上會用到的東西,我個人認為這是很困難的事情,因為
不同公司、不同部門、甚至不同人用的工具就有可能差很多,而且沒有兩個職缺需要的
東西是一模一樣的。即使是同樣的framework來說,面試官可能隨手考一個他最近剛用到
的function但你可能從來沒看過,這樣一來就無法評斷一個人解決問題的能力,而只能
知道這個人有沒有用過某種特定的東西而已,這種結果對於找正確的人進來也不會有太大
的幫助。
最後還是聲明一下,以上是個人在北美面試的經驗,台灣職場可能不適用QQ