看書的一點小建議!

大家好,我是小林。

我在博客園輸出了兩個圖解系列,分別是圖解網絡圖解系統,每個系列都輸出了 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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章