介绍
软件开发技术不断发展以满足硬件和方法不断增长的需求和能力。为了简化体力劳动,自动化在软件开发中发挥着越来越重要的作用。软件开发自动化的示例包括代码构建管理器、静态代码分析器、测试等系统。
另一方面,人工智能和机器人领域的研究取得了重大进展。被称为“机器人”的软件家族正在快速增长。这些机器人实现预定义的逻辑,它们的能力实际上仅受硬件的限制。现代软件开发技术可用于构建机器人,而机器人又可以执行软件开发任务。
本文描述了创建软件开发机器人的一般概念,并试图从现代软件开发方法的角度展示该概念。通过两个实际例子来说明这一想法。
本文的目的是启发读者学习现代编程技术并将其应用到现实生活中。作者通过这篇文章只是展示了他的一个小想法,希望读者通过反馈帮助他改进文章。
如何阅读本文
为了方便起见,读者应注意本文的两个主要关键部分:
因此,想要通过运行示例了解机器人如何工作的读者可以先阅读“机器人”一章。读者还可以查看“目录”一章来找到他/她想要的部分。
缩写
ATDCG | 自动测试驱动代码生成 |
深圳发展银行 | 软件开发机器人 |
TDCG | 测试驱动的代码生成 |
时分双工 | 测试驱动开发 |
内容
想法
软件开发的演变
激发作者在 SDB 领域进行研究的最初问题被解读为“软件开发技术是如何发展的?”。了解软件开发技术的发展趋势非常重要,因为这些知识有助于创造未来的愿景。前面的编程范式(编程技术)的一般阶段可以简单描述如下:
命令序列。编程时代的早期阶段,硬件薄弱,单个程序员开发单个程序。这些程序以非结构化的方式连续开发。
结构化编程。需要解决的问题范围的扩大需要编程代码量的增加以及对代码量的更好管理。这些代码被组合成块结构。
面向对象编程。代码块结构不断增长,最终被组合成名为对象的新型结构。代码块之间关系的数量和复杂性也在增加。引入了对象特有的新关系类型(封装、继承、多态性、访问级别等)。该编程模型反映了复杂系统的特征,其中不同的独立单元具有状态并且能够在一个公共环境中执行特定操作,并且接近现实生活中的参与者和过程。
问题是:下一步是什么,编程方法朝什么方向发展?
简化的 TDD 流程
TDD 是一种渐进式开发方法,它结合了测试优先开发,即在开发或重构生产代码之前编写测试。TDD 不是一种简单的编程技术,而是一种重要的敏捷需求和敏捷设计技术。TDD 的目标是编写干净、有效的代码。
TDD 是解释文章主要思想的便捷方法。以TDD作为进一步解释的基础,为描述 TDCG 的方法论提供了清晰的路径。
完整的 TDD 流程包含代码重构和测试确保代码正确运行的阶段。如果只需要创建新代码而不需要重构,则可以简化TDD过程。所考虑的简化 TDD 过程可以具有以下阶段:首先创建测试,开发软件单元,并可能重复开发任务,直到代码通过测试阶段。
下图展示了可能的简化 TDD 流程。
几乎所有信息源都描述了 TDD 任务,并关注一些流程可以自动化以减少手动工作的事实。有一个重要特征需要强调。自动化任务由经过验证的算法运行并且稳定,但手动执行的任务可能会引入错误。换句话说,测试和软件的开发人员对其工作质量负责。因此,可以从责任的角度描述所考虑的简化TDD过程的主要任务:
创建测试——是影响整个开发软件单元质量的关键任务。
运行测试- 是经过验证的自动过程,本身不会引入错误(实际上/我们假设如此)。
软件开发——由程序员执行,但测试保证了他/她的工作质量,从而减少了程序员对其工作的责任。
尽管本文包含了减少程序员对其工作的责任的考虑,但这意味着工作的质量只能通过测试来保证。为了简单起见,本文没有考虑其他质量指标,例如代码可读性、开发时间、代码性能。
测试驱动的代码生成
Raphael Marvie 在他的文章“测试驱动代码生成简介”中描述了测试驱动代码生成 (TDCG) 技术 [ Marvie. 2006 ]。他在 TDD 流程的背景下描述了 TDCG。
当前的文章将自动代码生成视为一项单独的技术,不属于 TDD 的一部分。但是,所考虑的技术与 TDD 和其他信息技术有着密切的关系。由于正在考虑的自动代码生成也基于之前编写的测试,因此可以将其命名为自动测试驱动代码生成ATDCG。
上述推理表明,只有运行测试是自动化的,但在 TDD 中创建测试和开发软件是手动任务(严格来说,这些任务可以/部分自动化,但不能完全自动化)。由于软件开发任务的质量(通过测试)是自动控制的,因此开发也可以完全自动化。
人类的角色只能收缩以创建测试。从业务角度来看,这意味着人类将创建和描述软件单元的需求,并且单元将根据这些需求自动创建。
因此,自动软件开发可以表示为上面考虑的简化 TDD 过程的演变。
自动化测试
自动化软件测试的经典方法有一个称为“代码覆盖率”的特征。代码覆盖率是用于描述特定测试套件运行时程序源代码执行程度的度量。代码覆盖率值较小意味着存在未自动测试的代码。
ATDCG 技术可以创建完全被测试覆盖的代码,因为代码是从头开始创建的。换句话说,它具有 100% 的代码覆盖率。因此,如果代码覆盖率是经典测试方法的良好指标,则它不能用于衡量 ADCG 的成功。
应引入通过测试衡量实际业务问题覆盖率的新指标。这一事实将成功的衡量标准从软件开发领域转移到系统/业务分析领域。
为了保持阅读的简单性并更紧扣主题,本文不会讨论此措施。但事实上,还有一些问题需要进一步研究,应该强调。
测试在 ATDCG 中的作用
在 ATDCG 中创建测试是唯一手动执行的任务。测试是自动软件单元创建过程的主要驱动力,同时也保证了过程的质量。因此,ATDCG中的测试具有以下特点:
整个 ATDCG 流程和结果质量取决于测试的创建方式
创建测试是 ATDCG 的主要且敏感的任务
与传统方法相比,创建测试与业务需求的关系更密切,并且与创建软件代码的关系更远
需要进行研究并开发创建 ATDCG 测试的方法和规则
机器学习
正如所提到的,ATDCG 正在开发的装置的质量完全取决于测试。反过来,测试的创建与业务需求的关系比与编程的关系更大。最有可能的是,测试将包含大量规则。从其他角度来看,测试将以声明性方式进行描述,并包含或引用大量数据。
由于测试创建过程与业务需求相关,因此这些数据应该具有足够高的抽象级别,以便为测试创建者提供基于业务需求开发测试的便捷方法。与经典测试方法相比,测试设计的高抽象级别和大量数据将导致复杂性增加。
因此,测试的创建和 ATDCG 的运行可以描述为:
以声明性形式创建测试并考虑实际物理数据量(例如业务流程的索引)
将创建的测试或其一部分视为自动创建软件单元的训练数据
这些观察结果表明 ADCG 与监督机器学习之间存在密切关系。因此,监督机器学习的理论和技术可以用于ATDCG。
社会影响
ATDCG 设想软件开发任务自动化,并将程序员从这个角色中解放出来。同时,测试的分析师和创建者的角色成为成功运行ATDCG的关键。但ATDCG需要自身的发展。而且,ATDCG的开发显然会满足Unix编程的两条规则[ Raymond. 2003年]:
经济法则:程序员的时间是昂贵的;优先节省机器时间
生成规则:避免手工破解;尽可能地编写程序来编写程序
因此,ATDCG可以被认为是一种软件开发技术,它带来了额外的机会,但不是限制,也不是颠覆。同时,这也为进一步研究该问题提供了机会和需求。
机器人
机器人是“软件机器人”(维基百科)。本节介绍两个 SDB 的创建:
Bot 1 - 演示 SDB 关键概念的最简单示例。该机器人的性能不允许在合理的时间段内获得真实的结果
机器人 2 - 性能改进的机器人,可在 5-10 分钟内生成结果(Intel I7 CPU)
问题
本文试图给出尽可能简单的解释,以呈现该技术的一般概念。在这种情况下,最小软件单元可以只是由用高级语言编写的一个代码行表示的简单功能。
这两个示例的目的都是创建一个简单的类型函数F基于训练数据的 C# 语言。该测试将检查每种情况下函数的输出值与输入的等价性。
训练数据
输入参数((A)和(二))和输出值((F)) 如下表所示:
(A) | (二) | (F) |
38 | 2 | 第1463章 |
4 | 11 | 80 |
51 | 7 | 2645 |
12 | 32 | 313 |
6 | 21 | 150 |
20 | 38 | 599 |
25 | 43 | 第849章 |
3 | 19 | 113 |
40 | 34 | 第1779章 |
实际上,这些数据是使用多项式函数构建的 F=A2+ 5 b + 9。这一事实允许检查创建的 SDB 的正确操作。在现实世界中,目标函数和测试很可能是未知的,并且可能非常复杂。
机器人应该找到等于上述多项式的函数。但结果可以是其被加数的任意组合。请参阅“结果”一章,看到机器人根据训练数据发现了几个实现计算的函数。
机器人1
如上所述,Bot 1 是演示 SDB 关键概念的最简单示例。该机器人的性能不允许在合理的时间段内获得真正的结果。但该代码是其他可能的解决方案中最简单的。
机器人创建类型的函数在 C# 语言上,如下所示:
C#
namespace Program { public class WorkingClass { public static int F(int a, int b) { return XXXXXXXXXXXXXXXX; } } }
此代码片段包含实现标记为 XXXXXXXXXXXXXXXX 的函数公式的代码。机器人应该找到此代码行。所有其他文本都是已知的,并且形成可以编译到库中的完整 C# 程序。
代码包含是使用由四个算术运算 ( -
, +
, *
, /
)、两个变量 (a
和b
) 和九个数字 ( 1
, 2
, , 3
, 4
, 5
, 6
, 7
, 8
, 9
) 组成的字母表构建的。
机器人实现的算法也很简单:
步骤1。通过将从字母表中随机选择的符号插入 XXXXXXXXXXXXXXXX 位置来构建代码
第2步。将代码编译到 RAM 中。如果编译失败,请执行步骤1
步骤3。运行训练数据集的函数
步骤4。比较实际函数输出和训练数据集的结果。如果任何情况下的值不同,请转到步骤 1
步骤5。打印找到的函数
该算法使用反射和动态代码生成在 C# 上实现。
表现
简单算法的性能非常差。字母表中不同符号组合的数量约为 4100 万种。(如果我们使用 4 个操作和 5 个变量)。简单的迭代需要巨大的计算量。现代个人计算机无法在合理的时间内执行如此大量的迭代。作者在 10 天内在 Intel I7 4 核 CPU 上运行了 4 个机器人实例,找到了一种解决方案。
虽然Bot 1的性能极差,但其源代码非常简单。其代码未作为文本包含在文章中,但可以下载(请参阅使用代码一章)。代码非常简单并带有注释,作者希望它具有足够的可读性以了解其工作原理。
机器人2
Bot 1可用于理解自动创建软件代码的最简单算法并研究所需的编程语言命令。但不能方便地查看结果。作者包含了同一机器人的改进版本,并将其命名为 Bot 2,以便在合理的时间段内获得结果。
Bot 2 采用遗传算法,可显着减少寻找解决方案的时间。它允许在运行一个线程的 Intel I7 CPU 上 5 - 20 分钟内获得结果。机器人 2 是使用稍微 复杂一点的代码编写的。不过代码也有注释,应该不难理解。
结果
下图展示了 Bot 2 生成的几个结果。读者可以关注生成的C#代码和运行时间。读者可以下载源代码并自行运行示例(请参阅使用代码一章)。
机器人可以轻松升级,将创建的代码直接写入*.cs文件,甚至创建 Visual Studio 项目结构。为了保持源代码简单,作者没有做这样的升级。
未来发展
当前的文章展示了创建 SDB 的可能性。但现在还不能在实践中使用。它可以受益于相关技术,例如机器学习、数据挖掘、TDD、自动代码生成等。
ATDCG 的未来开发可能涉及构建编译器和代码分析器的经验。成熟的机器人可以创建软件单元,避免使用高级语言和编译阶段。他们可以创建由 Microsoft 中间语言(二进制表示)命令或 Java 字节代码组成的单元。这可以显着加快代码生成过程。
目前ATDCG方法可供爱好者研究和开发。还应该对此事进行研究。理论研究将为理解 ATDCG 的好处以及如何实际实施它们奠定基础。
使用代码
该代码包括在以下环境中创建和运行的机器人 1 和机器人 2:
开发:微软 Visual Studio 社区 2015
编译:Microsoft .NET Framework 4.5,任何CPU
平台:Microsoft Windows 8.1,64 位,CPU:Intel I7
下载地址:
这两个示例在运行时都使用一个线程。多个实例可以同时运行,但它以最大功耗模式运行CPU。如果计算机不是为长时间计算而大量使用 CPU 而设计的,此类负载可能会使计算机过热。Bot 2 生成结果的速度相当快,并且不应使硬件过载。但作者不建议长时间运行Bot 1的多个实例。
参考
历史
2018 年12月15 日:更改了“简化 TDD 过程”一章中展示可能的简化 TDD 流程的图表图片(感谢@ciroBorrelli)
2016 年 11 月22日:首次发布
执照
本文以及任何相关的源代码和文件均已获得MIT 许可证的许可
评论留言