机器编程理论原理和实现

2020-02-04 02:03赵晨
电子技术与软件工程 2020年20期
关键词:视图代码编程

赵晨

(上海安鸣软件科技有限公司 上海市 201112)

1 机器编程介绍

1.1 与人工智能的关系

随着人工智能的蓬勃发展,机器的智能化程度越来越高,在很多领域,基于大量样本数据的自我学习,计算机在某一功能领域能够实现自我完善,通过持续的大数据量学习,执行功能的能力会得到持续提升,究其本质,实质上是一些重复性工作的持续优化,机器学习本身就是学习这些重复性工作的数据(即样本数据),然后优化工作的过程。

在软件开发领域,如何通过引入人工智能提升开发效率呢?首先思考机器学习的方式,由于编程工作本身,没有可行的方案提供一致性的编程“数据样本”,且不同的程序员实现的算法和过程有天壤之别,因此通过机器学习的方式让计算机自动编程将变得不可实现。

但是,通过对人工智能本质的深入思考后发现,机器学习只是人工产生智能的手段和过程,实际上,如果让机器具有智能,可以通过更多其他手段来进行。人工智能就是要用人工的方法使机器具有与人类智慧有关的功能[1];另外,在《人工智能词典》中,对人工智能的解释是:使计算机模拟人类的智能活动,完成人用智能才能完成的任务[2]。由此看来,假定软件构造过程中,由机器识别并读取软件的各层次设计模型,从而自动编程程序,由机器完成软件编程工作,属于人工智能在软件编程领域的一部分。再例如专家系统,专家系统是一种具有大量专门知识和经验的智能程序系统,也属于一种人工智能,它能运用领域专家多年积累的经验和专门知识,模拟领域专家的思维过程,解决该领域中需要专家才能解决的复杂问题[3]。我们发现在软件开发领域,构建软件的过程实质上是在模拟真实世界的过程,理解和解释模型需要软件行业专家来进行,这个过程类似专家系统。例如,在设计和开发软件系统过程中,以面向对象开发方法论举例,首先是研究软件系统所模拟的领域,其中包含了哪些实体对象,这些对象是如何通过互动或协作来完成这些功能,从而通过软件模拟这些功能进而实现整个软件系统。整个过程中,我们发现,其中,从面向对象角度看,对象的抽取、对象表达、对象间协作、对象状态管理、对象运作权限、对象可视化展现等均可以通过归纳并抽象,形成模型,这是我们熟知的软件建模;继续,如果进一步,将这些模型转化为代码的过程归纳并抽象出来,则通过模型直接转化为代码将变得可行,因此,将用人工编码实现模型的算法和过程进行抽象,让计算机可以理解模型并进行编程,这就是本文所述的机器编程的核心思想,因此机器编程就是基于深度抽象(非深度学习)的人工智能,让计算机理解设计模型并转化为代码,即机器编程,进而实现软件开发过程不用或者使用较少的人工编程工作。

1.2 机器编程概念的核心要素

机器编程是计算机取代人类程序员,由计算机理解设计模型并转化为代码的过程。通常软件开发步骤中,第一步架构设计人员经过需求采集并设计完成之后,第二步由程序员负责理解模型并实现编码,机器编程完成的工作就是这个步骤中的第二步,取代程序员编程实现模型,而由计算机理解并实现模型完成编程工作。机器编程的核心要素是机器理解模型并转变为代码,而非由人类程序员理解模型,并进行实现的过程,因此软件系统的模型化就是机器编程的输入,可执行代码是机器编程的输出。上文提到,软件系统就是模拟真实世界,真实世界的模拟实质上就是不同对象的交互,从面向对象角度,可以从不同层级对实体对象进行建模,进过分析与实践,我们认为从以下几个分层的模型可以对软件系统进行全面的建模。

(1)领域模型:实体对象的种类以及协作关系,可以直接转化为存储模型,例如可以直接转化为关系数据库的表达形式,存储域关系数据库中,或转化为一般性对象数据库,领域模型通过持久化可以保存在领域模型仓库中,对于形成领域专家仓库,从而衍生发展为领域模型专家系统。

(2)交互模型:表达对象间如何进行实际交互,例如在创建A 对象时,同时创建B 对象;或是创建A 对象完成后,将B 对象绑定到A 对象上。

(3)视图模型:视图模型理解为对象的展现模型,例如如果将对象展现到网页上,这可以视为网页模型。

(4)接口模型:接口模型表达系统输入和输出数据的模型。

(5)流程模型:表达数据的流转规则和走向。

(6)权限模型:表达系统的使用者如何访问对象的范围和系统功能的模型。

(7)对象加工模型:表达对象如何被加工和演变的模型,例如,一个报表对象,可能是由多个对象进行组装而来。

