看書的一點小建議!

大家好,我是小林。

我在部落格園輸出了兩個圖解系列,分別是圖解網路圖解系統,每個系列都輸出了 15W 字 + 500 張圖,收到了很多小夥伴的認可和支援,也經常小夥伴跑來感激小林,說看了我的圖解,拿到了大廠的 Offer。

這次就跟大家分享下我的看書經驗和心得

每隔一段時間,都有些讀者跑來請教我學習的心得。


他們的困惑可以歸類這幾點:

 

  • 書看不懂,容易放棄,怎麼辦?
  • 看書的效率很低,怎麼辦?
  • 做了很多筆記,依然過會就忘記,怎麼辦?

這些困惑我曾經也經歷過,中途也踩過很多坑,浪費了很多的時間,好在及時反思,調整了看書的方法,後面學習的效率立竿見影。

一、不要直接選擇困難模式

大家應該知道電腦書里有個黑皮系列的書,黑皮系列的書有一個共同的特點就是厚重

我相信不少小夥伴在想要學習電腦基礎類知識的時候,就買了這類黑皮書,書到貨後,我們滿懷信心,舉著厚重的黑皮書,下決心要把這些黑皮書一頁一頁地攻讀下來,結果不過幾天就被勸退了,然後就只有前幾頁是有翻閱的痕迹,剩下的幾百頁都完全是新的,最終這些厚厚的黑皮書就成了墊顯示器的神器

黑皮系列的書確實都是經典書,豆瓣評分都很高,知識點很全面,是好書無疑。但是這類書並不適合新手入門,你想想我們學習中文的時候,你是拿著新華字典學的嗎?很顯然不是。

黑皮書就好像遊戲里「困難模式」,新人一上來就玩這個模式,根本就體會不到遊戲的樂趣了,卸載了遊戲那還是小事,如果留下心裡陰影,造成不可逆的傷害,這就非常不好了。

說白了,這些厚的不行的電腦書不適合入門,我們應該先從「簡單模式」慢慢過渡,要屠龍,得先從新手村起步。

就拿我親身經歷舉例。

當初在學習電腦網路的時候,看見大家都說《電腦網路-自頂向下》和《TCP/IP 詳解》這兩本書好,我立馬買了學習,這本也是黑皮系列大厚書,奈何小林當時太菜,根本就砍不動這本書,砍兩下,刀鈍了,就想睡覺。

後面又找了一波書,發現《圖解 TCP/IP》、 《圖解 HTTP》、《網路是怎麼連接的》這幾本書都不厚,而且搭配了很多圖,我又立馬買回來學習。

這幾本書讀起來不會太困難,不出一個月,我就把這三本書看完了,立馬對電腦網路有了個整體且清晰的認識,終於知道了網路七層模型是什麼,也知道了兩台電腦是如何通過網路進行相互通訊的,也知道 HTTP、DNS、TCP、UDP、IP、ICMP、DHCP、ARP 這些常見的協議是用來幹嘛的了,成功突破了新手村。

雖然突破了新手村,但是學的知識還不夠深入。

所以,我後面回來看《電腦網路-自頂向下》和《TCP/IP 詳解》這兩本厚厚的書,不過這次就不會那麼吃力了。

後面回看這兩本書時,我也沒有選擇從頭看到尾,因為有些內容和在新手村看的書的內容重疊了,而且由於在新手村裡知道了哪幾個協議是常見的,於是就選擇了這幾個協議的章節進行深入學習,比如:

  • 我想進一步學習 TCP 協議的特性,於是就跳到《TCP/IP 詳解》書里講 TCP 協議的幾個章節,我就從中學到了 TCP 流量控制、超時重傳、擁塞控制等等。
  • 我想進一步學習 IP 協議,於是就跳到《電腦網路-自頂向下》書里講 IP 協議的章節,我就從中學到了 IP 協議更多的細節,IP 包頭的各個欄位用途、定址、路由轉發的原理等等。

看了黑皮書,我也深刻感受到黑皮系列的書確實經典,知識體系很全面,也很細節。

但是這種大且全的書並不意味著適合入門,新手很容易就在各種細節中迷失,而且書上有些不常用的協議我們是可以選擇不看的,如果不知道重點很容易就把時間浪費在這些地方,得不償失。

我是在新手村學習里抓到學習電腦網路的方向,也就是把「鍵入網址,到網頁顯示,期間發生了什麼?」這個問題所涉及到的協議都要掌握,比如 HTTP、DNS、TCP、UDP、IP、ARP、MAC 等等,然後再查黑皮書對應的章節來深入學習對應的協議。

