
這是第三次參與鐵人賽,很感動終於完成了🫠!
先來回顧一下此次系列文包含的主題:
這系列文一開始是因為自己想完成 Udemy 的 《Master the Coding Interview: Data Structures + Algorithms》線上課程,所以主題主要圍繞它,後來覺得可能相關知識不夠,又去讀了《A Common-Sense Guide to Data Structures and Algorithms》這本書,A Common-Sense Guide 的寫法很淺顯易懂,也有很多好理解的示意圖,不過我還是想有比較紮實的理解,所以又去上了台大林軒田教授放在 YouTube 的 《Data Structures and Algorithms》 課程,這對我來說就有點硬了XD。原本預計是三個學習資源都要完整看完,但後來因為有其他事要忙,只完成前兩者,台大的課程還在努力中QQ,希望近期也能把它上完~
資料結構與演算法(以下簡稱 DSA)是個有很多技術細節可深入研究的主題,這系列文只是以我讀的書、上的課為主來整理,可能有些不夠深入,但也希望能作為自己入門這個主題的學習筆記。此外,後來因時間關係,沒能學習並寫到更多 C++ 語言的部分,這也和一開始的規劃有些不同><但還是希望大家能藉這個系列初步認識 DSA~
如上所述,這次是圍繞幾個主要學習資源來寫,但時間心力有限,要在 30 天內涵蓋所有內容並不容易,難免有所取捨。有些原本規劃要提的沒有寫出來,或因為自己還不夠理解,所以只先大致帶過,例如:
上述遺珠有些也是我還不夠理解、需要再進一步學習的。除此之外,DSA 還有很多深入的技術主題可以探討,以下列出幾個這次學習資源沒有涵蓋、但也很常看到的主題:
如果對 DSA 有更多興趣,以下也列一些可以參考的資源,這也是我的待讀清單(待讀清單隨著鐵人賽持續增加中,哈哈哈嗚嗚嗚...):
應該很多人接觸 DSA 是為了刷 LeetCode,我一開始也是,想說先對這主題有大致了解後再開始刷題。不過寫完這系列文後,我覺得自己並沒有因此精通 LeetCode,畢竟刷題和學 DSA 需要不同的策略和角度,但也許以後看題目時會比以前稍微🤏有概念一點嗎(?
雖然不是刷題大師,但我仍然藉這次機會多認識了一些日常應用背後的實作,了解它們可能和哪些資料結構或演算法有關,也從中學到分析程式複雜度的方法,也算有點收穫了><
去年寫 FP 系列文時,我提到學會 FP 讓我多了另一種看待問題的角度,並且能應用到日常開發上,與 FP 這主題相比,我覺得我在 DSA 這領域上並沒有那麼精熟。現在有了 AI Agent 後,大部分人應該幾乎不再手寫程式了,但我想 DSA 這些基礎核心的東西仍有其重要性,軟體工程師也許不寫程式,但仍然要是能解決問題的人,多了解 DSA,思考問題時就會有更多考量面向與可行解方,我覺得這就像工具包的概念吧~它會隨著自己的學習與成長變得多元豐富,能解決的問題也會跟著變多,希望自己能繼續努力延伸學習~!
這次參賽前沒有太多糾結,但過程一樣非常痛苦,尤其演算法分析涉及一些數學的東西,看得頭很痛,相關讀物也是讀不完...。
另外,這次文章架構也有部分參考去年的寫法,以 Huli 大大在跟著小明一起搞懂技術名詞:MVC、SPA 與 SSR文章最後提到的方式來介紹每個主題:
我們可以用三個問題來幫助自己理解一項事物:
- 為什麼要有 XXX?
- 沒有 XXX 跟有 XXX 的區別是什麼?
- 所以 XXX 是什麼?
但這次不是每篇都依循這脈絡,因為我也參考了 EduHub 的 Concept Explainer skill,先從類比、一句話定義開始,再逐漸進入主題,希望還算好理解~
其實我今年的狀態一直不是很好,身心都很疲憊,求職上也有點挫折,好像還沒找到生活、工作、學習,又或是整個職涯上的平衡與方向。這次寫鐵人賽時也同時在忙別的事情,因此有些主題來不及好好查資料、深入學習。總是很忙碌地追趕著什麼,卻又感覺什麼都沒有(?,這陣子真的十分迷茫...因此,我們還是要再次重複雞湯!(突然的轉折🤣)
沒時間心力研究太多也無所謂,就先把目前學到的寫下來就好!
DSA 是每屆鐵人賽都會看到的主題,今年也看到很多優秀大大寫了這個題目,非常佩服。但回到自己的參賽目標,我想做的是上完《Master the Coding Interview: Data Structures + Algorithms》線上課程、讀完《A Common-Sense Guide to Data Structures and Algorithms》這本書,以及上完台大林軒田教授的課程。雖然台大課程還沒上完,但有達到部分目標就很棒了~
小小的進展也許看起來沒什麼,但相信自己每天一點點的學習都是累積,至少跟去年相比,我又多認識了 DSA 一點了!
即使現在 AI 已經很擅長寫程式、解 LeetCode 題,學 DSA 仍然有它的收穫,不一定是知識本身,也可能是從更多觀點思考的判斷力。學習是為了自己,重點是我有從中學到一些新東西,那就足夠了~
這陣子最喜歡的還是馬男波傑克的台詞:「It gets easier. Every day it gets a little easier. But you gotta do it every day — that's the hard part. But it does get easier.」每次覺得自己要不行了,都會默默重複的一句話。也許我學習與成長的步伐不快,但要相信一點一滴累積的力量!會越來越好的💪
為了完成系列文,我學到一些書中沒提到的知識,例如 V8 的 Array.prototype.sort 怎麼依陣列長度選擇排序方式、垃圾回收怎麼標記還在使用的物件。雖然和平常開發沒有直接相關,但看到 V8 為了效能做的這些處理就覺得蠻有趣的(有些真的好複雜哇),以實際應用為動機來接觸、學習 DSA,也讓它變得沒那麼遙遠。
另外這次文章也有很多示意圖,DSA 不少概念都很適合搭配圖來說明。本來想自己畫的,無奈這次真的太忙了QQ,就請 Claude Code 參考我過去畫的圖來繪製,來回也調整了很多次,希望大家會喜歡這次的圖~
最後的最後,給自己還有參賽的大家大大的掌聲吧!堅持 30 天真的不容易~即使有了 AI 能加速文章產出,但還是要先理解內容,才能進一步組織成文章,這也是很不簡單的事👍
如果你喜歡我的系列文,可以多多分享,文章中有任何敘述不清或錯誤的地方,都歡迎指教與討論!
若有興趣,也可以追蹤我的 Medium,另外我也建立好個人部落格啦!雖然鐵人賽文章還沒搬過去,但部落格會和 Medium 文章同步更新,也歡迎逛逛😆
希望這次資料結構與演算法之旅還算充實,謝謝大家,我們下次見👋🏻