程序员如何阅读常规代码:使用眼动追踪的受控实验外文翻译资料

 2022-03-15 20:37:03

英语原文共 39 页,剩余内容已隐藏,支付完成后下载完整资料


程序员如何阅读常规代码:使用眼动追踪的受控实验

艾哈迈德·吉巴拉·迪尔克·费蒂尔森

网上发布:2016年11月21日

copy;Springer Science Business Media 2016纽约

摘要包含相同基本模式重复的常规代码已被证明会对代码理解产生影响:规则函数可以很容易地理解为具有相同功能的非常规函数,尽管它们显着更长,包括更多控制结构。 据推测,这种效应是由于利用对第一个实例的理解来减轻对模式重复实例的理解。 为了验证和量化这种效应,我们使用眼动追踪来衡量花在阅读和理解常规代码上的时间和精力。 实验对象有18名学生和2名教职员。 结果是,投入初始代码段的时间和精力确实比后者花费的时间和精力要大得多,并且可以通过指数模型对努力的衰退进行建模。 这表明句法代码复杂性度量(例如LOC和MCC)需要进行上下文敏感,例如根据序列中它们的位置减少重复段的权重。 但是,并不是重复代码段实际上越来越快地被读取。 相反,最初的代码段会得到更多的关注,并会多次查看,而后面的代码段可能只会被剔除。 此外,已经发现了一些反复出现的阅读模式,这些模式一起表明通常阅读代码远非纯线性,并且在实验对象中表现出显着的可变性。

关键词 眼动跟踪 控制实验 代码规律 软件复杂性

  1. 介绍

尽管对代码复杂性度量标准的重要性达成了普遍的一致意见,但对特定度量标准及其准确度几乎没有达成一致意见(Vinju和Godfrey2012)。 诸如代码行(LOC)和McCabe的圈复杂度(MCC)之类的句法度量标准通常主要是因为它们很简单。 这些指标是可加性和近视的:它们只是计算源代码元素而不考虑其类型和上下文。 因此,它们并不一定反映源代码的有效复杂性,也就是说,代码的特性使其很难理解。 尤其是,它们导致对结构合理的长函数的夸大测量,这些函数实际上很容易理解(Jbara et al。2014c).

在以前的工作中(Jbara et al。2014c; Jbara和Feitelson2014a)我们引入规律性作为一个新的因素来质疑经典句法度量的可加性。 规则性是代码模式的重复(例如嵌套控制语句的某种模式),模式的重复实例通常是连续的。 数字1 与Linux相比,它具有大约相同长度的规则函数和非规则函数。5 和6 显示我们的实验中使用的常规函数,用矩形表示重复的实例。

常规代码通常比实现相同功能的非常规代码长,并且如果通过像MCC这样的指标进行衡量,则代码也更加复杂,因为LOC和MCC之间存在很强的相关性。 然而,我们的实验表明,长“复杂”的规则代码不比较短的非规则代码更难理解。 有人推测规律性是有帮助的,因为一旦理解了最初的模式,模式的重复实例就更容易理解(Jbara和Feitelson2014a).

为了研究这个想法,我们进行了一个受控实验,该实验使用眼动追踪来探索程序员如何阅读常规代码,并定量测量在这些代码中连续重复投入的时间和精力。 结果的确显示,时间和精力都集中在最初的重复实例上,并且在考虑到后面的实例时减少。 这种减少可以用指数函数来模拟。

因此,像LOC或MCC这样的基于附加语法的指标可能会产生误导,因为重复实例对复杂性和理解力的贡献较小。 Weyuker在其著名的关于代码复杂度指标的理想属性的工作中已经做出了这种观察(Weyuker1988),在那里她写道:“考虑程序主体P; P(也就是说,同一组语句重复两次)。 这需要两倍的时间来实现或理解P; P作为P? 可能不会“。我们的结果使我们能够采取额外的步骤,并建议可应用于重复代码段的特定权重函数,以反映其减少的影响。 这增加了一定程度的上下文敏感度以前遗忘的句法指标。

但总体努力模型并不能说明整个故事:观察主体的阅读模式也很有趣。 我们使用眼动追踪数据来分析受试者的扫描路径,即他们如何扫描他们正在阅读的代码。 这表明程序员阅读常规代码的方式与阅读自然语言文本时采用的传统大多数线性顺序相差甚远。 相反,阅读代码似乎是按照一系列模式完成的,例如扫描它,跳过寻找想法,跳回验证细节等等。

但是,所采用的模式和顺序非常个人化。 因此,在阅读代码的总体情况出现之前,有必要在不同的环境中收集更多的数据。 这样的未来工作可以基于我们在分析阅读常规代码时所包含的方法论基础,包括已确定的基本模式以及使用平滑从原始眼动追踪数据中消除噪音并使图案更加明显。 预计这些方法创新不仅适用于常规代码,而且适用于一般学习代码阅读。

