从一个项目出发,所获得的一些工程经验

My Experiences Eared from a Project

Posted by decaywood on 2015-12-21
- 错误校对

前一阵子和教研室同学一起完成了空管局的空管模拟系统控制模块的开发,一直没来得及总结。借着个人博客的上线,来写一写一个月以来开发的一些感受。

先说说背景,这个产品是一个模拟全国各大机场起降以及各航线航班飞行状态的软件,具有图形化界面,可以帮助飞机调度人员预测交通拥堵,气候对航班的影响,或者现实生活中可能发生的一些极端情况,整个项目目前处于初级阶段,而且每个环节都有对应的deadline,所以任务还是挺重的。

这个项目后台(航迹模拟引擎)是用Java编写的,核心的控制系统由C++编写,前端的数据展示模块由于历史遗留原因也用Java编写(JavaSwing),技术比较老旧。从被老师分配来技术协作到实际参与项目仅仅2个月。由于JavaSwing接触得不多,所以并没有很详细的了解API,但是GUI的核心思想都是相同的MVC模式,掌握的这点,短期上手也不是一个很大的问题。但是这次比较恼火的地方是,空管局上面的领导说只给一个月时间就得把demo做出来。然而控制模块除了我之外,只有一个同教研室的同学,其他模块也在开发中,且抽调不出足够人手参与。所以相当于2个人要在一个月之内完成整个控制模块的开发。

而控制模块具体是做什么呢,大概可以概括为这几方面的功能:

文本数据转换

由于历史遗留问题,不同语言的系统通信采用非Json等通用格式的数据来传输,所以在数据传输这个环节没有可用的库,得重复造轮子。

GUI必须动态显示树形结构数据

空管模拟系统的数据结构是树形结构,剧本为根下面记录着航班信息,航线等多达4层的数据,且兄弟节点互相依赖,这些数据会实时的从其他模块传输过来,GUI必须实时响应这种变化。

用户通过GUI修改参数后发送控制指令给核心模块处理

也就是说,通过GUI修改对象状态后,对象需要反序列化回文本数据进行模块间的传输。

效率!效率!效率!重要的事情说三遍!

由于整个模块从无到有期限只有一个月,任务量又特别庞大(十几个界面,数据统计功能,远程控制功能,以及数据展示功能),所以整个开发过程必须做到无比高效并且无缝衔接。

从这三点来说,看起来有点像不可能的任务,当然,抱怨已经没什么用了。毕竟是有个学习的机会已经很好了,虽然做不出来也不会为难我们,说不定能借此能激发一下自己的潜力呢。想到这心里一下平静了不少,不过这种棘手的任务不能草草的就开始了,还是得缜密的计划一下。

既然难点这么多,那就逐个击破!

首先从数据转换来看,虽然模块间传输的数据不是标准的Json数据,但是它也有自己固有的规律,它以Begin开头End结尾,如果有孩子,则依然以Begin/End标记,这样一来,递归遍历数据便成为可能(后来考虑到效率改用栈代替)。对于序列化为Java对象这个问题,如果进行手动set值,由于属性太多,这将成为浩大的工程。经过思考,用反射技术可以解决这个问题,额外的工作无非就是将类的层次结构和属性名与文本文件内容进行一一对应而已。反序列化方面,考虑到发送出去的控制指令与接收到的指令有些许差异,我们采用每个层级的具体类负责自有数据的序列化,子类复写父类序反列化方法,并调用父类序列化方法传入自己反序列化好的数据,这样父类就可以嵌套子类的数据文本,经过层层嵌套,完成整个数据的反序列化。

再看动态显示,由于传入数据时就得更新界面,很容易可以联想到监听者模式,遂单例一个Dispatcher即可(项目规模暂时用不到Spring进行对象管理)。而树形结构的显示上面,Swing封装的Jtree类,可以展示树形结构,Jtree是依赖特定接口的,也有默认的实现类,通过观察源码,默认实现类能够满足需求,于是直接将我们实现的节点类继承它即可。通过测试,结果与预想的一样。

最后就是开发效率问题了,这应该算是最棘手的问题。由于跟我组队的同学暂时处于入门阶段,所以必须把程序高度抽象化,模块化,并使用泛型,做适当的单元测试,把出现Bug的可能性降到最低。代码的衔接也需要慎重考虑,于是我们采用Git进行代码版本控制。使用Dev/Master两个分支,Dev分支用于进行合并和修改,Master为经过测试后的阶段性分支。

到此,项目规划基本完成。

后记

项目的过程就不细说了,中间确实遇到了很多困难,整个工程的设计也出现了一些设计上的缺陷,不过总体思路还是对的,经过几次重构,程序能够很好的运行,项目也如期交付(逾期半天)。至于版本控制方面,dev分支个人觉得还可以细分一下,包括一个功能对应一个分支,并行开发,也不容易产生依赖,搅在一起。虽然问题不少,不过还是圆满完成了任务,也比较有成就感。

一些体会

这次的项目在开发方面其实不难(用到的都是相当成熟的技术),难就难在整个项目的合理规划上,必须通过充分的调研,合理设计结构,这样需求变了也能很好的面对。其次,合作很重要,虽然一起开发的同学刚入门,不过学习能力很强,所以开发的同时,分享必要的开发技巧给他也是必须的,这样他能更快的提升技能,加速整个项目的进度,事实证明他对整个项目的贡献是非常大的!

以上就是我分享的一些感悟。