转自:五年java人的一点感悟

恍然间,发现自己在这个行业里已经摸爬滚打了五年了,原以为自 己就凭已有的项目经验和工作经历怎么着也应该算得上是一个业内比较资历的人士了,但是今年在换工作的过程中却遭到了重大的挫折。详细过程我就不再叙述,在 此,只想给大家说一说被拒绝的原因,看看大家有没有相似的经历,和类似的感悟。面试官对我的答复大致是这样的,我们不需要熟练工,我们需要在某领域拥有超 过常人的积累认知,和拥有整套完整思维模式和优秀认知事物能力的人…他很诚恳地告诉我,你还年轻,真的应该好好地静下心来,深入地研究一些东西,自己写一 些东西,而不是这也用过,那也知道,但是多半都是局限于仅仅见过,会用,却从来没有认真思考过其代码背后蕴含的思想,更少有人研究过源码,进而体会大师们 在某些问题的解决上秉承的思想和思维的风格。个人感觉,这也算是国内大部分程序员最让人悲哀的地方了,当然这也与外界浮躁氛围的蔓延不无关系。不了解这一 行的人总觉得程序员都是代码民工,如果自己也认为自己是敲代码的机器的话,我诚恳地建议您尽早转行吧,也许我这么说会得罪伤害一些同行,毕竟转行对任何一 个人来说都是有相当的风险和挑战的。不过这绝对应该是善意的忠告。相反,我强烈地认为,程序员应该是最有活力和最有思想的一个群体,只要你不肯让自己浮于 表面,更重要的是,必须勤于思考。如果你认可我这句的话,就请您继续往下看看我的感慨,否则,那就希望您好好利用好自己的时间做您最需要做的事吧。

于面试中被问到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对自己不再是个黑盒了。

转:五年java人的一点感悟的更多相关文章

  1. 一点一点看JDK源码(五)java.util.ArrayList 后篇之forEach

    一点一点看JDK源码(五)java.util.ArrayList 后篇之forEach liuyuhang原创,未经允许禁止转载 本文举例使用的是JDK8的API 目录:一点一点看JDK源码(〇) 代 ...

  2. 一点一点看JDK源码(五)java.util.ArrayList 后篇之sort与Comparator

    一点一点看JDK源码(五)java.util.ArrayList 后篇之sort与Comparator liuyuhang原创,未经允许禁止转载 本文举例使用的是JDK8的API 目录:一点一点看JD ...

  3. 一点一点看JDK源码(五)java.util.ArrayList 后篇之SubList

    一点一点看JDK源码(五)java.util.ArrayList 后篇之SubList liuyuhang原创,未经允许禁止转载 本文举例使用的是JDK8的API 目录:一点一点看JDK源码(〇) S ...

  4. 一点一点看JDK源码(五)java.util.ArrayList 后篇之Spliterator多线程遍历

    一点一点看JDK源码(五)java.util.ArrayList 后篇之Spliterator多线程遍历 liuyuhang原创,未经允许禁止转载 本文举例使用的是JDK8的API 目录:一点一点看J ...

  5. 一点一点看JDK源码(五)java.util.ArrayList 后篇之removeIf与Predicate

    一点一点看JDK源码(五)java.util.ArrayList 后篇之removeIf与Predicate liuyuhang原创,未经允许禁止转载 本文举例使用的是JDK8的API 目录:一点一点 ...

  6. 分析jQuery源码时记录的一点感悟

    分析jQuery源码时记录的一点感悟      1.  链式写法      这是jQuery语法上的最大特色,也许该改改POJO里的set方法,和其他的非get方法什么的,可以把多行代码合并,减去每次 ...

  7. 20155201 实验五《Java面向对象程序设计》实验报告

    20155201 实验五<Java面向对象程序设计>实验报告 一.实验内容 1. 数据结构应用 2. 结对编程:利用IDEA完成网络编程任务,1人负责客户端,1人负责服务器 3. 密码结对 ...

  8. 20145205 《Java程序设计》实验报告五:Java网络编程及安全

    20145205 <Java程序设计>实验报告五:Java网络编程及安全 实验要求 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.客户端中输入明文,利用DES算法加密,D ...

  9. 20145212 实验五《Java网络编程》

    20145212 实验五<Java网络编程> 一.实验内容 1.运行下载的TCP代码,结对进行,一人服务器,一人客户端: 2.利用加解密代码包,编译运行代码,一人加密,一人解密: 3.集成 ...

随机推荐

  1. ssh关于含有外键的传值中无法识别正确的action的原因和解决办法

    在含有外键的表中,要保存一个值到这个外键时:逻辑思路:需要先将jsp页面的值传到相应的action中,在这个action中需要引入这个外键的实体层和DAO层(DAO层只需set方法),在执行函数中对于 ...

  2. nginx中级应用

    1.安装监控模块 Nginx中的stub_status模块主要用于查看Nginx的一些状态信息. 本模块默认是不会编译进Nginx的,如果你要使用该模块,则要在编译安装Nginx时指定: . /con ...

  3. Android-隐式意图激活所有应用

    显示意图 与 隐式意图 对比 显示意图不能激活多个组件,只能激活一个组件 隐式意图能激活多个组件 显示意图只能在自身应用激活,不能激活其他应用 隐士意图能在自身应用激活,也能激活其他应用 每个应用程序 ...

  4. 系统数据库--修改tempdb的位置

    use mastergoAlter database tempdb modify file (name = tempdev, filename = 'G:\db\tempdb.mdf')goAlter ...

  5. nutch2.1+mysql+elasticsearch整合linux单机部署

    这次主要介绍下nutch2.1和mysql和elasticsearch的整合,是在单机上运行,并不是分布式部署.1.下载nutch2.1 nutch下载地址:http://labs.mop.com/a ...

  6. EF修改model自动更新数据库

    最近用MVC+EF学习时遇到修改model后而数据库没更新报错,就在网上找关于数据迁移自动更新数据库的,折腾了大半天终于弄了出来 第一步:在程序包管理器控制台里: Enable-Migrations ...

  7. 【MVC】分布视图带参数

    1.调用 <!--底部菜单--> @Html.Action(, itemTypeId = , itemId = ViewBag.Id }) 2.定义 public class ItemPu ...

  8. C#多线程编程实战1.1创建线程

    using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threa ...

  9. Conditional Expressions

    Conditional Expressions建立一些逻辑关系 The conditional expression classes from django.db import models clas ...

  10. .net 抽象类(abstract)和接口(interface)区别

    1.抽象类    (1) 抽象方法只作声明,而不包含实现,可以看成是没有实现体的虚方法    (2) 抽象类不能被实例化    (3) 抽象类可以但不是必须有抽象属性和抽象方法,但是一旦有了抽象方法, ...