2020年1月,抗击新型冠状病毒的战“疫”打响,包括广东省在内的全国多个省份进入一级应急响应状态。广东省教育厅《关于全力防控疫情确保开学安全的通知》要求各类学校要对师生的健康和分布情况做到“四精准”。中山大学新华学院信息化部门成立开发小组,决定借助信息化手段组织防控工作,确保全覆盖、无遗漏地掌握和使用防控数据。
开发小组在极短的时间内规划了项目实施路径,即“三步走”:第一步是根据“四精准”的要求做好师生分布情况和健康数据的采集工作;第二步是对采集的数据进行分析和研判,为防控领导小组做出科学决策提供数据支持;第三步是扩展到师生返校管理、日常晨检管理和其他扩展应用。
敏捷开发方法实践
该项目以师生用户为核心,不追求前期完美设计、完美编码,力求在很短的周期内开发出产品的核心功能,先解决基础应用,尽早发布可用版本,然后在后续的开发周期内逐步迭代升级、循序渐进地形成功能较完善的校园信息化系统生态。因此,适合采用敏捷开发方法。
需求管理
敏捷开发的核心要求是做好需求管理。开发团队在与学校人事部门、学工部门沟通后,对照上级各主管单位的文件要求,以共同认可的会议纪要的方式确定了前期需求:
(1)采集程序简便,避免“填表抗疫”,无形中增加业务部门的工作负担;
(2)数据完整,满足省、市和属地地方政府部门的日报要求;
(3)数据支持师生返校条件的判定,能衔接返校后的日常晨检工作;
(4)要确保信息安全,杜绝数据泄露和被越权访问。
选择开发工具
(1)项目管理工具
在明确需求后,开发小组开始分工,并借助“码云”工具实施任务管理、文档管理和代码管理。
任务管理主要将开发人员分成前端和后端两种角色,协商好前后端数据的接口。大家明确各自任务,同时借助工具可以了解团队其他成员的进展情况,什么时候开始,什么时候结束,最终交付的模块代码在哪里,实现团队成员之间互相监督、互相激励。
工具提供的文档管理功能可以让团队所有成员共享记录文档,也可以有各自独立的文档,最后合并形成统一的开发文档,避免文档版本不一致和无法溯源等问题。
极限编程作为敏捷开发的重要实现方式,侧重于实践,并力求把实践做到极限。针对本次任务,团队采用极限编程中的结对编程方式,最终成果都是软件代码和对软件代码的集成测试,所以归根结底还是要落实到代码管理上。团队选用的工具提供了完整的git代码库管理功能。
(2)前端开发工具
开发小组评估了APP、网站和小程序数据采集的优劣,并基于下述理由,决定使用微信小程序作为数据采集的终端:
无需安装。小程序扫码或搜索即用,免除了师生用户对APP占用手机空间和安装过程过度授权的反感;
位置采集简便。因疫情防控需要掌握师生的分布情况,同时考虑保护师生隐私信息,在经得用户授权后使用小程序的定位功能实时将坐标转换为只到区县一级的位置名称保存,且非防控重点地区不调取;
原有小程序平台和用户基础。由信息与网络中心自主研发的“iXH信息服务平台”小程序,自2018年起已经成功应用于迎新服务、校园卡查询、成绩查询、水电查询、课程表查询、图书馆藏查询、晨读打卡、“每日8000步”打卡等,不仅有了统一的平台界面,而且有用户基础,大多数师生用户无需再做绑定即可使用,少数未绑定的用户也只需作一次绑定即可。
为此,前端小程序开发采用微信开发者工具。
(3)后端开发工具
使用Intell JIDEA作为开发工具实现后端的业务逻辑,采用开源的Java轻量级框架SpringBoot快速构建业务接口。为减少开发团队在短时间内进行复杂的环境配置工作和依赖包的管理工作,将主要精力集中在业务逻辑的实现上,使用SpringBoot框架在MAVEN项目的pom文件中添加相关的依赖包,然后使用对应注解来代替繁琐的XML配置文件以管理对象的生命周期,简化了搭建和开发过程,而且不需要担心依赖包版本冲突和引用不稳定等问题。
第一阶段成效
团队很快上线了测试版本,并将小程序应用命名为“报平安”。系统以小程序为采集终端,使用nginx软负载将HTTPS请求分发在两台虚拟采集服务器上,利用Redis缓存鉴权信息。为确保数据安全,热备了数据库(如图1所示)。
系统上线次日就全面掌握全校近2.4万名学生和教职工的分布情况和基本健康状况。开发小组从数据库直接分类导出异常数据,并由人事部门和学工部门分别对这部分教职工和学生进行跟进和记录。地方政府和上级主管单位需要的报表数据不尽相同,但都可以从采集到的数据中通过构建查询视图自动生成,不仅可以确保数据的准确性,而且大大减轻学校工作人员收集、统计、上报数据的工作量。
后续与其他单位采集师生员工健康信息的APP、公众号、小程序、问卷等同类业务比较,“报平安”小程序具有如下优势:
(1)上线时间早。采用敏捷开发方法,产品前期需求确定,无需多步迭代,因此开发周期短,上线更早;
(2)无需重复登录。许多同类应用每次需要重新认证,“报平安”小程序在首次鉴权绑定学校信息后,用户无需再做绑定或登录操作,而是直接从微信服务器验证确认其来自微信小程序,并根据返回的OpenID自动拉取用户身份信息;
(3)采集数据的问卷设计更简洁。“报平安”小程序对后台已有的静态信息(如姓名、手机号码、身份证号码、部门或专业等)不作采集,仅采集需要关注的动态变化信息(如当天接触人群、本人或家庭成员身体健康状态等),以及通过用户授权获取的城市区县信息,师生用户10秒内即可完成“报平安”操作。
数据可视化与功能扩展
完成了第一阶段的数据采集,开发团队按原实施路径继续进行数据分析与可视化,并完善后续功能。
数据可视化
开发团队从不同维度对实时数据作统计分析,选用了基于Bootstrap的gentelella管理后台模板,使用Chart.js插件图表化结果,为全校科学决策提供直观依据。
选用不同色块的“甜甜圈”(doughnut)图分别展示了师生在广东省内各城市、全国除广东省以外各省(含港澳台)及在国外的分布情况。经过开发团队二次改造后的色块过渡自然,鼠标经过时以对比色展示动态效果,数值标签和图例清晰(如图2所示)。
同样的,采用水平柱状图展示防控重点地区师生在各年级、各院系的分布情况(如图3所示)。为了解每日需要重点关注师生的变化情况,用4张曲线图分别展示了确认或疑似病例、需重点关护师生、按规定自我观察或医学观察、本人或家庭成员身体不适人群近14天的变化情况(如图4所示)。
打卡自动提醒功能扩展
为准确掌握瞬息万变的动态数据,学校决定启动“天天报平安”工作,要求师生每天一报。为配合这项工作的开展,开发团队采取了两项措施。
一是利用微信小程序消息订阅功能,在前端提示师生用户授权,在后台代码中建立一个监听器(Listener)和自动发送模块,每天上午9时到10时向未“报平安”的师生用户推送打卡提醒消息。
二是在后台增加各二级院系“报平安”人数统计图和未“报平安”师生名单及联系方式,每天下午13时各二级院系管理员可登录后台查看,并根据名单个别提醒未填报师生完成填报,确保摸查工作全覆盖。
关