您的位置:首页 > 其它

转:我工作这几年 ―― 读“有多少人像这样这样苦苦挣扎”有感

2010-11-09 10:56 288 查看
我是06年毕业的,在大学时对C++非常感兴趣,工作被分配到部门后,被要求转做Java,非常不愿意,也找老大提过换部门,但老大答复不可能,没有办法,既来之,则安之,暂时无法改变现状,只好安心做一段时间Java。

大学期间我虽然也学了一点Java,但对WEB开发一无所知,所以只能从头学起,从HTML到JavaScript、再到Java,JSP,只要是WEB开发相关的东西,我都去学,还记得那会经常周六去加班学习项目组的代码,所有后台代码只要有源码的我都仔细研究过,特别是那些有些技术含量的,我都会让自己去搞透,当时我们项目组的WEB框架也是MVC框架的,但完全是公司内部的代码,没有用到开源的东西。有一个周六去看代码,当时花了一整天的时间搞懂了翻页组件(基于JSP的自定义标签实现)的原理和代码,兴奋了很久。
06年那会,Struts很火的,现在已经看不到了。页面框架完全是我们组内的一个同事自己实现的,基于JavaScript、XML实现的,我之前对WEB一无所知,所以当时对他十分崇拜,只要是他写的代码,我都会花很多时间去研究透。在我进公司两个月左右,我对他搞的那套框架和他写的代码已经基本搞透。在我进公司两个半月左右,部门新起了一个项目,他主动要求去了。由于我经常向他请教阅读他代码时出现的疑问,所以他对我印象还不错,加之那套代码我也基于搞明白了,所以他那套代码全部交给了我来维护。
由于刚进部门时我有表现出不想做Java的情绪,当时项目组的老成员对我很不认可,后来我踏实地做事,逐渐还是得到了他们的认可,特别是那位老员工的离去后他的代码我基本都能搞定,后来项目组的老员工还是改变了对我的偏见。我转正时,PM给了我一个A。我那会也认识到其实搞WEB开发还是有很多东西可以学的,自己的心态也调整了过来。
当时我花了很多时间来研究代码和写代码,当时借了本《Java 2 核心技术》,我记得书上的很多示例我都自己一行一行敲进去编译运行,看最终结果与书上说的是否一致,那些示例代码我都保存了下来,对我以后的工作也有不少帮助。
平时我会花很多时间去看书,《Effective Java》、《深入Java虚拟机》这些书我都买了,一有时间我就看,《深入Java虚拟机》那本书基本上看不太懂,但有时间我还是会翻翻。做Java,还要学习设计模式,我已经不记得这是谁告诉的,但当时我还是那么做了,设计模式相关的电子资料我也找了好多,有时间就翻下,并尝试在自己的代码中使用一些简单的模式,印象中单例模式我好像用得最多,哈哈。
慢慢地我也学了不少东西,当时感觉自己每天都在进步。那会我在页面方面提升得特别快,当时有些老员工也会问我一些页面开发相关的问题,慢慢地我在项目组也有了点地位。我们组还有另外一个比较牛的人,项目组中的一些疑难问题基本上都是他搞,当时他在项目组说的技术相关的其他人都认同,但我有时就会和他争论,并说出我的观点,虽然多半被大家否定,但还是有少部分意见会被采纳,后来再有问题他有时也会找我讨论。如果你想被别人认可,至少你得在某一方面在小范围内做到最好。
06年底,部门组织年终活动,我得到了“最佳新人奖”和“最快进步奖”,那天晚上我激动了很久。去给部门领导敬酒时,部门领导说的一句话我现在还记得很清楚:“你的工资多少现在来看不重要,重要的是你周围的人对你的认可”。可能各位看客觉得我的领导在忽悠我,但我从未那么看,那位领导的那句话也给我很大的学习动力。
07年初,我那位很牛的同事被调动去做一个新项目,领导答应他可以自己选人和他一起做,我有幸被他选中,现在想来真的应该好好谢谢他。这个新项目的具体工作其实就是搭建一套全新的WEB框架,不过领导提了一些特殊的要求。我被分配的具体工作就是搭建一套页面框架,同时实现权限管理,权限控制要能控制到按钮级别。那段时间我花了太多精力在上面,为了实现树型结构我自己花了两天时间来写JS代码,那段时间有时做梦都在想有些技术细节该怎么实现。总的来说,那些代码质量比较高,我自己测试完后,框架部分测试部没有提过一个问题单,到现在有些项目还在用我们当时实现的框架。做些那个项目后,有天我觉得想通面向对象设计中为什么要有接口,对设计模式开始有了真正的体会。
我工作第一年期间,很多天到了晚上六点我会准时头昏,大脑累得不行。现在来看,当时的付出是值得的。
------------------------------------

