很多程序員都知道學(xué)習(xí)計算機(jī)基礎(chǔ)知識非常的重要比肄,但是面對大量枯燥的理論知識該如何去學(xué)快耿,如何有節(jié)奏的推進(jìn)囊陡,從中得到一些正面的反饋,我覺得很多人都沒有想清楚掀亥。我曾經(jīng)也有這樣的困惑撞反,于是我翻閱很多大牛博客和付費(fèi)的專欄,從中找到一些很好的建議搪花,也用親身經(jīng)歷證明這些建議確實是有效的遏片。
不要讓你所學(xué)的概念變成孤島,概念清晰撮竿,聯(lián)系緊密才有戰(zhàn)斗力
先講一個故事吮便,2000 年我從昆明到上海,開始滬飄的歲月幢踏。剛到上海髓需,找不到好工作,只能大量地學(xué)習(xí)和看書房蝉,C/C++/Java僚匆,TCP/IP,Windows 編程惨驶,Unix 編程白热,等等。結(jié)果呢粗卜,書太多了屋确,根本看不過來。我想要更多地掌握知識续扔,結(jié)果我發(fā)現(xiàn)以死記硬背的方式根本就是在使蠻力學(xué)習(xí)攻臀,我很難在很短的時間內(nèi)學(xué)習(xí)很多的知識。于是我自己發(fā)明了一種叫“聯(lián)想記憶法”的方法纱昧,比如刨啸,在學(xué)習(xí) C++ 的時候,面對《C++ Primer》這種厚得不行的書识脆,我就使用聯(lián)想記憶法设联。我把 C++ 分成三部分。第一部分是 C++ 是用來解決 C 語言的問題的灼捂,那么 C 語言有什么問題呢离例?指針、宏悉稠、錯誤處理宫蛆、數(shù)據(jù)拷貝…… C++ 用什么技術(shù)來解決這些問題呢?第二部分是 C++ 的面向?qū)ο筇匦裕悍庋b的猛、繼承耀盗、多態(tài)想虎。封裝,讓我想到了構(gòu)造函數(shù)叛拷、析構(gòu)函數(shù)等舌厨。構(gòu)造函數(shù)讓我想到了初始化列表,想到了默認(rèn)構(gòu)造函數(shù)胡诗,想到了拷貝構(gòu)造函數(shù)邓线,想到了 new……多態(tài)淌友,讓我想到了虛函數(shù)煌恢,想到了 RTTI,RTTI 讓我想到了 dynamic_cast 和 typeid 等震庭。第三部分是 C++ 的泛型編程瑰抵。我想到了 template,想到了操作符重載器联,想到了函數(shù)對象二汛,想到 STL,想到數(shù)據(jù)容器拨拓,想到了 iterator肴颊,想到了通用算法,等等渣磷。于是婿着,我通過“順藤摸瓜”的方式,從知識樹的主干開始做廣度或是深度遍歷醋界,于是我就得到了一整棵的知識樹竟宋。這種“順藤摸瓜”的記憶方式讓我記住了很多知識。最重要的是形纺,當(dāng)出現(xiàn)一些我不知道的知識點時丘侠,我就會往這棵知識樹上掛,而這樣一來逐样,也使得我的學(xué)習(xí)更為系統(tǒng)和全面蜗字。這種畫知識圖的方式可以讓你從一個技術(shù)最重要最主干的地方出發(fā)開始遍歷所有的技術(shù)細(xì)節(jié),也就是畫地圖的方式脂新。如果你不想在知識的海洋中迷路挪捕,你需要有一份地圖,所以戏羽,學(xué)習(xí)并不是為了要記憶那些知識點担神,而是為了要找到一個知識的地圖,你在這個地圖上能通過關(guān)鍵路徑找到你想要的答案始花。
———摘自左耳耗子陳皓
我之前在學(xué)習(xí)java語言時也犯了概念孤島的錯誤妄讯,Java常用的關(guān)鍵字不下50個孩锡,我當(dāng)時非常簡單粗爆的想要記住每個關(guān)鍵字用法,結(jié)果就陷入了記了忘亥贸,忘了記的惡性循環(huán)中躬窜。殊不知這些關(guān)鍵字并不是憑空出現(xiàn)的,而是作者依據(jù)多年的軟件開發(fā)經(jīng)驗還使用者的反饋來設(shè)計炕置,所有的關(guān)鍵字都可以被劃分為幾大使用場景荣挨,例如:訪問控制(private 私有的;protected 受保護(hù)的朴摊;public 公共的)默垄,錯誤處理(catch 處理異常;finally 有沒有異常都執(zhí)行甚纲;throw 拋出一個異常對象口锭;throws 聲明一個異常可能被拋出介杆;try 捕獲異常)鹃操,基本類型(boolean 布爾型;byte 字節(jié)型春哨;char 字符型荆隘;double 雙精度;float 浮點赴背;int 整型椰拒;long 長整型;short 短整型癞尚;變量引用)等等耸三。這些應(yīng)用場景在腦海中就像一個個索引,在實踐中需要的時候浇揩,再按圖索驥去查找仪壮,非常的便捷與高效。
其實上面提到的學(xué)習(xí)方法胳徽,并非僅僅是經(jīng)驗之談积锅,這背后是由相關(guān)的理論支撐的。在很多講解大腦機(jī)制或記憶力的書籍中都提到一個相似的觀點养盗。
大腦中并沒有一個單獨(dú)的區(qū)域或結(jié)構(gòu)來存儲‘記憶’缚陷,曾有這樣一種假設(shè),人類提取記憶就是各個記憶碎片的‘重組’的過程往核。賦予隨機(jī)無序的信息以系統(tǒng)結(jié)構(gòu)箫爷,讓毫無意義的信息變得更加有意義,才能使那些容易遺忘的東西變得難以忘記。
自問自答虎锚,層層深入
舉個我學(xué)習(xí)計算機(jī)網(wǎng)絡(luò)的例子硫痰,我是以TCP/IP協(xié)議族作為起點的,通過學(xué)習(xí)窜护,我大致理解了消息傳遞的過程效斑,消息先從應(yīng)用層→傳輸層→網(wǎng)絡(luò)層→數(shù)據(jù)鏈路層→物理層經(jīng)過層層包裝,拆散柱徙,一幀一幀的由傳輸介質(zhì)把消息發(fā)送給目標(biāo)計算機(jī)缓屠,然后目標(biāo)計算機(jī)在由物理層→數(shù)據(jù)鏈路層→網(wǎng)絡(luò)層→傳輸層→應(yīng)用層,經(jīng)過層層解開包裝护侮,最后到應(yīng)用層還原消息敌完。這時候我腦海中的計算機(jī)的通信模型就像兩座沒有天橋的雙子塔,消息從A塔走到B塔必須從A塔頂層走到走到B塔后再從一層上到頂層概行。這個模型非常的簡潔明了蠢挡,也很好理解弧岳,但這只是一個骨架凳忙,真正遇到實際的問題,單靠這個模型是無法解決的禽炬。還有很多細(xì)節(jié)需要完善涧卵,這個過程是非常漫長的,需要你不停的自問自答腹尖,大量閱讀相關(guān)書籍柳恐,把這些新的概念掛到這個框架上。我舉一個如何通過自問自答和動手實踐來完善細(xì)節(jié)例子热幔,當(dāng)家都對ping這個命令和熟悉乐设,我們通過它來判斷本機(jī)和目標(biāo)機(jī)器能不能通訊。那么我們ping一臺同一個局域網(wǎng)內(nèi)的機(jī)器中間經(jīng)歷哪些過程呢绎巨?當(dāng)你需要詳細(xì)去講述這個過程的時候會突然的發(fā)現(xiàn)近尚,使用單純的使用雙子塔模型好像又不那么清晰了。首先第一點场勤,你會想戈锻,消息經(jīng)過五層協(xié)議層層封裝后,是如何發(fā)出去的呢和媳?這時候你通過查資料了解到格遭,局域網(wǎng)一般是通過一種叫交換機(jī)的設(shè)備將不同的機(jī)器連接到一起組成的。而交換機(jī)是一種二層設(shè)備留瞳,只有物理層和數(shù)據(jù)鏈路層拒迅,它能根據(jù)mac地址將消息轉(zhuǎn)發(fā)到目標(biāo)機(jī)器。這時,你會感覺清晰一點璧微,但是骤竹,你很快又會發(fā)現(xiàn)一個新的疑點。我ping的是IP地址啊往毡,那電腦是如何知道目標(biāo)的MAC地址的呢蒙揣?于是,你帶著問題去查找了相關(guān)的資料开瞭,后來你發(fā)現(xiàn)電腦并沒有什么神奇的黑魔法懒震,能夠預(yù)知目標(biāo)的mac地址,它和你一樣嗤详,不懂就問个扰。那它是如何問的呢?這時就引入了一個叫ARP協(xié)議的東西葱色。首先電腦會以廣播的方式發(fā)送一個帶有源IP源mac地址递宅,和目標(biāo)ip的數(shù)據(jù)包到局域網(wǎng)中,相當(dāng)于吼一聲苍狰,IP是xxxx的mac地址是什么办龄?這時如果目標(biāo)機(jī)器接收到這條廣播之后,拿過來一看淋昭,發(fā)現(xiàn)IP地址是自己的俐填,就會向發(fā)送這條廣播的電腦回復(fù),告訴它自己的mac地址是xxxx翔忽。于是發(fā)送ARP協(xié)議的電腦就知道對方的mac,它們倆就可以愉快的交流了英融,電腦還會自動去建立和維護(hù)一張IP地址和mac地址的映射表,這樣在短時間內(nèi)它們在通訊時歇式,只需要發(fā)一次ARP廣播就可以了驶悟。你看,通過這次自問自答和查找相關(guān)的資料是不是又完善了很多細(xì)節(jié)呢材失。我們對局域網(wǎng)內(nèi)信息如何傳輸?shù)牧私獾母釉敿?xì)了痕鳍,還引入了一些新的概念,例如:交換機(jī)豺憔,ARP協(xié)議额获,廣播,等等恭应。學(xué)習(xí)就是這么一個先了解大致的框架抄邀,然后再通過不停的提出問題解決問題,在解決問題中完善細(xì)節(jié)昼榛,層層深入的過程境肾。如果這時你覺得還不夠清晰剔难,那就動手實踐一下吧,給你介紹一個網(wǎng)絡(luò)分析神器——wireshark奥喻,他能捕捉網(wǎng)絡(luò)中的數(shù)據(jù)包偶宫,用圖形界面將其展示出來,非常的清晰和直觀环鲤。自己動手配置一個網(wǎng)絡(luò)實驗室也很簡單纯趋,只需要找到兩臺能上網(wǎng)的機(jī)器,可以是電腦或者手機(jī)冷离,在加上一個家用的路由器吵冒,就可以組成一個局域網(wǎng)啦。