(8)系统间交互模型:表达系统之间的模型,例如通常所说的不同系统间的数据集成工作,主要用于系统间信息转换和传递。

以上模型中,所有模型处于不同的层级之上,关于“智能系统应该是分层的”(Newell,1982)的思想已为计算机科学研究者和系统科学界所认可[4]。

图1:领域模型

图2:交互模型

图3:视图模型

图4:流程模型

1.3 机器编程与其他开发技术的共性与区别

机器编程注重模型的设计,软件生命周期中的程序编写环节,并将模型直接转化为可执行代码,人工编程仅在模型不易于表达或因设计模型不完善而无法表达时进行人工编程,这部分代码应不占或仅占据整个系统很小的比例。

软件生命周期贯穿了软件工程工程的六个基本活动[5],机器编程主要自动实现其中的程序编写和程序测试2 个过程,将其交给机器自动化完成。

同样,与Outsystems,iVX,Salesforce,Mendix,Appian,Joget 等低代码快速开发平台和技术的目的类似,其目的都是加速软件开发,减短软件开发过程中的迭代周期,提高开发效率和质量,降低开发成本,能够将模型直接转化为可运行应用程序。但根本不同之处在于:机器编程将模型转化为高级语言代码,其转换从编程结果和代码角度审视,应和人工编码并无不同,通过编译这些高级语言代码,进而执行软件系统。但Outsystems,iVX,Salesforce 等低代码快速开发平台所采用技术开发完成之后的系统仅能运行在平台自己架构之上,不是以普通的高级语言代码方式作为软件开发结果交付客户,虽然目的同样能够加速软件开发,但不是以模仿人类编程为目的,机器编程则是模仿人类编程过程,其产出高级语言代码作为结果是其主要特征,产出结果上看和人工编程并无不同,但编程效率却大大提高。

1.4 机器编程目前的发展状态

机器编程概念最早源于本文作者2014年一种构想,来表征软件开发中从模型向高级语言代码转换的过程,全部交由计算机完成,提出此构想的另一背景是当时由于客户化项目较多,尤其较为复杂的大型项目,对项目进度、项目管理形成挑战,且要求开发出的项目能够不依赖于开发平台而独立运行,同时项目代码交付客户后,客户的编程人员能够使用通用的高级编程语言例如Java,C#等进行后续独立升级开发。基于此背景与构想,彼时,作者创立了上海安鸣软件科技有限公司(Ulzin Software),将此概念付诸实验与实践,项目代号ACB,此后几年中,将领域模型、交互模型、视图模型、接口模型、流程模型、权限模型均进行了完整实现,项目能够通过可视化模型完整生成基于高级编程语言的程序代码。

2 实现

2.1 理论基础

机器编程概念的核心要点是“模型设计一切,一切代码源于模型”,模型类型健全,交给计算机编程,计算机产出所有代码,编程出的代码应和人类程序员编写出的具有比拟性。

2.2 设计模型

设计模型根据作用进行分类有六种:领域模型、业务交互模型、视图模型(页面模型)、接口模型、工作流模型、权限模型,本文以一个客户关系管理系统为例描述相关模型

2.2.1 领域模型

领域模型表达对象(领域模型中的实体)的存储,同时表达面向对象设计中的实体对象,其关系可理解为关系数据库中的1:1和1:N 以及N:N 关系,每个对象有其自己的属性,例如字符串、整形、枚举类型等。本例中创建客户、品牌、产品、行业4 种特种领域实体对象,每种实体中有相关属性,例如客户中有客户姓名,营业执照等,如图1所示。有很多因素会使软件开发复杂化,但最根本的原因是问题领域本身的错综复杂,控制复杂性关键是要有一个好的领域模型[6]。本系统设计的最顶层模型是领域模型,并且领域模型可以被持久化为领域模型仓库。

2.2.2 交互模型

交互模型主要设计业务实体间的协作关系,在本例中,要求在创建和修改客户过程中,必须选择行业和品牌,以及如果没有行业和品牌的情况下,是否允许即时创建,或是随同客户创建时一并创建;在品牌的创建和编辑过程中必须设置产品的前提下才能进行创建和编辑,这些不同对象的生存周期和协作过程会导致软件具有不同的视图模型,因此交互模型是视图模型的前导模型,如图2所示。

2.2.3 视图模型

视图模型是软件系统在运行时与用户交互的GUI 模型,例如在创建、编辑、搜索、展示时,分别有哪些属性,以及属性如何布局、以及样式定义等。视图设计用相同的数据绑定不同的用户控件,丰富的用户控件可以拥有更好的交互体验,视图模型是交互模型的后导模型,可以通过交互模型转化成视图模型,如图3所示。

2.2.4 流程模型

