看書的一點小建議!
昨天看到小北寫了篇「看書的一點小建議」,寫的很不錯,今天我也根據(jù)自己經(jīng)歷,分享下看計算機基礎(chǔ)類書的心得。
每隔一段時間,都有些讀者跑來請教我學(xué)習(xí)的心得。


他們的困惑可以歸類這幾點:
書看不懂,容易放棄,怎么辦?
看書的效率很低,怎么辦?
做了很多筆記,依然過會就忘記,怎么辦?
這些困惑我曾經(jīng)也經(jīng)歷過,中途也踩過很多坑,浪費了很多的時間,好在及時反思,調(diào)整了看書的方法,后面學(xué)習(xí)的效率立竿見影。
不要直接選擇困難模式
大家應(yīng)該知道計算機書里有個黑皮系列的書,黑皮系列的書有一個共同的特點就是厚重!
我相信不少小伙伴在想要學(xué)習(xí)計算機基礎(chǔ)類知識的時候,就買了這類黑皮書,書到貨后,我們滿懷信心,舉著厚重的黑皮書,下決心要把這些黑皮書一頁一頁地攻讀下來,結(jié)果不過幾天就被勸退了,然后就只有前幾頁是有翻閱的痕跡,剩下的幾百頁都完全是新的,最終這些厚厚的黑皮書就成了墊顯示器的神器。

黑皮系列的書確實都是經(jīng)典書,豆瓣評分都很高,知識點很全面,是好書無疑。但是這類書并不適合新手入門,你想想我們學(xué)習(xí)中文的時候,你是拿著新華字典學(xué)的嗎?很顯然不是。
黑皮書就好像游戲里「困難模式」,新人一上來就玩這個模式,根本就體會不到游戲的樂趣了,卸載了游戲那還是小事,如果留下心里陰影,造成不可逆的傷害,這就非常不好了。
說白了,這些厚的不行的計算機書不適合入門,我們應(yīng)該先從「簡單模式」慢慢過渡,要屠龍,得先從新手村起步。
就拿我親身經(jīng)歷舉例。
當(dāng)初在學(xué)習(xí)計算機網(wǎng)絡(luò)的時候,看見大家都說《計算機網(wǎng)絡(luò)-自頂向下》和《TCP/IP 詳解》這兩本書好,我立馬買了學(xué)習(xí),這本也是黑皮系列大厚書,奈何小林當(dāng)時太菜,根本就砍不動這本書,砍兩下,刀鈍了,就想睡覺。
后面又找了一波書,發(fā)現(xiàn)《圖解 TCP/IP》、 《圖解 HTTP》、《網(wǎng)絡(luò)是怎么連接的》這幾本書都不厚,而且搭配了很多圖,我又立馬買回來學(xué)習(xí)。
這幾本書讀起來不會太困難,不出一個月,我就把這三本書看完了,立馬對計算機網(wǎng)絡(luò)有了個整體且清晰的認識,終于知道了網(wǎng)絡(luò)七層模型是什么,也知道了兩臺電腦是如何通過網(wǎng)絡(luò)進行相互通信的,也知道 HTTP、DNS、TCP、UDP、IP、ICMP、DHCP、ARP 這些常見的協(xié)議是用來干嘛的了,成功突破了新手村。
雖然突破了新手村,但是學(xué)的知識還不夠深入。
所以,我后面回來看《計算機網(wǎng)絡(luò)-自頂向下》和《TCP/IP 詳解》這兩本厚厚的書,不過這次就不會那么吃力了。
后面回看這兩本書時,我也沒有選擇從頭看到尾,因為有些內(nèi)容和在新手村看的書的內(nèi)容重疊了,而且由于在新手村里知道了哪幾個協(xié)議是常見的,于是就選擇了這幾個協(xié)議的章節(jié)進行深入學(xué)習(xí),比如:
我想進一步學(xué)習(xí) TCP 協(xié)議的特性,于是就跳到《TCP/IP 詳解》書里講 TCP 協(xié)議的幾個章節(jié),我就從中學(xué)到了 TCP 流量控制、超時重傳、擁塞控制等等。
我想進一步學(xué)習(xí) IP 協(xié)議,于是就跳到《計算機網(wǎng)絡(luò)-自頂向下》書里講 IP 協(xié)議的章節(jié),我就從中學(xué)到了 IP 協(xié)議更多的細節(jié),IP 包頭的各個字段用途、尋址、路由轉(zhuǎn)發(fā)的原理等等。
看了黑皮書,我也深刻感受到黑皮系列的書確實經(jīng)典,知識體系很全面,也很細節(jié)。
但是這種大且全的書并不意味著適合入門,新手很容易就在各種細節(jié)中迷失,而且書上有些不常用的協(xié)議我們是可以選擇不看的,如果不知道重點很容易就把時間浪費在這些地方,得不償失。
我是在新手村學(xué)習(xí)里抓到學(xué)習(xí)計算機網(wǎng)絡(luò)的方向,也就是把「鍵入網(wǎng)址,到網(wǎng)頁顯示,期間發(fā)生了什么?」這個問題所涉及到的協(xié)議都要掌握,比如 HTTP、DNS、TCP、UDP、IP、ARP、MAC 等等,然后再查黑皮書對應(yīng)的章節(jié)來深入學(xué)習(xí)對應(yīng)的協(xié)議。
不僅僅是計算機網(wǎng)絡(luò),我在學(xué)習(xí)操作系統(tǒng)、計算機組成原理、網(wǎng)絡(luò)編程等等也是用這套方法,都是先看新手村的書,得知了哪些是重點知識后,再跳到黑皮書里對應(yīng)該知識的章節(jié)進行深入學(xué)習(xí)。
當(dāng)初在學(xué)網(wǎng)絡(luò)編程的時候,看見網(wǎng)上的人都說 UNP(Unix 網(wǎng)絡(luò)編程)、APUE(Unix 高級環(huán)境編程)這兩本書是網(wǎng)絡(luò)編程圣經(jīng)的書,那么好學(xué)的小林,那肯定毫無猶豫買了。
書到貨后,我瞬間就懵逼了,這兩本書是我買過最厚的書,這尼瑪怎么學(xué)?
跟著書本的節(jié)奏,學(xué)了一段的時間,是懂了些 Linux 網(wǎng)絡(luò)和系統(tǒng) API 的用法,摸索來摸索去都是各個 API 的細節(jié),始終不知道高并發(fā)網(wǎng)絡(luò)框架是如何實現(xiàn)的。

