基于Blackboard 9.1的插件研发探索与实现
——以“北大教学网”大英网测插件为例
2018-03-23王肖群王运美赵柳婷
王肖群,顾 静,王运美,赵柳婷
(北京大学教师教学发展中心,北京 100871)
0 引言
北京大学公共英语教学研究室,自 2011年以来,每学期依托“北大教学网”开展 1~4级 4000多名学生的教学任务,每个级别分成10多个教学班组,几乎每个级别每学期都要进行20次左右的“在线测试”(近9万人次),既作为教师主要教学手段,更作为学生重要考核指标,因此教师极其谨慎,学生也极其重视[1-3]。
众所周知,利用网络在线测试存在一定的风险[4],一方面是软硬件客观原因,服务器系统崩溃、校园网网络故障、学生宿舍环境障碍等;另一方面是学生主观原因,电脑误操作、成绩不理想等。由于每个测试学生只能“尝试”一次,不管遇到什么问题,学生都会发邮件给教学网客服,要求重新测试。我们客服人员在不能判定是否是主观原因的情况下,不得不每学期几千次地手工为学生进行“清除尝试”操作。不仅使我们的工作量骤然增大,而且造成学生网测分数不公平的现象。这是大英教研室网络教学最棘手的问题,也是我们支持服务最繁琐的事情。
同样,在学期末,大学英语网测成绩,需要教学网客服人员从教学网库表中,挑选导出几十张excel数据表,然后通过删除、排序、筛选、合并等手工整理出各班级原始成绩,再根据各级负责人的加权方案,最终计算出各班学生的网测成绩占总考试成绩的实际分值。这是大英网测最核心的工作,也是我们最担责任的工作。
上述这两个突出问题在几年当中一直存在,不能有效解决,直到北大教学网在2015年完成教学网软硬件升级到 9.1版本后,我们才重点解决大英网测教学的问题。
1 需求分析
经过与大英教研室领导和教师代表多次沟通,反复推敲,确定大英在线测试教学需求。
1.1 教师的需求
教师在每学期开学初,在教学网中可设置一学期内学生自主清除尝试的次数 M(初始值 M=0);教师在每学期学期末,在教学网中可针对每门课程设置不参加计算的低分测试数N(初始值N=0),即教师去掉学生的N个最低成绩,再根据教师具体算法(所有网测成绩换算成1分,为每位同学去掉N个最低分总分,按教师每学期设定的最终总分来折算),算出平均分。
教师可分班组查询学生的网测成绩,并在此基础上导出学生的网测成绩。
1.2 学生的需求
学生在每学期学期中,在教学网中进行课程的在线测试,每个测试在规定时间段内完成。学生每做完一个测试就即刻得到分数,自主决定是否“清除尝试”,最多只能有M次重做的机会。
1.3 可行性分析
“北大教学网”采用美国著名的Blackboard[5-7]系统构建,是一个集网络教学、资源管理、视频课堂和校园社区等诸多功能为一体的综合性网络教学辅助平台。Blackboard系统符合SCORM(Shareable Content Object Reference Model)标准,因此其内容资源可复用共享,具有互操作性,不仅可以与国内外教学支持平台无缝对接,而且用户可以根据自身需求,再经过一些专项培训,就可以自定义开发所需的功能插件。
2 插件设计
我们根据大英教研室网测需求,初步确定“大英网测插件”包含面向师生的“自动清除尝试”和只面向教师的“成绩计算及导出”两大功能模块。如图1所示。
2.1 用例图
教师可以设置网测清除次数、去除网测低分、导出学生网测成绩。系统默认每门课程网测清除次数为 0,教师可以针对每门课程设置学生一学期内网测清除的次数M。
在网测成绩计算中,系统默认每门课程不参与计算的低分测试数为 0,教师可针对每门课程设置去除的低分数量 N。教师可以根据学生的分班情况导出学生的网测成绩。如图2所示。
图1 大英网测插件用例图Fig.1 The use case diagram of College English network test plugin
图2 导出网测成绩核心算法示意图Fig.2 The algorithm of exporting network test results
每次参加网络测试后,学生需要立即判断是否清除该次网络测试成绩,重新参加网络测试。学生一学期内清除网测成绩的次数不可超过M。
2.2 界面设计
①教师进入课程,利用“控制面板”中的“课程工具”可设置本学期内该门课程学生自动清除尝试的次数。
②教师进入课程,利用“控制面板”中的“课程工具”可先设置条件,查询并导出该门课程的网测成绩。其中“不参加计算的低分测试数”和“最终总分”是必填项;
③学生进入课程,利用“工具”,可选择某个测试进行“清除尝试”,系统会提示学生当前清除成绩的剩余次数。
3 插件实现
“大英网测插件”研发必须基于 Blackboard平台。我们按照规范搭建了教学网开发测试平台,移植了正式平台教学数据。由于商用平台系统庞大资料有限,所以我们在Blackboard公司支持和指导下,合作研发大英插件,并着重对源代码进行优化改进,调置本地环境,最后部署实施大英插件[8-10]。大英插件研发架构和实现,如图3、4所示。
3.1 项目创建
首先,开发人员需要从Blackboard官网上下载并安装 Building Block插件。该插件是运行在Blackboard平台上的Web应用,可用MyEclipse创建 Building Block Project。
3.2 属性定义
Blackboard插件项目使用bb-manifest.xml配置文件来控制系统的数据访问权限和UI集成。配置文件分为plugin、links和permissions三大类,包括10个配置项。如表1所示。
图3 Blackboard平台插件研发的架构Fig.3 The architecture of the Blackboard plugin
图4 插件实现流程图Fig.4 The flow chat of the plugin implementation
表1 插件配置属性表Tab.1 The configurations of the plugin
插件处理器取值通常为项目名;插件类型分为课程工具和系统工具;链接地址是指用户在浏览器中访问这个插件的地址;授权类型包括 attribute和persist。Attribute是指数据库中已有属性,授权操作为get和set操作。Persist是指数据库中没有该属性,对应的授权操作包括create、modify和delete。
3.3 代码编写
项目采用了 MVC框架,大致分为三层:模型层、控制层和视图层。插件的代码结构一般分为两个部分,后端代码和前端代码[11-13]。程序框架结构,如图5所示。
图5 程序框架结构Fig.5 The structure of the program frame
(1)前端代码(处理前端客户端显示及跳转逻辑)
位于webContent文件夹下,插件从WEB-INF/config/stuts/struts-config.xml开始执行。
①Student包内是存放学生账号登陆时使用该插件的功能。
SuccessClearAttempt.jsp是学生使用该插件的入口文件;
testList.jsp是学生尝试清除成绩时的页面客户端文件;
②Teacher包内存放教师账号登陆时使用该插件的功能。
TestScoreList.jsp是导出网测成绩的入口文件;
test_score_list_export.jsp是把成绩导出到 excel表格的入口文件,
在testScoreList.jsp文件中调用;
GradeHistoryList.jsp和ViewGradeHistery.jsp查看成绩历史记录中调用;
SetAttemptCount.jsp是设置学生自动清除尝试次数的入口文件;
(2)后端代码(处理后端服务器端内部逻辑及数据存储、读取)
位于src文件夹下;/src/com/blackboard有4个子文件夹,build包为工具包;data包存放新定义的数据格式以及数据模板;test包是为插件添加封装和Blackboard系统接口;最主要是course包,实现系统的业务逻辑,Action有插件最核心的两个文件。CourseManagerAction设置清除尝试次数;TestManagerAction导出网络测试成绩;Data定义数据格式和数据模板;form将页面用户输入的值与后台属性绑定;query存放所有和数据库相关的函数。
3.4 插件部署
代码编写完成后,运行 build.xml文件,使用Ant工具将插件打包成 war文件。开发人员以管理员身份登录到Blackboard平台,打开上传Building Block页面,上传打包好的war文件。上传成功后,利用“定制”“工具可用性”勾选该插件,即可实施使用。如图6所示。
图6 自动清除尝试插件部署示意图Fig.6 The deployment of the plugin
3.5 插件优化
教师在试用阶段,发现导出网测成绩时,由于页面加载等待时间过长,出现“死机”误判现象,这是严重的问题。在测试系统上成绩计算准确,但在实际课程中成绩计算值偏小,这是困惑的问题;导出的成绩虽然按大英级别排序,但学生成绩没按班级排序,这是不合理的问题。我们针对问题,认真研读源程序并多次测试程序,独立找出各个问题的根源所在。
(1)导出网测成绩代码流程
入口链接是 TestManager?action=test_score_init,在struts-config.xml找到TestManager,链接到TestManagerAction,在 TestManagerAction的 execute函数中,test_score_init执行getTestScoreInit函数,顺利执行该函数后,返回 test_list,在 struts-config.xml中,返回值是 test_list,执行/teacher/testScoreList.jsp,testScoreList.jsp里点击执行按钮,跳转到TestManagerAction,参数是test_score_list;
在 TestManagerAction中,test_score_list执行getTestScoreList函数,开始执行真正的导出网测工作。而导致插件执行时间多长的原因是 getTest-ScoreList函数,如图7所示。
图7 程序执行流程演示框Fig.7 The execution path of the program
(2)“页面加载时间过长”解决方案
在getTestScoreList函数中,分三种情况计算学生成绩:课程没有小组、课程有小组并且选择了小组、课程有小组但是没有选择小组。对于第一种情况,直接读取数据库中课程用户信息,调用getFinalScore函数计算总成绩,最后返回所有学生信息和成绩的列表。对于后两种情况,要先确定选择的小组里有哪些用户,再执行第一种情况下做的工作。问题均出现在调用getFinalScore的过程中。如图8所示。
在原代码框图中标注的四个“重复”的语句,在循环语句内存在大量访问数据库的操作,导致程序开销大,非常耗时[14-15]。因此,把该段代码放到循环语句外面执行,只需一次数据库访问,将读取的结果保存在本地,在循环语句内直接调用本地保存的结果。另外,在原来代码中,凡是用到courseId(唯一标识课程)和 UserId(唯一标识用户),我们都把它们改成在核心代码开始前,一次性读取保存到本地,并在之后各个函数中将 courseId和 userId作为参数传入。
经过这些修改,很好地解决这个大难题。
(3)“成绩计算值偏小”解决方案
我们经过反复讨论、测试和后期的代码调试,发现课程中每个测验有个“编辑测验选项”,含有“自我评估选项”,可控制着测试是否需要计算成绩。对于不需要计算成绩的测试,教师可不选中“自我评估选项”中的“在成绩中心分数计算中添加该测试”;反之亦然。
教师通过“课程工具”可管理查看所有测试,对于没有部署的测试,可以适时的删减,保证测试的有效性和精确性。
(4)“成绩没按班级排序”解决方案
我们单独开发了按照班级排序的模块,在计算网测成绩时,可调用此功能模块。
4 测试方法及结果
4.1 测试方案
为了测试修改后插件的优化结果,本文编写了一些测试用例。具体测试方案如下:
①在问题函数代码运行前后,添加输出当前时间的语句,利用时间差得到程序运行时间。
图8 原程序结构(左)与改进后程序结构(右)对比Fig.8 The original program structure VS The optimized program structure
②在测试平台中新建“测试课程”,在课程中添加1位教师和51位学生(测试平台可以创建用户数的最大上限),在课程内容中创建10个测试,将学生分成3组,每组17人。
③运行修改后的插件导出网测成绩功能,并同时在服务器系统的后台查看系统日志文件输出的时间,计算两者间隔,得到实际运行时间。
4.2 测试结果
在“北大教学网”测试平台上对修改前后的插件进行运行时间测量,多次测量取平均,如表2所示。
从上表的平均结果看,原版本导出 51个学生10次网测成绩,平均需要约13秒,具体体现在网页加载时页面不停转圈等待。修改后版本在同等计算量的情况下需要约 3.2秒,运行速度提高了约 4倍。可见,代码的优化是有成效的,插件运行时间明显缩短,基本解决了原插件加载时间过长的问题。
4.3 插件其他功能验证
①对课程没有小组、课程有小组但是有的用户没有分入任何一个小组等各种可能的小组组合情况进行了测试,都可以得到正确的结果。
②对学生的成绩进行了测试计算,公式计算和网页上得到的结果一致。
③在各种情况下,导出网测成绩到excel表格的功能也都使用正常。
④对其他功能如设置清除尝试次数、清除尝试功能、查看历史成绩也一一进行了测试,都可以正常使用。
表2 插件修改前后运行时间对比Tab.2 The execution time of the original program and the optimized program
5 结语
截止到2016年11月,在“北大教学网”系统内课程数 1.2万门,用户总数 5.5万,系统访问量538万次,页面浏览量1324万次,各项数据统计居全国首位。我们通过较为繁琐的统计分析,并深入系统内部进行人工核实,确认 2015-2016年度北大本科网络教学数据,有948个教师(约占30%)、40个院系(约占70%),1057门课程(约占30%)、14180名学生(约占50%)使用“北大教学网”进行辅助教学和在线学习。我们对北大师生大群体的技术支持与服务依然是一个艰巨的任务。
我们制定了教学支持方针,认为保证教学网系统稳定可靠是前提、改进教学网与校务系统整合是关键、加大教学网项目支持力度是保障、加强院系及教师教学合作是核心。
我们服务的宗旨就是满足院系及教师教学需求,同时我们通过不断与院系及教师合作,找到开展深度应用的契合点。“大英网测插件”的研发是一个很好的尝试与创新,真正满足院系网络教学的迫切需求。同时我们只有通过内外合作,开阔视野挖掘Blackboard潜力,掌握教学网研发能力,提升自身业务能力,才能引领深度应用前沿。
[1] 曾腾, 何山. 高校信息化教学平台应用推广研究——基于“北大教学网”应用推广工作的实践探索[J]. 现代教育技术,2016, 26(04): 112-118.
[2] 王肖群. 与时俱进 睿智改革 勇于探索--北大教学网应用推广策略与实施: 《信息技术与教学深度融合》优秀案例集[C]: 40-51. 北京: 中国高等教育学会, 2015年9月.
[3] 王肖群, 陈虎, 徐金灿, 等. 北京大学教学改革新形势下的认识和思考[J]. 北京大学教育评论第14卷专刊, 2016,67-72.
[4] 李霄, 王常洲, 田雅. 计算机应用系统性能测试技术及应用研究[J]. 软件, 2013, 34(4): 69-73.
[5] Blackboard Inc. Blackboard Learn+ Building Blocks Tag Library Version 9.0[Z]. Washington, DC: Blackboard Inc,2008: 1-95.
[6] 陈飞, 杨公义, 李志刚, 等. 基于Blackboard系统的“北大教学网”扩展开发研究[J]. 北京大学教育评论第11卷专刊,2013, 201-211.
[7] 许明, 郭佳, 闫旻. Blackboard平台支持下的“二级Access数据库程序设计”课程的建设[J]. 软件, 2013, 34(4): 79-81.
[8] 蔡建平, 王琼. 敏捷开发过程管理平台的设计与应用[J].软件, 2013, 34(2): 12-16.
[9] 王旭. 传统软件开发团队如何转型为敏捷开发团队[J]. 软件, 2014, 35(3): 203.
[10] 吴成庆, 孙玉涛. 学生在线考试系统软件测试[J]. 软件,,2015, 36(6): 26-30.
[11] 李容. 基于MVC模式的Web应用研究[J]. 软件导刊, 2010,9(01): 19-21.
[12] 李海峰. MVC模式架构的应用研究[J]. 自动化与仪器仪表,2013, (01): 4-5+7.
[13] 高群霞. 基于MVC模式和多层架构的电子商务网站设计与实现[J]. 科技广场, 2017, (01): 56-58.
[14] 王庆福. 网站建设中数据库技术与WEB技术的应用对比研究[J]. 软件, 2013, 34(2): 86-87.
[15] 徐安令. SQL Server数据库的查询优化[J]. 软件, 2014,35(2): 88-89.