Conmajia

Stop stealing sheep!

导航

< 20253 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

💡 未来一瞥机器人码农

Dmitriy Gakh 著
Conmajia 译
原文发表于 2018 年 12 月 14 日 CODEPROJECT. 中文版已获作者授权.

全文约 3700 字建议阅读时间 8 分钟.

主要讲述自动化代码生成的一般性概念实现了两个可以写程序的机器人码农

第一个码农简单性能差

第二个码农复杂性能好

运行之前先读读代码使用说明.
机器人写的程序

简介

为了满足不断增长的方法学需求和硬件性能软件开发技术已经有了长足进步. 自动化在软件开发过程中对简化人工劳动起着越来越重要的作用. 软件开发自动化包含多个方面例如代码构建管理器静态代码分析器自动测试等系统.

另一方面人工智能和机器人方面的研究显著进步机器人bot软件家族得到了蓬勃发展. 机器人们实现了预设的逻辑操作只要硬件能跟上它们的能力几乎没有限制. 而现代软件开发技术可以应用到机器人上让它们具备可以编程开发的能力.

这篇文章介绍了创建软件开发机器人的一般概念从现代软件开发的角度展示了这一概念. 文章还附带了两个机器人码农的例子作为演示. 写作本文是为了抛砖引玉启发读者学习现代编程技术并应用到现实生活中. 我只是初步阐述了自己的一点想法读者中能人众多希望能对此篇拙作加以斧正.

导读

本文两个主要章节

读者可以从感兴趣的部分开始阅读.

术语

ATDCGAutomated Test-Driven Code Generation测试驱动的自动代码生成
SDBSoftware Development Bot软件开发机器人
TDCGTest-Driven Code Generation测试驱动的代码生成
TDDTest-Driven Development测试驱动的开发

思路

软件开发的发展

引发 SDB 领域研究的最初问题是“软件开发技术是如何开发的了解软件开发技术的趋势非常重要这些知识有助于创造未来的愿景. 编程范式的前几个阶段可以简要描述为

  1. 代码序列. 早期由于硬件能力较弱一般的软件都是程序员单打独斗完成的. 这些程序通常是以非结构化的形式开发的.
  2. 结构化编程. 随着需要解决的问题涉及范围不断扩大需要不断增加编程代码量. 为了更好管理代码出现了分块组织的代码结构.
  3. 面向对象编程. 代码块结构不断增长最终组合成一种新的称为对象的结构. 代码块之间关系的数量和复杂性也在增加. 引入了一些新的关系结构比如封装集成多态等. 编程模型反映了复杂系统的特征不同的单元执行不同的操作和现实生活中的参与者及过程密切相关.

问题是下一步是什么编程方法朝着什么方法发展

简化的 TDD 过程

TDD 是开发的进化方向它结合了测试优先的开发在开发或重构代码前编写测试. TDD 不是一种简单的编程技术而是一种重要的敏捷需求和敏捷设计技术其目标是编写干净而有效的代码. TDD 是解释本文主要思想的一种简洁方法. 本文以 TDD 作为进一步阐述的基础给出了描述 TDCG 方法论的清晰路径. 完整的 TDD 过程包含代码重构阶段通过测试确保代码正确. 在创建新代码阶段不需要重构可以简化 TDD 过程. 简化后的 TDD 主要有创建测试开发软件单元可能重复开发任务直到代码通过测试阶段.

图 1 简化的 TDD 过程

几乎所有描述 TDD 任务的信息来源都关注到有的处理可以自动进行而减少人工工作这一事实. 其中尤为重要的一项特性是自动任务运行的是经过证明的算法性能稳定但是人工执行的任务反而会引入错误. 换句话说测试及软件的开发者有责任保证他们工作的质量. 故而考虑简化 TDD 过程时的主要任务可以从职责角度进行描述

  • 创建测试影响整个软件开发单元的主要任务
  • 运行测试经过证明的自动过程本身不会引入错误
  • 开发软件由程序员实施通过测试保证其工作的质量

尽管本文考虑减少程序员对其工作的责任但这意味着只有通过测试才能保证工作的质量. 为保持解释的简单性暂不考虑其他质量指标如代码可读性开发时间代码性能等.

测试驱动的代码生成

