我的Java学习之路

这里说说我的经历吧。大学前以及大学前面三年的经历就不说了,因为大学前的高中就是好好学习,大学前三年就是混过来的。

    我上的学校还算可以,虽然不是北大清华这样第一流名牌大学,但至少也算中国的第二流名牌大学了。大学中前面三年都陪伴着游戏过去,所学到的只是些计算机基础知识。到大四后我突然发现就业的问题就在眼前,而自己似乎什么也不会,于是开始看书。最一开始重点看的是C++,可是后来自从看了一本J2ME的书以后被Java所吸引。当时虽然学校上过Java课程,但是自己也只是学了很少的皮毛,也就只会写写Hello World和什么加减法之类很简单的程序,连API都知道没有几个,比如说字符串长度的API我都不知道。所以刚开始自己学J2ME的时候屡屡受挫,自己也明白自己的缺点,决定从J2SE开始好好补上。

    刚开始为了熟悉Java开发环境,买了本JBuilder开发的教程,并且在自己的本本上安装了JBuilder进行演练。当时的我连JavaDoc都不知道,每次究竟什么API能做什么事情一点头绪都没有,还不知道哪里去查,后来同学告诉我有个JavaDoc这个东西,我还兴奋不已,觉得自己被从黑暗中拉回来了。一开始使用JBuilder的时候,马上为之所吸引,有两个原因,第一是因为它自动标出语法错误,边写代码边提示你什么地方语法出错,记得以前使用VC++的时候,每次程序写好后先编译,然后再Build,再运行,这其中每个步骤都会出不少错误。特别是在编译的时候,写个200多行的程序一次编译下来就有100多个错误,结果每次花在这上面的工夫都要好长时间。而JBuilder使用了即时语法分析,所以基本上程序写完,就可以省略调试语法错误的步骤了。第二个原因是可以自动提示代码,这个功能可以让你迅速熟悉API,免得每次去查帮助文档那么麻烦,我就是这么很快掌握了许多API的。

可能大家会问我为什么一开始不学习《Java编程思想》,的确这本书我们宿舍就有好几本,不过大家普遍反映效果不好,到最后都不知道说的是什么,所以我也没敢看。

    经过20天左右的学习,对Java有了更进一步的了解,熟悉了不少API函数,由于在那本书上写开发SWING占了不少篇幅,所以也对Swing的开发了解了不少。看完以后因为同学说Java的灵魂就是多线程编程,所以开始看Oreilly的《Java线程》。记得在大学中操作系统这门课我们就提到过线程的知识。并且课本上就是用Java实现的,当时有了一点点概念,但这次看这本专门说线程的书后才发现我原来了解的那些根本是什么都不算(当然,现在回想起来,我那时看书学到的也只是很简单的皮毛而已)。看完这本书后我自己学会在我的JBuilder下开发很简单的多线程程序,并且模拟线程冲突,等待等情况。当时看着自己写的一两百行程序可以顺利执行,那种兴奋劲就别提了。这本书我看得也很快,大概就花了3个星期看完。

    经过上面的学习,自己相比以前来说提升了不少,这时候自己也找到了工作,是做J2EE对日外包的,所以更加坚定了努力学习Java的信心。

    在上面写的程序中,我自己写程序没有规范性,在代码编写的时候自己的盲点特别多,还容易犯低级失误。同学有一个《Effective Java》中文版,可是我看了几页发现自己根本看不懂,里面什么静态工厂啊,什么单例模式什么的根本不知道什么东东。我知道自己目前的水平还不够,所以决定放下这本书,去寻找别的适合我的书看。这个时候我看到了候捷先生翻译的《Practical Java》一书,当时是刚刚上的书架。这本书我在书店翻了下目录后就感觉如获至宝,马上买回家,在回家的公车上就贪婪地读起来。这本书不算很厚,但是自己看得却很认真很仔细,也明白了不少东西,比如Java中等号和equals()方法的区别,究竟什么时候用什么。还有Exception处理机制,以前不知道什么叫Exception,只是JBuilder提示我要我抛出Exception我再抛出Exception,自己觉得这东西基本没什么用呢。但是看了这本书后我改变了看法,我发现Exception是个很好的东西,可以迅速把程序从正常状态和异常状态区分开来,即使而准确地在指定位置得到处理。那时自己也有了以后写程序的时候注意编写异常处理部分的想法。《Practical Java》这本书虽然不厚,但是我却非常仔细地去看了,大概花了1个月时间,我把这本书完全消化了下去。

    当时听说Java在网络上的应用非常广,我也不知道究竟是什么应用,我于是买了Oreilly的《Java网络编程》这本书。这本书虽然很厚,其实前半部分内容不是很复杂,后半部分写什么RMI的东西我也看不大懂,只能理解个概念。通过这本书,我了解了HTTP协议究竟是什么一个东西,在它上面利用 Java传输数据该如何做,知道了什么是Request,什么是Response。这也为以后开始我的J2EE之旅打下了很好的基础。当时自己依然是边看书边自己写代码来验证,自己写了个服务器端Socket和客户端Socket,成功进行了通信,又在上面加上了安全Socket内容,实现了SSL通信。当时我把写的这个又套上了Swing的外壳,还和同学拿这个传文件呢。不过当时也没有考虑过什么校验码之类的东西,所以传传小文件还是可以的,文件稍微一大一点,传过去的文件总是不对头,和我原来的文件经常会出一些差异,导致文件打不开。

    《Java网络编程》这本书看了不少时间,因为书比较厚,东西也比较多,不过除了后面的一些知识以外,其他的还是容易理解的。大概花了2个月左右的时间看完。看完后,时间也到了2004年的3月。我也轮到开始我毕业设计的时候了。我们的毕业设计导师都还不错,给你自己选个课题,我选的是一个B/S结构的在线简历处理系统,正好和我所学和下面所工作的东西是一条路上的了。这时我觉得我应该往B/S结构上转了,当时在选择先看Servlet还是先看JSP上犹豫不决。最终决定先看Servlet,后来也证明了我的决定是对的,我在熟悉了Servlet后再学JSP是非常容易的,基本上根本没有遇到什么难点。

可能有人会觉得我看了好多Oreilly的书,虽然我不能说Oreilly本本都是好书,不过相对来说,好书的概率总超过许多其他的出版社,而且体系比较齐全。我看得几本书我都觉得还不错。现说说下面这本我学Servlet时候看的《Java Servlet编程》来说吧,很不错的一本书,让我迅速知道了什么是Servlet,然后通过最简单的实例,让你知道了Servlet如何运行的,跟 HTTP协议是如何配合的,如何返回HTML形式的文本,XML配置符该如何写,究竟每个元素是什么意思等等。由于我原来有一定的XML基础(知道XML 语法各种格式的含义而已),所以掌握起来还算比较快。通过这本书,我知道了如何动态生成HTML文档,知道如何把一个Servlet映射到一个虚拟的地址。在后半部分写到了数据库操作部分,我对数据库的了解其实也仅限于原来大学课本上的《数据库系统原理》,如何从程序和数据库交互是一窍不通。通过数据库操作这章,我知道了如何使用JDBC语句如何编写,大家不要笑,对于当初一个新手来说,这个真是一个全新的领域,做什么事情都需要Sample来对照,跟着依葫芦画瓢吧,其实现在的软件开发也是这样,我想现在大家谁能直接手写Struts或者Hibernate的配置文件都很难吧。闲话少说,大概这个时候,我对毕业设计的雏形有了点思想上的概念。看完了《Java Servlet编程》后紧接着就又看Oreilly的《JSP设计》,由于有了Servlet的基础,学起JSP特别快。当时没有着重看Tag的自定义设计,光看了JSP的其他东西,终于在五一节后把毕业设计都写完了,当时总代码量是2000多行,第一次写这么多代码的程序觉得很有成就感。现在看起来那时做的是标准垃圾,但是当时觉得还是很不错。用了Servlet + JSP。其实Servlet也不是用来当控制器的,而是和JSP做的差不多功能,都是作view的功能的。很快,毕业设计交差过去了,写写毕业论文,准备答辩。在这个过程中,我又一次考虑自己下面该看什么书。