应该指出,MCC并不是普遍被认为是一个很好的复杂性度量标准,并且它在理论和实验两方面都受到了挑战。 但是,没有其他的复杂度度量被广泛接受并且没有这种批评,所以MCC在今天仍然被广泛使用。 关于它多年来所受批评的总结可以在我们以前的工作中找到(Jbara et al。2014c).

2.动机和研究问题

代码复杂性的一个重要方面是单个函数的复杂性,因为开发人员通常关注每个编程或调试任务的一小部分函数。 已经提出了大量度量函数复杂度的指标,但它们都不能完全反映源代码的复杂性(Fenton和Pfleeger1998; Nagappan等人2006)。 在以前的工作中,我们提出规律性是影响代码理解的一个附加因素,尤其是在长功能中,并为其意义提供了实验证据(Jbara et al。2014c; Jbara和Feitelson2014a)。 具体而言,我们进行了一些实验,要求开发人员了解功能并对其执行维护任务,其中不同主题实际上在同一功能的不同版本上工作。 因此,我们可以评估开发人员性能与函数编码风格之间的关系。

在继续之前,我们会对术语进行澄清。 规则性是指根据(可能嵌套的)控制语句具有相同结构的代码段序列。 这些序列很可能是由使用复制粘贴的开发人员生成的,然后根据其特定角色编辑序列中的每个实例。 这可以被认为是代码克隆的特例。 代码克隆通常被认为是不好的做法,因为需要始终保持单独的克隆,并且因为它可能导致代码膨胀。 这些问题与常规代码无关,因为实例通常相对较小并且位于同一地点。 因此,我们认为,规则性应该被视为一种独特的编码习惯,不要与克隆混淆。

按照定义,常规函数包含重复的代码段,这些代码段通常会一个接一个地出现。 这表明了解其中的一个细分将有助于理解后续细分。 基于此,我们假设第二部分需要的认知努力比第一部分需要的认知努力要少,并且随着开发者在重复部分序列中的继续,所需的努力变得更小。 在几个细分市场之后,可能预计额外的努力甚至可以忽略不计。

因此,我们的主要目的是研究开发人员阅读常规代码的方式,以及他们是否在重复代码段中投入相同的努力。 此外,如果努力确实不尽相同并且不断下降,我们希望找到反映该细分市场的连续位置与理解它所需努力量之间关系的模型。 通过合理假设投入的努力反映了遇到的困难,这样的模型可以作为一个好的依赖于上下文的权重函数,用于考虑所有重复部分具有相同影响并因此产生夸大度量的度量。 另外,我们使用这项研究来验证我们以前的工作是可重复的。 具体而言,这是一个“内部复制”,因为它由同一研究人员进行(Brooks et al。1994)。 我们也使用了和我们以前的研究完全一样的功能,并比较了阅读正规课程的学科与非正规课程的表现。 然而,实验背景是不同的(使用眼动仪与纸基组实验进行一对一实验),当然实验科目本身是不同的。

回顾一下,本文讨论的具体研究问题是:

1.开发人员是否需要理解常规代码时遵循任何模式? 特别是,他们的努力是否在正规部门之间平等分配?

2.假设有一种模式来管理努力的投资,哪种模型可能适合并描述它?

3.努力的分配是否能够说明整个故事? 换句话说,代码是线性读取的,只有重复的时间可能会改变,或者阅读模式更复杂?

4.在正确性和完成时间方面,结果与我们以前的工作(Jbara和Feitelson)是一致的2014a)?

在回答这些研究问题的基础上,本文做出以下主要贡献。 第一个也许是最明显的是与代码复杂性度量相关的方法论贡献,特别是LOC和MCC等常见度量标准。 在这方面,我们做出了两项创新贡献:

就我们所知,我们关于规则性的工作(在本文和前面的文章中)是MCC和LOC在明确衡量理解度和与这些度量的关系方面的第一个实证研究。

本文还建议首次以经验为基础的修正只是计算构造。 具体来说,如果代码是规则的并且包含相同模式的重复,我们建议他们对整体功能复杂性的贡献应该根据它们在序列中的位置而具有递减的权重。

其次,就回收信息以及从业者如何利用我们的结果而言,我们注意到常规代码通常“看起来很糟糕”,似乎违背了编写短函数,减少克隆和提取函数的公认的最佳实践。 但是我们通过实验证明,这样的代码不一定有不利影响。 因此,从业人员可以放心地使用常规风格(如果他们认为这是他们既定编程任务的自然风格),则可以使用,而不会对代码理解产生任何不良影响。 相反,在编程任务提出定期解决方案的情况下,如果程序员确信不推荐定期解决方案,他们可能会被迫使用非自然非定期解决方案,这可能会导致理解困难未来维护任务中的代码。