07年前四个月基本上都在做那个项目的框架,后两个月写了些业务代码,由于在页面开发方面PM觉得我不错,7月份我被派去深圳出差做一个新的项目,在我出差期间部门老大在一个新员工会上表扬过我,当然那是其他同事后来告诉我的。07年下半年我一直在做那个新项目,那个项目中间也遇到了不少问题,特别是性能问题,因为当时我们部门在大力推广这个项目,所以这个项目搞得我们非常痛苦。由于我道行不够,那些性能问题还轮不到我处理,但我还是学到了一些东西。记得期间有个性能问题是因为SQL写得不好(这个SQL非常耗时),导致整个系统并发时性能奇差;有次Tomcat宕机是因为JVM的内存参数未做优化设置导致PERM内存OutOfMemory。因为那期间的一系列问题,我对程序开发又有了一些新的认识,要开发出一个健壮的系统还真不是件易事。之前我认为会写SQL和存储过程,数据库就算掌握了,哈哈,想法太幼稚了。通过那个项目,我开始尝试去了解Tomcat,并找了些Tomcat资料来学习。
PS:有些人认为我有钱,非也。我家条件不好,刚工作时工资也很少,开始时也就2K多;我心理也不平衡过,07年在深圳期间还想过去深圳的一些软件公司去面试,但因为项目忙且对深圳不熟,最终未去。我坚持了下来,07年我的工资调整过三次,调整后有多少当然是不能告诉你的,不过比原来多很多。
那个项目还在继续,期间由于项目的需要和个人的兴趣,我陆续研究了Lucene、Tomcat的源码,当然有不少是看不懂的。特别是在看Tomcat的代码时,才发现Java体系还是比较庞大的,Tomcat源码中涉及到不少Java技术:线程池、JMX、类加载机制等。我后面的学习也有了新的方向。
08年因为项目需要我又有机会和那位比较牛的同事一起做项目,这次要实现一个短信服务器,并有一定的性能要求。Java天生支持多线程,所以这个项目就需要用多线程了。虽然之前写过一些简单的线程相关的代码,但还真没有在项目用过多线程。于是又一轮学习开始了,找多线程的资料看,找示例代码学习。说实话我天性不高,在大学花了很多时间去研究C++,自己也写过不少小玩意,所以工作后,由于大学期间的积累,像Java、JavaScript这些东西可以很快上手。07年期间我陆续将《重构》那本书翻阅了大部分,对重构的基本思想有了基本认识,加之07年期间对面向对象的进一步理解,在做短信服务器期间我不断地对代码进行重构,当时因为短信有性能要求,所以测试组也有兄弟配合我们做性能测试,所以我们基于性能测试的结果不断地做优化。由于自己确实花了不少心思在上面,所以在性能测试过程中一遇到问题,我自己很快就可以找出问题原因所在。那个项目大概做了3个多月,期间也差不多写了三个月的代码,由于业务逻辑相对清晰且流程明确,所以基本上自己做完单元测试后就不会给测试组留下提问题单的机会。虽然这个项目我们也用到了多线程,但都是直接使用的JDK1.5中提供的新的特性,所以做完这个项目对多线程还是没有太多的理解。反而是在不断重构代码的过程中,又理解了几个新的设计模式。08年第一季度基本上就这样过去了,基本还算充实。
08年第二个季度,我被分配的任务是做报表,由于PM担心报表的数据量可能会很大,所以在需求阶段就提出了性能要求。做报表,说白了就是基于数据库做数据汇总,期间我写的代码量不多,相对还算轻松,但性能问题PM三天两头的就会提醒我一次,所以心里还是有点负担的。由于之前一直没有很系统地学习Oracle,所以借这个项目机会我借了本Oracle资料,具体书名不记得了,我一有时间就看;公司内部有也有一些资料介绍常见的Oracle优化资料,我一般都是书结合优化资料看,同时在报表的数据库实现时去实践。项目后期,我重点就做性能测试,自己做假数据。期间做了一些验证后,我才真正发现Oracle的强大,在千万级的数据量下对该表进行查询,如果表的索引建得合适,只需要0.01秒就能完成,这0.01秒还包括数据的网络传输耗时。搞完这个项目我决定去了解一下Oracle的体系结构。
现在很多人认为搞Java很简单,搞WEB开发很没有技术含量,我个人并不这么认为,其实这个关键就看你怎么给自己定位了,WEB开发一般分三层(Model模型-View视图-Controller控制器),从前台(HTML、JavaScript),到逻辑层(Java)再到后台(某一数据库,如Oracle),如果你都能搞透,我相信你一定可以在项目组站稳脚跟,至于工资,那真的是附加值,如果你刚工作就非常注重工资的多少,这绝对会影响到你后面工作的心态及你的经验积累。搞Java如果你给自己的定位就是停留在简单的复制粘贴+Google搜索,我相信你很快就会厌倦现状。其实Java还是有些搞头的,比如多线程、类加载机制、内存分代(OutOfMemory也分多种情况)等,另外搞Java也会时常有些莫名其妙的问题,如果你能快速搞定,相信你的成就感会油然而生,你对Java就会有新的认识:Java没有你想的那么简单,简单的而是你的认知水平
08年下半年,因为部门整合,我的领导发生了变化,这也对我后面的工作和我的能力产生了巨大的影响……
----------------------------------------------
08年下半年因为部门整合,我的直接主管是换成了另一个部门的技术牛人,从他身上我学到了很多东西,除了具体的技术,还有做事的方法。具体学到的东西,我下面会详细讲。
08上半年做的短信服务器与其它模块之间的接口是基于Http接口实现的,tcp协议相对udp来说可靠但还是带来了一些性能损耗,另外Http又是基于tcp的上层协议,我们的短信服务器是基于Tomcat实现的,整体性能不是让人很满意。看过Tomcat源码的都清楚一个WEB请求从Tomcat接受到Http响应返回,中间经过了很多层的中转和过滤,如果想从根本上提升性能,只能考虑从通信协议层进行优化。我和一直合作的那位牛人又基于Mina开发一个私有协议的udp协议栈。总的代码量不多,但期间遇到了一点技术问题,这个问题我记录在了我的JavaEye上的第一篇博客上《使用Mina出现的JNI OutOfMemory的解决方法》,感兴趣的朋友可以看一下。具体是JNI OutOfMemory问题,最终的解决方法很简单,但过程是非常痛苦,印象中搞了两三天。最终这个版本的性能我们非常满意,在两个PC之间进行消息互发,每秒流量能达到4000条以上,这个结果还是我们随便测试的结果,在具体代码实现中,我们使用了不少设计模式,而且应用了不少Java多线程的知识,做完了这个项目我感觉自己在Java多线程方面入了门。现在回头来看,那算自己写过的最满意的代码了,代码量不大,性能很高,外部使用起来也非常容易。从那以后自己再没写过上千行以上的Java代码了,当然后面也没机会再和那位同事一起合作写代码。现在想来有点怀念写Java代码的时光。
08年初做的服务器在现网稳定运行了一段时间后,业务量也逐渐增大,后来开始出现问题,每隔10几天就会OutOfMemory一次,让领导非常头痛,但一时也找不到根因。虽然代码是我写的,我当时还没有处理过类似问题,一点经验都没有,很无奈。出现这个问题的那会,已经有部门整合的风声传出来了,也就是那会我现在的直接主管被要求过来指导解决这个问题。
当时我们内部成立了一个小组专门解决这个问题,主要有我和测试组的一个专门做性能测试的兄弟,在此之前我从没见过现在的老大。老大给我提了一些思路,同时给了我一些参考资料,也就是那会我开始接触GC日志以及JVM的一些高级选项,还有就是定位这个问题的方法,我也写在了我的博客《程序性能问题定位方法》中了。当时我和那个测试兄弟做了几次性能测试,在大并发量的情况下,问题很容易重现,问题只要可以重现,要解决只是时间问题了。OutOfMemory的根因是有多个线程向一个Map写入数据,另一个独立线程会定时将Map中的数据写入数据库,在并发量大的情况下,Map中元素增加的速度其实是快于独立线程将其取走的速度,最终Map中的元素越来越多,直至OutOfMemory。我犯的这个Bug真的非常隐蔽,一般情况下也不会出现,我后来在Review其他同事的代码也发现过同样的Bug。助我找到问题根因的工具是jmap,这个工具在JDK1.5的Linux安装包已经自带,感兴趣的朋友可以自己去Google一下jmap的用法,使用起来比较简单,但非常实用。这个问题大概搞了两周,中间大部分时间在做性能测试,通过这次问题攻关我对测试的看法发生了转变,同时也认识到了性能测试的重要性,也是通过这次问题攻关,我开始接触到了Java一些深层次的东西,如JVM的内存结构,一些Java的高级选项,GC日志的分析方法及JVM的GC机制。
那会我对Java的认识开始转变了,学Java还需要深入了解JVM的内部机制。此前虽然也看过《深入Java虚拟机》,但并未认识到JVM的内部机制对工作有什么帮助。说到《深入Java虚拟机》,我真得感谢这本书。有次和老大聊天,无意说到那次短信OutOfMemory问题的定位,他说初始见面对我印象不错,我问为什么,他说第一次去找我时见我的桌上放了一本《深入Java虚拟机》,他自己对技术非常感兴趣,也有本《深入Java虚拟机》,不管我有没有看过这本书,至少我潜意识里对技术还是挺感兴趣的。
也许有人觉得我运气好,有机会去做那么多东西,我个人也觉得自己的运气不错,但我更相信机会只给有准备的人。和我一起进项目组的也有几个,但并非每个人都有机会做那么多不同的东西。
之后08年过得就有点痛苦了,一直在处理现网问题,分析现网日志去找某些问题原因,时常是将几十M的日志取回来分析,也就是那段时间我开始大量使用EditPlus,并将EditPlus使用得异常熟练,之后我就坚信EditPlus是最好用的文本编程器。古人去“工欲善其事,必先利其器”,我想这应该也算。做不同的事情有不同的收获,即使是在重复劳动,我的耐性也得到了磨练,当然这是我现在的看法,当时可能也觉得很痛苦。在你快坚持不住的时候,再咬咬牙,后面一定会出现超出你预期的结果。项目需要我又做C++了,到现在也已经快一年了,代码写得不是太多;如果当初我一冲动便离职找了份C++的工作,现在又会怎样?可能也未必比现在学到的东西多。

待续 。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