就這樣學成電腦網路後,我在部落格園共輸出了 20 多篇圖解網路系列的文章,總字數高達 15W 字,並且手繪的圖共有 500 張,收穫了很多讀者的認可和支援,不少讀者跑來感激我,說我的圖解網路在面試中幫助到他們,不少人拿到了阿里、騰訊、位元組等大廠的Offer。

為了方便讀者們閱讀我把圖解網路整理成了PDF,大家可以作為面基突擊的手冊,開源給大家下載:點擊下載圖解網路 PDF

不僅僅是電腦網路,我在學習作業系統、電腦組成原理、網路編程等等也是用這套方法,都是先看新手村的書,得知了哪些是重點知識後,再跳到黑皮書里對應該知識的章節進行深入學習。

當初在學網路編程的時候,看見網上的人都說 UNP(Unix 網路編程)、APUE(Unix 高級環境編程)這兩本書是網路編程聖經的書,那麼好學的小林,那肯定毫無猶豫買了。

書到貨後,我瞬間就懵逼了,這兩本書是我買過最厚的書,這尼瑪怎麼學?

跟著書本的節奏,學了一段的時間,是懂了些 Linux 網路和系統 API 的用法,摸索來摸索去都是各個 API 的細節,始終不知道高並發網路框架是如何實現的。

後面我又重新找了一波關於網路編程的書,找到了這兩本:《TCP/IP 網路編程》和《Linux高性能伺服器編程》。

  • 《TCP/IP 網路編程》絕對是新手村級別的書,書里的內容不會有過多的術語,作者都用大白話來表達,配圖也很清晰,也有介紹我想知道的網路框架,雖然是比較基礎的多進程服務端模型、多執行緒服務端模型、非同步 IO 模型。而且最後一章實現了簡單的 HTTP 服務端,讓我知道了從程式碼角度是怎麼解析 HTTP 報文的,以及狀態機是如何實現和運轉的。
  • 《Linux高性能伺服器編程》這本書主要是網路框架為主,前幾章關於網路基礎知識對於掌握了電腦網路知識的同學可以直接跳過的,你看,很多知識是想通的,當我們知道掌握了這塊知識後,在學習新一本書的時候,就可以跳過重疊的內容。在這本書我學到了,Reactor、Proactor、訊號、定時器、多進程編程、多執行緒編程、進程池和執行緒池等。

這兩本書讓我大概知道了如果一個服務端要服務多個客戶端時,不是就簡單寫個 socket 編程就完事,而是還要結合 IO 多路復用 + 多執行緒的思想,也就是 Reactor 的設計理念,知道了這些事情後,後面我在看很多開源框架的網路模型時候,發現大多數基於 Reactor 的思想來實現的。

有了網路編程總體的視角後,在需要深入理解 socket api 中各種屬性設置(超時、非阻塞 IO、阻塞 IO 等)和異常處理就要回歸 APUE 這本書。

到這裡我才知道 UNP 和 APUE 為什麼會被稱為網路編程聖經級別的書,原因是書里各種細節和異常都寫的很全,也很細緻,可以應對工作中很多問題。

但是事實證明,它並不是個入門級的書,所以 UNP 和 APUE 的用途比較像字典,在需要的時候去查閱就好。

學習算機組成也一樣,我先看《程式是怎麼樣跑起來的》這本書,知道了程式跑起來的大概過程以及涉及到的知識點,然後帶著這個問題,從《電腦組成與設計》這本黑皮書找到每一部分的細節,通過進一步學習,知道了程式編譯過程,知道了 Intel x86 的指令結構,知道了電腦是如何存儲並計算浮點數的,知道了 CPU 執行程式的工作流程,知道了電腦存儲結構金字塔模型等等。

所以,大家在學習的時候,應該避免直接學大而全的書,我們要先從入門級別的書看起,抓住了主線重點知識後,再通過查閱這類大而全的書來進行深入學習。

二、不要只局限學一本書

我在學習的時候,有個習慣,喜歡找同類型的書一起學,就不會說學作業系統的時候,就只看一本理論書,而是結合 Linux 系統編程和內核分析的書一起看,一層層的深入一個知識點。

比如,我在學習作業系統的時候,在《現代作業系統》學了「進程與執行緒」的內容,而這本書介紹的內容比較概念性的,知識點也比較籠統,不夠具體。

然後我就會去學《Unix 高級環境編程》第 7 章「進程環境」、第 8 章「進程式控制制」、第 11 章「執行緒」、第 12 章「執行緒控制」、第 15 章「進程間通訊」,這一系列章節看完後,就知道了 Linux 是如果通過創建進程和執行緒,不只局限於理論了,還學會了應用。