后面我又重新找了一波關(guān)于網(wǎng)絡(luò)編程的書,找到了這兩本:《TCP/IP 網(wǎng)絡(luò)編程》和《Linux高性能服務(wù)器編程》。
《TCP/IP 網(wǎng)絡(luò)編程》絕對是新手村級別的書,書里的內(nèi)容不會有過多的術(shù)語,作者都用大白話來表達,配圖也很清晰,也有介紹我想知道的網(wǎng)絡(luò)框架,雖然是比較基礎(chǔ)的多進程服務(wù)端模型、多線程服務(wù)端模型、異步 IO 模型。而且最后一章實現(xiàn)了簡單的 HTTP 服務(wù)端,讓我知道了從代碼角度是怎么解析 HTTP 報文的,以及狀態(tài)機是如何實現(xiàn)和運轉(zhuǎn)的。
《Linux高性能服務(wù)器編程》這本書主要是網(wǎng)絡(luò)框架為主,前幾章關(guān)于網(wǎng)絡(luò)基礎(chǔ)知識對于掌握了計算機網(wǎng)絡(luò)知識的同學(xué)可以直接跳過的,你看,很多知識是想通的,當(dāng)我們知道掌握了這塊知識后,在學(xué)習(xí)新一本書的時候,就可以跳過重疊的內(nèi)容。在這本書我學(xué)到了,Reactor、Proactor、信號、定時器、多進程編程、多線程編程、進程池和線程池等。
這兩本書讓我大概知道了如果一個服務(wù)端要服務(wù)多個客戶端時,不是就簡單寫個 socket 編程就完事,而是還要結(jié)合 IO 多路復(fù)用 + 多線程的思想,也就是 Reactor 的設(shè)計理念,知道了這些事情后,后面我在看很多開源框架的網(wǎng)絡(luò)模型時候,發(fā)現(xiàn)大多數(shù)基于 Reactor 的思想來實現(xiàn)的。
有了網(wǎng)絡(luò)編程總體的視角后,在需要深入理解 socket api 中各種屬性設(shè)置(超時、非阻塞 IO、阻塞 IO 等)和異常處理就要回歸 APUE 這本書。
到這里我才知道 UNP 和 APUE 為什么會被稱為網(wǎng)絡(luò)編程圣經(jīng)級別的書,原因是書里各種細節(jié)和異常都寫的很全,也很細致,可以應(yīng)對工作中很多問題。
但是事實證明,它并不是個入門級的書,所以 UNP 和 APUE 的用途比較像字典,在需要的時候去查閱就好。
學(xué)習(xí)算機組成也一樣,我先看《程序是怎么樣跑起來的》這本書,知道了程序跑起來的大概過程以及涉及到的知識點,然后帶著這個問題,從《計算機組成與設(shè)計》這本黑皮書找到每一部分的細節(jié),通過進一步學(xué)習(xí),知道了程序編譯過程,知道了 Intel x86 的指令結(jié)構(gòu),知道了計算機是如何存儲并計算浮點數(shù)的,知道了 CPU 執(zhí)行程序的工作流程,知道了計算機存儲結(jié)構(gòu)金字塔模型等等。
所以,大家在學(xué)習(xí)的時候,應(yīng)該避免直接學(xué)大而全的書,我們要先從入門級別的書看起,抓住了主線重點知識后,再通過查閱這類大而全的書來進行深入學(xué)習(xí)。
不要只局限學(xué)一本書
我在學(xué)習(xí)的時候,有個習(xí)慣,喜歡找同類型的書一起學(xué),就不會說學(xué)操作系統(tǒng)的時候,就只看一本理論書,而是結(jié)合 Linux 系統(tǒng)編程和內(nèi)核分析的書一起看,一層層的深入一個知識點。
比如,我在學(xué)習(xí)操作系統(tǒng)的時候,在《現(xiàn)代操作系統(tǒng)》學(xué)了「進程與線程」的內(nèi)容,而這本書介紹的內(nèi)容比較概念性的,知識點也比較籠統(tǒng),不夠具體。
然后我就會去學(xué)《Unix 高級環(huán)境編程》第 7 章「進程環(huán)境」、第 8 章「進程控制」、第 11 章「線程」、第 12 章「線程控制」、第 15 章「進程間通信」,這一系列章節(jié)看完后,就知道了 Linux 是如果通過創(chuàng)建進程和線程,不只局限于理論了,還學(xué)會了應(yīng)用。
當(dāng)然這還不夠,我還會去學(xué)《深入 Linux 內(nèi)核架構(gòu)》第 2 章關(guān)于進程和線程的Linux 源碼分析,發(fā)現(xiàn) Linux 中進程和線程實際上都是用一個結(jié)構(gòu)體 task_struct 來表示的。讓我很驚嘆的是, Linux 操作系統(tǒng)對于進程和線程的創(chuàng)建,都是調(diào)用 do_fork 函數(shù)實現(xiàn)的。

