从大局着眼,立微处发力
我开始做 java 的时候,java 分三条线,J2EE、J2ME、J2SE。那时候不叫 EE,而且 J2SE 这个名称很流行的。最开始没有 spring,大家都一脸崇拜的狂啃 EJB。也不嫌累,乐在其中。顺便多嘴说一句,那时候很多的 java 都说不上来 J2EE 是啥意思。不知道具体成因。只是学校里 java 就一门语法课,各个培训机构好像也很少宏观的介绍 J2EE 体系里包含的一系列规范。包括 sun 公司也只在自己的 SL314 认证培训里有一点宏观介绍。总之当时就是在面试的过程里,很多做 J2EE 开发的都知道 servlet、jsp 这些术语。但是都没有看过对应的 specification。再后来 spring 横空出世,成为事实标准,一直到 J2EE 改成了 JavaEE 也没能改变分毫。spring 在很多人的认知里,就是 JavaEE。做 JavaEE 开发就是学 spring 用 spring。
我还记得我看过了 servlet 的 specification 之后醍醐灌顶,明白了 web.xml 里面为啥这么配置,明白了 servlet 和 filter 究竟怎么工作。懂了为什么 weblogic 和 websphere 的配置写法不一样。也可能是我之前没学对,走了弯路。但是看过了 servlet 的,我就一鼓作气把 jsp、jdbc、ejb 等几个都看了。后续的开发里,struts 出现的时候,就很容易明白 struts 的配置是什么作用,能明白最初设计中各个不同组件的逻辑和定位。struts 我学了 3 天就开始用在一个新项目里面使用了。之后一直到 spring 出现,最初的 springmvc 我也是从启动的 servlet 开始捋思路。如果不考虑深入理解 spring 的设计思想和核心架构,单单就是学会使用,应该和当时使用 struts 差不多的速度。
我现在在一些有提问环节的场合里,向面试或者内部晋级答辩、外部评审的时候就非常喜欢问关于这方面的问题,我特别喜欢问的一个问题是 spring 容器是什么时候被加载的。从这个问题我能了解他是否明确类的加载机制,能知道 web 容器和 spring 容器之间的关系和区别,知道 spring 容器的整体初始化过程。如果懂这方面,这个问题很快就能结束。如果不懂随便答,后续会带出一大堆的问题来。最近的一次公司内部晋级答辩,说起了 springboot 中使用 filter 中有个 order 参数用于定义优先级,这个和我记忆里的 filter 链式机制不一样。于是特别想知道细节(当时有点假借评委的身份了)。后来都把代码打开看其父类确实是 javax.servlet.Filter。证明了同事说的没错,但是他也没看过 specification,我们两不能就这个问题同步讨论。下来之后,检索了一下才知道 springboot 包装 filter 的加载机制,通过 order 来确定链的前后并留有扩展空间。但是其底层还是最初那种前后衔接的链式机制。
现在的开发非常容易,网上有大量的资料、教程,甚至做好的代码框架。用这些能非常快速的进行代码开发的初期工作,但是要能走的更深入一些还是要了解很多细节。我的感觉现在只要提到性能提升,多数都在三板斧里:分库分表、缓存、横向扩容。个别的想起异步和多线程,不过这两种能做好的太少了。几年前做的一个四要素认证项目,其中有个功能是根据卡 bin 反推发卡行。当时这个任务是一个从 211 一本毕业两年的小姑娘。从最初的数据库查询,改成缓存,然后改成 hash 值,再改成最后树结构。整体方案就改了 4、5 个版本,其中的小改动就更多了。所有的工作大概用了三周,性能也从最开始的 300ms 左右到最后的 30ms。这件事让我印象很深,看似一个简单的问题如果深入的探究会带来很多的反思。还是上面提到的那次晋级答辩,有一个场景是营销环节,会有批量短信发送。最大量估计在 20W 一批次左右。我后面的问题就是,如果为了某个目标,如何快速对这 20W 手机号码做有效性入参检查?其实我也没有特别好的办法,但是给我的回复是循环,这个回复我是觉得失望的。码农即便在落魄,也是有脑力要素的。只会有百度的程序员,未来的空间就变窄了。
其实很多程序员都很努力,各种的学习视频、书籍、blog、公众号。只是很多人在学习中都没有建立起来宏观的体系,离散的学着。说难听一些就是东一榔头西一棒子,最终的收效并不太好。所以还是建议学习的时候先建立体系,然后一点一点让体系里面每个点都丰盈起来。在实际工作里,每一次深入思考都会突破原来的天花板,更高一步。只是很多人都没有意识到这样小的提升会提升技术能力的作用是非常大的。真的死磕几个点,会更透彻的加固原有的很多技术点。
评论