我覺得有許多人覺得資料結構與演算法不重要或是不太重要的原因是我們在提到這個詞的時候指涉的對象不太一樣。

可以粗略地分為狹義跟廣義的,狹義指的是你在大學時修的那些課程,會學到一些你可能工作四五年都用不到的資料結構,例如說紅黑樹、B+ 樹、線段樹等等;演算法像是 DP、IDA+、最短路徑等等。

廣義的就是這篇文章裡面提到的,程式 = 資料結構 + 演算法,任何資料基本上都需要資料結構,任何解決問題的流程都叫做演算法。

對那些只看狹義定義的人來說,資料結構與演算法的確沒那麼重要,你就算不會寫那些東西你還是可以活得很好。然而我也相信他們認同在廣義的定義之下,資料結構與演算法是重要的。

這邊舉一個我剛好想到的例子:邏輯。我還在唸哲學系的時候修過一門課叫做基本邏輯,裡面教的就是在既定的邏輯系統之下把語句符號化,最後會變成有點像數學的一些式子,還可以做推導跟證明等等。

如果狹義的邏輯指的是這個,廣義的指的就是一般大家口中說的邏輯,狹義的邏輯重要嗎?可能不太重要,但廣義的邏輯大家都認同是重要的。對我來說,狹義的定義其實在難度上又高了一層,因為它把這件事情系統化。

舉例來說,當我們在講廣義的資料結構時,任何有結構的資料都可以稱為資料結構。可是資料結構這門學科把它系統化,所以我們知道有 Array、Linked List、Stack 跟 Queue 等等,因此學習起來的難度是比較高的。

回到原文,我聽到有人說:工作上用不太到「大學時學的那些」資料結構與演算法(狹義的定義)的時候,基本上我是認同的。不過這其實也跟工作型態有關,大部分人的工作都在上層,這邊講的上層指的是貼近使用者,下層是貼近系統。若是畫成圖會有點像是倒過來的金字塔,最上面的工程師人數最多,也離使用者最近,所以不會碰到一些跟系統相關的功能。

以這種工作類型來說,的確用不太到,因為很多東西都被下層的人給包裝好了。比如說後端工程師平常修個 bug 以為自己不會用到資料結構,殊不知資料庫的底層就一大堆大學時修的資料結構。但是這層被包裝好了,所以上層並不知道(其實也不一定要知道)。

而貼近系統的底層就必須對這些東西很熟悉,因為他們要做的事情是自己造輪子,而不是去用別人的輪子。

稍微整理一下,上層貼近使用者,工程師人數最多,門檻也相對低,平時的工作並不需要自己造輪子,所以對資料結構與演算法的專業要求也最少,大概只要知道陣列、物件就差不多了,並不一定要修這門課。

底層貼近系統,工程師人數相對少,門檻也較高,平時工作需要自己造輪子,所以需要對資料結構與演算法比較熟悉,需要學習系統化的理論,知道哪種場景底下用哪一種工具比較有效率。

對我來說,並不是每個工程師都要往下層跑,待在上層也不錯,而且上層也有其他需要解決的問題。

以上大概是我對這個問題的一些看法,我覺得這篇用旅遊規劃來比喻還滿不錯的,之後我要推薦我學生來看這篇XD

Written by

重度拖延症患者,興趣是光想不做,有很多想做的事,卻一件都沒有執行。無聊的時候喜歡寫文章,發現自己好像有把事情講得比其他人清楚的能力。相信分享與交流可以讓世界更美好。Medium 文章列表請參考:https://aszx87410.github.io/blog/medium

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store