在課程即將結(jié)束的時(shí)候,我們不聊技術(shù)本身,我想坐下來,跟你聊聊怎么來構(gòu)建個(gè)人的技術(shù)知識(shí)體系。
現(xiàn)在做技術(shù)的人普遍都有一種焦慮,相信你也或多或少有一點(diǎn),焦慮什么呢?總是感覺,自己不懂的技術(shù)太多了。雖然你不停地去學(xué)習(xí),拼命地?cái)U(kuò)充自己的技術(shù)棧,但是面對(duì)不斷出現(xiàn)的新技術(shù),學(xué)習(xí)的速度永遠(yuǎn)趕不上新技術(shù)發(fā)展的速度,就會(huì)感覺自己不會(huì)的東西越來越多,這其實(shí)就是一種技術(shù)焦慮。
焦慮的來源是什么?焦慮,其實(shí)是對(duì)某些不好的事情過度擔(dān)心而產(chǎn)生的一種煩躁情緒。這種擔(dān)心更多來源于“看不清”或者說是“未知”,人的本能就是對(duì)未知的事物會(huì)有莫名的恐懼。比如,我小時(shí)候考試考得不好,拿著成績(jī)單回家的路上是最焦慮的時(shí)候,因?yàn)槲也恢牢野謰尶吹匠煽?jī)之后會(huì)不會(huì)給我一頓胖揍。成績(jī)單交給爸媽之后,即使被揍了,也不再焦慮了,當(dāng)然屁股痛是另外一回事兒。
對(duì)于技術(shù)焦慮來說,你所擔(dān)心的“不好的事情”,其實(shí)就是擔(dān)心自己技術(shù)成長(zhǎng)跟不上技術(shù)環(huán)境的發(fā)展速度。就像一場(chǎng)賽跑,賽道是無數(shù)條路,所有人都在不同的路上拼命地往前跑,你不知道別人跑到哪兒了,也不知道還有多遠(yuǎn)才能終點(diǎn),不焦慮才怪。解決焦慮的辦法是,給你一個(gè)導(dǎo)航,你能看到自己處在什么位置,前面的路是什么樣的,應(yīng)該怎么來走,焦慮也就解除了。
緩解技術(shù)焦慮的“導(dǎo)航”是什么?如果你能跳出來,看清整個(gè)技術(shù)體系全貌,知道你自己的技術(shù)棧在這個(gè)技術(shù)體系中的位置,了解自己的長(zhǎng)處和短板,也就不再焦慮了。
我們可以把整個(gè)技術(shù)體系理解為一個(gè)超大的倒立的錐形體,上大下小。這個(gè)錐形,越靠上越偏重于應(yīng)用,或者說偏重于業(yè)務(wù),越靠下,越偏重于基礎(chǔ)技術(shù)和理論。整個(gè)技術(shù)知識(shí)結(jié)構(gòu)是這樣的模式,組成這個(gè)技術(shù)模型的每個(gè)技術(shù)點(diǎn)也呈現(xiàn)這樣的狀態(tài)。比如消息隊(duì)列,就是整個(gè)技術(shù)體系中的一小塊,它也是一個(gè)倒立的錐形。
最上層是消息隊(duì)列相關(guān)的生態(tài)系統(tǒng),這個(gè)里面涉及到的技術(shù)就非常多了,包括怎么和流計(jì)算配合,怎么和微服務(wù)配合,怎么來實(shí)現(xiàn)云原生等等。再往下一層,是各種消息隊(duì)列產(chǎn)品,這里面任何一種消息隊(duì)列產(chǎn)品,你要想把它學(xué)到精通,都需要花很多精力。
這個(gè)錐形越往下層,涉及到的技術(shù)就越少。比如說,消息隊(duì)列的實(shí)現(xiàn)原理,我們這一整門課也就差不多講全了。它用到的底層技術(shù),就是異步、并發(fā)、鎖等。直到這個(gè)錐形的尖尖,就一個(gè)數(shù)據(jù)結(jié)構(gòu),也是所有消息隊(duì)列的理論基礎(chǔ):“隊(duì)列”這個(gè)數(shù)據(jù)結(jié)構(gòu)。
在回到宏觀層面來看這個(gè)大錐形,雖然它越來越大,但是,新增的部分都在哪兒?都在上面是不是?也就是說,這個(gè)大錐形它上面的大餅越攤越大,但是底下的部分,其實(shí)變化很少。雖然計(jì)算機(jī)相關(guān)的科學(xué)也只有幾十年的歷史,但是,近二十幾年,基礎(chǔ)理論方面幾乎沒有任何突破性的進(jìn)展,也即是說這個(gè)大錐形的尖尖,二十年沒變過。我十幾年前大學(xué)本科學(xué)的課程,和現(xiàn)在在校大學(xué)生學(xué)的課程相比,基本沒什么變化,還是編譯原理、圖論這些課。
看清了技術(shù)體系的整體,再來看你自身這個(gè)個(gè)體。對(duì)于整個(gè)技術(shù)體系這個(gè)超大的錐形體,我們每個(gè)人能掌握的,也就是你個(gè)人的技術(shù)棧,也就只有其中很小的一部分。
你可能學(xué)了很多技術(shù),包括大學(xué)里面教的基礎(chǔ)理論知識(shí)、工作主要用的編程語言和一些框架等、為了面試,刷了好多的架構(gòu)和算法題。你是不是感覺,這三部分完全沒有任何關(guān)系?大學(xué)的課程早就忘得差不多了,因?yàn)楣ぷ髦谢居貌簧希还ぷ髦忻刻煊玫降木褪沁@點(diǎn)兒框架和增刪改查,做得很熟練了,也沒什么挑戰(zhàn);刷題的那些算法也僅僅是用來面試而已。
原因是什么?因?yàn)槟愕募夹g(shù)棧還沒有打通形成體系,是斷層的。這些知識(shí)其實(shí)是有聯(lián)系的,無論你開發(fā)的是什么應(yīng)用,使用什么編程語言,都免不了要使用一些基礎(chǔ)組件或者存儲(chǔ)系統(tǒng),實(shí)現(xiàn)這些基礎(chǔ)組件必然會(huì)用到一些設(shè)計(jì)模式、各種算法,那這些模式和算法,它的理論基礎(chǔ)就是你在大學(xué)中學(xué)習(xí)的那些圖論、計(jì)算機(jī)組成原理等等這些課中涉及的知識(shí)。所以說,并不是這些知識(shí)你用不到,而是你的知識(shí)體系沒有建立起來。
那一個(gè)好的、成體系的技術(shù)棧應(yīng)該是什么樣的呢?應(yīng)該是,“基礎(chǔ)深厚,涉獵廣泛,融匯貫通”。
把你個(gè)人的技術(shù)棧放到大錐形體中,應(yīng)該像一個(gè)頭向下倒立的魷魚。我們都知道,魷魚腦袋又大又尖,須子又多又長(zhǎng)。把魷魚倒過來,它腦袋要盡量塞滿這個(gè)大錐形的底部,也就是說,底層的大部分基礎(chǔ)知識(shí)你要掌握。
向上延伸的很多觸手,代表整個(gè)技術(shù)體系的最上層的眾多領(lǐng)域中,其中的幾個(gè)領(lǐng)域你也是要掌握的。并且,自上而下,最好不要有斷層,上層你掌握的技術(shù)不能只是浮于表面,而是要足夠的深入,深入到與你掌握的底層技術(shù)連通起來,代表你的知識(shí)體系是貫通的。
舉個(gè)例子,比如你寫了一段代碼,往數(shù)據(jù)庫中寫了一條數(shù)據(jù)。你編寫的程序,它在運(yùn)行時(shí)是怎么存儲(chǔ)和傳輸這條數(shù)據(jù)的?數(shù)據(jù)是如何從你的程序傳遞給數(shù)據(jù)庫的?數(shù)據(jù)在數(shù)據(jù)庫中是如何處理并存儲(chǔ)的?數(shù)據(jù)庫又是怎么把數(shù)據(jù)保存到磁盤上的?數(shù)據(jù)在磁盤上是以什么形式保存的?如果你可以回答出這些問題,那代表在這方面你的知識(shí)體系自上而下已經(jīng)打通了。
這樣的個(gè)人技術(shù)體系它有什么好處呢?你已經(jīng)掌握的每項(xiàng)應(yīng)用技術(shù),都是你實(shí)際工作中最常用的東西,你掌握的足夠深入,設(shè)計(jì)出來的技術(shù)方案或者寫出來的代碼質(zhì)量就更高,遇到相關(guān)的疑難問題也不至于難倒你。有一個(gè)非常好的基礎(chǔ),你學(xué)習(xí)新的應(yīng)用技術(shù)也會(huì)非??欤?yàn)槟阒灰獙W(xué)習(xí)它上層那部分就可以了,底層的技術(shù)很多是相通的。
我們講了從消息隊(duì)列的應(yīng)用到實(shí)現(xiàn)原理、再到底層技術(shù)。然后,我們?cè)趯?shí)踐篇來開發(fā) RPC 框架的時(shí)候,你會(huì)發(fā)現(xiàn)它和消息隊(duì)列用到的很多底層技術(shù)就是一樣的,那你學(xué)起來就會(huì)很容易很快。對(duì)于 RPC 框架這個(gè)知識(shí)體系,很多底層基礎(chǔ)技術(shù)你都已經(jīng)掌握了,你真正需要學(xué)習(xí)的,新的知識(shí)相對(duì)就會(huì)少一些。
那么,我們應(yīng)該怎么樣來構(gòu)建自己的技術(shù)知識(shí)體系呢?這里我給你一些建議。
我們大部分程序員的成長(zhǎng)軌跡都是差不多的。大學(xué)學(xué)習(xí)的那些計(jì)算機(jī)專業(yè)課,除了你學(xué)的那門編程語言以外,其他的專業(yè)課畢業(yè)之后大概率是用不到的。原因是,這些技術(shù)在整個(gè)技術(shù)體系中,基本上處于最底層。而我們畢業(yè)后,無論是做 Web 開發(fā)、做 APP 開發(fā)還是搞機(jī)器學(xué)習(xí)等等,在技術(shù)錐形結(jié)構(gòu)中都是最上層的應(yīng)用技術(shù),距離底層的技術(shù)太遠(yuǎn),聯(lián)系不上。
這個(gè)階段我給你的建議是,在一個(gè)技術(shù)領(lǐng)域內(nèi)盡量擴(kuò)展你的技術(shù)廣度。比如,你是做 Web 開發(fā)的,你可以嘗試多學(xué)多用相關(guān)的各種技術(shù),像各種 Web 框架、HTTP 協(xié)議、JSON、數(shù)據(jù)庫應(yīng)用、相關(guān)的各種中間件和組件。你不要今天學(xué)了 Spring,明天又去學(xué)機(jī)器學(xué)習(xí),后天再去學(xué)安卓,這樣跨度太大很難建立體系。
當(dāng)你在某個(gè)技術(shù)領(lǐng)域的技術(shù)廣度足夠了,達(dá)到一個(gè)什么程度呢?這個(gè)領(lǐng)域內(nèi)常用的技術(shù)你都會(huì)使用,隨便一個(gè)技術(shù),你都知道,或者即使你不知道,簡(jiǎn)單看一下也能很快明白,了解這個(gè)技術(shù)在這個(gè)技術(shù)領(lǐng)域內(nèi)是哪一類的,至少你知道的某個(gè)技術(shù)和它是類似的。
這個(gè)時(shí)候,你就可以去深入的,有目的的去找領(lǐng)域內(nèi)最核心的幾個(gè)技術(shù),去深入地學(xué)習(xí)它的實(shí)現(xiàn)原理和底層技術(shù)。比如,你是做 Web 開發(fā)的,你可以去學(xué)習(xí)某個(gè) Web 框架的實(shí)現(xiàn)原理,學(xué)習(xí) Web 容器的工作原理、學(xué)習(xí)數(shù)據(jù)庫的存儲(chǔ)結(jié)構(gòu)等等。當(dāng)你把這個(gè)技術(shù)領(lǐng)域內(nèi)的大部分技術(shù)研究到足夠深入,能夠聯(lián)系起來,你在這個(gè)技術(shù)領(lǐng)域內(nèi)的個(gè)人技術(shù)體系就建好了,你的第一條“小魷魚”就形成了。
所謂萬事開頭難,這一步其實(shí)是最難的,但是只要邁過這個(gè)門檻,后面的過程就相對(duì)簡(jiǎn)單了。你這個(gè)小魷魚可能個(gè)頭很小,須子也不多,頭扎的也不夠深,但是沒關(guān)系,只要是建立起了知識(shí)體系,這些問題都不是關(guān)鍵問題,都可以通過不斷的學(xué)習(xí)來逐步成長(zhǎng)。
建立起第一個(gè)小魷魚之后,你可以選擇繼續(xù)擴(kuò)展你知識(shí)體系的廣度和深度,養(yǎng)肥養(yǎng)大這條小魷魚。也可以換一個(gè)新的技術(shù)方向,再養(yǎng)一條新的小魷魚。隨著你涉獵的技術(shù)廣度和深度逐步增加,這些孤立的小魷魚,總會(huì)在底層的某個(gè)地方連通起來,變成一條大魷魚。當(dāng)你個(gè)人的技術(shù)體系足夠豐滿了之后,大部分新技術(shù)對(duì)你來說不過都是一根兒魷魚須子而已。你了解了技術(shù)全景,再構(gòu)建起你個(gè)人的技術(shù)體系,自然就不再焦慮了。
所謂,“大道至簡(jiǎn),知易行難”。道理總是聽起來很簡(jiǎn)單,真正能理解道理,落到實(shí)踐中去,還是非常難的。在實(shí)踐的過程中,可能有很多繁瑣的、瑣碎的問題都需要你去解決。希望你在構(gòu)建自己的知識(shí)體系過程中,能沉下心,堅(jiān)持去學(xué)習(xí)、練習(xí)和試錯(cuò)。勤勉之道無他,在有恒而已,愿你我共勉。
“送君千里,終有一別”,我們的這個(gè)課也該說再見了。在專欄開始更新時(shí),我曾鼓勵(lì)你立 Flag,不知道在這2周的時(shí)間里,你是否堅(jiān)持學(xué)習(xí)了每一節(jié)課?有沒有離當(dāng)初的目標(biāo)更近一些?希望你能堅(jiān)定不移地朝自己的目標(biāo)走去,無悔初心。
感謝你的一路支持,專欄雖然更新結(jié)束,但我們依舊可以在留言區(qū)繼續(xù)交流技術(shù)!最后,也祝福你不僅能成為消息隊(duì)列的高手,還可以通過對(duì)消息隊(duì)列的學(xué)習(xí),打通任督二脈,不僅能在職場(chǎng)上披襟斬棘,更能實(shí)現(xiàn)你的技術(shù)夢(mèng)想!
IT技術(shù)編程棧,致力于為廣大IT技術(shù)人員提供免費(fèi)的,實(shí)時(shí)的解決問題寶典。為您的學(xué)習(xí)以及開發(fā)提供技術(shù)支持!
聯(lián)系客服