WAG 项目个人总结
经过在公司 3 个月的工作,我顺利的完成了自己分属的工作, WAG 项目也已经顺利交付,对自己这 3 个月的实习期间的学习和工作进行总结,以便发现收获、寻找不足,为将来进一步打算做准备。
1. 完成的工作
主要完成 WAG 项目的事件日志操作和运行日志操作两个模块。都是将引擎端上报的数据按用户要求进行展示和存储,包括按不同条件进行查找,将查找结果导出
1.1 事件日志
事件日志部分要点在用户对不同查询条件的定制,这些条件包括:
l 时间
l IP 地址
l 上报引擎
l 事件级别
l 流行程度
l 影响设备
l 影响系统
l 端口
l 事件名称
大的逻辑相对简单,不同查询条件之间是并的关系,但各个条件之下还要求具体的符合用户习惯的实现。事件日志的数据量极大,需要考虑数据库查询的效率问题。导出数据时需要导成 csv 格式,供用户查看。
1.2 运行日志
运行日志部分根据引擎和时间两个条件对运行日志做查询和导出。
2. 技术回顾
2.1 涉及的技术和框架
大的层面是使用 J2EE 进行的 web 开发,基本的框架是 MVC 的框架,公司对 MVC 框架有自己的实现 VWF ,在控制层又进行了进一步的细化。
页面三方控件使用 dhtml ,包括 window 、 tabbar 、 grid 三部分, grid 又包含普通 grid 和 treegrid ,错误处理、界面友好性等都遵循统一的代码规范。
控制层使用 VWF 框架, VWF 是公司平台小组在 spring 基础上整合 jsp 、 freemark 、 velocity , hibernate 、 ibatis ,自 08 年公司对产品进行 web 化以来就在多款产品中得到应用, VWF 逻辑清晰,易于上手,同时 VWF 对于整个产品线的代码规范起到了极大的作用。
持久层对 hibernate , ibatis , spring jdbc 都进行了支持。
数据库方面支持 SqlServer 系列,包括 2000,2005/2008 , Oracle 系列,包括 9i/10g
文本支持上主要使用 Apache 项目组的包括 xml 、 csv 。
2.2 工具及插件
IDE 方面使用的是 Eclipse 新版 Helios ,应该是 Eclipse3.x 版本。基本上 3.x 的版本大同小异,不会对开发造成什么影响。工程的移植基本也没有问题(记得有过一个,忘了……)。
插件包括,:
l Web Tools Project(WTP) ,这是针对 Eclipse web 开发而设计的插件,主要是做很多后台工作(装上第二天我几乎就感觉不到它的存在了……),安装方法请参考我的 csdn 博客 http://blog.csdn.net/tomxiaodong/archive/2010/09/03/5861040.aspx 。当初主要是为了解决工程修改反应过慢装的此插件
l Jd-Eclipse plugin ,反编译插件,为了查看 .class 文件而安装。之前查看 .class 文件必须 link 外部的源码包,千奇百怪各种各样的 jar 包,想为他们每一个都 link 上源码包以供查看,想想就是很痛苦的事情(例如我们工程里包含 73 个外部 jar 包)。安装方法百度应该知道,不过更推荐 Google ,技术类的搜索百度实在是……,也可以参考我的 csdn 博客(只做了转帖,英文原文,没有翻译,但是很明了) http://blog.csdn.net/tomxiaodong/archive/2010/09/04/5863244.aspx?q=screenshots/jdeclipse 。个人感觉用着很方便, debug 的时候也能跳到 .class 文件中,不过不是很准确,仅供参考。
l Phpeclipse , 这个插件我倒是没用到,但是他导致我的 Eclipse 不能创建新类,找了很久才知道是跟 Eclipse 冲突,如果不用的话,删掉就行。必须要用的话……,请恕我没详细调查。
l HelloWorld ,自己学着写的插件……,没啥功能,只有个 hello world 的招呼,还有个天气日期的现实。
数据库客户端包括
l Microsoft SqlServer 客户端,只在没装 03 系统前用过两天,装了系统以后,可能是因为盗版的缘故,不能安装 service packet2 ,也就不能安装 .net framework ,所以就装不 SqlServer 客户端,不过印象中比后来用的要好用一些。
l Squirrel-sql 王波推荐的工具,手动添加驱动,似乎各种数据库都能支持,不过我没试过 Oracle ,毕竟 Oracle 主流还是用 plsql 。有时候反应有些慢,用着灵活,但是手动添加的程序稍显繁琐。
l Plsql 没啥好说的,就是语言支持上在多个项目上都遇到过问题,印象尤其深刻的是不能在安装目录中带“(”符号( win7 尤其注意,默认安装目录会有个“( x86 )”)。
2.3 遇到的问题及解决方案
l 接手来的代码阅读上,以事件日志部分的查询为例,同样的业务逻辑却分了两个(相同)的模块,有时使用公共的部分,有时又在各自的包内使用完全一样的各自的实现,实在是让我找了好一阵子,而且在每一个 SearchForm 中有多达 3000 多行代码,有大量代码的业务都已过时,建议下个版本好好清理一下这些用不着的代码(至少也要注释掉吧……)。
代码注释太少,类的作用、函数的作用、关键行,几乎完全没有注释只能通过设置断点,慢慢跟踪来掌握他们的作用和原理。建议下一步代码规范中把注释做点要求,因为我们的产品一直处于循环开发中,新版本不停的在出,开发人员却在不停更换,所以写好注释,是一劳永逸的事情,基本上,类和函数的注释应该强制要求下,关键行就看个人感觉和自觉了。
l 开发工具本身的问题,在开始进行开发时,将工程导入发布到服务器上以后,每次进行修改都需要长时间等待(即使是页面调整修改 grid 参数这样微小的改动); .class 文件不能查看; IDE 里不能创建新的文件等。这些问题有些会导致效率下降,有些会完全阻碍开发过程,还是应该尽早解决的。通过在网上查找和一些常识,最终解决了这些问题,换来的体会就是,“磨刀不误砍柴工”。
l 数据库选择,多数据库支持和大数据量查询的效率问题。数据库选择上,无论是桌面数据库系统和服务器数据库系统,还是 SqlServer 系列、 Oracle 系列、 Mysql 系列或是 IBM DB2 ,他们各自有各自的优势和相应的用户群,选择数据库需要根据用户自己对数据库的质量需求和价格预算来确定。我们公司的产品多要面对大数据量和多用户,因此不适用桌面数据库系统,因此适用的是服务器数据库系统,采用了同时支持 Sqlserver 和 Oracle 的策略,产品可能不会涉及大型主机,所以没有考虑与 DB2 的兼容性。
持久层上,由于 Hibernate 对底层数据库都进行了封装,数据层是透明的,所以用 Hibernate 的业务不必考虑数据库的支持,而适用 spring jdbc 需要直接构造 sql 语句,不同的数据库就会有差异,需要在构造 sql 语句的时候进行区分。
大数据量查询,由于日志量达到百万数量级,而且事件日志部分涉及两张数据库表,需要对其进行合并且排序,最早是将两张表的数据查询以后 union 再排序,这样做的话数据量到十万数量级的时候就已经难以忍受,后来我将分页的逻辑提取到了业务层,排除了适用 union 的问题,查询效率有所提高,但还是比较慢。因为子查询的嵌套的缘故,导致数据库中相关字段建立的物理索引完全失去了意义。所以个人呢还是倾向于在业务层去除 order by 子句,而采取保障数据库索引的措施,这样完全不用排序也能保证要求,而且查询效率也根本不是问题。
l 多浏览器支持。产品主要保证支持 IE6 、 7 、 8 和 FireFox 系列,很多时候 IE 下会出 grid 界面的问题,要减少类似问题,个人感觉有两点,一方面要注意 js 书写位置的规范,另一方面是 grid 参数设置的规范,我想下一步控件规范上会有专人做出总结的。
3. 个人收获和问题总结
3.1 收获
首先原来学的知识得到了巩固和提高,新学的知识得到了练习。主要新学到的知识包括 WAG 产品的工作流程及基本原理、 VWF 框架、 XBMP 通讯、 Spring JDBC 、数据库访问优化,专门看了一本 spring 内部源码的书,对其内部实现进行了一些了解。
用到的旧的知识包括 Java 异常处理、反射、多态, SSH 使用, Apache 一些常用语言包的使用、 log4j 的使用
然后,也是最重要的就是感受到在企业做项目跟在学校的不同,适应了公司邮件驱动的工作方式。发现了大家的分享交流会议对自我提高的重要性。此外,通过跟同学朋友们的交流,也发现了我们公司同事们对工作的责任感和工作热情真的是很值得我学习。知道了工作中什么样的问题应该自己解决,什么样的问题应该拿出来大家共同讨论。了解了项目组建设和管理的一些方法和章程。另外,也是自己的体会,定期进行自我总结真的很重要,不论是技术上还是工作项目上,对技术进行总结,有利于巩固和提高、也有助于对技术点向别人表述;对工作进行总结,可以发现自己的一些坏习惯,自我监督以期提高工作效率,增加工作成果。
3.2 问题
主要的问题,代码写出来经常有 bug ,不太靠谱;总结原因,一方面是 java 基础知识不够牢固,做 java 也算是半路出家,没正经学过 java 基础,导致很多细节被疏漏,于是就出现像多态和反射时的错误;另一方面,有时候注意力不够集中,经验上也是有欠缺的,写出来的代码不够规范,容易出纰漏。
做自测的力度不够,赶上我们测试人员比较少,越是到了最后关键时刻,发现的 bug 反而多了,影响不好,测试的方法也没有太注意,不能覆盖到全部的逻辑,于是就有潜在的问题随时会出现。这方面自己需要在自测的时候也用心一些,不能完全交给测试间,当然也需要测试的兄弟多多辛苦。
4. 题外话
出来实习的第一个项目,自己动手写的代码可能也就那么两三千行,很多时间都挣扎在页面的修改和代码阅读中,其实我很建议公司有一个专门负责页面模块的人来处理页面问题。举例来说,现在每个人都在搞页面,可能修改一些像 grid 参数,页面一些颜色字体表格等的调整,虽然每个人都可以搞定,但是可能一些人需要学习成本才行,而我认为这个成本很奢侈;另一方面,每个人各自搞的东西别人都不知道,我就发现很多公用的 css 文件都没人用,然后换了个地方又另写了一份,这样一来,几乎失去了 css 存在的意义, css 是为了规范、简化、集中管理页面元素属性的处理,而我们却常需要自己维护一份 css 文件,更严重的是,当代码交给别人以后会发生什么就不可预见了,接受代码的人可能改了半天文件都发现跟没改一样,然后发现页面里引用的 css 文件竟然不是自己在修改的,而是别的地方存在的跟在修改的相同名字的 css 文件。