軟體的核心就是資料結構與演算法
如果你問一個大神,學習軟體程式設計有哪些重要知識點需要掌握的,他的答案一定會包括資料結構與演算法。
對於一直疲於完成增刪改查的廣大碼農來說,只要能把分配的任務順利完成,不出 bug 就行了,至於效能、優雅性,那是大神們才考慮的事。其實,在日常工作中,我們也習慣於利用各種框架快速實現功能,網上看幾遍關於框架的快速上手應用的博文,就馬上能把各種高大上的新技術應用到專案中去。
是的,新技術的使用門檻並不高,就連大資料、深度學習,甚至區塊鏈技術,對一個有點經驗的程式員來說,快速上手也不是難事。可要是使用這些新技術框架過程中,遇到一些莫名奇妙的問題,連 Google 也給不出答案時,程式設計師們就有點尷尬了。因為我們大多不會深究這些框架技術的底層邏輯,也不關心資料是如何組織儲存和計算處理的。
今天公司的同事給我們簡單介紹了 Kafka 框架的基礎知識,我發現這個框架裡就到處充斥著資料結構與演算法。訊息從生產者到 broker 節點,再到消費者,中間過程需要對訊息進行傳輸,就涉及到資料按約定的格式進行組織,什麼樣的資料結構才有利於實現安全、可靠、高效的傳輸呢?用什麼演算法才能更高效校驗訊息是否被人篡改?藉助的 Zookeeper 又是怎樣協調叢集裡的 broker 節點實現負載均衡?訊息的持久化又是怎樣分割槽分塊,又可以讓消費者快速的查詢取出的呢?可以說在這一個框架裡,包含了太多計算機的基礎知識了。
今天在同事講述訊息的資料結構的時候,我突然想起這種結構有點像 java 位元組碼檔案的資料結構,有魔數,屬性表,接著是引數名的長度,然後是引數,引數值的長度,引數值。再回想一下 TCP 協議裡資料包的資料結構以及公司裡的自定義傳輸協議,還有流行的 protobuf 之類的協議,它們採用的資料結構都大同小異,然後有自己特定的約定格式。以前我對這些知識都是看過了就算了,也沒有認真思考為什麼要這樣設計,如果要我來設計,我又會怎麼做呢?現在我意識到了,這些基礎的東西是不會過時的,無論技術怎麼層出不窮,還是脫離不了核心的基礎知識。
不光是技術,生活中很多事情也是這樣,如果只是淺嘗輒止,或許能一時應急,但始終會覺得不知所以然。比如現在的房價漲得這麼厲害,身邊買房的人都賺了,自己是不是也借夠首付上車呢?大學選專業是選現在超賺錢的金融、計算機類的嗎?如果光看表面,或許你周圍的清潔工人、種田的大叔們都能輕鬆給你一個答案,但問題的本質是什麼,你有沒有詳細研究過呢?
軟體的核心就是資料結構與演算法,那麼人生的核心又是什麼呢?