这次我又看中了侯捷翻译的一本巨著,也就是鼎鼎大名的Martin Fowler写的《重构——改善既有代码的设计》这本书。刚开始听见重构这个名字,总觉得非常高深,加上都评论说重构是和设计模式齐名的东东,感觉更加高深恐怖了。大概在6月初我开始看了重构,刚开始看的时候虽然抱着试试看的心态,不过还是非常认真的。但是,让我颇感意外的是重构并不是很难,至少这本书中说的非常通俗易懂,通过大量的实例让你觉得重构是种很简单很基本的技术。虽然我看完了重构以后在真实的代码编写中很少直接按照上面代码所说的方法进行重构代码,基本上都是通过IDE来重构代码,但是却大大提升了自己编程思维,从此以后写代码就很少瞻前顾后了,因为我拥有了重构这个工具。这本书有点厚,再加上中间有答辩,拍毕业照,以及毕业手续等等,这本书我花了一个半月看完。我看书的速度也不算快,不过我看书比较有恒心,不像有部分人看几天就不想看了,我能坚持天天看,所以总的来说还是不慢的。我计算过,如果我每天看10页书,坚持下去,那一年就是3650页书,平均一本书365页来算,1年就是10本。如果这10本书中有8本不属于垃圾书籍,那么你这年就能有非常大的提高了。

看重构这本书中间我也抽了一段时间看了两本其他的书,第一本是《Java夜未眠》,挺不错的一本书,虽然是散文,但是还是能让你明白不少道理,受益匪浅。另外一本就是李维的《Borland传奇》,由于自己当时最喜欢用的工具就是JBuilder,所以也对Borland公司非常敬仰,特别对安德森,简直就顶礼膜拜啊,哈哈。这本书写得很精彩,写了Borland公司二十年来的血泪史,写了如何跟微软斗争,如何在微软和IBM的夹缝中生存。当然,也有很多的对于技术方面作者李维自己的见解,看了会有不少同感的。就这样,磨磨蹭蹭地把重构看完了。

    当看完了《重构》这本书之后,我也开始去公司报到上班了。可以看出来,我当时工作的时候水平也很有限,但总比一年前要好不少,至少很多东西都已经知道了。那时外面极限编程听的比较多,自己也去书店买了本《Java极限编程》回来看,现在想想算是我看得第一本垃圾书籍了。不过也是有收获的,这本书极限编程也就说了点概念,然后就写了不少工具的使用方法。在看《重构》中对JUnit有了点认识,不过只是皮毛中的皮毛。看了这本《Java极限编程》后对 JUnit的使用又了解了不少皮毛,对于Cactus有了点了解,对Ant了解了不少,至少可以自己写出自己需要的配置文件了,并且可以结合JUnit生成测试Report。由于我去的是日企,做对日外包的,所以公司开始培训日本语,用的是《标准日本语》这套教材。我于是边学日语边看技术,大概2个星期左右我把那本《Java极限编程》初步看完后就扔在了家里。这时的我已经开始会用Ant了,觉得是步入J2EE的重要一步。

    很快啃掉那本垃圾书以后又看了本和Java不是非常有关的书:《程序员修炼之道——从小工到专家》,原因其实很简单,大学同学都说这本书是经典书,看书这东西,别人的评价还是能起不少作用的。这本书字数不是很多,不过排版的时候比较分散,导致书本有点厚,呵呵,可能也算出版社赚钱的一种方法吧。不过总的来说,我觉得出版社纸张质量最好的是电子工业出版社,其次是中国电力出版社,最烂的恐怕就是机械工业出版社了,机械工业出版社有少量书纸张还能说过去,但有不少简直让人不得不有脾气啊,纸张薄得感觉和写毛笔字的宣纸都差不多了。这本电子工业出版社的书纸张质量的确不错,不过也许是因为我功力尚浅,所以这本书虽然都看懂了,但是深有感触并且铭记于心的没有几个,现在再回想,也只记得软件模块设计时要正交等等少数几点了。这本书由于内容不是非常多,所以我就看了半个月不到搞定。这时的我开发IDE已经转移到了Eclipse上,毕竟商业开发用D版有点说不过去,而且公司也怕查,所以不允许用JBuilder,鼓励大家用Eclipse。我用了一段时间的Eclipse后,从一开始的不适应到后来觉得Eclipse很方便使用,JBuilder比Eclipse多的就是一些根据不同类型开发的模版而已,而这些可以由Eclipse的插件来弥补。到了这时,我觉得我的Java基础应该算还可以的了,API也熟悉了非常多。我觉得看《Effective Java》的时机成熟了。

    由于大学已经毕业了,所以也不会有同学的《Effective Java》放在边上让我看这样的好事出现,老老实实地去了书店买了本《Effective Java》中文版回来研读。呵呵,大家也许会问我为什么不买本E文的看,虽然我大学早早也把英语4级过了,而且大学中不少计算机专业课程教材也是E文的,当时为了考试也认真读了。但是毕竟英语不是我们的母语,看起来速度上明显比中文版的慢一截。当然,如果是那种垃圾翻译者用机器翻译出来的中文版,看那些垃圾中文版速度肯定比不上直接看英文原版的。这时的我看《Effective Java》已经不再是当初的那么感觉很陌生了,觉得上面说的那些要点自己想想还都是可以理解的。我个人觉得提高自身编程习惯以及水平最多的还是看类似于《Practical Java》和《Effective Java》的这种按照条目来进行说明的书,能把你自己平时容易忽略的地方按照重点一个个揪出来进行修正。比如《Effective Java》中的第一条,使用静态工厂来代替构造函数,自己原来在进行开发的时候,从来不怎么会主动想到建立一个静态工厂,总觉得使用构造函数来新建一个对象是天经地义的事情。但看完这个条目后,我的看法也随之改变,发现静态工厂还是非常好的,当然,也不是什么地方用静态工厂都很好。上面也写到了静态工厂的优缺点,比如在什么地方适合使用,什么场合最好不要使用等等。这本书我觉得翻译的也不错,绝对值,强烈向有一定开发经验的人推荐。我大概看了3周半的样子把这本书看完,这时的时间也到了2004年的9月初,新员工入司培训也不再是第一个月纯粹的日语培训,而是技术培训和日语培训一起开展,技术上培训 Java,Web开发,数据库开发这三门课程,日语则开始进行日本语国际三级的培训。公司的日语培训和技术培训都还不错,技术培训纯粹把大家当作什么都不懂的人,在Java上从最原始的Hello World开始培训,Web开发上从HTML页面开始培训,数据库开发则从Oracle的安装,SQL语句的编写开始培训。当然,在培训的过程中我也不会闲着,而是又开始寻找自己要啃的书本,这次,我选中了Oreilly新出版不久的《Java与XML》第二版。

    由于XML表达数据的自由性以及强大型,所以XML特别适合于做配置文件以及数据信息文件,在Java中XML的使用可谓是多如牛毛。在J2EE中,从 Web Application的web.xml开始就是XML文件,到下面的Framework配置等等,没有一个没有XML的身影,而且XML都起到了举足轻重的作用。虽然我原来也懂一点XML,不过也仅限于XML的语法以及结构等等,那些深入下去的东西基本还是盲点,关于Java中如何处理XML更是一窍不通。为了更好的学习J2EE,XML是必须征服得一座山峰。这次,我依然又再一次信任了Oreilly出版社,买了本当时出版不久的《Java与XML》中文第二版。这本书刚开始并没有过多介绍XML本身过多的东西,只是为了怕某些读者并不了解XML而对XML语法结构等做了非常简要的介绍,不过也非常到位的介绍。介绍完了这些XML基础知识后就开始了SAX——〉DOM——〉JDOM——〉JAXP——〉Web Service的历程。不过我现在觉得如果能介绍DOM4J就更好了,因为我现在觉得DOM4J是Java中最好用而且性能也不错的XML处理工具。刚开始的我其实什么是SAX,什么是DOM都不知道,对JAXP更是一无所知。这本书英文版据说很受好评,中文版我只能说一般,因为有些地方估计译者并不擅长这一块,所以翻译得很生硬,以至于部分段落难于理解。总体来说,书的绝大多数内容还是可以看懂,由于没有具体实际操作的经验,所以很多也就是把概念理解了,直到几个月后做正式项目开始应用这些XML处理工具进行开发的时候才达到了熟练运用的能力。在这本书中学会了JDOM的使用方法,JDOM也还是比较好用的,学会了JDOM,以后操纵XML也方便了许多。这本书我的建议就是,可以一口气读到第十章JAXP部分,后面的Cocoon以及SOAP等等部分那本书介绍的并不是很好。Cocoon我是看了官方专门的帮助文档以后才感觉入了门。而SOAP是经过别的书籍加上项目中的实际运用才真正学会的。

