没有合适的资源?快使用搜索试试~ 我知道了~
理论计算机科学电子笔记166(2007)93-109www.elsevier.com/locate/entcs一种基于变化的软件演化方法Romain Robbes and Michele Lanza罗曼·罗伯斯和米歇尔·兰扎1,2瑞士卢加诺大学信息学院摘要软件演化研究受到研究人员可用信息量的限制:当前的版本控制工具并不存储开发人员生成的所有信息。它们并不记录发布的系统的每个中间版本,而只是在开发人员将源代码提交到存储库时拍摄的快照。此外,大多数软件演化分析工具不是日常编程活动的一部分,因为分析工具是资源密集型的,并且没有集成到开发环境中。我们建议将开发信息建模为更改操作,我们直接从开发人员正在使用的编程环境中检索这些更改操作,同时他们正在对系统进行更改。这种准确和增量的信息为开发人员和研究人员探索和发展复杂系统开辟了新的途径。保留字:软件演化、版本控制系统、IDE1引言软件演化研究的目标是利用软件系统的历史分析其现状并预测其未来发展[11],[5]。 等分析需要关于系统的信息以给出关于其历史的准确洞察。传统上,研究人员从版本控制系统中提取数据,因为它们的存储库包含开发人员生成和修改的工件我们认为,存储在版本控制系统中的信息是不够完整的,以执行更高质量的进化研究。由于软件系统的过去的发展不是大多数开发人员的主要关注点,因此在设计版本控制系统时,它不是一个重要的需求。它们支持语言独立性、分布式和高级合并能力等特性。1电子邮件:romain. lu.unisi.ch2电子邮件:michele. unisi.ch1571-0661 © 2006 Elsevier B. V.在CC BY-NC-ND许可下开放访问。doi:10.1016/j.entcs.2006.06.01594R. Robbes,M.Lanza/Electronic Notes in Theoretical Computer Science 166(2007)93我们需要向开发人员证明,通过改进我们的工具在他们日常过程中的集成,软件演化研究的结果对他们立即有用。大多数工具都是为“事后”使用而定制的,即一旦主要开发结束,在添加新功能之前。 常见的方法是从存储库中下载多个版本并同时处理它们。这表明增量处理是有限的,并且计算时间长且资源密集。我们需要提供更多的增量的、轻量级的方法,开发人员可以在他们的工作中使用本文介绍了我们的方法来解决准确的信息检索和开发人员使用进化工具的问题。我们认为最准确的信息来源是开发人员正在使用的集成开发环境(IDE)。通过将我们的工具挂钩到IDE中,我们可以在发生演化时捕获演化信息,以增量的方式处理它,并与环境交互以提高工具的可用性。 我们的方法是基于开发人员应用于系统的变更模型,因此将变更视为第一类实体。从这个意义上说,我们不区分系统和在其上执行的更改,即, 软件工程是软件进化的一部分。论文的结构:第2部分扩展了我们提出的问题的性质和后果。第3节介绍了我们的替代方法。第4节描述了SpyWare的实现状态,我们的原型。第5节描述了如何在实践中使用这样的模型,以及如何在一个增量的、基于变化的世界中陈述和解决问题。第6节概述了一些初步结果,而第7节总结了论文。2当前软件演化为了进行有效的进化研究,需要关于所研究系统的准确数据。 尽管有这种需求,社区用来收集数据的工具确实 不能提供这样准确的信息。 大多数数据恢复策略的核心是系统开发人员使用的版本控制系统选择从中提取数据的版本系统的主要标准是它版本化了多少系统,尤其是开源系统:开发者允许免费访问他们的软件库。最大的开源软件系统(Mozilla,Apache,KDE等)使用CVS或Subversion,因此研究人员编写工具从这些存储库中收集数据2.1信息收集在以前的研究中[14],我们发现,目前使用的大多数版本控制系统(包括CVS和Subversion)确实丢失了大量关于系统版本的信息。我们确定了两个主要的正交原因:大多数版本控制系统是(1)基于文件的,(2)基于快照的。基于文件的系统。这些系统中的大多数仍然在文件级运行,因为这保证了语言独立性。另一方面,它涉及额外的工作R. Robbes,M.Lanza/Electronic Notes in Theoretical Computer Science 166(2007)9395为了提高系统使用的编程语言的抽象级别[16],[9],因为收集的信息是模糊的:• 关于系统的语义信息分散在大量的文本文件中:没有内置的程序结构的中央存储库,它必须手动创建。• 在系统的多个版本中跟踪程序级(而不是文本级)实体是很困难的,因为它涉及到解析整个系统的多个版本,同时考虑到诸如由于重构而导致的文件和实体的重命名等事件。因此,一些分析是在已经采样的数据上进行的[7],[8]:由于时间和空间的限制,只选择了一个子集的版本。这增加了每个版本之间的更改,并使跨版本链接实体变得更加困难,因为它们更改的概率更高。其他分析完全不解析文件,而是基于更粗粒度的信息,如行数或目录大小[4],[6]。基于快照的系统。软件的连续版本之间的更改由开发人员存储在显式请求(称为提交)中。两次开发人员提交之间的时间差别很大,但通常是几个小时或几天。两次提交之间发生的事情永远不会存储在版本控制系统中,我们必须处理降级的信息:• 由于提交是根据开发人员的意愿完成的,因此可以在一次提交中引入几个独立的补丁或功能添加,这使得它们很难区分• 每个更改的时间信息被减少到执行提交的时间:除了提取系统两个版本之间的差异的任务之外,导致这些差异的更改的确切顺序的所有信息都丢失了。2.2信息丢失Example. 图1中的示例显示了这种信息丢失如何显著降低关于系统的推断知识。在这个简单的场景中,开发人员启动了一个简短的重构会话,在其中他重构了方法doFoo。他(1)在新方法bar中提取了一个语句块,(2)在整个系统中用访问器替换了对实例变量x和y的直接访问,(3)将doFoo重命名为baz,替换了代码库中对doFoo的所有引用。然后他提交这些更改。这是一个非常小的提交,不到一分钟的工作,因为在当前的IDE中,所有这些重构操作都可以是半自动化的。提交通常意味着比这个简单示例更大的更改集。根据从版本控制系统收集的信息,96R. Robbes,M.Lanza/Electronic Notes in Theoretical Computer Science 166(2007)93提取方法方法创建访问器?提交之间更改的行重构之间的区别public int x;public int y;publicintfindDuplicate(){intfindDuplicate();}public intfindDuplicate(){}public intfindDuplicate(){}private bar(z){ blu =blu * 2; t =blurg(z);bli[t] = blu;return t;}}foo = newFoo(); f.intn();print f.x + f.y;public int x;public int y;public booleanalert(){boolean alert();booleanalert();}public intfindDuplicate(){}public intfindDuplicate(){}private bar(z){ blu =blu * 2; t =blurg(z);bli[t] = blu;return t;}}f = new Foo(); f.doFoo(); print f.x+ f.y;public int x;public int y;public booleanalert(){boolean alert();blu = blu * 2;t = blurg(z); bli[t]= blu; returnt;}public intfindDuplicate(){}public intfindDuplicate(){}}f = new Foo(); f.doFoo(); print f.x+ f.y;class Foo {int x;privateint i;public int getX(){ return x; }public setX(newX){ x =newX;}public int getY(){ return y; }public int getY(newY){ y =newY;}public void run(){blah.blah(blah);intgetX();return bar();}public void run(){returngetY();}public void run(){returngetX()+getY();}public void run(){blu = blu * 2;t = blurg(z); bli[t]= blu; returnt;}}return new Foo();f.baz. add();int findDuplicate();图1.一、简单的重构场景导致演化信息丢失。物理变化3:• 方法doFoo改名了,现在明显更短了。这使得很难检测新方法baz是否真的是doFoo的同一个实体。一个简单的分析可以得出结论,doFoo方法消失了。• 有几个新方法:bar、baz和访问器方法getX、getY、setX、setY。• 有几个方法的实现被修改,因为doFoo和访问器的引入,可能分散在几个文件中,3请注意,下文所述的更改是方案一级的更改。如果使用的版本控制系统是基于文件的,则需要首先将其提升到该级别R. Robbes,M.Lanza/Electronic Notes in Theoretical Computer Science 166(2007)9397整个代码库。在这个例子中,只有重构-对系统的逻辑更改是微不足道的,但是这个提交引起了许多物理更改:以代码行来衡量它的重要性被夸大了。 如果没有复杂而耗时的分析[16],一些实体(如doFoo)就会丢失,即使它们仍然存在于代码库中。 另一方面,使用这种耗时的分析使得将这些工具集成到日常活动中变得更加困难。此外,上面描述的简单场景假设开发人员每工作几分钟就提交一次。 实际上,它更多的是在小时的顺序。 变化的数量会更大,变化会被稀释得更多 更少的可恢复性。2.3缺乏整合软件演化分析社区收集信息的方式已经塑造了它的工具,使其具有类似的功能。从版本存储库中获取信息的典型过程是:(1)从存储库中下载一组版本,(2)为每个版本构建程序表示,以及(3)尝试链接实体的连续版本。这种方法显然只适合于流水线活动,因为即使使用抽样,也是耗时的(在大规模系统中需要数小时或数天才能完成)。目前,正向和逆向工程是两个非常不同的,独立的活动。在实际应用中,逆向工程是由专门的顾问在时间限制下对未知系统进行操作为了更好地适应开发人员,软件演化工具在本质上需要是增量的,并且可以从IDE轻松访问。当开发人员在系统的较小部分上工作时,工具需要关注较小规模的更改,并向外部人员(如项目经理)提供系统的“大画面”视图。随着敏捷方法论的出现,所有这些必要性变得更加重要,例如极端编程,它提倡在代码库中持续重构和更改2.4我们方法我们的方法,在接下来的部分中介绍,源于以下观察:• 版本控制系统不是检索信息的好来源,因为它们将更改存储在文件级别。它们还在提交时存储更改,从而产生太粗粒度的更改。• 现在越来越多的开发人员使用IDE,它提供了丰富的信息和工具,使开发更加有效,并增加了系统的变化率。98R. Robbes,M.Lanza/Electronic Notes in Theoretical Computer Science 166(2007)93• 为了使演化工具获得认可,它们必须(1)适应这种变化率的增加,(2)被开发人员自己作为日常活动的一部分使用,(3)能够专注于小型和大型实体,以及(4)支持信息的增量更新,因为一天的信息检索阶段是日常使用的一项重要任务3进化的另一种方法我们的方法基于两个概念:(1)IDE集成,以记录尽可能多的信息,并允许轻松访问我们的工具,以及(2)基于第一类更改操作的模型,以更好地匹配软件开发的增量过程。3.1将IDE用作信息源大多数程序员使用IDE来完成日常任务,因为它们是功能强大的工具,支持半自动重构,增量编译,单元测试,高级调试,源代码控制集成,快速浏览系统等。它们中的大多数是可扩展的插件系统。IDE之所以能够做这么多事情,是因为它们拥有关于开发人员及其系统的大量信息。能够浏览或重构系统已经意味着有一个具体的程序模型。因此,我们提倡将我们的工具集成到IDE中,并使用IDE本身作为演化信息的来源,而不是版本控制系统。工具集成提高了可见性,是在开发人员的工作流程中使用它们的第一步。 使用IDE作为信息的来源,是我们能够最接近地理解开发者意图的地方大多数IDE都具有事件通知系统,因此工具可以对开发人员正在做的事情做出反应。 当类被编译时,或者当方法重新编译。我们提出的方法使用这些IDE钩子,当开发人员通过创建定义为第一类更改实体的数据来修改系统时,它们会做出反应。3.2一级变更主体第一类变更实体是按照增量方式构建系统的对象,用于对系统的历史进行建模。它们包含的信息可以重现它们代表历史的程序。当执行时,它们产生它们在某个时间点所表示的程序的抽象表示。它们还包含进化研究人员感兴趣的其他信息,例如何时以及谁执行了哪些改变操作。传统的方法将程序的历史建模为一系列版本。这是内存消耗,因为系统的大部分部分不会改变,只是在版本之间复制。这就是为什么大多数方法都包括一个抽样步骤,旨在通过选择其中的一小部分来减少版本的数量。因此,该采样步骤增加了连续版本之间的变化,R. Robbes,M.Lanza/Electronic Notes in Theoretical Computer Science 166(2007)9399细粒度的分析更加困难。相比之下,我们的方法只存储版本之间的程序级差异,并且能够在任何时间点再现程序。变更操作还可以更准确地模拟开发人员思考系统的方式。 如果开发人员想重命名一个变量, 考虑用新方法替换所有引用它的方法,即使这是IDE最终要做的:对系统进行增量修改建模可以简化其理解。文献表明,一些版本控制系统已经尝试了基于更改而不是基于版本的版本控制方法[12] [13]。然而,这些方法只关注合并,而我们的模型更通用,并允许以各种方式使用更改操作。我们还认为,通过不替换版本控制系统层,而是对其进行补充,我们的方法将遇到更少的阻力。虽然我们用第一类变更操作来模拟程序演化,以简化逆向工程,但我们相信它对正向工程也很有用。大多数最终用户应用程序都有一个撤销机制,但大多数程序编辑器在语义级别上都没有提供一个合理的机制。一流的变更操作可以实现这一点,从而通过试验和错误促进探索性编程。 第一类变更实体也可以简化任意程序转换以促进程序演化,遵循与半自动重构相同的方案[15]。总而言之,我们的方法包括以下步骤:(i) 使用IDE的挂钩来通知开发人员活动。(ii) 通过创建表示开发人员正在执行的语义操作的第一类变更对象来(iii) 执行这些更改对象以在任何时间点移动程序表示。优势 这种替代方法相对于从存储库收集数据和执行离线分析的优点如下:• 精度在事件发生时对它们做出反应,比存储在版本控制系统中的信息更准确。时间戳更精确,而不是减少到提交时间。事件一个接一个地发生,给了我们更多的背景来处理它们,而不是我们必须处理一批它们,起源于一整天• 增量。维护模型的语义表示要容易得多。 源自IDE的事件是高级事件。 它们的粒度是类和方法,而不是文件和行。 只有在方法级别才需要代码解析。• 纹理细密每一个程序实体都可以被建模,并沿着其版本跟踪,如果需要的话,可以跟踪到语句级别。没有状态重复,当实体在几个版本中不改变时,导致空间经济。100R. Robbes,M.Lanza/Electronic Notes in Theoretical Computer Science 166(2007)93• 灵活性. 使用更改对象可以很容易地在时间上进行回溯和前进。 它导致 对代码库进行更多的实验,减轻开发中的缺点. 我们已识别我们的方法可能存在的问题及影响:• 验收进化研究人员使用CVS,尽管它的缺点,因为它是大多数开发人员使用的版本控制系统。Subversion是一个新的版本控制系统,因为它足够接近CVS。因此要想成功我们需要尽可能少地偏离人们• 验证。我们的方法需要通过案例研究进行评估。我们正在监控我们的原型本身,但如果没有“真实世界”的案例研究,我们不确定性能约束。我们的方法最适合新项目。这限制了可能的案例研究。然而,第6节显示了几个小规模案例研究的初步结果。• 范式转换。这种解决各种问题的渐进方法需要新的工具和新的实践来定义。• 适用性。我们的方法是特定于语言的,这比传统的基于文件的方法需要更多的努力来适应新的语言。 然而,在这方面, 我们当前的原型实现被分成独立于语言的部分和依赖于语言的部分。只有后者必须适应其他语言/IDE。为了解决接受问题,我们可以将我们的工具集成到主流IDE中,比如Eclipse,它具有插件机制。系统的监控部分不具有侵入性,用户看不到。可以通过创建一个“sync”文件来跟踪会话或程序员位置之间的数据,该文件将成为当前项目的一部分。版本系统本身将用于广播和同步信息。4我们的原型:SpyWare我们的想法在一个名为SpyWare的原型中实现,该原型是用Squeak编写的[10]。它通过使用位于IDE钩子上的事件处理程序来监视开发人员的活动,并根据Squeak IDE中发生的事件生成更改操作图2是我们的原型的一系列屏幕截图它显示了我们监控的一个项目的演变(在高级程序度量方面,例如类、方法、语句的数量和语句中方法的平均大小)。示出了放大前一曲线图4的峰值的相同曲线图。还显示了系统的两个不同视图上的两个代码浏览器:一个在峰值期间(底部),一个在峰值之后(顶部)。两个景点相隔约半小时。我们清楚地看到,顶部的类比底部的类少,与蓝色峰值一致。如顶部浏览器中的滚动条所示,4由于我们目前使用的曲线缩放算法,缩放后的视图与前一个视图不完全相同R. Robbes,M.Lanza/Electronic Notes in Theoretical Computer Science 166(2007)93101在以后的版本中有更多的方法到目前为止支持的低级别更改如表1所示。它们可以在更高级别的更改中组合;表4中列出了其中一些。更改类型包类方法可变声明创作XXXXX此外XXXXX去除XXXXX重命名-X---超类变更没有X没有没有没有属性更改XXXXX重构-----表1SpyWare支持的更改图二. SpyWare的UI具有交互式可视化、版本浏览和统计数据(未显示)。项目:项目一。类的数量(蓝色);方法的数量(红色);语句的数量(青色);平均非访问器方法大小(洋红色)SpyWare将这些更改操作与程序实体相关联,直到状态级别。可以跟踪对单个语句的更改。实体是唯一102R. Robbes,M.Lanza/Electronic Notes in Theoretical Computer Science 166(2007)93独立于它们的名称进行识别:重命名是一个简单的操作。SpyWare还可以通过应用或恢复更改操作,在任何时间点生成它正在监视的程序的源代码。它还具有对历史的交互式可视化的我们未来的工作包括定义和检测更高阶的变化,如重构,或监控程序的不同特征,这些变化来自我们已经定义的基本构建块。SpyWare目前是单用户的:我们计划很快使其成为多用户。5基于变化的软件演化我们相信我们的方法有可能解决逆向和正向工程中的一些问题,因为IDE集成使两个活动之间的对话更加自然。促进程序理解。处理更细粒度的变化将使我们能够更准确地检测和描述变化。存储对代码执行的所有重构将使我们能够跟踪特定实体的整个生命周期,即使在重命名和移动之后。我们还认为,可以将更改描述为错误修复,重构或功能添加,并且这些信息将允许通过将其置于上下文环境中来集中分析特定更改。我们的模型允许我们以任意方式(使用属性或注释)对更改和实体进行特征化或分类。这个功能也可以用来简化代码的理解。与经典的版本控制系统不同,在经典的版本控制系统中,分支是固定的,并且在修改之前就已经建立好了,我们的模型允许在审查变更的同时修改变更的属性。 需要分组的更改可以 为了更容易处理而标记记录系统的完整历史允许通过在周围修改的上下文中检查其引入和修改来细粒度地理解专用代码段,例如,知道一行代码是从方法的开始还是很晚才出现是很有用的。促进程序的发展。第一类变更对象可以通过网络广泛传播,以提高对变更的感知和响应,从而为开发人员提供其他开发人员正在做什么的洞察力。这样一个系统会告诉他们,如果他们的变化是相互冲突与其他人的变化。这将有助于避免漫长而痛苦的合并阶段。基于更改的操作加上实体级跟踪将简化重构,例如,在我们当前的模型中,实体的名称只是一个属性:重命名 而不是一个完美的身份。合并反向和正向工程。 更高级的语言和工具促进了更快、更容易的功能实现,这转化为更高的系统更改率。因此,一些逆向工程活动需要在较小的规模上进行,但需要更高的频率和准确性,以便在恢复工作之前跟踪系统中最近修改的内容R. Robbes,M.Lanza/Electronic Notes in Theoretical Computer Science 166(2007)93103在其中的一部分。系统的两个版本之间的更改操作可用于生成自动和交互式更改日志,以使其他开发人员加快 开发人员所做的更改6初步结果为了证实我们的观点,我们需要收集一些支持我们假设的数据。由于之前没有系统记录过如此详细的信息,因此我们不能依赖预先存在的软件存储库作为数据源。因此,我们必须设计一个过程来收集我们需要的信息,并找到一些适当的测试对象。我们的原型目前正在自我监控,因此可以将其用作案例研究,但我们希望外部开发的软件尽可能公正 在我们的第一个案例研究中。6.1案例研究设置和描述由于我们学院的课程包括几个项目,我们选择使用学生生成的数据进行案例研究。在第二学期的课程中,学生必须在Smalltalk中编写一个为期一周的配对项目。一个班22名学生中,有11对组成。 每对选手必须从这三个题目中选择一个• 一个类似亚马逊的虚拟商店,用户可以在这里购买书籍、CD、DVD等。• 一种几何程序,可以对不同的基本三维形状(如立方体、金字塔等)执行各种数学函数。• 一个简单的基于文本的角色扮演游戏。 用户扮演一个必须流浪的英雄一个地牢,寻找一些宝藏,同时以回合制的方式与怪物战斗。由于这个项目的开放性,选择这个项目的人最终会有更多的代码和更复杂的设计。选择的主题很简单:项目的目标是让学生深入了解面向对象的设计,以及面向对象编程的关键概念,如组合,继承和多态性,如何在实践中使用。为了收集数据,我们为学生量身定制了编程环境。 他们的环境包括我们的原型的监控部分,在当前的版本中,它定期将新的更改作为文件上传到FTP服务器。 它还包括一份通知,说明他们参与了这样的实验。结果如下:在11个项目中,9个项目包含适当的数据,在此列出。其他两个要么选择使用另一个编程环境来实现他们的项目,要么选择使用我们提供的环境的旧版本,其中发送给我们的信息具有稍微不同的格式。104R. Robbes,M.Lanza/Electronic Notes in Theoretical Computer Science 166(2007)936.2定量数据分析本节概述了我们在项目中发现的数据类型,高层次的视角。在每个表格中,每个项目都用一个字母表示,从A到I。项目类型开始端持续时间埃什奥尔特变化每小时变化一几何2006/03/2715点02分-2006/04/0320:06-7天5小时43.5小时192344.2B店2006/03/27十一点二十七分-2006/04/03二十点三十七分-7天9小时11 H30527.7C店2006/03/2713时06分-2006/04/01十八点二十一分-5天5小时25.5小时80031.4D店2006/03/27十一点二十八分-2006/04/0116时09分-7 d4.5小时22 H60927.7E店2006/03/27十一点半-2006/03/30十九点零五分-3 d7.5小时15 H38825.9FRPG2006/03/27十一点二十八分-2006/04/04十二点零四分-8个d0.5小时21 H74135.3G几何2006/03/2717点06分-2006/04/03二十三点十七分-7天6小时27.5小时83630.4H店2006/03/27十一点四十五分-2006/04/03二十二点四十五分-7 d11 h14 H49035.0我RPG2006/03/27十一点二十九分-2006/04/0323点36分-7 d12小时48 H124726.0表2每个项目的持续时间(从记录的第一次变更到最后一次变更在表2中,我们可以看到学生在这些项目上花费的时间,从略多于10小时到近50小时不等。考虑到这些学生应用于其系统的相关更改数量(从400到2000个高层次的变化,意味着更高数量的低层次的变化),我们认为这是一个强有力的理由,以改变为基础的方法:我们测量了CVS提交的平均数量,源项目,并指出其中大多数项目平均每个工作日只有略多于1个提交,即,8小时简而言之,像CVS这样的版本控制系统的变更信息丢失程度令人印象深刻。这也反映在“每小时更改数”指标中:每小时更改数从26到45不等。如果学生们每小时存一次钱表3显示了在项目期间创建的实体数目。我们还可以看到粗体显示的是系统交付给我们进行分级时剩余的实体数量。表4总结了在每个系统上进行的变更类型从这两张表中我们可以看到项目稳定性的一些趋势:项目A、C、G,以及所有其他项目在项目结束时都有超过85%的新增实体仍然存在,项目B和项目E是最稳定的(分别为89%和91%)。根据表4,项目B、E和F是最稳定的项目,它们具有一些调用良好维护实践的事件:类被重命名和注释。R. Robbes,M.Lanza/Electronic Notes in Theoretical Computer Science 166(2007)93105实体类型一BCDEFGH我包7/72/21/12/22/22/2四分之四2/27/7类十九/二十三十三/十四11/148/9十三/十三15/17十六/二十一10/1228/43实例变量32/8012/19十六/二十九14/19十八/二十42/55十八/二十九24/2972/107类变量0/零0/零0/2个0/零0/零0/零十二/四十三0/零1/1方法157/33198/11677/144 129/158 109/121 205/242 105/212 一百一十四/一百三十五308/405论点65/65二十一/二十一35/3586/8616/1681/81十七岁32/3260/60临时人员209/239七十一/七十二54/85100/118七十三/八十一一百二十四/一百三十四31/45七十一/八十二142/157持续率百分之六十九百分之八十九百分之六十二百分之八十六百分之九十一百分之八十八百分之五十四百分之八十七百分之七十九表3项目规模的高级指标:实体最终数目/实体变化类型- 项目一BCDEFGH我添加类22141491215211248改进的类别65173413624571527课堂评论0120010000重新分类-rized0050000011班级更名000011001删除类10155036218添加的属性8219291920613029137属性重新移动50713521915554添加方法366119182164117237219135415改良方法2346911714081154143118185方法回顾8201234336421删除方法190208132133811721106表4变化类型另一方面,项目C和I的特点是几个类被重新组织,例如改变包。 这预示着更重要的重组 本项目6.3定性数据图3显示了从2006年3月27日到2006年4月4日这九个项目的演变情况。在左边,我们可以很容易地通过它们的形状来识别和描述会话。与右图相比,在右图中,每个编码会话之后都绘制了一个点:不可能从它来描述会话。我们在这个图中看到了几106R. Robbes,M.Lanza/Electronic Notes in Theoretical Computer Science 166(2007)93种类型的会话,每种会话都有不同的视觉模式:• 会话S1是阶梯形的:在短时间内添加许多方法,几乎没有一个被移除。这表明程序员在本次会议期间有一定的专注力和效率。R. Robbes,M.Lanza/Electronic Notes in Theoretical Computer Science 166(2007)93107我FS1S4S2DAHECBCGS3图三. 左:所有项目的方法数量的可视化。 右:在每个编码会话之后模拟相同的度量。项目:A(红色); B(青色); C(蓝色); D(洋红色); E(棕色); F(橙色); G(黄色); H(黑色); I(绿色)。• 会话(如会话S2)停滞:增长缓慢,偶尔会删除一些方法。这表明一种更为谨慎的方法,在这种方法中,要遵循的道路不像楼梯形会议那样清晰。 如果某些方法在此会话期间被修改多次,则这可能是一个bug修复会话,在找到正确的修复之前需要多次尝试• S3期是一个过山车期。 Session S3和类似的功能很多移除方法:这表示清理(例如在项目结束时,在交付之前)或功能的重新分配:如果会话以急剧增加(如S3)结束,则可能表示从删除的类复制到另一个类,或者通过复制/粘贴和修改,或者通过代码重写。• 最后,像S4这样的会话可以被认为是专注于bug修复的会话:经过一段时间的评估,程序员专注于一个问题,并在一个快速的会话中解决它。通过对编程会话的这种分类,我们可以限定每个项目的演变:一些项目的特点是大量的楼梯形会议。项目B、D、E和H的此类会议占绝大多数,而项目F和G的此类会议也相当多。项目F和G也有一些“过山车”形状的会议,其中发生了一些重组,但设法保持相当集中,直到项目结束。项目B、D、E和H是“虚拟商店”类型的项目,比几何和角色扮演项目更容易设计和实现:领域定义得更明确,项目不像其他项目那样开放。这解释了学生编程的重点和效率。三个项目的行为不同:项目A(几何),C(虚拟商店)和I(角色扮演游戏)。项目C有几个108R. Robbes,M.Lanza/Electronic Notes in Theoretical Computer Science 166(2007)93执行不像其他项目那样直接。它还具有接近尾声的清理阶段。项目I在开始时有两个“过山车”会议,指示可供选择的设计倾向:一个尖峰非常高而细,然后系统的大小急剧上升。其他会议要么停滞不前,要么在停滞和楼梯形之间徘徊。在那些时期,设计和实施更难确定。项目A的曲线是所有曲线中最复杂的:它的特点是在开始时有一个延长的过山车,然后是一个系统相当停滞的阶段,在项目结束时又有一个过山车,以一些清理结束。这个项目的特点是结合了好的扩展思想(使用图形用户界面)和糟糕的设计选择(主继承树使模型类从用户界面类继承为了结束这项研究,我们对图3的右侧进行了评论。 在它中,显示的数据曲线与左侧相同,但有以下例外:它的绘制方式就好像数据是在每个编码会话结束时收集的,而不是在每次更改之后。事实上,它模仿了我们从主流版本控制系统(如CVS)中获得的数据类型。我们可以清楚地看到,我们不可能在如此低的数据质量下进行深入的分析7结论软件演化研究受到信息丢失的限制,而大多数版本控制系统无法捕获这些信息。开发人员不使用演化分析工具,因为它们没有集成到IDE中,并且需要耗时的数据检索和处理阶段。他们不适合小规模的日常任务[2]。我们提出了一种替代的方法来收集和处理软件演化的信息。我们从开发人员正在使用的IDE而不是版本控制系统收集数据。我们将程序更改建模为第一类实体,以更接近开发人员的思维过程。 更改可以操纵模型,在任何时间点以非常细粒度的方式。我们的方法是增量的,细粒度的,并集成在IDE中,我们认为它适合开发人员的日常使用。 为了验证我们的假设,我们 目前正在实施一个名为SpyWare的原型我们获得的初步结果使我们相信我们的方法是有用的,我们打算进一步发展。我们能够通过使用视觉模式,在一个会话接一个会话的基础上,在高水平上描述学生项目的特征,但也可以在较低水平上描述。R. Robbes,M.Lanza/Electronic Notes in Theoretical Computer Science 166(2007)93109鸣谢:我们衷心感谢瑞士国家科学基金会对“COSE -控制软件进化”(SNF项目编号200021-107584/1)和“NOREX -再生技术网络”(SNF SCOPES项目编号IB 7320 -110997)项目的财政支持我们感谢Marco我们还要感谢卢加诺大学的学生,他们在做项目时接受了监督。引用[1] K. 贝克极限编程:拥抱变化艾迪森·韦斯利2000年[2] S. Deme yer,F. VanRyssel berghe,T. Gürba,J. 拉辛格河Marinescu,T. 门斯湾杜波依斯,D. Janssens,S. Ducasse,M.兰扎,M。Rieger,H. Gall,M. Wermelinger和M.艾尔·拉姆利局域网仿真:重构的研究与教学实例.在IWPSE 2005(第八届软件进化原理国际研讨会)的会议记录中,第123-131页,Los Alamitos CA,2005年。IEEE计算机学会出版社.[3] M. Fowler,K. Beck,J. Brant,W. Opdyke和D.罗伯茨重构:改进现有代码的设计。艾迪森·韦斯利1999年[4] H. Gall,K. Hajek和M.贾扎耶里 基于产品发布历史的逻辑耦合检测。在Proceedings InternationalConference on Software Maintenance(ICSMIEEE计算机学会出版社.[5] H. Gall ,M. 贾兹河 Kléosch和G. 我 的天 这两个是基于产品发布历史的评价观察结果。在ProceedingsInternational Conference on Software Maintenance(ICSM'97 ) , 第 160-166 页 , Los AlamitosCA , 1997 年 。IEEE计算机学会出版社.[6] H. Gall,M. Jazayeri和J. Kraubernski。用于检测逻辑耦合的CVS发布历史数据。软件演化原理国际研讨会(IWPSE 2003),第13-23页,Los Alamitos CA,2003年IEEE计算机学会出版社.[7] T. 格尔巴岛 Ducasse和M. 兰扎 昨天的天气:通过总结变化的演变来指导早期的革命工程。 在Proceedings20th IEEE International Conference on Software Maintenance(ICSM'04 ) , 第 40-49 页 , LosAlamitos CA , 2004 年。IEEE计算机学会出版社.[8] T. Grba,M. Lanza和S. 杜卡斯阶级等级制度演变的特征。 在Proceedin g的第九届欧洲软件维护和再工程会议(CSMR'05 ),第2-11页,Los Alam itos CA ,2005中。IEEE计算机协会。[9] C.Güorg和P. 魏斯格湾。从sof中检测重构并使重构可视化是一个很重要的过
下载后可阅读完整内容,剩余1页未读,立即下载
cpongm
- 粉丝: 4
- 资源: 2万+
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- 电力电子系统建模与控制入门
- SQL数据库基础入门:发展历程与关键概念
- DC/DC变换器动态建模与控制方法解析
- 市***专有云IaaS服务:云主机与数据库解决方案
- 紫鸟数据魔方:跨境电商选品神器,助力爆款打造
- 电力电子技术:DC-DC变换器动态模型与控制
- 视觉与实用并重:跨境电商产品开发的六重价值策略
- VB.NET三层架构下的数据库应用程序开发
- 跨境电商产品开发:关键词策略与用户痛点挖掘
- VC-MFC数据库编程技巧与实现
- 亚马逊新品开发策略:选品与市场研究
- 数据库基础知识:从数据到Visual FoxPro应用
- 计算机专业实习经验与项目总结
- Sparkle家族轻量级加密与哈希:提升IoT设备数据安全性
- SQL数据库期末考试精选题与答案解析
- H3C规模数据融合:技术探讨与应用案例解析
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功