如果你問一個大神们拙,學(xué)習(xí)軟件編程有哪些重要知識點(diǎn)需要掌握的歼跟,他的答案一定會包括數(shù)據(jù)結(jié)構(gòu)與算法刑棵。
對于一直疲于完成增刪改查的廣大碼農(nóng)來說赏廓,只要能把分配的任務(wù)順利完成涵紊,不出 bug 就行了,至于性能幔摸、優(yōu)雅性摸柄,那是大神們才考慮的事。其實(shí)既忆,在日常工作中驱负,我們也習(xí)慣于利用各種框架快速實(shí)現(xiàn)功能,網(wǎng)上看幾遍關(guān)于框架的快速上手應(yīng)用的博文患雇,就馬上能把各種高大上的新技術(shù)應(yīng)用到項目中去跃脊。
是的,新技術(shù)的使用門檻并不高苛吱,就連大數(shù)據(jù)酪术、深度學(xué)習(xí),甚至區(qū)塊鏈技術(shù)翠储,對一個有點(diǎn)經(jīng)驗的程序員來說绘雁,快速上手也不是難事≡可要是使用這些新技術(shù)框架過程中庐舟,遇到一些莫名奇妙的問題,連 Google 也給不出答案時住拭,程序員們就有點(diǎn)尷尬了挪略。因為我們大多不會深究這些框架技術(shù)的底層邏輯,也不關(guān)心數(shù)據(jù)是如何組織存儲和計算處理的滔岳。
今天公司的同事給我們簡單介紹了 Kafka 框架的基礎(chǔ)知識杠娱,我發(fā)現(xiàn)這個框架里就到處充斥著數(shù)據(jù)結(jié)構(gòu)與算法。消息從生產(chǎn)者到 broker 節(jié)點(diǎn)澈蟆,再到消費(fèi)者墨辛,中間過程需要對消息進(jìn)行傳輸,就涉及到數(shù)據(jù)按約定的格式進(jìn)行組織趴俘,什么樣的數(shù)據(jù)結(jié)構(gòu)才有利于實(shí)現(xiàn)安全睹簇、可靠奏赘、高效的傳輸呢?用什么算法才能更高效校驗消息是否被人篡改太惠?借助的 Zookeeper 又是怎樣協(xié)調(diào)集群里的 broker 節(jié)點(diǎn)實(shí)現(xiàn)負(fù)載均衡磨淌?消息的持久化又是怎樣分區(qū)分塊,又可以讓消費(fèi)者快速的查詢?nèi)〕龅哪卦湓ǎ靠梢哉f在這一個框架里梁只,包含了太多計算機(jī)的基礎(chǔ)知識了。
今天在同事講述消息的數(shù)據(jù)結(jié)構(gòu)的時候埃脏,我突然想起這種結(jié)構(gòu)有點(diǎn)像 java 字節(jié)碼文件的數(shù)據(jù)結(jié)構(gòu)搪锣,有魔數(shù),屬性表彩掐,接著是參數(shù)名的長度构舟,然后是參數(shù),參數(shù)值的長度堵幽,參數(shù)值狗超。再回想一下 TCP 協(xié)議里數(shù)據(jù)包的數(shù)據(jù)結(jié)構(gòu)以及公司里的自定義傳輸協(xié)議,還有流行的 protobuf 之類的協(xié)議朴下,它們采用的數(shù)據(jù)結(jié)構(gòu)都大同小異努咐,然后有自己特定的約定格式。以前我對這些知識都是看過了就算了殴胧,也沒有認(rèn)真思考為什么要這樣設(shè)計渗稍,如果要我來設(shè)計,我又會怎么做呢溃肪?現(xiàn)在我意識到了免胃,這些基礎(chǔ)的東西是不會過時的音五,無論技術(shù)怎么層出不窮惫撰,還是脫離不了核心的基礎(chǔ)知識。
不光是技術(shù)躺涝,生活中很多事情也是這樣厨钻,如果只是淺嘗輒止,或許能一時應(yīng)急坚嗜,但始終會覺得不知所以然夯膀。比如現(xiàn)在的房價漲得這么厲害,身邊買房的人都賺了苍蔬,自己是不是也借夠首付上車呢诱建?大學(xué)選專業(yè)是選現(xiàn)在超賺錢的金融、計算機(jī)類的嗎碟绑?如果光看表面俺猿,或許你周圍的清潔工人茎匠、種田的大叔們都能輕松給你一個答案,但問題的本質(zhì)是什么押袍,你有沒有詳細(xì)研究過呢诵冒?
軟件的核心就是數(shù)據(jù)結(jié)構(gòu)與算法,那么人生的核心又是什么呢谊惭?