程序设计课中代码质量的可视化评判
谷锐 徐斌 陈佳
摘要:本文介绍了一种将程序源代码转化为图形以实现代码质量可视化评判的方法。该方法基于可视化理论,遵循程序代码质量评判原则,利用相关技术手段将学生提交的源程序代码转化为特定图形,然后教师根据标准图形模式对学生的代码质量进行评判。试验表明,这种可视化的评判方法可以在不牺牲评价质量的前提下极大地提高教师的评判速度,进而提升整体教学效率。该方法还能够有效激发学生的学习兴趣,其實现思路也可向其他类型课程推广。
关键词:可视化;程序代码质量;评判
中图分类号:G434? 文献标识码:A? 论文编号:1674-2117(2019)19-0103-03
● 引言
当代教学活动正从传统的课堂授课、考试和人工阅卷转向更为多样的教学和考核形式。利用计算机技术进行自动判分已经非常常见,该方法虽然高效,但其结果不适合作为学生学习效果评判的主要依据,也不宜作为能力训练的工具。可见,现代科技手段在给教学活动带来便利的同时,也引入了规模扩大和保持教学效果的矛盾。虽然目前尚不能完全解决这一问题,但在特定的领域和场合仍可做出一定改变。
目前,各大专院校计算机程序设计课程的开设非常普遍,笔者认为,可以从这一类课程着手尝试解决前述矛盾,因此结合所在学校的在线Java代码质量检查系统WorkJava,提出了一种利用可视化技术进行程序代码质量可视化主观评判的方法。
● 可视化的基本理论
数据可视化(data visualization)主要研究数据的可视化表现。它不单纯是科学,可以说是科学和艺术的混合体。[1]由于人类对图形(长度、大小、颜色等)具有天然的敏感性,而对数字的识别和理解需要更高层次的思维活动和更长的时间,因此对于教师测评而言,可视化的测评比基于文字或数字的测评更便捷,并且有利于减少误判。
数据可视化主要应用在两个方面:数据分析和信息传递。[2]利用数据可视化技术可以更好地理解数据的含义,发掘其中隐藏的规律,并将发现表达出来以便他人了解。因此,数据可视化技术对于教学的主观评价而言更有意义:数据可视化不但可以帮助教师更快、更好地进行教学评价,而且可以在完全透明的情况下提高学生向教师传递信息的效率。
目前,数据可视化对教育教学的作用大多体现在教授环节,即利用可视化工具提高学生的学习兴趣,提升学生的记忆和理解水平。但教学是双向的,不仅要求从教师向学生方向的信息能够正确高效地传递,还要求从学生到教师方向同样能够实现良好沟通。因此数据可视化对于教师而言,面临更多的挑战是后者:前者是1∶n的关系,属于“广播”;而后者是n∶1的关系,属于汇聚。很显然,不借助现代信息技术手段,教师只能对来自学生的信息进行“串行化”处理,即逐一地应对,这必然会造成学生长时间排队,并给教师带来沉重负担。
教学评价可视化中需要解决的主要问题有:第一,找到一组恰当的符号来代表数据;第二,将这些符号用恰当的形式组织起来形成容易理解的图形;第三,总结和归纳出评价中最关心、最重要问题所对应的图形模式(pattern)。笔者接下来就这三方面问题的实现展开讨论。
● 代码质量可视化检测方法
对程序代码质量的评判长久以来主要依赖于人的主观判断,即通过阅读程序代码,发现所谓的“坏味道”(bad smell)来对代码质量进行评判。[3]但对于什么是“坏味道”,没有一个精确客观的定义,一般通过把待评判代码与标准代码作比较来得出结论。因此,笔者尝试将符合最佳实践(best practice)的代码进行可视化,从中找到一些典型的模式,再将其转化为标准的图形或标准图形的某种组合。
图形元素越多越不利于使用者记忆、掌握和理解,对于新手而言尤其如此。因此本研究中只采用圆和直线两种基本的图形实现可视化设计。其中圆形代表节点,对应一个Java类,线代表从属(包含)或继承关系。
节点的半径体现了该类的代码行数:代码行数越多的程序,对应节点的半径也越大。节点的颜色没有特别含义,仅用于区别不同的类,以实现更好的视觉效果。一种特殊的节点是根节点(root),该节点位于画面中心,是所有其他节点和关系连线依附的基础,因此其半径恒定设为3个像素。当鼠标移动到节点上方时,可以自动显示该节点名称(类名)和准确的代码行数。
线有虚实两种,虚线只用在与根节点相连的节点上,表示位于整个图形的第一层次,并非一定存在从属关系。线的粗细和长短没有意义,但对于同一节点而言,距离该节点近的节点(由较短的线连接的节点)为类的属性,而较远者(由较长的线连接)为类的方法。
将节点与关系进行组合,得到三种基本的图形模式,如下图中(1)所示。
A部分为按照JavaBean规范设计的用于承载数据的类结构。该图形模式的特点是以一个直径较大的节点为中心,周边环绕比较密集的两层小节点,且内层节点的数量大致为外层节点的两倍。该图形模式具有较高的辨识度,非常有利于使用者观察和识别。
B部分为采用继承关系实现的多种分类的类结构。其外观为一个具有一定层次结构的树枝状结构。该结构中的主要节点位于中间“树枝”的位置,并且直径较大,次要节点位于“叶子”位置,并且直径较小。
C部分为主要逻辑实现部分。该图形模式为以一个较大的节点为中心,辐射若干直径大致均匀的子节点。与A部分的区别在于没有明显的双层叶子,而且其对应比例往往不是两倍。这一部分的图形模式较为灵活,需要具体问题具体分析,但只要提供了参考标准,对照分辨并不困难。
图形的产生需要借助多种技术完成。首先利用Java编译器对源代码进行编译处理,验证基本语法;然后用自动化测试工具进行程序功能测试;接着利用JavaParser对提交的Java代码进行结构分析,生成JSON字符串;最后交由D3.js按照设定的图例进行可视化展示。
● 试验验证
为了验证本评判方法,笔者对所在学校某年级的本科Java语言课(43人)的学习效果进行检验。教师预先做出标准程序代码,并生成如图中(1)所示的标准图形。该图中的A、B、C三部分是此次测试考核的重点。观察可见标准图形中三个部分分布均匀,每部分图形均具有良好的对称性。图中(2)(3)(4)为从学生提交的答案生成的图形中选出的三幅典型对比图。
图中的(2)中,仅有X1部分与标准图形存在一定差异:该部分图形中的一个叶子节点出现了轻微畸大的情况。通过仔细分析该学生的程序代码,发现是由其类型结构设计不合理所致。
图中的(3)中,X2部分出现了较明显的畸形,可见该学生的程序实现思路存在重大偏差。通过分析该学生的程序代码发现,该部分程序实现虽然能够正确运行并通过功能测试,但结构很差,是典型的实现了全部功能但设计不达标的情况。
图中的(4)与标准图形完全不同。从该学生作业提交时间非常靠近截止时间这一现象判断,该学生提交的代码可能是应急拼凑而成。编译测试结果也表明,该学生提交的代码仅通过了编译,没有通过全部功能测试。
为了对结果进行更有效的分析,两位教师对所有学生的代码各自独立进行两次评判:第一次采用直接阅读程序代码的方式,第二次采用图形查看方式。评判结果表明,用直接阅读程序代码方式,教师平均的评判时间为37.38秒(平均265.4行Java代码),而用图形方式的教师的平均评判时间为4.01秒。两种方式下评判结果平均分差异为0.02,可以认为差异较小。
● 总结与展望
本研究是一次利用可视化方法对教学效果进行检验的尝试,从试验结果看,可以在保证评判效果的基础上,大幅度提高评判效率(约9倍)。可视化的方法不仅直观、高效,而且由于在设定标准和图形的过程中实际上已经确定了评判的重点,因此可以避免干扰因素对评判结果的影响。例如,在对程序代码评判过程中,个别代码缩进问题可能会对教师的主观评分产生较大影响,但可视化评价可以忽略这一次要问题而使得教师的注意力更加集中,从而得到更公允的评判。评判效率的提升意味着在不影响教学质量的前提下,课程的受众规模可以进一步扩大,这对于提高有限教学资源的利用率而言大有裨益。
当慕课风潮过后学者们开始反思其中存在的问题[4],可视化的评价手段有助于提高学生的学习兴趣,也能成为在线教学的有益补充。最新的软件可视化评估文献综述中也发现了对激发使用者兴趣不够重视的问题。[5]本试验中很多学生对由自己编写的“枯燥”的程序代码生成的五彩斑斓的图形产生了很大兴趣,甚至会不断修正代码以提高图形的“美观”程度。很显然,视觉上的美感和程序质量之间可以通过可视化建立起紧密联系,这方面值得展开更加深入的研究。
本文提出的思路和方法不仅可以应用于程序设计教学,还可以进一步推广到其他学科领域中去。比如对于简答或综述类问题,可以用图形化的方法进行关键词和答题结构提示,从而加快教师的评判速度,提高评判的准确率。当然,其所需技术手段和具体实現方法,仍有待进一步探索。
参考文献:
[1]Manuela Aparicio and Carlos J,Costa.Data visualization[J].Communication Design Quarterly Review,2014(03).
[2]Stephen Few.The Encyclopedia of Human-Computer Interaction,2nd Ed[M].2019.
[3](美)福勒.重构[M].北京:中国电力出版社,2003.
[4]代纪燕.学习科学视角下国外慕课发展面临的困境与挑战——以美国为例[J].中国信息技术教育,2019(05):102-105.
[5]L.Merino,M. Ghafari,C. Anslow,O. Nierstrasz. A systematic literature review of software visualization evaluation[J].Journal of Systems and Software,2018(144).