这时到我刚进公司已经两个月过去了,时间已经到了9月中旬的样子,还有一个月我们公司新员工入司培训就要结束,也意味着还有一个多月我们就要开始接触正式项目。这时的我写B/S程序仅仅是JSP + JavaBean的水平,连JSP中的TAG都不会自定义,看见别人网上的程序自己还自己定义Tag很是羡慕,于是决定把那本《JSP设计》认真看完,把自定义Tag的功能实现。后来看了以后发现原来那本《JSP设计》的精华都在最后的150页内,最后那部分先是介绍了自定义Tag的定义方法以及Tag定义所带来的一些好处。自从学会了如何自定义Tag,在后来公司的项目中自己也根据项目的特点定义了一些共通的Tag,大大方便了不少项目中的开发人员,提高了生产力。这本书而且也说了一下B/S开发的两种Web Module。在这里,我第一次知道了Web开发可以用一个Servlet作为控制器,用JSP仅仅作用于表现层,这也为以后掌握MVC打下了很好的基础。

9月中下旬扫完了《JSP设计》的尾巴后,有一次跟公司给我们培训的老师在闲聊时谈到了项目开发,我询问他项目是不是用JSP和 JavaBean来开发,他笑着和我说不是这样的,而是基于Framework来进行开发。比如Struts就是公司的常用Framework。 Struts这东西以前也好像听说过,不过从来也只是听说而已,并没有看过。得到这个信息的我,为了能尽快熟悉实际项目的开发环境,便决心尽快学会 Struts。当时的市场上讲解Struts的书只有一本,也就是Oreilly的《Jakarta Struts编程》,不像现在连《Struts in Action》的中文版也有了。我去了书店买来开始回家看,刚开始看的时候觉得如同云里雾里一般,因为这本书归纳总结性的东西很多,比较适合当参考手册,而真正带领新手入门这一块做的并不好。所以当我把这本书都看完了以后,还是不会用Struts编写一个程序,只是感觉自己朦朦胧胧懂了一些概念,比如 MVC什么的。在公司我们的培训也结束了,通知在国庆节过来以后的第一个星期——大概是10月10日左右进行考试,最后根据培训考核情况来调整薪水。当时跟我一起培训的新员工基本上没有人会Struts,其实这个时候连会用JSP + JavaBean写一个最简单的登录画面的人也没有多少个,大部分人还是模模糊糊懂一点,但是具体做东西还是做不来的那种水平。国庆节大概10月5号的我去了趟书店,突然发现书架上新上了一本书,就是孙卫琴编写的《精通Struts》这本书。孙卫琴的书我倒是听说过,就是在这之前出的一本关于Tomcat 以及Web App开发的书,据说挺容易上手的。我翻看了这本书的目录结构,觉得可以值得一读,于是虽然价格不菲,仍然买回家当天就研读起来。凭我的读后感觉来说,这本书也许学术价值并不高,说得深入的东西基本没有,但是特别适合初学者,通过Hello World这种例子迅速让你手把手编写出第一个Struts程序。就这样,在这本书买回来的第二天,我自己就用Struts写了一个很简单的登录画面程序,当时的感觉别提多兴奋了,就感觉自己入了门,以后的道路一片光明。在这里,我要由衷地感谢孙卫琴女士,写了这么一本适合初学者的书,同时也建议没有学过Struts但又想掌握Struts的Java程序员们买这本书回来看(不知道我是不是有书托之嫌,我只是说我自己的心里想法)。

    国庆的假期放完了,我也回到了公司准备考核,上午是笔试,下午是上机考试。笔试分为了4块,分别是Java,Web开发,Oracle数据库,以及 CMMI规约。这四门除了Oracle数据库我一向不是很擅长,只考了个中等分数以外,其他三门分数都名列前茅。不过CMMI规约老实说我也不怎么会,不过碰巧考的很多都是我知道的东西。下午是上机考试,题目给出来了,我一看题目,原来是一个最简易的成绩查询系统,也就是数据库里面已经有一些学生成绩,我们写一个检索页面,可以输入或者选择检索条件,把符合我们检索条件的数据输出并显示在画面中。我于是拿刚学会不久的Struts进行编写,在3个小时内把整个页面都写好了,并且还自定义了一个Tag来显示数据信息。考完以后我才知道总共也就五六个人程序可以运行,而且只有我一个人用的是Struts,其他人基本都是最简单的JSP + JavaBean,有的人连JavaBean都没有,数据库操作全部写在了JSP页面中。毫无疑问,这次上机考试我得到了好评,给了最高分。在全部的培训成绩中我也居前两名,我们部门新员工我排第一名。带着这个成绩,我们的入司培训基本结束,开始进入部门做实习项目。

    虽然说我们正式进了部门,不过试用期还没有结束,我们试用期最后一个月的任务就是做一个实习项目,当然,每天还是要进行日语培训,因为要参加12月份的国际日语三级考试。公司也象征性得给大家培训了三节课的技术,第一节是Struts培训,第二节是Web App的MVC结构的培训,第三节是Log4j培训,这几次培训下来,大部分人感觉好象云里雾里一样,基本什么都没听懂,不过我由于有了点Struts的基本知识,所以感觉收获比较大,特别是MVC的培训中我真正明白了视图——控制器——模型这三层每层应该怎么处理,知道了一个Web App中如何分Java Package比较好,明白了专门有一个DAO层来处理数据库所带来的便捷,明白了Log在Web开发中的重要地位,这为以后的开发带来了很大的好处。实习项目的课题很快就下来了,要我们做一个电子相册的B/S系统,要求有图片上传,图片检索,图片显示以及要用Struts来构建,这些是基本的要求,其他功能可以自由扩张。我们部门的新员工分为两个小Group,都是一样的课题,互相促进和学习,每个Group还配备了一个老员工,作为督促我们的进度,防止我们有过大的偏差等等,不过具体做东西上原则上要求是不会给我们什么帮助。首先每个小Group要选出一个Leader,结果我被大家一致选为我们 Group的Leader。在小组讨论中我们先进行需求分析,大家的讨论很是热烈,主意也很多,不过基本上组员们也都是点子多,具体实现上面还都没有想过。对于他们的那些建议,绝大多数我决定都作为我们要实现的目标,但也有少部分我觉得目前以我们的水平还无法实现的,就先否决了。会议开完后,当天回家以后我就开始排开发计划和个人的进度,第二天写画面的基本设计,第三天把组员拉过来开始Review基本设计,我们组的速度还算比较快。从星期二公布课题,到星期五就和几个组员一起把DEMO画面设计出来了。原来的计划是第二个星期一开始Coding,大概花一个星期完成。不过其余组员似乎还是不怎么会 Struts,于是我回家星期六星期天基本全天都在看书写代码学习,花了两天把项目基本Coding完毕。其中Web页面部分也不再使用一开始使用 Frame的做法,而是采用了Tiles框架。Tiles的使用过后我感觉是非常好的东西,经过简单的配置可以完成大批网页中类似部分的构建,而且生成的属于一个页面,这样就省去了以前写Frame时提交页面总是要考虑设置Target以及在引用对象的时候大批Parent或者top对象使用的麻烦事了。在开发过程中我使用了Log4j,这为我的调试程序带来了极大的方便,呵呵,可以想象,没有Log来调试一个Web程序真是不可想象的。