只不過傳遞的參數(shù)不同,通過參數(shù)的不同來控制是復(fù)制父進程的資源(內(nèi)存、文件描述、信號量等),還是引用父進程的資源,這樣會更加深刻知道進程和線程的區(qū)別。
再比如,我在學(xué)習(xí)計算機網(wǎng)絡(luò)的時候,在《圖解 TCP/IP》學(xué)到了第六章關(guān)于 TCP 超時重傳、流量控制、擁塞控制等內(nèi)容,這本書講的比較淺。
為了更深入理解 TCP,我就會去看《TCP/IP 詳解》第 17 到 24 章,這幾章都是詳細介紹了 TCP,在這里會學(xué)到更全面的 TCP,比如 同時打開或關(guān)閉、negle 算法、往返時間 RTT 的計算、還有擁塞控制、快速重傳、快速恢復(fù)、慢啟動這些過程中的擁塞窗口是怎么變化的等等。
但是我在學(xué)《TCP/IP 詳解》遇到了點困難,因為書里的案例有些地方看的不清晰,也不容易懂,特別是那些 TCP 抓包圖,看到瞎眼。
后面我找到了本神書:《TCP/IP Guide》,很可惜只有英文的,我只看了這本書講滑動窗口和流量控制的章節(jié),因為這本書的精華就是這兩個,其他的一般般,這兩個章節(jié)的配圖特別多,也很清晰。

