烫手山芋以及如何应对甲方频繁的变更需求

Legacy Project & The key to face the frequently requirements change

Posted by decaywood on 2016-02-27
- 错误校对

空管局那边差不多没什么事了,然而这学期刚开始,假期综合症还没缓下来,实验室师兄的遗留项目被由我负责的小队接下来了,说实话真心有点郁闷。

这个项目以前跟师兄交流过,无非是前端定时从后台定时get一些地图数据展示罢了,没什么难的,技术栈相当简单:前端使用d3配合百度ECharts进行展示,后台使用Tornado进行异步处理请求,数据库暂定MySQL。唯有一点让我左右为难,甲方无止境的需求变更。。。当然,这是大师兄说的,本开始他们几个人配合得挺好的,但由于需求变更太频繁,且没有足够详细的文档以及测试数据,其开发进度以及团队配合的默契渐渐打散,我接手时,代码已经像一把咸菜一样混乱。

主要几个问题如下:

  • 后台通信接口混乱 ajax、websocket交织在一起
  • 耦合极高,需求已经达到无法更改的程度
  • 未模块化,一个函数实现了所有功能,要看懂功能极其困难
  • 甲方需求不明确,变更频繁

经过几天思考后,我打算好好整理一下已有的文档,并想想如何应对这种情况。目前团队的情况是除我之外的其余4个同学掌握较为基本的js知识,其中一个熟悉c语言,两个熟悉Java。后台遗留代码是用Python写的,我过了一遍,结构还算清晰,只是没按官方文档的推荐用法来,稍微重构一下就行了,于是我打算全揽了后台的工作。而前端问题就有点棘手了,照现在的代码来看,只能推翻重来,不过一些已经实现的并已经测试的功能可以尽量剥离出来用于以后的复用。故前端任务是最重的,小组四人加上我都得介入开发。

目前计划如下:

  • 前端展示层尽可能地提取出可配置属性
  • 前端功能尽量模块化,函数尽可能基础化,复杂功能由基础函数进行组合
  • 前端数据更新统一为ajax定时轮询机制,调用接口统一
  • 后台在遗留代码基础上进行重构,按官方规范进行编写
  • 使用git进行版本控制,代码托管到oschina

好处:第一条以及第二条计划主要是为了应对频繁的需求更改,需求更改后,基础函数可以不用修改,如果只是改改颜色,速度等一些展示方面的属性,配置一下参数就行了。其次配合第五条计划可以高效利用有限的人力,各模块同时跟进。第三条计划是为了降低不必要的复杂度,轮询机制已经能够很好的满足要求了就没必要将代码复杂化。第四条计划为的是杜绝新增功能时的调试成本,虽然后台代码暂时没什么问题,但总归是一个定时炸弹。如果出现什么问题都不好debug,尤其是对Tornado不是很熟悉的时候,按照官方推荐用法来比较好。再者由于采用轮询方式更新数据,服务器不再需要主动推送数据了,维护一个全局变量似乎没有什么意义。

后记: 暂时先想了这么多,可能考虑的还不够周全,到时候依场景再做改动吧。

持续更新…

2016.3.14 更新:

最近网络拓扑态势项目进展还算顺利,不出意外的话可能可以提前一个月完成任务,今天接着上文进行一次阶段性的总结吧。

目前前端主要的难点也是一期的难点终于在前两天解决了,意外地只花了一下午的时间,具体算法后面再说。后台并没有一开始想的那么简单,仔细查看前期代码后,发现一些业务方面的处理还是相当混乱的,重构可能不比重写轻松,索性对整个代码进行了重写,结构比之前好了很多。团队合作方面参考了国外的一篇文章:一个成功的Git分支模型,通过合理的划分职责以及提交分支,项目目前保持着良好的推进速度。

对于后台,以前通过get加请求参数的方式获取数据,这是一种接口。另一种就是服务器通过websocket进行主动推送。通过调研,推送动作完全可以放置在前端进行轮询,因为本质都是定时从数据库获取数据(数据库数据改变无法进行回调)。这样的话就简化了前后端通讯接口。对于通过请求参数判断业务类型,我们引用了RESTful API的设计风格,通过路径来判断业务类型,后台通过tornado正则功能来匹配对应的handler。对于数据库访问对象,我们额外增加了一层很薄了TimeCache作为缓存,隔一秒失效一次,避免频繁的数据库读取。后台目前能够良好的运行…

前端几个棘手的问题都逐个击破了,分别为节点树的折叠与展开,增加节点之间的力学特性,以及业务连线的渲染等等。其中最难的带业务连线的节点折叠功能也已经开发完毕,这标志着一期遗留的问题被完全解决(一期此功能并没有完整实现且bug频出,没有达到甲方要求)。

2016.3.16 更新:

今天发现最麻烦的问题出乎意料,不是之前的折叠算法问题,而是地图的离线地图,找了很久的离线地图下载器都要收费,不收费的都有水印,不尽人意,最后通过写了一个Google地图爬虫,根据莫卡托算法计算出url进行瓦片图的抓取,由于国内网络原因,速度特别慢,故通过ssh远程控制将爬虫代码跑在了国外主机上,目前正在稳定运行,估计耗时三天。瓦片图的映射拼接交给leaflet来做,地图显示问题暂时解决。目前的难点在于实现svg层与地图层实现缩放以及平移的联动(图标必须可以通过js控制,所以leaflet自带的marker满足不了需求),这里需要一个算法来协调,暂时还在想解决方案中。