这段时间我是边开发边翻查那本《精通Struts》的,这样,迅速把Struts中提供的许多Tag弄熟练了,为以后具体的项目开发带来了便捷。也许是一向以来公司的实习项目完成效果都不是很理想吧,这次我们的迅速完成比较出乎Leader的意料,综合三个月的试用培训,由于我在日语和技术以及实习项目中表现都还不错,所以定工资级别时也是同一批进公司的新员工中最高的,随着转正会议的结束,我也在10月底成为了公司的正式员工。大概刚刚进入11月份,我们 Group便开动一个项目,项目不是很大。当时老员工们许多都在做项目的详细设计,我便跟着公司一位技术专家(也是当初给我们入司培训的其中一位老师)做起项目的Framework构建工作。当时的我才进公司,第一资历尚浅,第二我的确也并不是很会什么东西,所以给我的任务很多都是一些模块的 Utility的设计。比如通用的Check方法啊,CSV以及定长文件的读取解析什么的啊,还有某些在IE中可以实现的效果如何在Netscape中也能实现同样的效果等等。虽然这些东西在现在看来并不是很复杂,但是当时自己的确随着做这些东西而学到了很多很多。比如使用JDOM对XML文件的解析啊,很多Check方法的小技巧啊,IE和Netscape究竟有什么地方不一致,该如何解决等等,这些都在这几天内了解了很多。在这几天中,我通过网上查找资料,临场迅速学习了Java反射的使用方法,并且自己边学边写实例,实现了各种情况下的反射案例。我个人觉得掌握Java反射技术是非常重要的,这让你可以写一些通用的工具。如果不会反射技术的话,也许你永远只能写一些针对特定情况下的解决方法。而会使用反射以后,你可以写一些代码,这些代码可以用在许多地方,达到自己扩展甚至构建Framework的效果。在这个项目中,我使用了自定义Tag和Java反射技术,定义了些项目中比较需要的通用的 Tag,方便了大家。

    后来听老员工说新员工进公司就开始做Framework是以前从来都没有过的事情,因为我们Leader对我希望比较大,所以想尽可能培养我,让我早点挑起项目大梁,所以给我的成长提供了一次又一次的机遇。11月中旬以后,项目开始进入编码阶段,我也第一次看到了正式的项目设计书。第一次看到设计书的时候我都觉得自己脑子有点懵,一大堆日语什么含义自己不是很清楚,而且感觉根本无从下手,不知道从哪里开始看比较好。项目担当耐心得和我说了设计书的格式以及究竟什么地方是什么一个含义,以及Coding的时候按照什么个思路来看设计书。再加上项目中有老员工先写了个Sample,让大家看了标准的一个流程,所以我们就依葫芦画瓢,慢慢得把一个画面一个画面Coding完毕。当然了,后来也有测试员来测试我们的画面,发现bug后就发Bug Report给我,那一个月就是在Coding,修正Bug中渡过的,这个项目是用Struts做的,因为不大。所以也没有再用其他的 Framework,数据库操作那里只有个非常简单的单表操作DAO层,其余的DB操作都是自己通过JDBC操作语句来完成的。在这第一个自己接触的真正项目中,我自己学到了很多B/S设计的技巧,感觉很充实。不过书本学习方面我也没有闲着,我为了能够深入了解Java,大概在11月中旬左右开始看《深入 Java虚拟机》这本书,由于内容比较深入,所以看得也有点吃力。书翻译得和写得都还不错,值得一看,我一直看了前八章,看到Java程序运行细节后就没再看了,大概看到了12月底的样子吧,呵呵,有时间的话决定把后面的部分也看完。这本书看完后收获就是了解了Class文件的实质,Java的安全模型,虚拟机是如何工作的。这些知识对后来调试程序Bug或者Exception的时候非常有好处,可以把以前自己觉得莫名其妙的错误的原因找出来,不像以前遇到很古怪的Exception的时候怎么死的都不知道,从读完这本书以后,在以后的调试异常中很少再有不知所以然的感觉了。

    2004年12月底的时候,我的第一个项目也做完了,由于我空闲着,Leader便在星期三的时候把一个公司内部开发的Source统计的小工具让我进行修改,使得添加一个比较有用的功能。东西给我的时候基本没有任何文档,在我手上的就是一堆源代码而已,界面是用Swing制作的,因为没有专门在UI上进行精心设计,所以说不上好看,典型的Java编写的图形界面的程序的样子。软件不是非常大,估计在1万行源代码以内,不过对于只有一个人修改来说,也比较够呛了。还好我在刚学Java的时候用JBuilder写了一些Swing的程序,现在还是对Swing有概念的,所以拿到手上以后经过仔细分析,逐渐理清了头绪。经过修改和自己测试完毕后,觉得还比较满意,达到了预期的目标,于是在星期五的时候提交给了Leader。通过这次,对Swing的开发又加深了印象,自然,在有的细节技巧方面受益匪浅。

元旦很快来临了,在年底以前,公司觉得有必要学习下Hibernate,虽然我们目前的项目中还没有用过Hibernate,而是用另外一个公司内部开发的ORM工具,不过几名技术专家初步对Hibernate感觉后觉得Hibernate的功能要强大的多,而且是开源的,不断有人在推动,升级,所以有必要我们要学Hibernate。这次的学习采用学习小组的形式,也就是公司内部先抽几名员工(主要是技术部门的,当然,开发部门如果有兴趣的话也可以考虑)来进行深入学习,然后定期开会交流互相学习,达到短时间内先行的几名成员迅速深入掌握 Hibernate的形式。由于我第一处于空闲状态,第二也比较有兴趣,而且跟技术部门的专家们也比较谈得来,所以我也加入了其中,成为几名学习小组中成员的一部分。我们学习资料主要就是《Hibernate in Action》英文版一书以及官方的帮助手册。我负责其中对象操作,Transaction和Cache,还有高级Mapping关系的设置几个部分的学习。由于资料都是全英文的,所以看书速度并不是很快,不过还是初步得到掌握了。大概学习了半个多月的样子,我们各自基本学习完毕,互相交流后并且写下了读书笔记,用来后面具体项目开发时候参考用。通过这大半个月的学习,我个人觉得提高了非常多,在这之前,我只知道有ORM这种东西,但是从来没有使用过,也从来没有看过。自从学过了以后,我不仅对Hibernate在代码编写时的使用比较熟悉了,而且对Hibernate的配置以及许多底层的知识有了很清楚的认识,让自己在数据持久化方面的认识提高了大大的一步。

    元旦过后,虽然一边在学习Hibernate,不过由于下面项目的需要,Leader跟我说要我学一下Unix下的Shell编程,因为项目中许多批处理会用Shell来启动。UNIX命令在学校时候学过的,不过这个时候已经忘记了很多,只是翻阅资料的时候还能回想起来不少命令。 Shell并不难,如果有了编程基础,学习Shell编程也很快的,总体感觉就是编程语言大同小异,从基本语法来说,不外乎赋值、条件、循环这几种类型。只要迅速掌握这几种类型在这种编程语言中的编码格式,那么你就可以迅速掌握这门语言最基本的编程能力。Shell经过一周的学习后觉得感觉不错,不仅可以顺利看懂别人写的Shell程序,而且自己可以在Linux下顺利写出符合自己需求的Shell程序并能顺利执行。但是突发事件总是有的,那个项目突然决定延后两个月,所以前一个星期的学得Shell等于暂时派不上用场了。不过嘛,多学一样技能总是没有害处的,而且又复习了那么多Unix命令啦,感觉还是很不错的。于是我又进入了不在项目中的真空期了。

    但是好景不长啊,好日子还没有过上两个星期,公司去年做的一个比较大的项目开始了2期开发,我也被一下拖入了项目中。说起那个项目,公司好多人还心有余悸,据说去年那个项目开发的时候,大概50多号人干了好几个月,每天都是11点以后才有可能回家,周六是铁定加班,周日是看情况,晚上就算加班加到凌晨3 点也不是什么奇怪的事情。当时大家都说多来几个这种项目大家就要死了,这次这个项目的2期过来了,大家精神又一次紧张起来咯。一开始照例是项目会议,听完项目经理描述以后,大家也放心了不少,这次虽然说是二期,不过规模不大,只需要15个人左右干一个月就能搞定。主要是把项目一期里面一些地方进行改修,当然也有需要新的画面的开发,不过相对于去年的那块不是很多而已。对我来说这次是个很大的考验,因为项目是二期,项目组内除了我,其他的人都做过1期开发,所以对项目结构都很清楚。这次项目开始并没有什么培训,所以我只能单独看1期的源代码来熟悉项目结构什么的。这个时候项目经理把我叫去要我办理护照,准备这个项目派遣我去东京现场维护。

这个项目是个比较全面比较大的项目,服务器采取了集群的方式,数据量也是千万乃至上亿级别的,所以性能要求特别高。在技术方面用到了很多,使用EJB来控制Transaction,使用了ORM工具来操纵DB数据等等等等。而且由于比较庞大,所以服务器初始化的那块为了Load上去大批配置信息,代码量极其庞大,在权限控制的那块地方,代码非常难以读懂。这也给我一开始的学习代码带来了很大的一块麻烦。不过总算静下心来后把整个项目框架以及实现手法基本摸清楚了,这个时候觉得非常开心,而且对Web应用程序的构造心里面也非常充实,觉得自己已经具备写 Framework的初步能力了。