第三,在科学层面上,本文扩展了我们以前的规律性工作,部分解释了开发人员如何应对实际系统中的高MCC功能。 事实上存在很长的函数(迄今为止我们观察到的最大函数是FreeBSD操作系统中的MCC = 1316的函数)。 我们现在知道开发人员可以处理它们,尤其是当代码包含重复模式时,不会严格审查所有代码。

第四,我们在研究通用代码阅读模式领域取得了进展。

这包括两个独立的贡献:

一个是重新确认之前已经识别的各种代码阅读模式的发生,并提出一些额外的代码。 这是能够使用原始模式的基础来描述代码读取的另一步骤。

另一种是建议平滑原始眼动追踪数据以更清楚地显示出模式。 平滑过程是非任意的,并且基于分析在不同感兴趣区域中的停留时间。

3.方法论方法

3.1 测试程序

我们使用图像处理领域的两个程序(表1)。 每个程序有两个版本:常规和非常规使用的程序的规格是:计算所有像素周围的3times;3个邻域的中间值,并找出围绕一个点的最大曼哈顿半径,使得该半径内的所有像素具有相同的值。 这些节目来自我们以前的作品(Jbara和Feitelson2014a),并且它们符合以下实验标准:

已知域的现实程序。

相同规格的合理定期和非定期实施。

非平凡的规格。

我们可以在两个实现中使用一个程序,但我们更喜欢两个程序来避免程序特定的结论。 我们不使用更多,因为每个版本都很难获得足够的实验主题。

为了量化不同版本的规则级别,我们使用基于压缩的可操作定义。 这种选择是基于认识到压缩算法识别其输入中的重复并用较短的编码替换它们。 我们系统地研究了不同的压缩方案和代码预处理级别(Jbara和Feitelson2014; Jbara等人。2014c),并发现不同的组合产生不同的结果。 与感知复杂性相关性最好的组合(开发人员如何主观评估函数的复杂性)是将代码剥离为关键字和格式的骨架,并使用gzip压缩例程。 然后通过压缩比对规律性进行量化。 可能的替代指标及其评估留待未来工作。

3.2 眼动仪

我们使用Eye Tribe眼动仪(www.theeyetribe.com)在这项工作中。 该设备使用摄像头和红外LED。 它以60Hz的采样率运行,60Hz模式下的延迟小于20ms,精度为0.5\-1\。 该设备支持9,12或16点用于校准过程。 我们使用了9点模式。 屏幕分辨率由1024设置为1280,源代码使用Consolas 11字体以全屏窗口显示,其物理尺寸为15 x 12英寸。 左边距约为120像素,最高边距约为35。

眼部是一个远程眼睛跟踪器,因此它为受试者提供非侵入式工作环境,这对于可靠的测量来说是必不可少的。 此外,该设备允许在真实实验过程中进行头部移动,但不进行校准。

为了分析跟踪数据,我们使用OGAMA(www.ogama.net)。 它是一款专为分析眼睛和鼠标移动而设计的开源软件。 OGAMA支持许多像Tobii这样的商业眼动仪。 在其最新版本(4.5)中增加了对Eye Tribe的支持。 此内置支持使该过程更轻松,并节省了系统间数据的导入。

3.3 任务设计

基本上,我们采用了我们以前的工作(Jbara和Feitelson)的方案和实验2的任务2014a)有一个区别。 在我们以前的工作中,每个科目按顺序执行相同的任务(理解程序做什么),以及一个程序的常规版本和另一个程序的非常规版本。 在这项工作中,我们遵循主题间设计,其中每个主题仅在一个版本上执行任务。 这项设计决定是在一项试点研究的基础上进行的,在这项试验研究中,受试者声称执行两个节目非常困难,特别是当你必须长时间注视屏幕时(Wang et al。2006).

除了回答理解问题这个项目做了什么以外,还要求受试者评估5分制代码的难度,并说明评估的原因。

为每位参与者提供了一个实验后问题,了解他们接近程序的方式,目标是了解他们的工作如何在代码中分布以及为什么。 回顾性的,事实证明,这个后实验问题很重要,因为有些情况下眼动数据不符合参与者的意见。

3.4 正确分级解决方案

在对我们跟随Kerin等人的受试者的解决方案进行评分时, (2011),Cornelissen等人 (2011)和Shneiderman(1977)。 具体而言,我们采用了三个评估员参与的多通道方法。 最初,第一作者根据个人规模评估答案。 在第二次通过时,另一位同事评估了答案。 但是,在少数情况下,两次评估之间存在较大差距。 为了解决这个问题,第二作者对这些案件进行

全文共7295字,剩余内容已隐藏,支付完成后下载完整资料


资料编号:[16182],资料为PDF文档或Word文档,PDF文档可免费转换为Word

原文和译文剩余内容已隐藏,您需要先支付 30元 才能查看原文和译文全部内容!立即支付

以上是毕业论文外文翻译,课题毕业论文、任务书、文献综述、开题报告、程序设计、图纸设计等资料可联系客服协助查找。