資料結構和演算法對一個工程師的意義?如何提升實力?

我們常聽到人們會說,「演算法」和「資料結構」是一名優秀工程師的必備素養,但究竟這句話是什麼意思呢?

工程師面試時常常用 LeetCode 解題來篩選面試者,而想要針對 LeetCode 刻意練習時,又需要先有「演算法」和「資料結構」的觀念基礎。這個面試準備過程即使是對本科系畢業的學生也需要刻意準備,對非本科系的轉職者來說,就更加令人望而生畏。

演算法面試準備與LeetCode 刷題重點心法

但如果脫離「面試解題」這個情境,倒底學習演算法/資料結構有什麼意義?除了準備面試,這些學習的投資有什麼長期價值嗎?

在今天的分享中,我們訪問了愛料理技術長與共同創辦人 Richard Lee,希望能為正在攻略演算法/資料結構的讀者們,設定具有長期價值的目標展望,讓你在苦練 LeetCode 刷題時,能感受到這些投資不是只為了一時的考試,而是長期的工程師職涯自我修練的一部分。

演算法/資料結構的應用場景

對 iCook 共同創辦人兼技術長 Richard 而言,對長期的職涯發展而言,演算法與資料結構的素養,是長期職涯發展中不可或缺的「內功」。

具體來說,軟體工程師的任務是打造產品,而當一個工程師在思考什麼是「好的產品」時,他會需要思考:

  • 擴充性
  • 可用性
  • 效能

而若要能夠思考這 3 件事,甚至要不斷進步,就需要有演算法/資料結構的內功。

舉例來說,在做 SQL 優化時,很多人會直覺想到要加上 index,然而,這樣就夠了嗎?Index 效能是否有差異?你是否知道 index 背後的設計運用了 B-Tree 的結構?要怎麼設計 Index 才會達成 SQL 優化的目的?

若真心深入思考類似的問題,就會需要有基本工的輔助。

或者,若 SQL 資料庫不敷使用,想要改用 NoSQL 資料庫,然而,資料庫裡會提供一大堆的資料結構,你要怎麼選擇?你是否能評估不同結構的複雜度?到頭來你會需要知道背後的原理,知道不同的結構適合儲存什麼樣的資料,才能真正地做出選擇。

即使是非本科系畢業的轉職工程師,隨著職涯歷程發展,開始需要評估專案架構、選擇適合工具,會開始感受這些議題的真實重要性,然後自己涉法把基本功追起來。

刷題目數愈多愈好?

上面講的是隨著職涯成長而自然而然發生的情況,但由於面試的需求,更多人(這裡指非本科的轉職者)和演算法/資料結構的「第一次親密接觸」是在求職面試時,動機是在面試時,透過「刷 LeetCode」的方式,一邊寫面試考古題,一邊蒐集相關知識。

在這種比較考試導向的情境下,有時候難免會出現一些迷思。最常見的就是對「題目數」的誤解,在網路上充斥著「面試某某等級公司需要刷 X 百題 LeetCode」等說法。

人總是希望有一個明確的指標,例如「如果我完成了什麼什麼⋯⋯就可以怎樣怎樣了」,很可惜,這可能只是個迷思。反而引起一種恐懼,我們常常看到其他人「刷幾百題」仍然沒有上,開始擔心自己到底要刷幾題,才可以面試上理想公司。

問題是,如果你的刷題方式是錯的,刷幾題都沒用。

Leetcode是什麼?誰需要刷題?工程師面試要刷到什麼程度

一邊刷 LeetCode 一邊提升實力

對像 Richard 這樣的資深工程師來說,LeetCode 並不是一個純解題來準備面試的平台,而是讓自己保持演算法/資料結構靈敏度的練功場。

對於想要使用 LeetCode 刷題,一邊建立基礎觀念,一邊準備面試,一邊提升實力的人,Richard 的建議如下:

  • 短期 (零基礎~年資 2 年內):著重刷題時的思路/運算思維,能不能至少寫出暴力解?應用語言特性實作出程式碼,至少要能成功過關,對最佳解不要太執著。
  • 中期 (2 年左右):開始吸收演算法經典,能思考複雜度,深度/廣度優先⋯⋯能把暴力解優化,或者開始看最佳解的 case study,把單點知識走深,看看常考的高頻題,了解題目背後的常見思路。
  • 中後期:刷了不少題、在工作中有 awareness 能:保持刷題習慣,鍛練手感,可以寫更少題,但可以思考更多延伸問題,或者針對自己工作中在思考的事,去 leetcode 上找類似的題目

看 Richard 影片完整內容