0. 缘起
以前看别人吐槽代码尸山,还没有感触。最近由于项目需要,需要对功能进行大幅扩展,新同事还在学习中,所以重构。其实需求也不是很复杂,做一个设备管理软件,涉及诸多外设接口,北向接口要求同时支持GUI、WEB、SNMP和Netconf等,多用户竞争,以及多优先级下配置的生效问题。
1. 基础设计
1.1 软件设计松耦合
嵌入式的开发,与严重受限的资源相对应的是对可靠性的超高需求,两年平稳运行是基本需求。随着用户对交互性需求的提升(软件定义网络要求具有全网可配,高可视化)。各功能模块的松耦合,是产品稳步迭代的重要基础。
1.2 低自编代码
嵌入式的开发,拿来主义是常态。一堆成熟的开源项目任君采撷,还贴心搭上支撑服务。尽可能减少自写代码,是提高编程效率,保障软件运行稳定的基础(这两天扒了下新同事的代码,运行时间的考量很神奇,可以不厌其烦的打开关闭外设,寄存器的置位清零不设置冗余时间),重构也不算重新开发,至少数据交互协议省时间了。
1.3 进程间通信
没啥特别的,共享内存、消息队列、信号量大体够用。内存溢出和超时导致的开销增长,已经躺过无数的雷了。本次重构中,以共享内存作为信息发布平台,以消息队列作为交互使用,信号量保证操作的原子性。
1.3 资源竞争
接口可以很多,使用接口的用户也可以很多,外设老爷爷主打一个佛系,硬件资源竞争跟我外设有什么关系。他强任他强,清风拂山岗。他横由他横,明月照大江。如果你觉得外设不对,一定是你打开方式不对。外设的管理采用订阅方式,知之为知之,不知为不知,是知也。对管理数据进行归纳分类,并与外设接口进行映射;对用户需求进行统计分析,并进行集中采集和发布。
2. 开发难点
2.1 前事不忘后事之师
还好自编代码只有8K,开发的起点有点回退(顺便重温了下四年前的代码)。源代码还是有点映象。全新的软件架构,需要引入全新的数据结构,派生了更多的变量(有全局的、有局部的)。重构中间有很多事情打断,事实上记忆出现混淆和遗忘。
2.2 历史残余
GUI、WEB都是独立项目(GUI最早是PyQt开发,bytes完美对接C语言结构体;WEB引入了JSON),两者的数据需求、指令约束也完全不同的。代码重构,虽然采用订阅方式搞定外设,但多应用、多用户下的订阅发起和关闭,需要新的维护。采用内存数据库与视图,搞定了维护,多应用下的交互指令统一,依然是一个问题。为提高指令的执行效率,引入hash。一坑还未平息,一坑又来清洗。
2.3 查漏补缺
时代在变,需求也在变。账户安全、数据安全需求凸显,RADIUS、安全加密、
全寿命周期的状态回溯,引入新特征,复用老特征。
2.4 维稳
好的软件产品是设计出来的,更是测试出来的。目前的测试也主要是功能的测试,进而追溯长时间运行后内存开销情况。长期稳定性测试欠缺(想想设计寿命二十年的产品,多长时间的测试视为长期稳定),压力给到了设计。
网友评论