當然這還不夠,我還會去學《深入 Linux 內核架構》第 2 章關於進程和執行緒的Linux 源碼分析,發現 Linux 中進程和執行緒實際上都是用一個結構體 task_struct 來表示的。讓我很驚嘆的是, Linux 作業系統對於進程和執行緒的創建,都是調用 do_fork 函數實現的。


只不過傳遞的參數不同,通過參數的不同來控制是複製父進程的資源(記憶體、文件描述、訊號量等),還是引用父進程的資源,這樣會更加深刻知道進程和執行緒的區別。

 

我學成作業系統後,也寫了 20 多篇圖解作業系統系列文章,最近花了幾天時間整理成圖解系統 PDF

現在也開源給大家下載:點擊下載圖解系統 PDF

再比如,我在學習電腦網路的時候,在《圖解 TCP/IP》學到了第六章關於 TCP 超時重傳、流量控制、擁塞控制等內容,這本書講的比較淺。

為了更深入理解 TCP,我就會去看《TCP/IP 詳解》第 17 到 24 章,這幾章都是詳細介紹了 TCP,在這裡會學到更全面的 TCP,比如 同時打開或關閉、negle 演算法、往返時間 RTT 的計算、還有擁塞控制、快速重傳、快速恢復、慢啟動這些過程中的擁塞窗口是怎麼變化的等等。

但是我在學《TCP/IP 詳解》遇到了點困難,因為書里的案例有些地方看的不清晰,也不容易懂,特別是那些 TCP 抓包圖,看到瞎眼。

後面我找到了本神書:《TCP/IP Guide》,很可惜只有英文的,我只看了這本書講滑動窗口和流量控制的章節,因為這本書的精華就是這兩個,其他的一般般,這兩個章節的配圖特別多,也很清晰。

我就在這知道了發送窗口和接收窗口的工作過程,也知道了滑動窗口對流量的影響,也知道了作業系統記憶體緊張的時候,也會影響滑動窗口,以及糊塗窗口綜合症等等。

所以在學習一個知識的時候,大家不一定要把一本書從頭看到尾後,才去學另外一本書。

最好的方式是在一本書看完某個章節的知識點後,馬上去學另外一本相對比較深入的書的對應章節的內容,這樣一層一層的深入下去,你對這個知識點的掌握就會很深刻了。

三、不要只看不動手

電腦類的知識都比較龐大,單純只看很容易就忘記的了,當然即使做了筆記也會忘記。

就像小林寫了很多文章,每篇文章的內容我也不一定都記得住,但是當我回看文章後,知識點很快會被喚醒起來。

所以記筆記的好處在於後面複習的時候,可以很快就能回想起來。

記筆記的方式有很多種,手寫在筆記型電腦、在書上標註、在 world 文檔記錄等等,但這些我覺得都不是好的方式。

我覺得比較好的方式是思維導圖,把思維導圖當作一課自己的知識樹,每深入學一個知識點的時候,就開一個分支去記錄,記錄的內容最好是用自己的話來描述,而不是複製書上的內容,這樣只是單純的 copy,最好經過自己大腦的思考,用自己的話做個小總結,這樣的知識點不容易忘。

還有很多知識其實可以結合生活中的場景來記憶,這樣想忘記都難,比如阻塞 IO、非阻塞 IO、同步 IO 和非同步 IO,我之前文章用去飯堂打菜的場景來介紹它們之間的區別。


再比如介紹各種進程調度演算法,我之前文章用銀行業務辦理的場景來介紹。

 

四、總結

最後做個總結,回答開頭的問題。

書看不懂,容易放棄,怎麼辦?

不要一開始選擇困難模式,也就是不要一開始選擇大而全的書,這類書一般不適合入門學習。

我們先要找新手村級別的書來入門,新手村的書一般很快就看完的,看完後我們大概就知道這類書籍的重點知識,然後再通過查閱這些大而全的書的目錄來學習對應章節的內容。

看書的效率很低,怎麼辦?

其實書並不一定要全部從頭看完的,而且也不要固執到一直只看一本書。

最好在學習某個知識點的時候,通過看多本書來一層層的學習這個知識點,這樣你學起來的知識點會比較全面,也更加深入。

按這種方式學,你會發現很多書都被你不經意間看了 7788 的。

做了很多筆記,依然過會就忘記,怎麼辦?

做筆記建議使用思維導圖,把思維導圖當作一課自己的知識樹,每深入學一個知識點的時候,就開一個分支去記錄。

在記錄筆記的時候,盡量少 copy 書上的內容,最好還是經過自己思考後用自己的話輸出的筆記,而且可以搭配生活場景來加深記憶點。

五、作者簡介

作者簡介:大家好,我是小林,一個專為大家圖解的工具人,微信搜索「小林coding」,關注回復「圖解」,獲取小林原創的圖解網路和圖解系統 PDF。