身為軟體工程師,一定聽過演算法、資料結構。尤其企業面試,「演算法」常作為軟體工程師的面試考題。但實務上會用到演算法嗎?軟體工程師到底該不該學演算法?
11 月份 ALPHA Camp AMA 活動,特別邀請到任職頂尖軟體外商的資深工程師 Brian,與校長 Bernard 一起直播,分享從歷史系自學踏上軟體工程師的歷程,並深入解析演算法的應用場景,及演算法面試心法。
Brian 指出,「對演算法的深度理解,決定了普通工程師與優秀工程師的分野!」想讓軟體工程師職涯有所提升,不可錯過演算法。
歷史系畢業,跨領域轉職外商軟體工程師的職涯之路
大學念歷史系的 Brian,為什麼最後會成為軟體工程師?他解釋道,念歷史是興趣,而自己從小就有創業夢,他觀察「軟體創業」低門檻,又是未來趨勢,於是他大學開始自學程式、修程式學程,大四開始獨立接案,畢業後與朋友一起創業做 APP。
後來因創業以失敗告終,Brian 重新開始接案、也擔任過 ALPHA Camp 課程講師,最後他進入頂尖外商軟體公司,擔任軟體工程師。
軟體工程師學演算法有什麼好處?談演算法概念與應用場景
Brian 接著談到軟體工程師面試時,許多企業常會考「演算法」。到底演算法是什麼?為什麼企業面試喜歡考演算法?實際上做產品會用演算法嗎?
演算法是什麼?為什麼許多知名公司面試要考演算法?
演算法,是一種將「輸入值」經過運算後產生出「輸出值」的運算方法,是解決問題的一套邏輯思維。談起演算法在工作中的應用,Brian 指出:「事實上,當軟體工程師在做面向使用者的應用軟體如 Web、APP 等,幾乎用不到演算法。即使有機會用到演算法,就算你不會,也可以用比較初階的方式寫出來。」
但他接著強調,「軟體工程師懂演算法,關鍵的差異是效率!」
他以數學概念「乘法 vs 加法」比喻,說明「演算法就像乘法一樣,不管懂不懂乘法,店員都能完成結帳,但很明顯會乘法的店員,他的效率比較高。」
同場加映:認識演算法(Algorithm)與運算思維(Computational Thinking)
如果多數情況用不到演算法,為什麼許多公司面試還是喜歡考演算法?Brian 認為原因有二:
- 演算法是「普通 vs 優秀軟體工程師」的分野:偶爾有用到演算法的場景時,能不能透過演算法思維,寫出執行效率更好的程式碼
- 資料分析、後端應用,常會應用到演算法:演算法在寫前端應用軟體時,確實比較少機會用到。但如果是做資料分析、後端應用軟體,演算法就有它的功能。比如 Google Search 的邏輯,不懂演算法可能就做不出來
演算法的應用場景:以計算平均股價為例
Brian 寫了一段「Python 計算平均股價」的程式碼,舉例說明為什麼擁有演算法思維,能寫出更好、執行效率更高的程式碼:
計算平均股價-未使用演算法
說明:假設有過去 100 天的股價,但只需要最近 20 天的平均股價,這段程式的確能計算出最後 20 天的平均價格,卻導致浪費了 80 個空間去儲存不需要的股價資料。如果要計算的數字越多,就會浪費更多的空間。
計算平均股價-使用演算法
說明:這段程式碼跟前一段相比,多加了宣告,把 list 變成固定長度,length 設為 20,最新的數字會把舊的數字蓋掉。所以不管股價資料幾筆,所需的執行空間都固定。如果拿評估演算法效能的指標 Big-O 來看,這個作法就是達到了空間複雜度 O(1) 的理想狀況。
從上述舉例可得知,演算法能提高程式碼的執行效率。特別是當使用者規模或資料量達一定程度時,應用演算法提升程式的效能就變得非常重要。
校長 Bernard 最後則補充:軟體工程師有演算法思維,可以讓程式碼的運算時間、記憶體空間都做到優化。為什麼相對有規模的企業面試要考演算法?因為他們希望你能考慮到效能,在部分情況下,他們特別需要去解決效能問題。
演算法面試心法:前後端面試,如何準備資料結構與演算法
說明演算法的定位與應用場景後,Brian 接著分享如何準備演算法及資料結構面試。
基礎準備:閱讀演算法書籍
準備演算法面試時,Brian 建議可先透過閱讀書籍,建立演算法基礎知識:
- 主力書籍「Cracking the coding interview」:Brian 認為這是一本聖經級的演算法面試準備書籍,內容包含演算法面試所需的基礎知識,與演算法經典題目詳解,是準備演算法面試很有效率的一本書
- 其他參考書籍「The Algorithm Design Manual」或其他大學演算法教科書:由於前述提到的書籍為面試導向,Brian 建議可再找一本演算法教科書,補充更多細節知識
LeetCode 刷題:建立正確思維與實作練習
軟體工程師在準備技術面試時,會透過 LeetCode 刷考古題來練習手感、準備資料結構和演算法考題。但刷題數量越多越好嗎?想面試知名企業,刷題要先刷到 500 題嗎?
針對常見的刷題迷思,Brian 分享正確的刷題思維為:「融會貫通比刷題數重要!刷題意義在於找出自己的盲點,如果時間有限,與其花很多時間一知半解刷了 200 題,不如把 100 題好好搞懂。」
延伸閱讀:Leetcode是什麼?誰需要刷題?工程師面試要刷到什麼程度
Brian 接著分享刷題技巧:
- 寫 LeetCode 考古題目,會碰到兩個關卡「思維」及「實作」:首先要有想法知道大概怎麼寫,再來是如何實際寫出 Bug Free 的程式
- LeetCode 選題:若 20 分鐘寫得出 medium 難度的考題,即可應付大部分的面試。若遇到只有一種解法,或解法很刁鑽的題目,可以先跳過
- 當 LeetCode 寫不出來時,建議可依序使用以下方法:先參考 LeetCode 討論區的討論,自己思考;假設還是沒有方向,則看解答;但如果看了解答還是不懂,可以適度硬背,因為很多題目的解法是類似的,有時候會忽然搞懂為什麼這樣寫
- 若藉由以上幫助才能解題,要重寫確認自己有消化吸收:Brian 自己在遇到不懂的題目時,會隔五天至一周的時間回頭重寫,如果有寫出來才表示已經融會貫通
最後,Brian 分享當企業採白板題考演算法及資料結構時,如何應對刷題實作:
- 平時要練習手寫程式在紙上或白板上:所謂白板題就是企業讓面試者在白板上寫下題目的解法。Brian 認為,當不借助電腦的幫助時,寫程式需要注意的事情比較多,例如語法結尾沒加分號等狀況,難度會更高,因此會需要平時自己練習手寫在紙上或白板上
- 寫白板題時,要邊寫邊解釋:這樣做的目的是讓面試官知道自己的思考過程,由於這件事不太容易,所以建議平時也要練習
- 寫完白板題後,要做基本檢查,思考有無特殊情況:Brian 舉例,寫題後要去思考一些問題,如「時間/空間複雜度是多少?可以改善嗎?」,或「當數字是 0 或無限大時,程式還能運作嗎?」、「出現預期外的 data type 會 crash 嗎?」確保自己的程式碼在特殊情況下仍能正常運作
演算法學習 Q&A
活動最後,針對網友對演算法的相關提問,Brian 進行解答:
Q:學習演算法之前,需要有什麼樣的基礎嗎?
演算法算是獨立學問,不太需要基礎知識,但由於會使用 Big-O 來分析演算法效率,分析時會用到高中數學知識,如指數、對數等,所以還是要理解一些高中數學,假設真的忘了,碰到時再回頭補上即可。
Q:演算法會因程式語言不同而有差異嗎?
95% 邏輯是一樣的,但根據語言特性,實作細節寫法可能有點不同。如果要從零開始準備演算法面試,提供兩個面向供參考:
- 選擇自己最熟悉的語言練習演算法:絕大多數公司在面試演算法時,不會要求使用的程式語言,因此可以用自己最拿手的程式語言來準備
- 若無特別熟悉的程式語言,建議可以用 C 語言來學習演算法:由於 C 語言是很原始的程式語言,如果用 C 寫得出演算法,基本上其他語言也寫得出來
無論如何,程式語言只是工具,在準備演算法面試時,建議使用自己最拿手的武器去應戰。
Q:網路開發新手在做 side project 時,如何導入演算法思維?
其實蠻困難的,因為絕大多數前端應用軟體都用不到演算法,再者如果沒有演算法的概念,也無從應用起。只有當你具備演算法基礎知識時,做 project 才有機會用到演算法,因此在做 side project 時,可以反問自己:有沒有更棒的程式寫法。
結語
藉由 Brian 的分享可得知演算法的應用場景,及在面試及工作中所扮演的角色。在面試上,演算法常作為企業面試考題,用來測試軟體工程師是否擁有「效能」思維。而在工作中,若負責寫前端應用軟體,使用演算法能讓程式碼的品質及執行效率更好,若是做資料分析、後端應用等產品,演算法更是必備的知識。
因此,軟體工程師想讓職涯升級,懂演算法是成為優秀工程師的必經之路。