Raphael Marvie 在测试驱动的代码生成简介[Marvie, 2006]一文中描述了测试驱动的代码生成TDCG技术. Marvie 是在 TDD 处理的范畴内描述 TDCG 的而本文将自动代码生成视为一种独立的技术而不是 TDD 的一部分. 但是所考虑的技术与 TDD 和其他信息技术有着密切的关系. 自动代码生成基于先前编写的测试因此可以将其命名为测试驱动的自动代码生成ATDCG.

上述推理表明只有运行测试是自动化的但创建测试和开发软件是 TDD 中的人工实施的任务这些任务可以部分自动化但不能完全自动化. 事实上由于软件开发任务的质量是通过测试自动控制的开发也可以完全自动化. 人类的角色将收缩为仅负责创建测试. 从业务的角度来看这意味着程序员为软件单元创建描述需求而这些单元将根据需求自动创建. 因此自动软件开发可以被看作是上述简化 TDD 过程的一种演变.

图 2 自动化 TDD 过程

自动化测试

传统的自动化软件测试方法有一个称为代码覆盖率code coverage的特性. 这是用于描述在特定测试单元运行时程序源代码的执行程度的度量. 较小的代码覆盖率意味着存在未经自动测试的代码. ATDCG 技术从零开始创建代码因此可以保证测试完全覆盖所有代码. 换句话说它有 100% 的代码覆盖率. 也正是因为这个特性代码覆盖率无法用于衡量 ATDCG 成功与否. 于是应该考虑引入新的指标通过测试来衡量实际的业务问题覆盖率. 这一事实将成功与否的度量从软件开发领域转移到业务分析中. 关于这方面的话题已经超出了本文讨论的范围不再赘述.

ATDCG 中测试的角色

创建测试是 ATDCG 过程中唯一需要人工执行的任务. 测试是软件单元自动生成过程的主要驱动同时保证了过程的质量. 因此ATDCG 中的测试具有以下特点

  • 整个 ATDCG 过程和结果的质量均取决于测试
  • 创建测试是 ATDCG 最主要和最敏感的任务
  • 与经典方法相比创建测试与业务需求较创建软件代码的关系更为密切
  • 需要研究制定用于创建 ATDCG 测试的方法和规则

机器学习

正如前面提到的ATDCG 开发的软件单元质量完全取决于测试. 反过来测试的创建在很大程度上与业务需求相关而不是与编程相关. 从另一个角度来看测试将以声明性的方式描述并包含大量的规则数据. 因为测试创建过程与业务需求相关所以这些数据应该具有足够高的抽象级别以使测试创建者能够方便地根据业务需求开发测试. 与传统的测试方法相比测试设计的高抽象级别和大量数据引入将导致复杂性的增加. 创建测试和运行 ATDCG 可以描述为

  • 以声明形式创建测试并考虑实际物理数据的数量
  • 将创建的测试或其一部分视为软件单元自动创建的训练数据

这些观察结果表明 ATDCG 与有监督学习supervised learning有很深的关系后者的相关理论和技术可以应用于 ATDCG 领域的研究.

社会影响

ATDCG 旨在完成软件开发任务的自动化它将使程序员从这个角色中解放出来. 同时测试分析师和创建者的角色成为成功运行 ATDCG 的关键. 此外ATDCG 的开发显然将满足两条 Unix 编程规则 [Raymond, 2003]

  1. 经济规则程序员的时间是昂贵的节省人的时间优先于机器时间
  2. 生成规则尽可能编写一些程序由它们负责编写其余的程序

因此ATDCG 可以认为是一种软件开发技术它可以带来更多的机会为进一步研究这一问题提供机遇.

机器人码农

这里的机器人指的是软件机器人software robot. 本节讲述两个 SDB 的创建过程.

  • 1 号最简单的 SDB用于展示概念性能较差
  • 2 号更好的性能可以在 5-10 分钟内得到结果Intel i7

问题

本文试图给出一个尽可能简单的解释以提出该技术的一般概念. 在这种情况下最小的软件单元可以只是一个简单的函数由一个写在高级语言上的代码行表示. 下面两个例子的目的都是基于训练数据在 C# 语言上创建一个简单的函数. 在每种情况下测试将检查输入功能输出值的等效性.

训练数据

输入参数 ab输出 f 在下表列出

表 1 训练数据
abf
3821463
41180
5172645
1232313
621150
2038599
2543849
319113
40341779

