學習計算機,從抽象到具體,再到抽象
學計算機的過程,是一個從抽象到具體的過程,等將一切具象化以後,再重新理解抽象,將得到前所未有的酣暢。
以HTTP協議為例
抽象過程學習
在學HTTP協議的時候,很多人都是從「文字描述」(書本或者文章)開始,頂多是配合一些實踐,例如:如何發送一個HTTP請求,如何接受一個HTTP請求。當具有這些知識以後,再加上這個世界HTTP相關的輪子太多了,大部分情況下不需要我們親自去造。
客戶端想用一個網路框架,找找開源的,發現有一堆:Apache的HTTPClient、Square的OKHTTP,就算沒有,一些語言的系統庫也提供的一些基本的封裝(例如Java的HttpURLConnection)
服務端要用搭建一個簡單的web站點,找找開源的HTTP伺服器,也是有不少:Apache、Nginx、Tomcat等
經過一些實踐之後,對HTTP這個協議裡面包含的一些內容肯定有比較寬的了解,知道了如下內容:
- URIs/URLs/URNs,
- HTTP Request,並且知道HTTP Request裡面包含請求起始行(Request start line)、請求頭(Request Headers)和請求體(Request Bodys);請求起始行裡面又包含HTTP Method(GET POST PUT等),HTTP協議版本等
- HTTP Respone,並且知道HTTP Response裡面包含響應起始行(Response start line)、響應頭(Response Headers)和響應體(Response Bodys);響應起始行裡面包含響應狀態碼,常用的狀態碼有200、304、404、500、502等
具象過程學習
如果HTTP協議學到此處,那麼還只是停留在表象(抽象層),當被問及一些稍微深的問題或者進行操刀HTTP通信方面優化時,依然無從作答或者無法下手。
你可以通過以下問題(都是各大公司經典的面試題),檢測下自己對HTTP協議(網路知識)的理解程度:
1. get和post方法的區別?
我想這個問題的答案有一定了解的你能回答出如下重要的兩點:
(1)get用於獲取數據,post用於提交數據
(2)get不安全,post相對來說安全
那再問更深一點,get能用於提交數據嗎?為什麼?
post能用於獲取數據嗎?為什麼?
post提交的數據放在哪兒?
你覺得這個兩種請求的方法,哪一種更高效,還是說效率上沒有差別,為什麼?
2. 當在瀏覽器地址欄鍵入:http://www.taobao.com,回車之後,後續發生了哪些事情?
3. 如果讓你著手進行一些網路優化,你會從哪些方面入手?
我很喜歡的一種學習方式,就是問題式學習,這是符合客觀規律。我們每天學的東西,做的事情,往大了看,不都是為了解決問題嘛。
通過對以上問題的思考和研究,我們一定會得出以下具象的結論:
1. HTTP協議,這個詞,大部分人只是把焦點放在了「HTTP」上,而忘記了另外一個關鍵詞「協議」。協議是什麼?
Wikipedia的核心定義如下:
In telecommunication, a communication protocol is a system of rules that allow two or more entities of a communications system to transmit information via any kind of variation of a physical quantity. The protocol defines the rules syntax,semantics and synchronization of communication and possible error recovery methods. Protocols may be implemented by hardware,software, or a combination of both.[1]
精簡就是:協議就是規則,通信領域也是如此。
HTTP協議就是一套規則,大家都是按照這套規則來通信。
如果我和你對話,我用這套規則問你話,你沒有遵循這套規則,你將聽不懂,我也收不到回應,就這麼簡單。
客戶端那些開源的HTTP網路框架和服務端所使用的HTTP伺服器,就是用計算機編程語言按照這套規則來實現的軟體,我們用這套軟體間接用HTTP通信,我們也可以直接用HTTP協議來,但是太麻煩了。
2. HTTP協議是應用層協議,建立在傳輸層之上,依賴操作系統的套接字介面。研讀一下HTTP網路框架的源碼或者HTTP伺服器源碼便可得知(我研讀的是OKHTTP)。如果你覺得沒有親眼看到TCP/IP的影子,你再看看Linux關於socket的源碼,底層用的就是TCP/IP。
通過以上深入的思考、理論學習、源碼閱讀,我想我們已經進入到了HTTP具象的世界:他是一套規範,最終他被表達的方式就是代碼,然後提供給成千上萬的開發者去使用。
再抽象過程學習
當進入具象的世界之後,我們再回過頭來想想,為什麼網路世界有那麼多協議,為什麼要有經典TCP/IP四層經典模型? 一個協議不行嗎?
行。可是很麻煩。為了簡單,為了使用方便,大師們進行了層層抽象。而抽象是計算機領域一個非常重要的本質。
還記得曾經看到過一句話:計算機科學領域的任何問題都可以通過增加一個間接的中間層來解決。這句話反應的便是這個「抽象」二字的神奇功效!
我的HTTP學習方法參考
主要閱讀的書籍是:《圖解HTTP》(入門用) 《HTTP權威指南》(進階,知識點細化)《TCP/IP詳解》
實踐:編寫客戶端程序和伺服器程序,通過HTTP通信
源碼閱讀(任意選一個大眾常用的軟體即可)
推薦閱讀:
※滿分文書大全|如何寫一份招生官都拒絕不了的CS文書
※關於引用的一點點想法
※自從學了計算機網路,室友終於不在半夜打遊戲了-- ping/ICMP學以致用
※從一個指針的聲明淺談和函數、數組有關的指針
※當"老經驗"遇到"新場景"——學習方式的陷阱