小弟在後端與資料領域打滾過幾年,也刷過上百題 Leetcode
同意大部分演算法題確實工作上不會用到,但仍然有很多潛在價值存在
就來分享一下我覺得刷題真的"有意義"的那部分好了
1. 工程基本功
例如天字第一題,Two Sum,考得就是一個 Hash Table 的基本概念
也是非常常見的 junior developer 會遇到的場景
例如現在有兩台機器,定期產出 1e6 筆資料量級的 excel 報表
現在要你寫個系統 on-demand 讀取並合併兩張報表後返回給客戶
如果做成 O(N^2) 然後跟主管說他就這麼慢沒辦法
那技術顯然很有問題...
2. 將理論實際應用的能力
例如 Trie 的概念本身不難
但突然碰到沒見過得複雜變化問題
你有辦法馬上反應過來應用上去嗎?
3. Coding 速度與準確度
你有沒有辦法在很短時間,實作一個中等難度的問題,然後一次就 bug free pass
這對應的是你平日工作的開發效率,還有邏輯是否縝密
如果你寫兩三行 code 就要一直 print 看輸出修改邏輯漏洞
代表你對程式操作變數的熟練度不足
當要大量開發一些不太困難的工項時(這是公司常見場景),效率會較低落
而且可能會有潛藏的 bug
甚至 unit test 也幫不了你,因為你根本就沒想到要測試這些 corner case
4. 後端系統設計
要你做資料庫選擇,那最少該對 B+Tree, LSM Tree 等結構有概念
要你做地圖系統,那 Quad-Tree, R-Tree, KD-Tree, Z-Order Indexing 也該能聊聊?
或 Cache 系統最常見的 LRU/LFU cache 選擇
分散式系統最基本的 Consistent Hashing 有哪些應用,好壞是什麼
這類演算法可能實作很複雜導致 Leetcode 不愛考
但 Leetcode 的部分題目也是從這些概念中提煉出來(例如一堆基本 Tree 操作)
足夠小到可以變成一個 10~20min 寫的完的題目
假如你 Leetcode 都寫的出來,想來要理解系統設計真實應用的演算法也不會太困難
5. 靈活思考
這就一些奇怪的觀察力考驗題
看你能不能看穿他轉幾個彎之後,就是某個簡單的演算法概念
跟考益智問題的意思差不多
因為他想找真的很聰明、頭腦很靈活的人
如果聰明人想得出來,大量努力刷題苦練過的普通人也想的出來
那起碼這個篩法有一定機率找到我想要的人,另一些也是肯努力的人
這樣對面試官來說也不錯了
6. 溝通能力
這個應該也被講爛了
很多公司也沒有要你一秒給最佳解(真的題題秒解還會懷疑你是哪邊去偷到題目)
而是要看你一路跟面試官怎樣討論溝通,將答案一步步優化到最佳的整個過程
你刷的題目足夠,思考也會更穩定,討論更聚焦更有方向,對答案更有自信
如果他覺得你是個一起討論研究問題很舒服的人,就有機會給正面評價
我自己就曾在 Appier 面試被丟了一個沒有優於 O(N^2) 還是 O(N^3) 解的問題
(細節部分記憶模糊了... 也可能是沒有 linear time 解)
但他問的一副有的樣子,一直要我再想想
我想了一陣子,還是跟他解釋了幾種不同思路、假設、還有分別會遇到的障礙
然後很有自信的跟他說這確實沒辦法
面試官就很滿意了,說那是他們真實遇到的難題,也確實還找不到辦法,所以跟我聊聊
後來我們又聊了很多有趣的問題,是很棒的面試經驗
假如當時我不夠熟練的話,一定只會一直擔心我哪裡沒想到,做不出來完蛋了死定了
大概就不會有後續了
當然啦,如果碰到不合格的面試官,或考題亂挑一通,那以上情境都不會發生
有些面試官只會背題,甚至自己也不懂
手上有一份答案,你講的跟答案一樣就 pass
你講不一樣但同樣可以過(甚至還更好)的答案,通通都算 fail
那遇到這種也只能說運氣不好,這場考試毫無意義
但不代表這整個演算法面試的模式沒有可取之處。
--