跳转至

结束语 老兵回首,薪火相传

你好,我是郭屹。

到今天,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”才会大有收获,让自己的技术水平迈上新台阶。经过这段时间的学习,如果我能将“道”传于你的手上,也是我的荣耀。如果你再慷慨一点,我希望你能把知识分享出去,让更多的程序员受益。要知道知识不是苹果,不会越分越少。

这就是我最后要说的话,希望你我以及再后来的程序员,能够接力共同爬上技术的顶峰一览众山小。好了,我是郭屹,谢谢你听完我的故事和我的碎碎念,希望我们有缘再见!

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

精选留言(9)
  • peter 👍(4) 💬(1)

    感谢老师的精彩讲解,期待能够再次相遇。 Q1:可以开Tomcat的课程吗? Q2:本专栏侧重spring的核心技术。除了核心模块外,还有很多模块。其他模块是以插件的形式集成到系统中吗? Q3:怎么阅读spring源码?用sourceInsight还是Idea?有的人说直接在Idea中就可以。Spring源码阅读,有什么好的文字或视频资料? Q4:没有请求的情况下怎么访问数据库? SpringBoot项目,controller中自动注入service,service中自动注入Mapper。请求来了之后,由controller处理,controller调用自动注入的service,service再调用自动注入的Mapper,这是典型的ssm流程。 但是,现在有一个需求:软件启动后,需要访问数据库,此时并没有用户请求。 软件启动后,采用上面所说的典型ssm方法,失败了,原因好像是controller中注入的service是null,不知道为什么没有成功注入。(或者是service中自动注入的mappter是null,两年前做的,有点记不清楚了)。 Ssm方法失败后,我现在的实现方法是:controller的构造函数中使用JDBC访问数据库,能够成功访问。 问题:软件启动后,controller的构造函数执行了,说明controller被实例化了,此时service会自动注入吗?

    2023-05-03

  • C. 👍(1) 💬(1)

    结束结束,代码运行一切正常,也进行了扩展

    2023-05-12

  • Jay 👍(1) 💬(1)

    多谢老师,这是极客上第一门一直坚持每周完成学习的课程,自己动手实现确实比看介绍原理的文章效率高很多了。有个问题请教老师,spring框架代码已经变化很大了,未来如果要持续学习其原理,应该从哪个方向深入呢?比如是继续学习Ioc mvc...的最新代码,还是去探索spring cloud的原理呢?

    2023-05-01

  • InfoQ_1f089af08bc8 👍(0) 💬(1)

    请问郭老师,什么时候能分享一下MiniTomcat的讲解?谢谢!

    2023-11-15

  • funnyx 👍(0) 💬(1)

    老师好,能否讲一讲关于spring的组合注解的原理呢?

    2023-06-29

  • __@Wong 👍(0) 💬(2)

    老师早上好,想问个其他话题,当时有没有做得比较好的国产spring啊,能否讲下国产spring与spring之间的故事,国产spring到现在就销声匿迹了呢

    2023-05-31

  • 彩笔采购 👍(6) 💬(0)

    很羡慕老师能够不到50岁就归园田居,享受生活

    2023-05-04

  • Lysen ᯤ⁶ᴳ 👍(1) 💬(0)

    看完老师的 ”碎碎念“,突然有点肃然起敬。 在大三的时候,我学完了 Spring、SpringBoot、MyBatis 等这些常用的开发框架,为了找工作,又去学习 SpringCloud。但是学到一半就学不下去了,因为感觉一直在搭建项目,总觉得自己只是会用某些框架而已,没有什么兴趣,只是为了找工作而学习。 直到后面看了有 B 站的 UP 主推荐 "极客时间" 的课程,后面慢慢地去了解 Redis、MySQL,以及现在的 MiniSpring 的底层原理,我才发现,原来之前自己学会的东西都是皮毛,底层的代码世界原来如此有趣,这才是我真正感兴趣、想学习的知识。就像老师说的,虽然在业界总是说 “不要重新造轮子”,但是只有自己动手重新造轮子才能真正地理解知识。 总而言之,谢谢老师!然后,我学习 MiniTomcat 去了哈哈哈哈哈哈!

    2024-10-13

  • 听风有信 👍(0) 💬(0)

    完结撒花

    2024-12-23