这些数据是用多项式 f=a2+5b+9 得到的. 用这些数据检查创建的 SDB 是否正确操作. 在现实世界中目标函数和测试很可能是未知的并且非常复杂. 根据训练数据机器码农理应找到与上述多项式相等的函数但其结果可以有不同的形式. 在结果一节可以看到机器人根据训练数据发现了多个版本的实现.

1 号机器人

前面说过1 号机器人用于演示 SDB 的主要概念它的性能较差但胜在代码简洁. 1 号以 C# 语言创建 f(a,b) 形式的函数产生类似这样的代码片段

namespace Program
{
    public class WorkingClass
    {
        public static int F(int a, int b)
        {
            return XXX;
        }
    }
}

机器人需要做的根据表 1 的训练数据找到标为 XXX 部分的正确的 C# 语句最后输出完整的程序. 在这个例子里机器人码农在编程时将用到四个算术运算符+-*/两个变量ab和 9 个数字123456789.

作为例子1 号机器人程序实现的算法也很简单

  1. 通过将从字母表中随机选择的符号插入到 XXX 位置来创建代码
  2. 把代码编译到 RAM如果编译失败回到 1
  3. 运行训练数据集函数
  4. 比较实际的函数输出和训练数据集的结果如果有任何不同回到 1
  5. 打印找到的函数

算法用 C# 实现使用了反射动态代码生成等技术.

性能

这种简单算法的性能非常之差. 对一个有 4 个操作和 5 个变量的程序来说最多可以有超过 4100 万个不同符号组合这对于简单的迭代而言计算量太大. 使用普通 PC 是无法胜任的. 就这个例子而言我在配备 Intel i7 四核处理器的 PC 上花了 10 天时间运行 4 个机器人实例才找到一个解决方案.

2 号机器人

1 号机器人可以用来理解自动创建软件代码的最简单算法并研究所需的编程语言命令但运行性能太差不便于观察结果. 为了在合理的时间内得到结果我对 1 号进行了改进得到 2 号机器人.

2 号实现了遗传算法大大减少了寻找解决方案的时间. 在 Intel i7 CPU 单核运行的情况下2 号可以在 5-20 分钟内得到结果. 它的代码更复杂不过我加入了不少注释理解起来应该不算太难.

结果

下面的图片显示了由 2 号产生的几个结果注意观察最终生成的 C# 代码和运行时间. 读者可以下载源代码并自己运行示例参见使用代码一节.

输出结果图点击小圆点翻阅

未来发展

本文展示了创建 SDB 的可能性但现在还不能用在实践中. 不过相关的技术如机器学习数据挖掘TDD自动代码生成等都对它有所裨益. ATDCG 的未来发展可能涉及到编译程序和代码分析器的构建经验. 成熟的机器人可以创建软件单元避免使用高级语言和编译阶段. 它们可以创建由中间语言CIL或 Java 字节代码bytecode组成的单元这可以显著加快代码生成过程. 目前有很多爱好者研究和开发 ATDCG. 理论研究将为理解 ATDCG 的优点以及如何在实践中加以实施打下基础.

代码使用说明 返回正文

1 号码农和 2 号码农开发运行环境

  • 开发 Microsoft Visual Studio Community 2015
  • 编译 Microsoft .NET Framework 4.5
  • 平台 Microsoft Windows 8.1 64-bit on Intel i7

第一个码农

第二个码农

两个例子都使用了单线程可以多开但是 CPU 使用率会达到 100%. 在这样的高负荷下CPU 会严重发热长时间运行时要考虑到这一点. 2 号码农运行起来会快很多CPU 负荷更低.

参考资料

  1. [Marvie,06] R. Marvie. An Introduction to Test-Driven Code Generation. EuroPython 2006.
  2. [Raymond,03] E. S. Raymond. The Art of Unix Programming. Addison-Wesley, 2003.

历史

  • 2019-01-22 中文版
  • 2018-12-15 更新了图片
  • 2016-11-22 首发

许可

文中内容全部使用 MIT 许可.

关于作者

Dmitriy Gakh来自阿塞拜疆 软件工程师分析员架构师研究员IT 应用专家培训师.

posted on2019-01-22   Conmajia  阅读(1451)  评论(1编辑  收藏  举报

编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示