恍然间,发现自己在这个行业里已经摸爬滚打了五年了,原以为自己就凭已有的项目经验和工作经历怎么着也应该算得上是一个业内比较资历的人士了,但是今年在换工作的过程中却遭到了重大的挫折。详细过程我就不再叙述,在此,只想给大家说一说被拒绝的原因,看看大家有没有相似的经历,和类似的感悟。面试官对我的答复大致是这样的,我们不需要熟练工,我们需要在某领域拥有超过常人的积累认知,和拥有整套完整思维模式和优秀认知事物能力的人…他很诚恳地告诉我,你还年轻,真的应该好好地静下心来,深入地研究一些东西,自己写一些东西,而不是这也用过,那也知道,但是多半都是局限于仅仅见过,会用,却从来没有认真思考过其代码背后蕴含的思想,更少有人研究过源码,进而体会大师们在某些问题的解决上秉承的思想和思维的风格。个人感觉,这也算是国内大部分程序员最让人悲哀的地方了,当然这也与外界浮躁氛围的蔓延不无关系。不了解这一行的人总觉得程序员都是代码民工,如果自己也认为自己是敲代码的机器的话,我诚恳地建议您尽早转行吧,也许我这么说会得罪伤害一些同行,毕竟转行对任何一个人来说都是有相当的风险和挑战的。不过这绝对应该是善意的忠告。相反,我强烈地认为,程序员应该是最有活力和最有思想的一个群体,只要你不肯让自己浮于表面,更重要的是,必须勤于思考。如果你认可我这句的话,就请您继续往下看看我的感慨,否则,那就希望您好好利用好自己的时间做您最需要做的事吧。
由于面试中被问到tomcat的时候,让面试官问得人仰马翻,哑口无言,所以回来之后洗心革面,下决心要把tomcat好好研究个明白,再也无法容忍自己只知其一不知其二了。于是上阿帕奇的官网上找文档找资料,当源码,在一些技术论坛找高人的分析帖子,并且搜罗相关的书籍,无奈一番折腾后都不能让我满意,因为一千个人对一个事物或许会有一千个看法和观点。网上此类介绍tomcat的技术类帖子更多的都是些抄袭,说到这里,本人在此郑重声明,做技术的人应该恪守一点职业道德,那就是责任心(我曾经给自己取的网名就是扯嗓门讲大道理的人),你想给大家讲某个东西的话,必须应该是自己真正亲自分析研究过的,这是最最起码的要求,千万不能东抄一点西抄一点拼凑,不懂瞎装,瞎写,这是极其让人鄙视的态度,虽然当下这个时代,大家确实都比较浮躁,而且急功近利,但越是这样,就更需要大家坚守自己,尤其是做技术的人,对技术必须秉承实事求是,严谨,务实的态度,彻底刨掉那些虚华的东西,这样我们才敢从心态上说我们称得上是一位真正做技术的人。
好了,说了这么多废话,浪费大家时间了,下面说说我对tomcat源码研究的几点展望,众所周知,tomcat是一个开源的Servlet容器,而这个容器的主要作用就是负责处理和响应客户请求(我们暂且忽略其他的一些次要的方面)。那么好,我们可以先做这样一个比喻,tomcat应该可以比作一部机器,这部机器可以接受客户端的请求,并返回一个结果给客户端,而且这部机器的原材料是java。那么我们想知道,这部机器的结构是怎么样的?它的组成部分有哪些,这些组成部分是如何被组织到一块的?这应该是第一步,即对tomcat的整体组成要有个纵览,知道tomcat这部机器都有些什么组成部分,知道每一部分主要都负责了什么工作,这一点非常重要;那么第二步,就是,这部机器是如何启动的?《精通tomcat》一书中把tomcat比作一部发动机,再恰当不过了,因为在它正常提供处理客户端请求的服务之前,它得先完成它的启动,我拿到源码之后(版本号是TOMCAT_6_0_12),也是参考《精通tomcat》一书的指导,找到Bootstrap类,然后Dubug as Java Application,一步一步跟源码来研究tomcat的启动脉络。大家知道,tomcat是一个基于组件的服务器,那么完成了第一步工作,我想大家应该大体都会知道tomcat里面都包含了哪些组件了,那么通过第二步,我相信大家对这些组件是如何组装并启动的这个问题,就会有一个比较初始的认识和了解了。我们在日常工作中的系统设计和开发处处强调松耦合的思想,那么我想tomcat里面这些组件的组织将会是一个非常典范的案例值得我们研究和学习,人家是如何组织自身的组件的,如何装配的,这个问题,需要大家对digester技术有所研究,当然现在digester已经作为阿帕奇的一个common项目了,大家可以当相关的文档和源码进行深入研究这个技术,我也正在研究学习中,希望大家共同学习共同进步。那么再完成了前两部,知道tomcat里面都有些什么,并且知道tomcat的启动流程之后,我觉得就应该对tomcat应答一次请求的全过程进行细致深入的分析了,客户端发出向tomcat发出请求之后,tomcat是如何处理的?最先是那个类那个方法来响应,那个组件最先接到了请求的,之后它具体都做了什么,整个过程的处理逻辑和原则是什么样的?搞懂了这些,相信对tomcat的任何返回结果就再也不会感到意外和困惑。遗憾的是,我目前只看到很多地方粗粗地这么介绍:请求被发送到本机端口8080,被监听的HttpConnector获得,然后再由Connector交给Engine处理,再匹配名为localhost的Host处理,紧接着由Host匹配Context,再找JSPServelt类等等,这些介绍我目前还深表怀疑,貌似正确,其实说得不免有些笼统,当然也不能说完全错误,因为我目前还没彻底搞清楚这个问题,也不敢贸然下结论,我只是跟了源码后发现,请求来了先运行的是CoyoteAdapter这个类的service方法,实践出真知,还是希望大家亲自跟跟源码去理清楚其中玄机,看看tomcat接受请求处理请求的过程到底是怎么样的?我觉得只有搞清楚了这个问题,才敢说自己对tomcat算是真的懂了一些,至少tomcat对自己不再是个黑盒了。这个过程我目前还在进行中,由于自身能力有限,尚需多少时间能彻底搞清楚还是个未知数,但是我愿意继续努力,今天由于时间原因,先写到这里,我会继续发帖向大家汇报我的进展,更加希望能得到众多高人的指点,不甚感激,谢谢大家。
首先,谢谢jeffrey4chartcrm 同学的关注和回复。其实我上文中提到的这个领域肯定不仅仅指的是业务领域,肯定还应该是包括技术领域的。咱们做技术的人估计最初多半还是从技术开始的,但是对于咱们这一行来讲,满足业务需求又是我们永恒的方向,也就是说业务是灵魂,技术仅仅是为业务服务而已。这个观点想必多半人还是认同的,那么为了更好地完成我们技术人的使命,我们的武器一定要精良,当然指的就是我们对技术的认识和掌握了,只有精通了技术,才有可能很好地完成我们的使命。我就是不想再做个熟练工了,所以想花大力气研究学习源码以提高自己的内功,进而提升自己的专业素质和能力。所以,我觉得花点时间研究源码,应该算不上南辕北辙吧,更多地应该算是磨刀不误砍柴工吧。何况对于闻名遐迩的tomcat来说,做Java的人如果永远对它都敬而远之,而仅仅是用过,会用的水平的话,是不是有些惭愧呢,大师的作品就摆在面前,我们真的没有理由不好好地虚心研究和学习,难道我们不该向大师看齐吗?还是那句老话,一定鄙见,欢迎高人“拍砖”。我觉的这位面试官是你的贵人,他说的很对,5年的经验如果仅仅是使用开源框架,那真的是一种悲哀,资深的技术人员是必须钻研一个领域的,这个领域有几个层面的东西,一个业务领域、一个是技术领域。业务领域很明显需要清楚的需求,技术领域就是计算机科学,大家都是做技术的,哪个领域适合自己,只有自己最清楚。
另外我想说明一点,一开始就去看源码,我保证能读懂70%就不错了,有很多基础性的东西你真的掌握里吗?举个简单的例子:如果源码里有一个优先队列,当你看源码的时候你能看出来这是一个优先级队列吗?或者一个多路归并排序,你能看出来算法思路吗?
我再次强调一点,如果没有数据结构和算法的基础,是无法和优秀的程序员对话的。