《计算机网络》这门课为何如此之难?

瘦腰啼。

操作系统和计算机网络的共同点,在于它们都是相当复杂的体系结构,如果觉得难,也许是因为自己没能产生足够的求知欲。你也说了,“无聊,晦涩”——而无聊感其实是没治的。对课程的热情和对女生的爱慕感其实差不多,不能一见钟情的,可以试着培养,培养之后还是觉得无聊的,那就不是真情了。

以下讨论如何培养自己对计算机网络的真情。

首先,计算机网络这门课,我不知道你们用哪本教材,不过任何足够好的教材,都要教给你各种五花八门协议的来龙去脉,也就是历史。学历史,要有——借用一个文科生的 buzzword——“大历史观”。自一九六九年 ARPANET 以降,计算机网络是个颇有些年头的玩意。那些协议啦缩写啦什么的,大都在你出生之前就存在了。去翻翻旧的 RFC,英文的写作风格都不太一样——那时候的 nerd 们,西装革履,坐在窄小的单色 CRT 显示器前面,敲下一个个字符——许多人如今都已经作古,但他们苦心定制下来的各种规约(Protocol),让你今天能在知乎上面问我这个问题。这难道不是很神奇的事情吗?所以你要有感恩的心。有了感恩的心,妖就不再……呃,我的意思是,研究历史就会有朝圣感。

而计算机网络的一切技术细节,也就是那些枯燥的部分,都是历史遗留问题。可以说,如果将现有一切推倒重来,重新考虑“多台计算机之间如何互相通信”这个计算机网络所解决的根本问题,再发明出来的互联网将会是完全另一番样子,而且肯定会简单很多——一个原因是技术进步了,另一个原因是人们从历史中吸取了教训 [1]。所以,当你面对枯燥的技术细节的时候,可以试着考虑这样一个问题:如此设计的理性因素何在?它有什么改进的余地?比如,TCP 建立会话为什么要三次握手?为什么 OSI 要有七层?进而思考一下,这样的设计合理吗?不合理的设计会被取代吗?比如,OSI 为什么没能成功?以及,为什么人们会拥抱 REST,嫌鄙 SOAP?

再就是,计算机网络这门课,与现实世界结合得相当紧密。编译原理本质上是语言学和数理逻辑学,一切都发生在完美世界里,语法树想多长就多长,不用考虑浇水施肥的问题。但是计算机网络不一样,物理层就是赤裸裸的铜线光纤红外线,要考虑到现实世界可能发生的各种问题,要有容错能力。这些其实都是工科的东西,更接近机电,而非数学。所以你要培养自己对现实世界的热爱,接受现实世界的不完美,不能痴迷于符号逻辑和二次元软妹子里。

总结来说,计算机网络教授的是知识,也是经验和文化,不能为了学而学它…… 就像不能仅仅为了繁衍后代而把妹子。

[1] faqs.org/rfcs/rfc1606.h ,见 Conclusions 一节。
原发布于 https://www.zhihu.com/question/19718686/answer/12754632