项目是紧张的,基本上每天晚上都要加班到11点,然后打车回家,哈哈,公司报销。而且临近过年,这么加班也一点都感觉不到过年的气息。不过我也不能因此放松了自己的学习。我觉得自己的基础应该算比较好了,便开始啃起另外一本大部头——《Java与模式》。一直以来我对设计模式的感觉就是一些已经成型的,久经考验的代码框架,具有非常好的可扩展能力以及非常好的代码健壮性。不过初学者最好不要看设计模式,因为你接触的代码不多,如果贸然看设计模式的话,会造成不明白为什么这种设计模式好,究竟好在什么地方的情况下就在代码中乱套设计模式,对自己的以后编码发展带来不利的影响。每一种设计模式都有每一种设计模式的特点,自然也有他们自身的适用范围,比如拿最基本的单例模式(Singleton)来说,适合于做配置信息读取器,主键产生器等全局唯一的东西。如果初学者不明白这些,拿单例模式乱套,什么都用单例模式,比如把普通传递数据用的JavaBean也做成了单例模式,带来的恶果就严重了。这本《Java与模式》我是从头到尾认认真真看了,每看完一个模式都会仔细回想以前看的代码哪里用到过这个模式,总会自己想想这些模式适用于哪些地方。因为这个时候我自己编写的代码行数也已经很多了,所以看见这些模式就会特别有感觉。经过50多天的认真研读,所有模式都被我消化了下去,并且使得我的对程序开发上面的认识提升了非常大的一步。顺路说一句,这本书写得非常好,例子很多,但是不复杂,有一定代码编写经验的人就可以看懂了。不过看懂并不是最重要的,重要的是消化下去,用来理解以前看过的代码的精华,这样自己才能得到提高。

    这个项目虽然很紧张很忙,不过我还是适应了下来,而且对整个项目结构什么的都有了比较好的整体的把握。项目横跨了整个过年期间,所以在过年的那几天都必须开着手机,怕有什么突发事件要求去加班。签证在2月4日左右送过去签,Leader跟我说因为在过年期间,所以签证可能会比较缓慢,比较难签,不过一般情况下1个月应该足够了。原计划我是跟另外两个同事3月6日去东京,这样算算也差不多。不过中国有句话叫好事多磨,呵呵,用在我身上的确不过分,我的签证3 月3日日本领事馆才签,三月四日送到南京。3月5日和3月6日是双休日,所以3月7日签证才送到我手上。由于计划是3月6日派人去东京,所以只好派另外一个身上有签证还没有过期的人代替我过去,这次的机会就算泡汤咯。不过我并不是很在意,因为公司这里去东京出差的机会狠多,特别对于开发人员,据说工作几年后一听到去日本出差就不乐意,毕竟也背井离乡么。

    在这个项目的途中,大概在2005年1月底2月初的时候公司也开始进行了制作详细设计的培训,我虽然在项目中,不过也成为了其中一员。这次培训总共大概6 次课,每次2个多小时,虽然时间不长,不过把详细设计的要点以及思路和容易出错的地方都说了出来,感觉很是不错,这几次课的培训后,虽然可能要我立即进行详细设计编写还有点困难,不过心里面已经有了不少底,我觉得经过一段时间后的锻炼,我应该可以有进行详细设计的能力了。

    3月初这个大项目结束后,本以为可以休整下,不过很快通知我3月7日加入另外一个项目,其实也不算一个正式的项目,属于公司知识库的一个信息查询模块。由公司的一个技术专家负责,那人也就是我进公司时候第一个项目中带着我的那个技术专家,说起来我和他还真有缘,现在我这个项目还是跟着他,而且公司里面唯一一个和我同月同日生的人,真是很巧的巧合呢。他人挺好,很热心,所以我也从他那学到了很多东西。这次由于不是正式项目,所以并没有什么基本设计书,而是他给我们开会议的时候大致说了下项目的内容,每个画面的具体功能以及数据库表格的设计。由于这次项目规模很小,总共就12个画面的量,所以不采取 Struts等Framework,而是采用比较原始的JSP + JavaBeans的构造。我们每个人根据他所跟我们讲解得功能写每个人自己分配到的画面的详细设计,其实也不算真正的详细设计,就是每个人把自己操作的那块的具体逻辑设计写出来,然后和他一起review一次,再开始编写代码。详细设计这里我做的很快,当天下午就把自己分配到的两个画面业务逻辑什么的都写好了,星期一布置得任务,我星期三的时候全部编码自测完毕提交,所以我的感觉就好像这个小项目一瞬间就结束了。

日本每年财务结算是在3月份,所以我们历来的习惯就是每年1月和2月很忙,3月开始清闲,一直可以到5月左右会接到个大项目昨。所以接下来就真正到了我的空闲时期,没有项目的压力,我可以自由学我自己喜欢的东西。很久以前买了本《精通EJB》第二版,可是一直以来我觉得自己功力尚浅,所以没有看,这次我想认真学学EJB。虽然大家公认EJB并不是很好,不过历来受到批评的都是EJB中的Entity Bean部分,这部分我觉得可以借助Hibernate来弥补,而会话Bean和消息驱动Bean则还是挺不错的。这次也当学一门技术,学习其好的东西,不是很好的东西就当作以后开发时候的借鉴。《精通EJB》这本书我的感觉是书质量比较好,不过翻译的水平稍微差了点,特别是有不少错误,而且很低级的错误居然校对的时候都没有发现,不能不说是个比较大的瑕疵。但是它不失为一本EJB的好教材。从一开始的JNDI开始,然后讲解了对象序列化,RMI- IIOP等等。这些以前都模模糊糊,或者是看过了但是还不知道究竟有什么用。但是经过这次的学习以后,对这些分布式系统比较需要的东西有了进一步的了解,感觉头脑中比较清晰,究竟RMI是什么样的工作原理,怎样实现一个远程方法调用等等。接下来的EJB学习,自己用Eclipse + Weblogic边看书边动手,写了一个个自己的学习小程序。我个人感觉看书最好就是边看边自己动手写小学习程序,这样比光看不练能学到多得多的东西。学了EJB后觉得脑子又清晰了很多,看见一个案例后头脑中就会有好几种如何解决的方法,几种方法互相在头脑中自己比较,经过这样,大大提高了自己的思维活跃性。

    3月中旬开始由于公司比较清闲,大部分人处于没有项目的状态,所以公司举办了第一届全公司范围的编程竞赛。公司只指定了题目为一个日历系统,要求具有日程记事等功能,其余功能自由发挥。这次不再采用团队形式了,而是采取各自为战的策略。自从培训过详细设计以后,我头脑一直有如何写详细设计的思路,这次我自己首先指定了开发计划,保证自己控制自己的进度。接着进行了需求分析,确定了我有哪些功能。然后在自己的基本设计中开始进行数据库结构设计。这次我决定采用Hibernate+Struts的结构进行编写,这样我的数据持久层操作大大简化,而且功能上也增强了许多。DB设计好以后我开始DEMO画面的制作。说实话,我美工水平实在不怎么样,可以说虽然一般网页的效果我都会自己做出来,不过具体网页设计成什么样我还真是一窍不通。还好 Dreamweaver我还算算是比较熟练,自己捣鼓捣鼓也想摸象样把DEMO画面给设计出来了,不过美观不美观我就觉得不怎么样了,只是我能力有限,也没办法设计的更好看,这个时候我感受到了一个项目中美工是多么重要啊。下面的详细设计自己写得很开心,把需要的功能都用文字反映了出来,这也算我写成详细设计样子的第一份详细设计了,做完挺有成就感的。接下来首先构筑自己这个小项目的Framework,经过公司两个正式项目的洗礼后,那两个项目的 Framework我都认真研读过源代码的,所以我自己有了自己心里一套Framework的构造方法,特别是如何把Struts和Hibernate结合起来的结构,自己有自己的一些想法。在这次Framework构造中,我没有复制任何公司以前的代码段,都是凭着自己对以前看的代码理解后写出来的。这次项目我觉得对自己的提高也很大,首先锻炼了自己详细设计的能力。其次,自己虽然学习过Hibernate,不过从来没有这么样应用过 Hibernate,这次让自己大大提升了实践运用的经验。公司由于知道这时也没有一个真正的项目使用Hibernate,所以这时的我也算公司内部 Hibernate使用经验最丰富的人了,这也为了后来我协助别的使用了Hibernate的项目解决问题的原因。再次,我这次自己写了 Framework,特别在批处理方面,运用了许多刚学会理解掉的设计模式,这些模式让我的程序更具有健壮性和可扩展性,让我在设计方面的能力大大提升了。

