1. 程式人生 > >,《計算機網路》這門課為何如此之難?

,《計算機網路》這門課為何如此之難?

作業系統和計算機網路的共同點,在於它們都是相當複雜的體系結構,如果覺得難,也許是因為自己沒能產生足夠的求知慾。你也說了,“無聊,晦澀”——而無聊感其實是沒治的。對課程的熱情和對女生的愛慕感其實差不多,不能一見鍾情的,可以試著培養,培養之後還是覺得無聊的,那就不是真情了。

以下討論如何培養自己對計算機網路的真情。

首先,計算機網路這門課,我不知道你們用哪本教材,不過任何足夠好的教材,都要教給你各種五花八門協議的來龍去脈,也就是歷史。學歷史,要有——借用一個文科生的 buzzword——“大歷史觀”。自一九六九年 ARPANET 以降,計算機網路是個頗有些年頭的玩意。那些協議啦縮寫啦什麼的,大都在你出生之前就存在了。去翻翻舊的 RFC,英文的寫作風格都不太一樣——那時候的 nerd 們,西裝革履,坐在窄小的單色 CRT 顯示器前面,敲下一個個字元——許多人如今都已經作古,但他們苦心定製下來的各種規約(Protocol),讓你今天能在知乎上面問我這個問題。這難道不是很神奇的事情嗎?所以你要有感恩的心。有了感恩的心,妖就不再……呃,我的意思是,研究歷史就會有朝聖感。


而計算機網路的一切技術細節,也就是那些枯燥的部分,都是歷史遺留問題。可以說,如果將現有一切推倒重來,重新考慮“多臺計算機之間如何互相通訊”這個計算機網路所解決的根本問題,再發明出來的網際網路將會是完全另一番樣子,而且肯定會簡單很多——一個原因是技術進步了,另一個原因是人們從歷史中吸取了教訓 [1]。所以,當你面對枯燥的技術細節的時候,可以試著考慮這樣一個問題:如此設計的理性因素何在?它有什麼改進的餘地?比如,TCP 建立會話為什麼要三次握手?為什麼 OSI 要有七層?進而思考一下,這樣的設計合理嗎?不合理的設計會被取代嗎?比如,OSI 為什麼沒能成功?以及,為什麼人們會擁抱 REST,嫌鄙 SOAP?


再就是,計算機網路這門課,與現實世界結合得相當緊密。編譯原理本質上是語言學和數理邏輯學,一切都發生在完美世界裡,語法樹想多長就多長,不用考慮澆水施肥的問題。但是計算機網路不一樣,物理層就是赤裸裸的銅線光纖紅外線,要考慮到現實世界可能發生的各種問題,要有容錯能力。這些其實都是工科的東西,更接近機電,而非數學。所以你要培養自己對現實世界的熱愛,接受現實世界的不完美,不能痴迷於符號邏輯和二次元軟妹子裡。

總結來說,計算機網路教授的是知識,也是經驗和文化,不能為了學而學它…… 就像不能僅僅為了繁衍後代而把妹子。