这书目前只看了一半,已经迫不及待在豆瓣上打了五星。
问题意识
由在浏览器中一次请求响应的过程在计算机内部是如何处理的这个问题出发,从HTTP层的请求响应协议到Socket的创建、连接、收发数据再到传输层、网络层、数据链路层的逐步添加各层协议的包头,到物理层将数据在局域网上传输,又是如何将0101的数字信号转换成实际物理层面的电光信号,经过集线器、交换机、路由器之间的传递到达最终目的地。讲的内容实际和大学里的《计算机网络》课程点几乎一样,但全书翻译的还是挺流畅简洁准确的,可以看出作者对于这个问题思考过程中层层递进环环相扣的追问与回答,亦足见译者的文笔和专业技术功底。
“问题意识”这个概念我大概是看秦晖先生的文章里提到的,学术界比较重视这个东西,大概意思是【问一个问题,不会是凭空想象出来的,一定是在某个特别情境产生的疑问,比如面对一个特殊时空下的历史事件,或是和某个理论对话,试图回应它能回答或不能回答的问题。而回答为什么要问这个问题的解释,就构成了发问的问题意识】。简单讲问题就是一个很简单的疑问,而问题意识涉及你在什么情境下产生这个疑问。所以问题是问题意识的结果,问题意识是形成问题的过程。
前几天一个在小米工作的朋友在讨论组里问我java里的socket通信在计算机上到底是如何工作的,这个问题认真解释起来涉及计算机网络上数据在七层协议之间流转过程和Java程序如何调用操作系统层面的socket库,还是挺费口水的。我好奇的是为什么会产生这个问题,原来他最近在做rpc调用的东西,java层面的api琢磨久了难免想再进一步,深挖更底层的东西,了解被api封装的严严实实的java本地调用背后的运行机制,程序员能思考到这个程度显然技术上又将精进不少。私以为这种才是求学问道的正途,我好像很久没有这种不断思考追问的状态了。
上面不厌其烦的解释“问题意识”这个概念就是想说知识问答已经非常活跃的当下,问题已经不再重要,绝大多数都能找到答案(程序员社区三大利器Google GitHub Stackoverflow),再不济去百度知道知乎啥的问问也会有收获。反而是产生问题的过程更重要,因为这表明提问者经历了哪些思考,思考的广度和深度。
那些年困惑过的计算机术语
前几天阮一峰老师一条讲socket的微博引起了一堆人的共鸣,当年学计算机时就被很多术语的中文翻译弄得一头雾水,比如套接字(socket)、句柄(handle)、正则表达式(regular)、宏(Macro)等等,反正看起来别扭极了,导致很多时候涉及这些术语文章看起来总觉得不自然,有滞涩感。
书中第2章最后恰好解释了socket这个词,原来是取自灯泡插座的的意思,就是那种老式的螺丝灯泡里凹进去的可以往里插东西的圆孔。
凡是能插东西的孔都可以叫socket,灯泡插到socket里灯就亮了,同理程序插到套接字里就可以开始通信了。套接字背后就是传输数据的通道,这个通道和通信对象相连接,就像流过电线的电流一样,数据就在这个通道中流动,所以插进去一个程序,就可以和对方通信了。
解了一个千古之谜。。。
本质复杂性
记得刚学计算机语言的时候就记得一句话【面向对象的三大特性:封装、继承、多态】,程序语言考试包括刚毕业那两年的各公司笔试必出这道题。曾经对这个结论有点儿游离,到了这几年反而体会越来越深,很多东西都是这样,死记硬背多年,突然某个瞬间被一个缠绕许久的问题勾出来,原来是这么回事,前人的总结真是到位。
拿封装的思想来说,得益于各种形式上接近于算术语言和自然语言,概念上接近于通常使用的概念的高级程序语言的发展,一个命令可以代替几条、几十条甚至几百条直接操作计算机硬件的汇编语言的指令。这就是一种封装,目的当然是为了解放和发展生产力,而Java这种面向对象的语言更将操作系统底层的本地调用(native)给封装起来,只能通过JNI接口调用其他语言来实现对底层的访问。所以就算再精通Java语言,离理解计算机背后的原理还差很远。反而越深入越发现一切都是操作系统底层万变不离其宗的运行机制被上层不同程序语言以自己的语法包装起来而已,比如java里IO操作有bio、nio、aio,搞这么复杂是操作系统的同步、异步和阻塞、非阻塞模型在作怪,底层有这么多类型,上层必然也有相对应的机制,这就是逃不掉的本质复杂性。
Java的网络编程看似只有Socket、ServerSocket那几个类,新建、监听、accept、输入输出流、关闭这几步行礼如仪,了解了更底层的机制和原理才体会出为何Java的API会设计成这样。