工作这么多年了。突然想总结一下。
知识和经验是需要积累的,当知识和经验都积累到一定的程度,或许就能产生质变的效果。这是我近八年的IT职业经历的感受。
本科毕业时去找工作,当时真的很迷茫,觉得自己好像什么也做不了似的,甚至觉得自己找不了工作。尽管本科时,用过C语言来写过不少代码。但到毕业时,感觉 都忘了似的。这还是用得不深、理解不够的结果。毕业作品用VB来做了一个台球游戏。至少看起来也挺象样的。但是感觉对VB的很多东西都不懂。总之,对自己 的知识,脑子里就是一盘散沙。本科的学习对什么都是一个大概。根本没有办法或不懂得把学到的东西应用上去。这或许就是知识与经验的最原始的积累阶段,只能 说是一个量变过程的开始,离质变还远着呢。
没办法,上个研究生吧。
硕士期间,可以说经历一个很大的量变过程。两年半的时间中,差不多一年半的时间是在不停的学习各种知识,准确的说是重新温习和加强了一下本科时学习的知 识,诸如,体系结构,操作系统,网络,数据库等等。还有意识的选择的一门语言来重点学习。这样《Java编程思想》的第一版救被我够入了。或许我还是中国 大地上读完这边本书前100个中的一个。开始都这本书时,感觉真是天书。当我都到第三遍时,感觉终于开窍了点。书上留下了很多自己笔记。很遗憾的是,后来 这本书借给某个同学,让他弄丢了。特别可惜。
经过一年多的知识学习,当时感觉自己有了质变了(现在看来,只能是个小质变),可以出去显伸手了。很幸运,第一份工作就是一个Java方面的工作。但工作 之后才发现,尽管《Java编程思想》看了三遍,但是还是没法很好的工作。为什么呢?没办法,工作的内容是写Jsp和Servlet,《编程思想》中有 j2ee的内容本来就很少。那是才突然感觉到,java的内容很多,自己只是知道一个皮毛。自己其实并没有掌握其中的精髓。两个月后,jsp和 Servlet也知道了个大概了。为了毕业论文,先不干了。
写毕业论文的过程,又是一个知识积累的过程,为了能在论文中把东西说得圆满,再次去翻阅了大量的书籍,虽然没有深入学习,但都很多知识都有了大概的印象。这对以后的深入学习很重要。
论文写得差不多了,还有半年才毕业呢。又找了份工作。这次重新拿起了本科时用过的VB。可能是有过一次小质变,这下用起来就顺手多了。也很幸运到了一个大 公司,那时有时间了,兼职跟全职一样,跟正式员工做同样的工作。(收入也差不离多少~) 这算是有了一次真正锻炼的机会,也为以后的工作经验和学习积累做了充分的预演。但是后来,证明这里的工作还是有点单一,或者说单调,只是用VB写代码而 已。
终于毕业了,工作了。 Java相关的工作当然是我最想要的工作。 开始工作了,问题也开始出现了:ant以前看过,不是很熟,以前都是用JBuilder(当时流行这个);struts从来没有听说过;Linux,装 过,没深入用过;JVM调优,真不懂; Oracle数据库,装过,也算用过,但是在Linux下真不会使了,当然更不了解其内部的东西;JMS,JMX知道,不熟,并发编程更是不懂了;还有操 作系统,网络通讯的底层的东西等等等等,很多东西,感觉自己不熟悉的东西太多了。
一年过去了,ant很熟了,所有项目工程的编译打包脚本都是我写的,真的很辛苦的~。Linux的很多命令也会用了。
两年过去了,struts差不多专了。可以自己原创新产品的图形界面框架了。已经用Bash Shell来写了很多脚本了,也开始逐步更深入的去了解Linux了。能解决一些Oracle的问题了。EJB,JMS,JMX之类的东西,因为都有了差 不多固定的应用模式,用起来也不难了。也开始去接触性能方面的东西了。
工作三年了,开始遇到问题了:性能问题。因为以前做的东西对这方面的要求不高了,现在要遇到了。首先是多线程编程和IO编程的问题。多线程方面的编程,虽 然可以从书上学到一些内容,还可以参照别人的代码。但是当应用程序大规模的应用起来时,问题就出来了。没有并发编程方面的理论知识,要写出高质量的代码, 真的很难,操作系统的知识也很重要。还有EJB、JMS、CORBA中出现的一些棘手问题,自己真的解决不了,因为对它们的理解都是表面的,并没有深入理 解。但是也没有办法,没有那么多时间去系统学习了,只能是出现问题的时候去Google学习来解决问题了,但是为什么那样解决,很多东西自己真不知道。这 可能工作中的必然阶段。但是这也是经验积累的重要阶段。
就在不断加班中,度过了职业生涯的头四年。因为工作的需要,诸如ant,hibernate,struts,spring,webwork等等之类的开源 工具,用起来基本差不多了;EJB,RMI,JMS,JMX,CORBA,SNMP等等之类也写了不少代码了;当然tomcat, jboss之类当然也熟得很了;MySQL,Oracle对开发工作也不会有多大的阻碍了;Linux,shell编程之类更是用得够多了。这时也开始发 现,工作变得越来越容易了。这时因为经验和知识的积累,让很多问题都变得容易解决了。而且很多代码都成形了。用起来也方便多了。但这时候,开始发现自己的 进步变慢了。这是必然了,因为很多时候都是在使用自己以前积累的知识和经验。但是自己并没有觉得自己是专家或者高手。就是自己并没有质变。这时特别想去做 一些新的东西。但是这种愿望一般都很难实现。因为在一个大公司中,创新往往也是冒险的。
这时感觉真的出现了瓶颈。现在很多IT技术和工具不断出现,觉得自己去了解它很容易。但同时又觉得这样下去,自己只是在知识面越来越广,越来越是只知道表 面功夫,很肤浅。因为工作中并不需要这么多这些新东西。怎么办?现在工作变得容易了,时间也多了。自己必须做些什么了。
先去解决工作以来自己面临的一些不爽的东西吧。首先当然是并行编程的问题。尽管在工作中做了不少并发编程的工作了。但是基本都是先依样画葫芦,然后出现问 题再企图去解决的工作方式。自己并不能完全吃透。很感谢JDK5中的concurrent包和它的实现者,仔细研读了几遍作者的书,加上工作中的应用,感 觉自己突然比同事们都高了一个档次,特别是加上掌握了NIO、JVM故障和调优方面的经验之后。至少让自己感觉到,要成为高水平的JAVA开发人员,并发 编程、IO和调优这方面的能力是相当重要的。
来到了职业生涯的第六个年头。突然有个机会需要自己去进一步掌握Oracle。这么多年来,自己除了java开发之外,还多工作都是在Linux和 MySQL、Oracle数据库方面,Linux的知识得到了比较全面的了解,而MySQL的内容相对较少(至少那时比较深的书籍不多,只有MySQL本 身的文档),也很容易有了一定的了解。Oracle一直都是我比较尊敬的产品,因为它本身的文档就让我尊敬(应该是害怕~)。当年上学时,李开复还在微 软,去听了他的一次演讲,他当时就说Oracle是让他很尊重的做大软件的公司。确实像Oracle这样的大数据库软件,也是微软自己所做不出来的。就像 自己现在特别想去了解Google的后台的基础平台的实现一样,当时也特别想深入了解Oracle。这样自己真正开始了对Oracle的深入学习的过程。 非常感谢Oracle大师们的那基本OracleXXX艺术的书籍。全面学习Oracle的过程其实也就是一个对操作系统、数据库理论知识、网络知识等知 识的汇合学习的过程。我对Oracle的学习并不想自己去成为一个DBA(尽管没有考证,我想我比很多有OCP的人强~),但是这个学习过程确实受益非 浅。当自己去深入掌握了Oralce某些知识之后,突然感觉自己在其他方面的知识也豁然开朗了。甚至Oracle的一些技术也可以被自己应用到自己的编程 实现中,比如就曾经参照Oracle的检查点技术来解决问题。
工作这么多年了,现在深深的觉得理论知识、基础知识相当的重要。细细体味一下,大学时学习过的汇编、编译原理、体系结构、操作系统、数据库原理和网络等理 论知识是多么的重要。如果这些知识都有很好的基础,很多其他知识的学习都可以信手拈来了。可惜毕业的时候这些都大部分还给老师了(当然,也可以说在中国现 有的教授模式下,很多这些知识我们并没有被真正授予)。当自己慢慢的去拾起这些知识之后,工作中的很多东西突然被领悟。有一段时间没有去写EJB、 RMI、CORBA、JMS之类的代码了,甚至那些API都忘了,但是常常当同事在这些方面遇到棘手的问题时,自己时常能帮助解决、或者至少能根据自己的 知识给出解释去指导得到解决的方法。这也许就是基础知识和知识积累的力量。
当然,基础知识是至关重要,但是只是一味的去读那基本书籍,可能就成了书呆子了,甚至根本没有领悟那些知识,大多得在应用环境中体会。所以很多现在的中国 大学教育根本没法真正达到传授知识的目的。所以也很感谢这么多年的工作经历和公司提供的机会。但是基础知识并不一定能带来技术技巧。技巧或许需要更多更广 的经验和知识面。基础知识能让自己更容易理解和分析问题,而新技术和经验技巧却能提供更多更好的方法来解决问题。编程语言也许并不重要。但是有时也很重 要。当掌握的编程语言多了,找到解决问题的手段也就多了。同样,知识面广了,新技术和技巧的掌握得多了,工作就轻松了~。这也是知识积累的力量。
这么多年了,自己还是没法预料将来会是怎么的职业生涯,因为计划赶不上变化。但如果知识掌握的扎实,不管将来怎样变化,都一样可以应付。不是知识和技术没有用,得看掌握到什么程度。继续努力吧!
计划赶不上变化,也许再过八年之后。我又是另一番感受了。