我就在這知道了發(fā)送窗口和接收窗口的工作過程,也知道了滑動窗口對流量的影響,也知道了操作系統(tǒng)內(nèi)存緊張的時候,也會影響滑動窗口,以及糊涂窗口綜合癥等等。
所以在學(xué)習(xí)一個知識的時候,大家不一定要把一本書從頭看到尾后,才去學(xué)另外一本書。
最好的方式是在一本書看完某個章節(jié)的知識點后,馬上去學(xué)另外一本相對比較深入的書的對應(yīng)章節(jié)的內(nèi)容,這樣一層一層的深入下去,你對這個知識點的掌握就會很深刻了。
不要只看不動手
計算機類的知識都比較龐大,單純只看很容易就忘記的了,當(dāng)然即使做了筆記也會忘記。
就像小林寫了很多文章,每篇文章的內(nèi)容我也不一定都記得住,但是當(dāng)我回看文章后,知識點很快會被喚醒起來。
所以記筆記的好處在于后面復(fù)習(xí)的時候,可以很快就能回想起來。
記筆記的方式有很多種,手寫在筆記本、在書上標注、在 world 文檔記錄等等,但這些我覺得都不是好的方式。
我覺得比較好的方式是思維導(dǎo)圖,把思維導(dǎo)圖當(dāng)作一課自己的知識樹,每深入學(xué)一個知識點的時候,就開一個分支去記錄,記錄的內(nèi)容最好是用自己的話來描述,而不是復(fù)制書上的內(nèi)容,這樣只是單純的 copy,最好經(jīng)過自己大腦的思考,用自己的話做個小總結(jié),這樣的知識點不容易忘。
還有很多知識其實可以結(jié)合生活中的場景來記憶,這樣想忘記都難,比如阻塞 IO、非阻塞 IO、同步 IO 和異步 IO,我之前文章用去飯?zhí)么虿说膱鼍皝斫榻B它們之間的區(qū)別。

再比如介紹各種進程調(diào)度算法,我之前文章用銀行業(yè)務(wù)辦理的場景來介紹。

總結(jié)
最后做個總結(jié),回答開頭的問題。
書看不懂,容易放棄,怎么辦?
不要一開始選擇困難模式,也就是不要一開始選擇大而全的書,這類書一般不適合入門學(xué)習(xí)。
我們先要找新手村級別的書來入門,新手村的書一般很快就看完的,看完后我們大概就知道這類書籍的重點知識,然后再通過查閱這些大而全的書的目錄來學(xué)習(xí)對應(yīng)章節(jié)的內(nèi)容。
看書的效率很低,怎么辦?
其實書并不一定要全部從頭看完的,而且也不要固執(zhí)到一直只看一本書。
最好在學(xué)習(xí)某個知識點的時候,通過看多本書來一層層的學(xué)習(xí)這個知識點,這樣你學(xué)起來的知識點會比較全面,也更加深入。
按這種方式學(xué),你會發(fā)現(xiàn)很多書都被你不經(jīng)意間看了 7788 的。
做了很多筆記,依然過會就忘記,怎么辦?
做筆記建議使用思維導(dǎo)圖,把思維導(dǎo)圖當(dāng)作一課自己的知識樹,每深入學(xué)一個知識點的時候,就開一個分支去記錄。
在記錄筆記的時候,盡量少 copy 書上的內(nèi)容,最好還是經(jīng)過自己思考后用自己的話輸出的筆記,而且可以搭配生活場景來加深記憶點。