这次的编程竞赛我写得比较认真,代码量的确也很大,总代码行数超过了3万行,有效代码行数也在1万行以上。经过公司专家们的评定后,我得到了第一名,虽然没有什么奖品,不过肯定了我这段时间以来的努力,我还是很开心的。而且这次的编程竞赛让我大大增加了编码的熟练度,而且也在其中演练了许多自己想出来的编程技巧,为以后的发展带来很大的好处。

    从4月份开始,公司由于比较清闲,所以部门内部开始进行各种培训。我们部门开展了3项培训,第一项就是编程能力培训,第二项是Oracle数据库技术培训,第三项是测试技巧培训。在编程能力培训中,主要就是把原来没有注意的细节采取大家讨论,轮流讲课的方式进行的,虽然其中很多东西我原来都是知道的,不过也有原来不清楚的地方。而且经过了这次互相讨论,更加加深了印象。在Oracle培训中我觉得收获很大,这个Oracle培训采取了传统的上课的模式,由我们开发小组中一个取得OCM的老员工给我们讲解。对于Oracle,我原来基本上就只会写写SQL语句,具体Oracle有什么特别的功能,可以做什么我也不是很清楚。但是这次上课从Oracle的启动原理开始,让我知道Oracle中究竟有什么,Oracle数据库各部分在磁盘上是如何存放的, Control File,Redo File究竟是什么意思,在数据库中起什么作用,数据库是怎么依赖他们运行的,还有如何对Oracle进行系统管理员级别的管理,如何在不停止数据库运行的情况下进行数据库的更新、升级、备份等等。这些东西虽然非常有用,但在平时的开发是学不到的,这次趁着这个机会大大提升了自己Oracle的水平,感觉非常开心。数据库一向是我的弱项,在上大学的时候我SQL语句能力只是一般,数据库管理配置什么基本一点都不懂,通过这次集中的培训,我觉得自己的能力又进一步增强了,弱项也在慢慢退却。在三项培训中最后进行的测试培训我承认我没有怎么认真去学,所以学会的也就是些测试概念,具体的测试技巧什么的还是不怎么会。现在开发和测试的结合性越来越高,看来要下下功夫,以免给淘汰咯。

    提了这段时间在公司的进展,还没说自己的学习呢,这段时间正好看见中文版的《JUnit in Action》出版了,在书的背后写着“如果没有看过这本书,就不要对J2EE进行单元测试”这句话。我早在去年就了解了JUnit的强大功能,再加上 Ant的话对于回归测试是非常便利的。趁有时间,我便于3月底4月初的时候开始看这本书。当时的我看《精通EJB》第二版看了一半,发现其中错误越来越多,而且文字也有些地方不知所云了,所以扔下不再浪费时间看那本书,专心攻读《JUnit In Action》。凭良心说,Manning的这套In Action丛书的确很不错,从我先前看的《Hibernate In Action》英文版就能看出来,其中对代码的编排非常方便读者,感觉可以很顺利的看到你所想看到的代码片断。这套《JUnit In Action》也是一样,博文视点的纸张还是很好的,排版使用了Manning的风格,阅读起来很舒服,所以我读得很快,大概就两个多星期就读完了这本 400多页的书。感觉的确收获不浅,首先,原来的自动化配置工具中只会使用一个Ant,其他的基本没听说过,在这本书上详细介绍了Maven。听过书中的讲解以及自己的试验,的确觉得Maven功能很强大,不过感觉起来配置比Ant要麻烦,所以我自己的感觉是Ant在项目中还是会广泛应用,不过Maven 在大型项目,特别是整个Site中有很大的用武之地,对于我们来说,使用的方法都是很简单的,掌握如何编写配置文件才是我们的关键。

书对 JUnit与Cactus在J2EE的测试手法上给了大量的事例,给人的感觉非常好,In Action这套丛书最大的优点就在这里,用实例代码片断让你迅速了解一样东西。在实际工作中其实JUnit应用也是比较广泛的,特别如果采取测试驱动开发的话,JUnit是必不可少的一部分。在TagLib测试,JSP单体测试,数据库测试和EJB测试都是我以前根本没有看过的东西。其实这次虽然学是学会了,不过真正做的时候还是要有个代码例子依葫芦画瓢。我想大家肯定也都有这种感觉,写程序的时候先找一段有点相似的代码片断Copy过来,然后看看要修改什么地方,真正从头到尾自己用手写的代码片断是不多的,除非你已经烂熟于心。不过这本书快看完的时候,项目又来了。

    这次做一个企业的MIS系统,与以往不同的是,这次客户给了一个比较庞大的基盘,封装了近100个Tag,基本上把各种各样有可能遇到的操作都封装到 Tag里面了。而且所有的画面显示等信息都是放在数据库的Table中,所以这次要求不写任何程序代码,只是学会使用好这些Tag,然后利用这些Tag写出Jsp页面。一开始的时候还真是头疼,这些Tag一个都不明白,而且文档不是非常齐全,Tag的Source中注释也比较少,学习起来不是很方便。我们一共3个人投入到这个项目的前期准备中,在第一个星期的学习中大家互相分配好个人学习的模块,随时互相交流。在后来的深入中发现这个项目的业务逻辑操作会使用PL/SQL以及存储过程来进行,对于我来说,PL/SQL是从来没有做过的东西,就叫做一窍不通,于是我需要从头开始学习PL/SQL,以及如何编写存储过程。我从网上下了一个PL/SQL的电子书籍,然后在公司花了一天时间进行学习,个人用的是Toad来调试PL/SQL的,虽然别人喜欢用 PL/SQL Developer来进行开发,不过我还是比较钟爱Toad,而且Toad的确功能也很强大,使用起来也很方便就是了。经过第一天的PL/SQL的学习,基本掌握了全部语法以及存储过程的书写格式等等,开始能够写写非常简单的PL/SQL。接下来的两三天不断巩固熟练,客户那里也发过来几本详细设计让我们练习着做一下。有了实际的详细设计,再加上我们之间互相交流,我们提高的都很快,大概过了三四天,大家就把基本详细设计代码编写完毕了,而且经过实际锻炼,我的PL/SQL编写存储过程的水平也大大提升,已经可以满足开发中的需要了。

这个项目因为如果我们一开始做的能让客户满意的话,后续的项目将会比较庞大,所以Leader决定把我们Group比较空闲的其他人也先培训一下,让他们有点感觉,到以后正式开发的时候也能迅速进入状态,负责给他们培训的任务也就交给了我。说起来是培训,其实也就是把大概流程以及方法通过一次会议的形式告诉他们,然后把我前面已经作好的那个画面作为他们的作业,要他们看着设计书自己把画面制作出来。这个时候也要放劳动节了,黄金周可以休息一个星期,想想就觉得很Happy。劳动节的时候基本没有怎么学习,只是先把XML-RPC仔细看了下,学会了如何去写一个XML-RPC的应用,接着稍微看了点SOAP,看得也不错,只是些简单的SOAP的例子而已,那些 SOAP的复杂东西都没有看。

    很快就五一黄金周七天放假放完,八号开始上班,上班后就开始正式做节前就定好的那个项目,这次性质属于试做,也就是人家先发一批设计书过来,我们然后开始 Coding,大概做了一周后,我自己害了急性结膜炎,只能回家休息,这次可真的是只能休息了,眼睛觉得特别涨,不要说电脑了,连书都不能看,看了眼睛就疼。所以在家就只能睡大觉,过了一周眼睛大概才复原,可以去公司上班了。回到公司以后,Leader通知我说我不用去做上次那个项目了,要我加入我们 Group的一个新的项目,这个项目比较大,当时还处于东京刚刚做好基本设计,我们从东京把任务接下来,准备发回来做详细设计。我进去的时候项目才开始三四天,基本上还没有做什么,这次我进入了详细设计制作小组,开始进行这个项目的详细设计的制作。

    由于我属于第一次在正式的项目中参与详细设计,所以很多东西都不明白,特别是业务上面的东西,许多日语中的业务术语我根本不明白,比如什么卖切,切替,仕入什么的。看着基本设计书,感觉跟以前看详细设计书有很大的不同。具体的东西写的少了,业务流程逻辑框架什么的比较多,所以需要首先把业务内容都熟悉了,才可能写出详细设计来。这次的详细设计我也不是孤军奋战,而是有一个进公司4年的老员工带着我一起做,我的任务很轻,不过重点是学会如何去写详细设计,也许下次再有一个比较大的项目,就没有别人再带着我,而是我自己一个人去完成详细设计了。大概详细设计写了20天左右,我被通知当天把手上的一份详细设计写完,第二天进入方式设计小组进行方式的设计。