流程模型主要设计事务处理过程中的流程逻辑,将流程用可视化的方式表达出来,例如此例中客户上传的营业执照图片在不同条件下,存储在不同的位置,这种逻辑可以用流程模型来进行设计。由于流程的实质是逻辑的抽象,因此,本文中提到的对象加工模型和系统交互模型实际上可以看作是流程模型的实例,因此,可以通过设计更详细的流程模型来实现对象加工模型和系统交互模型,如图4 流程模型所示。

2.2.5 接口模型

接口模型用于设计系统与其他系统进行信息传递时的输出和输出接口规范,本质上,视图模型就是一种与用户进行交互的接口实例,因此可以将视图模型用作接口模型,因此接口模型本文不再赘述。

2.2.6 权限模型

权限模型用于设计业务对象在运行时,当前登录用户是否可以访问,例如一个客户列表,当前用户能够访问哪些客户数据;或者某个功能是否可以访问,例如页面、按钮。这种模型经过抽象,通常可以固化为一个功能:在权限管理侧,设置软件系统登陆用户可以或怎样管理哪些其他用户,这些用户ID 称为“可管理用户”,例如上级可以管理哪些下级,以及设置软件系统登陆用户能否访问一些功能,例如页面、按钮控件;在业务模块中,取出业务对象所关联的所有用户ID,例如客户的创建者ID,这些用户ID 称为“对象关联用户”。将“可管理用户”和“对象关联用户”取交集,得到的结果,就是当前登录用户可以管理哪些用户,取出这些交集用户创建的客户就完成了权限管理。这里的创建者只是一种常见对象关联示例,实际中可能有更多种形式。权限模型在本项目的运行时框架部分进行了实现。

图5:基于T4 文本引擎的转换过程

图6:源代码(C#)

图7:源代码(Java)

图8

表1

3 模型向代码转换原理

每种模型向代码转换的过程,由于是“编写代码的代码”,可以采用一种文本模板转换引擎为工具,以提高转换代码得可读性和调试得便利性,例如Mircosoft T4 Text Template Transformation Toolkit,图5 是一个ComboBox 控件的前端模型到代码的转换源码示例。

3.1 特殊功能代码的注入

对于特殊代码的部分,需要采用一种方式,将用户的自定义代码与系统生成的代码相融合,将客户化代码融合进系统生成的代码,一种方案是采用事件机制,例如当用户点击上传按钮上传完毕一份营业执照时,用自定义代码提示营业执照上传完成,完成此项任务可以在上传按钮上绑定onupload 事件,写上开发者自定义的提示代码。

3.2 运行时环境

系统由模型生成的代码是业务范畴内的功能,例如一个CRM客户管理系统,通过模型设计,并利用机器编程得到的代码实际上是业务对象交互的功能,一些其他业务无关的基础功能代码,例如调用底层的数据库交互或是,需要一个通用的框架,这个框架被称为运行时框架。将模型生成的代码放入运行时框架,共同编译,得到的结果就是一个完整可运行、二进制软件系统。

4 结果

4.1 编程出代码

机器编程由于速度快,在设计时就可以随时看到机器编程的结果代码,本文给出两种代码类型结果:C#、Java,如图6 和图7所示。

4.2 运行

本例进行编译执行后的运行结果如图所示,图8 是一个将源代码编译通过后执行的客户关系管理系统。

5 展望

围绕模型到代码的转换还有很多有价值功能可以拓展,例如对象加工模型和系统集成模型可以通过流程模型来填补,目前未进行实现,因此本论文不包含相关部分介绍。其次视图模型设计的可视化部分最终目标应与系统运行时效果保持一致,目前是一种抽象的视图设计效果,设计时效果与运行时效果保持完全一致是最佳结果。

另外,代码种类可以进一步得到扩展,目前已完整实现的代码种类C#和Java,代码引擎如果能够进一步抽象,形成代码引擎开发规范,将更易于向其他语言进行扩展。

最后,由于设计模型的实际上是一个完整的系统知识库,是完成整个软件项目的充要条件,因此模型的产出结果实际上可以更加丰富,例如,通过模型应还能自动产生软件的介绍文档、介绍视频、演示视频,以及自动化测试脚本等。

6 结论

按照本文定义的机器编程概念,所有设计模型,领域模型、业务交互模型、视图模型、接口模型、工作流模型、权限模型,到代码的转换得到了完整实现,并在作者所在的上海安鸣软件科技有限公司目前核心业务所在广告行业的DSP、DMP、SSP、CRM、SEM等系统中都成功得以成功应用和上线。

最后,表1 将机器编程和人工编程的进行对比。

猜你喜欢
视图代码编程
编程,是一种态度
编程小能手
纺织机上诞生的编程
创世代码
创世代码
创世代码
创世代码
视图
Y—20重型运输机多视图
SA2型76毫米车载高炮多视图