Skip to content

结束语 像地质学家一样奋力往下挖

你好,我是郭屹。

经过这段时间的学习,我们终于走到了课程的终点站。我们从一个最原始的HttpServer开始,一步步扩展,最后终于完成了我们自己的MiniTomcat,搞清楚了Tomcat的内部运行原理。希望你能够在这个过程中体会到“蓦然回首,那人却在,灯火阑珊处”的喜悦。

软件地质学的堆积过程

就像我在课程开篇词里提到的,“软件是一个地质学堆积过程”,这句话其实是Visual Basic的发明人Alan Cooper说的。意思就是,软件结构跟地球的地层结构一样,是一个层级关系,一层一层地自下而上累积叠加的,越是底层的越古老越基础,而表层的各色风景都是依赖于底层来运行的。地质学家们每天拿着一把铁锹往下探索,来了解地球的奥秘。我们程序员也是这样的,一层一层往下挖,打开代码库去了解计算机系统的奥秘,了解上层那些异彩纷呈的应用软件底下究竟是靠什么运行的。

图片

因此, 一个好的程序员,不仅仅要学会搬砖,还要学会挖土。 挖过土之后,就不会被各式各样层出不穷的表象所迷惑了。时髦技术如风花雪月,而基础技术如万古长空。

体系化学习

现代教育采用分科教育方式,把完整体系拆分成多个科目进行学习。就拿大学计算机软件专业来说,虽然提供了很多课程,但每个课程只专注于某一方面的知识,导致学习者很难把这些零散的知识串联起来。这种教育方式的问题在于,它没能系统地教授学生如何在计算机硬件基础上构建软件。

同样,学习计算机硬件专业的人也没办法全面掌握如何自己动手制造一台计算机。在这种分科教育体系下,即使是大学教授,也可能只精通某一方面的知识。作为学习者,我们应该努力把所学知识融会贯通,避免陷入只见树木不见森林的困境。

在理解计算机软件结构的时候,我们可以把计算机系统最底层的硬件层看成一个封装好的层次,它遵循Von Neumann体系结构。对于我们软件行业的人来说,关键就在于了解这个层次与外界的接口,简单来说就是机器指令集。从理论上讲,如果我们拥有一台裸机,就可以自己动手构建完整的软件系统了。

软件结构的演进

计算机原始社会的时候,第一代程序员(基本上是一些心细的女生)就是在这种机器上编制的程序,她们知道要怎么一步步地操纵这台机器,将数据放在存储器哪个位置,然后将数据从存储器什么地方取出来,放到算术逻辑单元的寄存器中,然后让算术逻辑单元执行什么算术操作,之后再执行下一步,最后计算出结果。

这些程序执行步骤是手工通过开关拨弄一条条指令输入进去的,程序员的思维方式要与机器同频而不是与问题分解同频,这样很别扭,所以自然地这些程序员就将这些二进制开关弄成了助记码,比如将1001助记为LOAD,1100助记为ADD,然后再由她们手工换成机器的表示。

但是这样还是很麻烦,就有人想到了能不能用一个通用的程序来管理这些机器硬件,不需要程序员来直接面向机器了, 操作系统 就在这个时候登上了舞台。操作系统这一层相当于在硬件裸机之上进行了一层包装,构建了一台概念上的计算机。在这台虚拟机上,不再需要知道具体的硬件设备,不需要管数据放在存储器哪个位置,不需要记住计算机的指令集。这个时候,程序员使用的概念是变量、语句、文件等等,这些代码会被一种叫做编译程序的程序翻译成机器指令,而不是靠人来手工做了,操作系统运行时会加载这些程序。

那么问题来了,第一个编译程序是怎么来的呢?这个过程可以说是采用了一种迭代进化的方法,先由人来手工用汇编指令来制作第一个简单的编译程序C0,然后用这个编译程序所能实现的语言编写第二个编译程序C1,每一版本都添加一些特性,直到构成完整的语言。

有了操作系统,编写程序就方便多了,在过程中大家发现有很多任务是公用的,于是又提取出了一个又一个的工具,比如数据库系统、文件系统、网络协议,图形界面等等。现在还在这些中间层工具集的基础上,进一步发展出Web Server、Java、Spring、Cloud等等,方便程序员构建更大的应用系统。

这就是到目前为止的软件地质学堆积的过程。刚入行的程序员一上来就看到的是Spring Cloud,还有.NET等等,甚至直接快进到低代码平台,底层被遮蔽掉了。这种状况对产业有利而对个人学习不利,学习一门技术最好的办法就是自己动手做一个,因为纸上得来终觉浅,绝知此事还是要躬行啊。

那么我的想法就是从头再来,自己动手在操作系统之上重构Java Mini世界。

图片

从Mini虚拟机开始,一块一块构建,最后建成一个Mini Spring Cloud分布式架构。这些也就是到目前为止完整Java技术栈了。不过这显然是一个庞大的工作,不是一个人能做到的,需要一群人一步一步去做。

长居海外,我看到国外的程序员会有很多专业活动,一群人聚在一起琢磨某个技术,组成一个活跃的技术圈。我们中国的程序员在繁忙的工作之余,也应当学学这个硅谷文化,我们不仅是打工人,还是专业的程序员,应该有自己作为一个专业人士的专属家园。

希望在极客时间这个技术社区,能汇聚一批程序员,大家一起扎扎实实地下笨功夫,琢磨这些基础技术。不是为了提高薪水,不是为了面试,不是为了拿证书,而是出于对编程的热爱,以此为一生的志业,在这个花花世界中稳如泰山。“且要沉酣向文史,未须辛苦慕功名”,这是陆游68岁的时候写下的诗句。希望我们都可以为自己留有这样一片天地。

写在最后的话

我到了这个年龄,会经常回忆九十年代初期在南开大学读书的时光,那个时候 Linus Torvalds也在读大学。我的老师留美归来带回来一些资料,其中就有Minix,我看到了几百页的源代码,大约3万来行。那个时候我们老师带着我们一起读代码,并当成操作系统这门课去教授。而恰巧那个时候Linus也在啃Minix源代码,最后他改成了Linux。

人生有一些奇遇,会碰到事后想起来令人惊叹的事情,时间是单向的箭,我们穿越不到过去,也不能预知未来,但是我自己的亲身经历告诉我的是, 打好基础,深挖底层,能让我们行稳致远。

很幸运这段时间我们共同走过了一段修炼功力的路,到这里虽然这段旅途结束了,但学无止境,希望未来在江湖上能听到你的传奇。

最后的最后,还是要感谢你这段时间的陪伴,同时我也希望听到你对课程的建议与意见,所以我准备了一份 结课问卷,希望你可以花几分钟的时间填一下,期待听到你的声音。

图片

📝 小调查

下一次你想手写什么呢?

  1. 手写 MiniRedis
  2. 手写 MiniMQ
  3. 手写 MiniMySQL
  4. 手写 MiniDubbo
  5. 其他,欢迎补充

后续小编会根据投票统计出结果。