进入方式小组以后,接到的任务就是好几个编写DB操作方面的代码自动化生成工具。由于这次DB 方面并没有非常强制性的那种规约,所以SQL语句的编写可以说比较随意,这就给我工具的编写带来了很大的难度和挑战。这次负责管理方式小组的人仍然是进公司以后经常带着我的那位技术专家,所以也真算很巧呢。写工具其实很对自身代码编写的提高也很有好处,因为首先客户那里资料会不断修改,这些工具你为了以后客户更新资料后你能顺利更新工具,你需要设计一个优良的Framework,不一定需要多么复杂的Framework,不过一定要尽量把程序各方面的耦合度尽量降低,这样才有利于自己对工具进行扩展。紧接着很快,项目代码编写开始了,我的任务算中等偏上,有2个画面和一个批处理需要编写,复杂度还算比较繁一点。这次项目需要编写JUnit程序,每天都要进行回归测试,保证代码Method的正确性。JUnit虽然自己会用,但是从来没有在真正的项目中使用,所以在真正用的时候感觉有点手足无措。以前做JUnit从来都是觉得给个参数,检测一个返回值就好了,其实不是那么回事,业务逻辑复杂了,自己需要做大量的Stub来模拟真实的Class的返回值。设计一个好的Stub是比较困难的,特别在数据库内容比较丰富的时候,一张数据库Table就有上百个域,工作量可见一斑了。项目要到05年9月中旬才会结束,所以现在还在紧张的开发阶段。我写了JUnit的感觉就是难点不在如何去写JUnit程序,而是如何去设计测试用例。对于我们这样不是以测试出身的程序员来说,设计测试用例是很痛苦而且很艰难的事情,估计有过相似经验的人肯定会表示赞同。

    当然我一边在紧张的做项目,对于书本的学习也没有闲着。这段时间抓紧把侯捷的Word排版艺术扫了一遍,看完觉得收获颇丰。虽然我以前觉得我在Word上用得挺不错,日常的一些操作什么的我都会,不过看这本书的中间我发现我还是有很多地方不会的,也学到了不少东西,在以后的Word排版中会很受到好处。由于项目用到了Spring知识,所以我也看了网络上那个流传广泛的Spring开发指南的PDF看了一遍,感觉长了见识,对IOC以及DI有了进一步的了解,也理解了为什么需要采用IOC以及DI。不过这个也没有深入下去仔细看,以后等项目稍微空闲一点的时候一定再把Hibernate和Spring好好看一下,学习人家的设计理念,提高自己能力。对了,也许最重要的是我最近在看一本书,就是《J2EE核心模式》的第二版,我当时原来准备看电子版的这本《Core J2EE Patterns》的,不过突然在书店发现这本书的中文版出来了,而且译者有熊节的名字,也就是跟侯捷一起翻译《重构——改善既有代码的设计》的那个译者,我比较相信他翻译的水平,于是买回来看,虽然项目非常紧张,我一个月算上周末需要加班在100个小时左右的样子,但是我相信时间是海绵里的水,只要去挤,肯定会有的。所以我到现在大概看了2周的样子,已经看了300多页,而且感觉自己的设计视野也开阔了许多,这本书的确很好,把J2EE中常用的一些模块原理都说了出来,说明了为什么这么做好,这么做如何减少了耦合性,提高了可维护性等等,总之,有1年以上J2EE开发经验而且觉得自己对J2EE有了比较好的了解的开发人员我强烈推荐看这本书。看了这本书以后我都在回想以前设计的一些框架,一些模块,觉得自己有很多地方当时设计的时候觉得很精巧,不过却属于弄巧成拙,加大了模块的耦合性,所以在修改的时候比较难于下手。 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
