你好,我是郭屹。
到今天,MiniSpring课程就更新完毕了,也算是了却了我多年来的一桩心愿。这两个月以来,我们手敲代码、讨论更好的实现方案,一起实现了属于我们自己的MiniSpring。关于Spring我想教给你的知识都在课程中了。而在这最后一节课,我不想讲技术、讲代码了,我想让你听一听我的故事, 和我一起回到那个Java野蛮生长的年代。
我之前在课程JDBC部分提到过,我1996年开始使用Java编程序,并编写了中国第一个JDBC Driver。在那之后的一个技术研讨会上,我见到了Sun技术研发中心总监 K.J.Gao,他正在中国开始招兵买马,了解到我做的工作之后,就在Sun技术研发中心为我提供了一个职位。
K.J.被称为Java中国第一人,因为他是最早把Java技术带到中国的人。那个时候,归国人员不多,像K.J.这样的Stanford毕业生更是凤毛麟角,于是我有幸在K.J.的指导下从事了一段时间的Java研发。
记得在1998年夏天的时候,K.J.交给我们一个任务,研究基于Internet的企业计算的软件框架结构。当时他想起个名字叫ICET(发音为ice tea,中文叫冰茶),他跟我说硅谷的同事们搞了个HotJava热咖啡,我们中国团队为什么不可以搞个Ice Tea冰茶?
当年JavaEE领域大火的技术是EJB,被称为皇冠上的明珠, K.J.洞察到了EJB技术的复杂庞大,认为需要一个简易的替代方案。我那个时候太年轻,水平不足,视野狭窄,只是模模糊糊知道一点概念,所以我还是选择了去学习最新的现成的技术,甚至在研习EJB规范要自己写一个实现,因此ICET一直没有大的进展。
那个时候,JavaEE内部也有很多争议。Rod Johnson是专家顾问,他很耿直,激烈批评EJB,后来甚至嘲讽说一帮没有编过实际程序的专家在编规范,于是他与EJB路线分道扬镳。后来Rod Johnson撰写 《Expert One-on-One J2EE Design and Development》 长文。当时我看后,不禁在想,这不就是K.J.交给我们的任务吗?我无力实现,也再没有机会去实现了。
再之后Rod Johnson更是在书名上直接加上了“without EJB”字样。Rod Johnson站起来宣称,根本不需要EJB。这撼动了整个JavaEE领域,改变了历史潮流。他是重证千古推倒一时的人物,就像长坂坡的赵子龙,以一人之力而挡十万雄师。
这是我在初出茅庐的阶段留下的遗憾,影响了我后来很长的一段时间。
2011年秋天,忽然传来K.J.去世的消息,我给治丧组发信“痛失吾师”。想着自己没有理解和完成老师交给我的任务,感慨岁月流逝,愧对恩师。老师交办的任务,对我来说,就像抱着的一团火,不完成是绝不会释怀的,于是就有了MiniSpring。当时我用了29天的时间,把Spring框架核心怎么一步步构造演变的过程写了下来,之后就放置在自己的电脑某个文件夹中作为纪念了。
这一下子又过了七年,几个计算机专业的后辈正好快要毕业了,想让我讲解Spring好找工作,于是我就翻出来给他们和他们的同学远程开课。后来他们建议我公布到Github上开源,但是只放在Github上并没有直接给很多人带来帮助,所以之后他们又建议我在极客时间上进行讲解,造福后学。对我个人而言,年近五十,退隐在一个叫Killara的宁静小镇,将平生所学讲授出去,这就是薪火相传,也算是间接地完成了老师交给我的任务。
通过我之前的这些经历,我想告诉你, 一定要趁着大好年华,勇敢地去做一些事情,不要一味地追求技术潮流的一时之快,而是要像K.J.和Rod Johnson一样有自己的思考,始终坚持自己的信念和追求。Spring框架其实就是这样做的,它不断探索并坚持一些简单而有效的设计原则,二十多年来热度一直不减,最终成为了Java开发领域事实上的平台。
我想这样的结果是这离不开两点因素的:一是Spring的思想足够简单而纯粹,所以易于接受,它的无侵入式方案给了程序员极大的自由;二是它形成了一个良好的生态,平台的简洁和开放性,让大家都愿意一起工作,于是有很多人提供了很好的解决方案。不过任何事情都是双刃剑,良好的生态和开箱即用的框架方案带给我们的不只有简便,还有可能是浅显地停留在表面。
基于这些年我看到的事实,很多程序员即使编程多年对原理理解也还是很少,影响了进一步提升。我认为主要是因为他们接触的都是框架进化之后的结果,殊不知这些框架本身有它提出时要面对的问题以及随后的逐步变化。
直接讲解框架本身,虽然省事省时间,但是忽略了历史进程,也很难让人了解到它的来龙去脉,只能照猫画虎地拷贝代码,对我们程序员的技术提升反而不利。为了帮助你深入原理,我调整了课程的讲述方式,不再是直接讲解框架本身,而是 将Spring框架打散再重构。从一个Bean开始,一步步实现一个mini版的Spring。
此外我在写作的时候,还特别留意一点,就是 突出重点。因为我们编程的时候很容易陷入细节,被各种代码技巧和语法糖所引导,这样反而会忽略最核心和基础的结构。学习Spring,最重要的是先理解它的结构,之后再深入细节一个点一个点地学习Spring的代码技巧。MiniSpring的目标就是第一步,带你入门了解结构。因此课程中的包名、类名、主要方法名跟Spring框架都是对应的,之后你再读Spring框架代码的时候就不会迷失。
如果你真的能从MiniSpring中理解框架的原理,使其变成你研读Spring框架代码的梯子,那么这部分的任务我就算是完成了。不过这也只是第一步,其实我还有一个更大的构想,叫做“从头再来”,就是假设我们穿越回到1995年,那个时候只有Java语言,我们一步步手工构造出后来的这些经典。自己动手构造Tomcat、脚本语言、MyBatis、Redis、Netty、Cloud,组成一个完整且自洽的Java体系。我相信,一起从头再来,一定会让人脱胎换骨。
业界总是说“不要重新造轮子”,话虽不错,不过那是对商业机构说的,对我们来说, 只有自己动手重新造轮子才能真正地理解知识。 二十世纪下半叶最伟大的物理学家Feynman费曼说过,怎么叫理解了一个知识?就是一你听懂了,二你能做出来,三你能给别人讲明白。
编程是匠艺,虽然Github上有全部代码,但是我希望你不要复制粘贴,而是自己动手一点一点录入,虽然辛苦,但是 “Get you hands dirty”才会大有收获,让自己的技术水平迈上新台阶。经过这段时间的学习,如果我能将“道”传于你的手上,也是我的荣耀。如果你再慷慨一点,我希望你能把知识分享出去,让更多的程序员受益。要知道知识不是苹果,不会越分越少。
这就是我最后要说的话,希望你我以及再后来的程序员,能够接力共同爬上技术的顶峰一览众山小。好了,我是郭屹,谢谢你听完我的故事和我的碎碎念,希望我们有缘再见!
最后的最后,还是要感谢你这段时间的陪伴,同时我也希望听到你对课程的建议与意见,所以我准备了一份 结课问卷,希望你可以花几分钟的时间填一下,期待听到你的声音。