2009年2月16日星期一

2008的过去-纪念在ARDC实习的半年

现在是2009年的2月16日,今天和老大说明了我的去意,老大也没说什么,即使说什么我也听不进去了。我意已决,兄勿多言。

半年前,也就是2008年7月15日一早,我背着个包和张兄一起来到ARDC(SHARP ADVANCED R&D CENTER),看到了分配给我使用的座位与电脑,见到了我这半年实习的领导,见到了和我一起共事半年的共事,也听到了目前项目组的当前工作项目,终于开始了人生头一次离开校园的实习。也许我还年轻,看不了它的成长,也许我太浮躁,总想去外面的花花世界看看,也许我真的性格使然,实习期间也没认识几个朋友,几乎有一半时间在想自己的事情,也许是初涉社会的茫然与无知,总认为老大给的任务还是比较简单的,在早早做完后,就开始看各种招聘实习相关的信息。也许我真的是想赌一把,最终选择离开了ARDC,选择去另外一家可能实习待遇还不如ARDC、公司规模远没有作为世界500强之一的SHARP大,甚至面对的可能会有很多加班、更加幸苦的单位!但是我毕竟是个年轻人,“身于忧患,死于安乐”,“机会永远大于安定”,最终选择了离开,从一个火坑往另外一个火坑义无反顾的跳了进去!

首先说一下ARDC,实际是由日本本部直接投资的,但是由于成立初期,僧少粥也少,暂时挂在SES下属,财务也是由SES把持。经济大权不在自己手上,其实对ARDC的发展还是有所限制的。ARDC主要是为SHARP其产品、其子公司各种需求而制作软件的,基本是属于自产自销的地步,即亏损了有母公司买单,盈利了也不一定能得到好处。我个人觉得如果ARDC要做到长远发展,软件开发必须要“走出去”。

我在ARDC一共参加了2个项目。头一个项目是SVG Authoring Tool,说白了,就是基于J2SE,利用NetBean IDE,编写的SVG创作工具。
1. SVG文件为了增强与用户的交互性,曾加了animation和set属性,用来标记动画效果。animation和set中用begin,end来标记动画触发的一些时间标记,而begin和end应该可以相互关联,如果有animation(set)被删除的话,begin与set理论上也应做相应的修改;如果图形元素删除,所属的animation、set也一并删除。而在实际的程序中,begin与end已经作为固定的字符串属性赋给了相应的animation(set),与它所对应的animation(set)间并没有直接的联系,这就给操作上带来了问题,造成系统在运行后产生系统垃圾的可能性大为提高。我的修改方案是在animation(set)中新建一个静态的Hashmap对象,用来存储animation(set)之间的相互映射关系,每次SVG载入时,通过载入,初始化animation(set)之间的关系,当对animation(set)的begin、set或者其本身进行操作时,相应的修改这个静态的Hashmap,退出时相应的从Hashmap中读取映射关系,加以保存。但我这种修改方案随之带来一个问题,增加了一个变量,同时就引入了数个方法,这样虽然解决了问题,但由于引入了一个新的关系,导致程序产生了新的未知BUG,甚至是ERROR,FAULT。在发现了这些问题后,解决方法是尽量采用局部变量,在不增加系统方法的前提下,增加局部变量以减少系统的开销。
2. SvgDocument类过于庞大,SVG Authoring Tool设计SVG文件可以通过软件输出成*.svg格式的文件,这就要求将存储在内存中的对象按照svg文件格式逐条输出,svg文件有手机、TV上两种版本,而且存在一定的差异性。原先的程序是每个版本一个方法,其存在不少代码功能上的重复不说,而且每个方法都过于庞大,不宜读懂,如果修改起来很是麻烦,重构是不可避免的,将相同的过程抽象出getEntityXml(),getDefsXML(),getDescriptionXML()等各种不同的方法。
3. SVG Authoring Tool由于功能日趋完善,代码愈来愈多,所积累下来的BUG数目也与日俱增,其中大多涉及到SWING上面的一些设置与属性的相互关系。日方也提出了一些修改意见,animation(set)创建时,会有ID的属性,原先可以自动按顺序排列的功能取消,ID可以不连续,大大简化了对animation(set)的操作。

第二个项目是基于J2ME的手机CXMDF阅读器。
1. MIDP的文字断行功能。CXMDF的菜单都是基于MIDP底层面板进行编写的,对于排版这种高级的属性必须自行实现。文字断行也就是显示英文的时候,在一行的末尾不能将单词硬生生的拆开,使得一个单词横跨两行,影响阅读,主要是对单词是否结束做逻辑上的判断。判断一个单词的显示宽度,如果没有超过一行则从下一行开始显示;如果超过一行的宽度,则根据剩下的宽度找出单词应该断开的位置,插入“--“,前半段在第一后结尾显示,后半段则另起一行,从下一行开始显示。
2. TextDlg的完成。根据日方给出的界面式样书,从主要的界面样式中分离出比较有代表性和抽象性的TextDlg,主要在其上完成对文本信息的显示。TextDlg继承自AbstractDlg,后者是所有Dlg的抽象类。AbstractDlg中已经实现了drawBackgroud,drawButton等方法,TextDlg主要实现drawDialog显示界面上的文本内容,dialogLoop通过循环实现对按键事件的相应。前者对文本以及文本后的按钮进行显示布局,若文本只有极少的一行则只需将该文本全屏居中显示即可,若行数多了,则不仅由上到下的居中处理,而且通过dialogLoop实现滚屏效果。附在文本后的按钮则按照不同的要求显示成按钮与链接两种模式。
3. 实现漫画场景中显示菜单的功能,包括页面跳转、和功能菜单。因为之前项目中已经完成了几个Dlg的开发工作,这里的工作实际便是通过调用这几个Dlg来完成相应的功能,其中包括稍微修改了KomaSelectDlg的绘制布局,在BookSelectCanvas中增加了Property字段,用来判断显示菜单的事件,增加字段用来判断check是否有下一本书等。
4. 系统中一些BUG的处理工作。当阅读器显示漫画场景的时候,若该漫画场景存在特殊效果,例如渐变、震动等,在漫画显示这些特殊效果时,无法做到翻页等命令,即特效无法被cancle。原因是处理画面特效效果的代码,与开启按键监听的代码是在一个线程中顺序执行的,即setlayout,drawlayout结束之后才开始监听按键。我的做法是将drawlayout中处理画面特效的代码独立作为一个线程来处理,但是在系统中多增加了一个线程,可能带来了与其他线程的冲突。事实也证明了我这种方法存在问题,应为Java对于这种线程的先后执行并没有明确的先后顺序,导致虽然实现了键盘监听,但特效的处理会向后延迟。

CXMDF项目主要有日方(本部)提供设计方案,我们ARDC主要负责核心包的开发,测试交由香港的团队外包给第三方的公司来完成;而在我们的核心包开发完毕之后,台湾、香港的团队将完成基于核心包的外围应用程序的开发,并适用于当地的运营商和手机平台。

综述一下,在ARDC的半年,算是对我启蒙的半年,在这半年我学到了很多东西,不过还很难说我已经从学生的角色中走出来了,路漫漫其修远兮,吾将上下而求索!

没有评论:

我的简介