有不少的同学发信给我,和我探讨java的自学过程应该是什么样的,毕竟有很多人因为各种各样的原因不能参加培训。我试着给出自己的见解,抛砖引玉吧。 这个路线图是给那些为了就业的人准备的,如果只是兴趣,不一定照这个走。 这里只是讲了路线图,关于路线中的各个阶段,学到什么程度,如何学习等,可以参考后面的JAVA自学之路 七:《路线图明细》。 首先要学JavaSE,这是无庸置疑的。 与此同时,是的,与此同时,和JavaSE的学习同步,建议大家研究一下数据结构与算法。 在这儿之后,你可以选择向J2ME、或者Java GUI、Socket编程等方向努力,但是通过第一篇的办法,你可以很容易就将这方向过滤掉(永远不要忘了我们是为了就业),好吧,暂时和它们诀别,还是向着J2EE的方向前进吧。 在JavaSE完成之后,可以试着完成一些小项目,同时关注一下设计模式的内容,不必强求自己能够完全掌握各种细节,往前走吧。 掌握一种编程工具,比如说Eclipse。 数据库,可以选择使用Oracle或者MySQL开始 。 JDBC,用Java连接数据库。 可以选择在这个地方切入Hibernate,也可以选择在Struts 之后。 HTML CSS JavaScript,这些东西是做web项目必需的内容 。 Servlet JSP,服务器端必需。 XML AJAX,新的流行趋势不能不了解。 作一些小项目吧。比如BBS、留言系统、学籍管理、商城等等,随便着一些业务逻辑比较简单的来做一做。 Struts,MVC的典型应用 Hibernate,OR Mapping的典范之作。 Spring IOC + AOP, 面向对象 + 面向切面,完善的旅程。 把以前自己的小项目加入Struts、Spring、Hibernate的元素吧。 去研究各种商业项目的业务逻辑吧,才能在你的简历中加入浓重的一笔。 EJB3.0,java在走了很多弯路后的回归之作,值得研究。 SOA,业界铁定的未来趋势,要紧紧跟随。 在后面,我会告诉你每一步的学习方法和学习重点。 JAVA自学之路 三:要动手 无论如何,请坚持不懈的动手实验! 学习Java要动手,仅仅是看和听是不能够学好编程的。总有同学来信问我们这样的问题,说:"老师我看了视频了,可是怎么一动手就没有任何思路呢?" 对此,我一般都会说不要着急,如果你只是看了视频就想行云流水的话,那老师这些年的锻炼真是白费了,这么多年的苦练才能略有些行云流水的感觉,你一朝一夕就想自己能够达到,不是太奢侈了吗 作为编程的过来人想一下,当年自己学编程的时候是什么时候有思路的呢?至少也是照猫画虎画了一段时间之后吧,我本人是在某一个领域画虎画了上万行代码的时候才慢慢有自己思路的。就像写作文,要有自己思路总是一般来说要经过几个阶段,首先学习词汇,然后学习造句,然后大量阅读别人的文章,自己模仿着写一些,逐渐的经验积累,才能形成自己的思路。学编程,恐怕也得慢慢的来吧,只是看一看、听一听视频,是不足以学好编程的。 所以,动手吧,跟着做,一行一行的跟着敲,一个项目敲完了,比如坦克,再试着加一些自己的功能,按照自己的思路敲一些代码,收获远比干听大的多。 如果遇到,暂时对于一些思路不能理解的同学,我一般都会劝告说,动手写,先写代码,量变会引起质变的。而这种质变的确发生过不少次。 提醒一句,要理解代码思路之后再跟着敲 ,背着敲,千万不要左边摆着别人的程序,右边自己一个一个子母的写,这就不再是程序员了,成了打字员了。 纸上得来终觉浅,所以:别问那么多,别想那么多,动手写吧。 JAVA自学之路 四:要事为先 对待人生的任何事情都要:抓大放小,要事为先 对于一个以前从来没有接触过java的人,java无疑是庞大的,似乎每个领域都可以拓展开来都是一片开阔地,每一个领域要想深入接触到每一个细节所耗费的精力都是巨大的。这个时候大家都胸怀壮志,两眼发光的盯着每一个崭新的知识点,遇见了任何一个知识点都恨不得抠的清清楚楚,明明白白。 难道这有什么不对吗? 我的意见是,没什么大毛病,但是学习效率太低了!我们推荐的学习方式是,抓大放小,要事为先。 比如说学习J2SE的时候,学到GUI这一章,有的同学认为,既然学到这儿了,我们去把SWING细细的了解一遍吧;还有的同学,遇到了在Linux下的Shell编程,就恨不得把Shell先学成专家才肯,或者是才敢,继续往下学习;有没有过这样的感觉,一本书的上册没有学好,觉着下册心里也没底儿,甚至非要把上册复习一遍才敢继续学习。如果你也是这样,要去看看心理医生啦,没准儿会有洁癖的毛病。 任何事情都要追求完美才敢继续往后进行,是一种性格缺陷 大胆的放弃一些东西吧,有失才有得,把自己有限的、宝贵的精力用在对于就业直接相关的地方,这才是最有效率的学习方式!等你参加工作,有了可持续发展的事业动力和经济基础,有时间有精力闲的没事儿干的时候,再去研究那些其它吧。 曾经有一个故事,说得是产能和产量的关系。 一个人喜欢读书,读了一辈子,无所不通,这时候要做任何工作都可以,他的产能到了极致,但是,他老了,即便每天产出大量的东西也不能维持多久了,一辈子的产量并没有多少。 另一个人直接工作,忙,天天在机器旁日复一日,做了一辈子,没时间学习和进修,可以想象,产量能有多大呢。 人的一生,要锻炼产能,也要及时产出,引擎要转,也要停下来加油,这两者平衡的越好,你的贡献和产量就会越大。如果钻研的东西和产能目标(或者说近期的产能目标)无关的话,要舍得放手。 所以,对于SWING,暂时先扔在一边吧。 对于shell,对于各种协议过于详细的细节,对于喜欢的游戏编程,对于javascript各种华而不实的效果,都暂时和它们分别吧。一切和我们的直接工作目标关联不大的东西,扔在一边或者弄清楚到足够支持下一步的学习就可以了。 那这样岂不是妨碍我成为通晓各种细节的高手了吗? 我一向不认为一个人掌握了很多很多知识点的细节就是高手了,一个人如果告诉你,回字有四种写法,你会认为他是高手吗? 毫不客气的说,现在我们所教授的所有知识细节在网上或书中都可以找到,只要你肯花时间花精力去动手试,去钻研,没有什么不能掌握的。struts、spring你能掌握吗?当然能!但是如果把时间花在spring的各种细节的研究上,花在研究中国企业应用不广泛地的spring mvc上,这个精力就太浪费了,而且学习的积极性会受到打击,谁愿意整天泡在细节的蜘蛛网中挣扎不出来呢?谁愿意天天经历风雨却总是不能见到彩虹呢? 盖房子,要先建骨架,再谈修饰。 画山水,要先画结构,再谈润色。 认识一台结构复杂的机器,应该首先认清楚脉络,然后再逐步认识每一个关节。 为了应付从小学到大学的考试,我们背了各种各样的不应该提前掌握的细节,同时也养成了见到细节就抠的学习习惯。而现在,是到改改的时候了。 请在合适的时间,做合适的事情吧。 把时间和精力花在作项目上面,花在写作品以及锻炼解决问题的能力上面吧,这是迈向高手的正确的而且快速的方向。 我一直不认为一个课程提供了很多很多的细节就是优秀的价值高的课程了,掌握必要的细节,这个不含糊,至于其他,或者通过视频给出(这样可以给出更多的细节,但是不占上课时间,课上只讲重要的、必要的细节知识),或者在掌握了自学的能力后自己能够查出,这才是正途。 当你看书到某个地方暂时不理解的时候的,暂时放手吧,追求一些行云流水、自然而然的境界吧,只是不要停下前进的脚步,不要被大路旁边的支根末节干扰了你前进的行程,项目,真实的项目,这才是目的,就在不远的前方。 陶渊明读书,叫做“不求甚解”,但他是大诗人。 诸葛亮读书,总是“观其大略”,但他是大政治家。 作研究的,是在确定了方向之后才详细的研究深入的东西。 到了庐山,脉络形状扔在一边,盯着一棵棵小草、一粒粒石子的看,怎么样才能识得“真面目”? 作为应用型的人才,是研究回字的n种写法还是抓紧时间向着主要应用的方向努力,请自己作出抉择。 以项目驱动自己的学习吧,当把握了技术的脉络之后再去补充细节的研究,是正途。 这辈子就不研究其他的方向了吗? 当然要研究!但是在将来合适的时间再说吧。 所以,抓大放小,要事为先! 那么,在JAVA的这些课程中,哪些才是大,才是要事呢?请继续读下去。 JAVA自学之路 五:问题解决之道 既然是学习,就不可能不遇到问题。 既然是自学,就没有方便的和老师探讨的机会。 那么,遇到问题之后,环境配不通,程序调不过,运行不正常,遇见这些恼人的问题的时候,该怎么办呢? 首先我要恭喜你,遇见问题,意味着你又有涨经验的机会了,每解决一个问题,你的JAVA经验值就应该上升几百点,问题遇到的越多,知识提升的越快。 但是总是解决不了也是很恼人的,怎么办呢? 我一般要求我们的学生都是这样来进行的。 当你遇到一个问题的时候: 1:要仔细的观察错误的现象,是的,要仔细 有不少同学的手非常快,在编译一个程序的时候,报了一大堆的错误,扫了一眼之后就开始盯着代码一行一行的找,看清什么错误了吗?没有!有的时候安装软件出问题了,一个对话框弹出来说出错了,马上举手问老师:“不得了了,出错了,出错了”。 “什么错误?” “还没看呢?” 这都是典型的不上心的方法!请记住,学习编程并不是一件很容易的事情,自己首先要重视,要用心才可以。 在开发中,仔细观察出错信息,或者运行不正常的信息,是你要做的第一件事。 读清楚了,才能在以后的步骤中有的放矢,哭了半天,总要知道哭的是谁才成。 这里又分三种情况: A:错误信息读懂了,那么请进入2步:要仔细思考问题会出在哪些环节 B:没读懂,愣是一点没看懂,进入第4步吧:google C:读了个半懂,有些眉目但是不太能确定,第2步和第4步结合着来。 2:要仔细思考问题会出在哪些环节(重要) 当你读懂了一个问题之后,要好好的思考这个问题可能会在哪些环节上出错。 一辆汽车从总成线上下来,车门子关不上! 哪错了?你怎么查? 当然是顺着生产线一站一站的查下来。 程序也是一样的,也是一系列语句完成后产生的结果。 写一个网络程序,总是发现服务器端打印不出接收的数据,有几个环节会出错? 仔细分析这个现象的环节: 客户端产生数据->按“发送”按钮->发送到服务器->服务器接收到后打印 这几个环节都有可能会出错: 有可能客户端根本就没产生数据,有可能发送按钮按下去后根本就没发出去,或者发出去的不是你产生的东西,或者根本就没连接网络,或者发送出去服务器没有接收到,或者接收到之前就打印了等等等等。 学着去这样仔细的分析程序的环节和这些环节可能会产生的问题,你的经验值定然会大幅度快速的提升,这样做很累人,但是一件事情如果做下来一点都不累的话,这个东西还有价值吗? 在网页A输入了一个人的名字,提交到B,首先存储到数据库,然后再读出来,发现乱码!怎么办?当然是分析环节: 客户输入->HTTP发送->B接收->存储到数据库->读出->展现到网页 每个环节都可能出问题,怎么才能知道哪里出的问题?继续往下读。 3:如何定位错误(重要)分析清楚有哪些环节之后,下一步就是定位到底什么环节出错了。 定位有以下三种办法: A 打印输出,比如java的System.out.println(),比如js的alert(),这种办法常用,必须掌握 B Debug,可以参考我们的视频《坦克大战》,详细讲了Eclipse的调试。 C 删掉一部分调试一部分,也就是去掉一部分的功能,做简化,然后调试剩下的功能,JSP和JavaScript常用。 4:如果还不行,google吧 还查不出来?恭喜你,你遇到的错误是值得认真对待的错误,是会影响你学习生涯的错误,问一下google或者百度吧。照着下面的方法查查看。 一般来讲,搜索引擎可以搜到各种知识点,我曾经跟同学们开玩笑说:“学会了怎么google或者baidu,其实没必要跟老师学了,自己全都搞懂了,尚学堂是没必要来的。”当然,只是玩笑,培训的作用有三个: A:系统化知识 B:真实项目锻炼经验 C:少走弯路,节省时间 不知不觉开始做广告了,请原谅,处其位谋其事,总得为尚学堂说点什么:) 言归正传,如何查搜索引擎? 先精后粗,首先先进行尽量精确的查找,比如一个错误,SocketException,你怀疑它是在connect()方法出的问题,那么当然是选这样的关键词java connect SocketException 先中后英,本着以解决问题为主的想法,练习英文还是先放在一边吧,首先应该在中文网页中查询,还不行的话,搜索英文的吧,最近的尚学堂课程中会带大家阅读英文的书籍。有很多东西就像一层窗户纸,远看灰蒙蒙怪唬人的,你壮着胆子一捅,它就破了。阅读英文的书籍就是如此,不是想象中的那么困难:)宁可在沙场上战死,也不能被吓死不是吗:) 信息筛选,搜索出来的结果不见得能够完全匹配,建议大家多阅读前几页的搜索结果,多打开几个网页看看,不过,我的经验是超过3页一般就没意义了,所以超过3页还没有找到合适的答案,或许应该调整一下关键词,或者放粗整个搜索的结果了。 经常的进行知识难点的查询,如果一个问题牵扯的面比较广,就干脆到网上搜索一些相关的专题,比如“java 乱码 mysql” “oracle 创建用户”等等,如果有必要,不要犯懒,勤动手写一些小小的测试程序,来弄明白知识点的细节。这也是涨知识的重要的途径。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值