
這書目前只看了一半,已經(jīng)迫不及待在豆瓣上打了五星。
問題意識
由在瀏覽器中一次請求響應的過程在計算機內部是如何處理的這個問題出發(fā),從HTTP層的請求響應協(xié)議到Socket的創(chuàng)建、連接、收發(fā)數(shù)據(jù)再到傳輸層、網(wǎng)絡層、數(shù)據(jù)鏈路層的逐步添加各層協(xié)議的包頭,到物理層將數(shù)據(jù)在局域網(wǎng)上傳輸,又是如何將0101的數(shù)字信號轉換成實際物理層面的電光信號,經(jīng)過集線器、交換機、路由器之間的傳遞到達最終目的地。講的內容實際和大學里的《計算機網(wǎng)絡》課程點幾乎一樣,但全書翻譯的還是挺流暢簡潔準確的,可以看出作者對于這個問題思考過程中層層遞進環(huán)環(huán)相扣的追問與回答,亦足見譯者的文筆和專業(yè)技術功底。
“問題意識”這個概念我大概是看秦暉先生的文章里提到的,學術界比較重視這個東西,大概意思是【問一個問題,不會是憑空想象出來的,一定是在某個特別情境產(chǎn)生的疑問,比如面對一個特殊時空下的歷史事件,或是和某個理論對話,試圖回應它能回答或不能回答的問題。而回答為什么要問這個問題的解釋,就構成了發(fā)問的問題意識】。簡單講問題就是一個很簡單的疑問,而問題意識涉及你在什么情境下產(chǎn)生這個疑問。所以問題是問題意識的結果,問題意識是形成問題的過程。
前幾天一個在小米工作的朋友在討論組里問我java里的socket通信在計算機上到底是如何工作的,這個問題認真解釋起來涉及計算機網(wǎng)絡上數(shù)據(jù)在七層協(xié)議之間流轉過程和Java程序如何調用操作系統(tǒng)層面的socket庫,還是挺費口水的。我好奇的是為什么會產(chǎn)生這個問題,原來他最近在做rpc調用的東西,java層面的api琢磨久了難免想再進一步,深挖更底層的東西,了解被api封裝的嚴嚴實實的java本地調用背后的運行機制,程序員能思考到這個程度顯然技術上又將精進不少。私以為這種才是求學問道的正途,我好像很久沒有這種不斷思考追問的狀態(tài)了。
上面不厭其煩的解釋“問題意識”這個概念就是想說知識問答已經(jīng)非?;钴S的當下,問題已經(jīng)不再重要,絕大多數(shù)都能找到答案(程序員社區(qū)三大利器Google GitHub Stackoverflow),再不濟去百度知道知乎啥的問問也會有收獲。反而是產(chǎn)生問題的過程更重要,因為這表明提問者經(jīng)歷了哪些思考,思考的廣度和深度。
那些年困惑過的計算機術語
前幾天阮一峰老師一條講socket的微博引起了一堆人的共鳴,當年學計算機時就被很多術語的中文翻譯弄得一頭霧水,比如套接字(socket)、句柄(handle)、正則表達式(regular)、宏(Macro)等等,反正看起來別扭極了,導致很多時候涉及這些術語文章看起來總覺得不自然,有滯澀感。
書中第2章最后恰好解釋了socket這個詞,原來是取自燈泡插座的的意思,就是那種老式的螺絲燈泡里凹進去的可以往里插東西的圓孔。

凡是能插東西的孔都可以叫socket,燈泡插到socket里燈就亮了,同理程序插到套接字里就可以開始通信了。套接字背后就是傳輸數(shù)據(jù)的通道,這個通道和通信對象相連接,就像流過電線的電流一樣,數(shù)據(jù)就在這個通道中流動,所以插進去一個程序,就可以和對方通信了。
解了一個千古之謎。。。
本質復雜性
記得剛學計算機語言的時候就記得一句話【面向對象的三大特性:封裝、繼承、多態(tài)】,程序語言考試包括剛畢業(yè)那兩年的各公司筆試必出這道題。曾經(jīng)對這個結論有點兒游離,到了這幾年反而體會越來越深,很多東西都是這樣,死記硬背多年,突然某個瞬間被一個纏繞許久的問題勾出來,原來是這么回事,前人的總結真是到位。
拿封裝的思想來說,得益于各種形式上接近于算術語言和自然語言,概念上接近于通常使用的概念的高級程序語言的發(fā)展,一個命令可以代替幾條、幾十條甚至幾百條直接操作計算機硬件的匯編語言的指令。這就是一種封裝,目的當然是為了解放和發(fā)展生產(chǎn)力,而Java這種面向對象的語言更將操作系統(tǒng)底層的本地調用(native)給封裝起來,只能通過JNI接口調用其他語言來實現(xiàn)對底層的訪問。所以就算再精通Java語言,離理解計算機背后的原理還差很遠。反而越深入越發(fā)現(xiàn)一切都是操作系統(tǒng)底層萬變不離其宗的運行機制被上層不同程序語言以自己的語法包裝起來而已,比如java里IO操作有bio、nio、aio,搞這么復雜是操作系統(tǒng)的同步、異步和阻塞、非阻塞模型在作怪,底層有這么多類型,上層必然也有相對應的機制,這就是逃不掉的本質復雜性。
Java的網(wǎng)絡編程看似只有Socket、ServerSocket那幾個類,新建、監(jiān)聽、accept、輸入輸出流、關閉這幾步行禮如儀,了解了更底層的機制和原理才體會出為何Java的API會設計成這樣。