点击蓝字 关注我们
低代码开发在过去十多年中逐渐发展成熟,虽然不能说给软件工程领域带来颠覆性的影响,但在企业应用市场中确实扎下了根,成为定制化应用开发的利器。低代码开发一般认为是一种可视化的快速应用开发方法,无需编码或者仅通过少量的人工编码就可以实现完整的软件应用,其实现应用开发的主要手段就是可视化的应用逻辑建模和配置加上自动化的代码生成。直观上看,低代码开发的一般模式就是通过可视化的拖拉拽和配置操作来定义和定制数据模型、界面布局、显示内容、业务流程和处理逻辑等,同时通过少量的编程(例如存储过程、脚本语言编程等)实现一些复杂的逻辑以及功能扩展。最终得到的软件应用可以通过编译(自动生成完整代码然后编译)或者解释(不生成代码,直接在运行时解释模型)的方式来运行,其背后的软件部署(目前多采用基于云的部署方式)往往也可以通过平台实现无缝衔接的自动化处理。
低代码开发方法是在市场需求和技术发展的共同作用之下以一种“水到渠成”的方式出现的。在市场需求方面,各个业务领域中层出不穷的应用需求以及快速迭代更新的压力使得传统的“一切重新开发”的模式不再适用;在技术发展方面,可视化编程、模型驱动架构以及云计算领域PaaS和SaaS技术的发展都为低代码开发方法的发展成熟奠定了坚实的基础。从软件方法学上看,低代码开发集中体现了复用式开发以及软件产品线的思想。例如,低代码开发大量使用了生成式复用(基于模板或模型的代码生成)以及组装式复用(界面控件与通用功能模块及其API的复用);低代码开发平台集中体现了软件产品线开发中的领域分析以及共性与可变性分析的思想,一些平台还会显式定义一套特定领域语言(DSL);低代码开发平台事实上提供了软件产品线开发所倡导的参考体系结构,为应用开发提供了预定义的定制和扩展能力。
当前,低代码开发在企业软件市场中已经得到了广泛的应用,各种低代码平台层出不穷,其中既包括互联网厂商依托其云平台和云服务搭建的平台,又包括传统的企业应用软件开发商基于多年行业经验总结凝练推出的平台,还包括一些看好企业级应用市场发展及低代码平台应用前景的创业企业推出的平台。此外,在很多专业领域中,开发人员也会构建一些面向细分领域和特定目的的低代码开发工具从而提高工作效率、避免重复劳动,例如在智能化运维(AIOps)领域很多企业都构建了内部使用的低代码开发工具来辅助生成各种运维脚本,在大数据可视化分析领域很多企业也构建了低代码开发工具来实现可视化分析应用的灵活定制。
近两年大模型技术及应用生态有了长足的发展。大模型强大的意图理解、问题分解、方案规划与代码生成能力使得基于大模型的自然语言编程成为一个热门话题。通过模型微调、提示工程、检索增强以及Agent等技术,大模型已经可以实现一些小规模应用的生成式开发,包括面向最终用户(End User)、以API和服务集成与编排为主的应用生成以及面向开发人员、以交互式代码生成和修改为主的应用开发。例如,此前我们团队分享过的面向服务机器人(《动动嘴就能喝上咖啡,ChatGPT做到了》)以及人机物融合场景(《基于GPT-4的人机物融合应用构造实践》)的应用生成案例就属于第一类(面向最终用户);此前我们团队分享过的面向小规模应用程序(如俄罗斯方块游戏)的生成式开发策略(《ChatGPT协作开发实录:编程新手的试验探索》)就属于第二类(面向开发人员)。
当前,基于大模型的生成式软件开发正受到越来越多的关注,同时也引发了关于低代码开发与大模型代码生成之间关系的讨论。例如,既然都能够实现软件生成并且大模型还支持基于自然语言的人机交互(而非低代码平台所采取的可视化拖拉拽的方式),那么低代码开发是不是可以被取代了呢?围绕这个问题,本文从几个方面谈一谈我的个人看法。
01
低代码开发与大模型代码生成的区别
低代码开发与大模型代码生成的区别可以从以下几个方面去看。
1
代码生成的机理不同
低代码开发中的代码生成主要采用的是基于模板以及模型驱动的思路,这也是软件工程领域的经典技术了,即通过预定义的代码模板或者元模型(包括建模规范以及代码生成规则)实现代码生成。其背后体现的是领域知识的作用,即领域专家从特定领域的大量应用中分析和抽取共性和可变性然后通过抽象形成相应的模板或元模型。而大模型代码生成则采用的是数据驱动的方式,即通过大量的文本和代码数据训练一个黑盒的神经网络模型(一般基于Transformer架构)来实现代码生成,其机理与基于大模型的文本生成(如ChatGPT所支持的形式)类似。
2
背后的系统支撑不同
低代码开发的成功很大程度上也要归功于背后的系统支撑,包括各种中间件和开发框架。例如,很多低代码平台都支持基于云的Web应用软件开发,背后都利用了云原生软件基础设施(如云数据库、分布式缓存、容器编排系统以及各种微服务治理组件等)以及主流的Web开发框架(如前端的Vue框架和后端的Spring框架)的支持。这些系统支撑不仅为应用开发提供了规范并降低了应用开发的难度,而且为低代码开发所生成的软件系统提供了部署和运维支撑,从而使得应用代码生成本身无需过多考虑性能、可用性、安全性等方面架构设计问题。例如,运行在云上的低代码应用软件的可伸缩性以及安全和可用性保障主要是由平台背后的运行时系统来支撑的,甚至其运维也是由平台来提供的(作为PaaS服务的一部分)。而大模型代码生成则基本上没有类似的系统支撑。其中,面向开发人员的代码生成主要是根据上下文及提示产生代码,一般不会考虑预定义的框架和系统支撑;面向最终用户的应用生成可能会提供一些平台支撑,例如可供编排的API与服务资源管理、所生成应用的运行支撑(往往就是一些API与服务编排脚本的解释执行机制)等。
3
所支持的软件开发广度和完整性不同
低代码开发与大模型代码生成的机理与系统支撑等方面的差异导致二者在所支持的软件开发广度和完整性方面的显著区别。如图1所示,低代码开发面向特定领域,所支持的领域广度有限;大模型代码生成则具有良好的通用性,在适当的上下文与提示下可以在不同领域中实现代码生成,所支持的领域广度较大。从完整性上看,低代码开发可以生成完整的大规模企业级软件应用,包括前端界面、后台业务逻辑及数据管理等各个层次,同时可以提供完善的运行时质量保障(如性能、可用性、安全性)和标准化的运维支撑;大模型代码生成当前则主要关注于局部的代码生成(如代码片段、方法/函数),往往难以产生覆盖软件各个层次的完整应用同时也缺少软件整体架构和运行时质量方面的支持。因此,我们经常看到的一个现象就是,低代码开发平台可以为预期范围之内的应用开发提供非常好的支持,但对于预期范围之外的应用开发则完全无法提供支持。
图1. 低代码开发与大模型代码生成在所支持的软件开发广度和完整性上的对比
02
低代码开发与大模型的结合点
当前,低代码开发与大模型代码生成在企业软件开发中所处的位置和使用模式上还存在着较大的区别(这里暂时抛开面向最终用户的简单应用开发)。低代码开发平台的目标用户往往具备丰富的业务知识,理解业务流程和业务逻辑,而在软件开发技能方面则要求不高。但这类用户在平台的支持下可以开发出完整的大规模企业级应用。而大模型代码生成则主要面向专业程序员,在软件开发中不同的地方提供局部的辅助支持,例如代码补全、片段级代码生成等。当前也有技术专家在一些大规模企业级应用开发中利用大模型实现了较高的代码生成比例(例如70-80%)。但正如我在此前的分享《迈向更高层次智能化开发之路:写给大模型的2023总结》中所提到的,这种模式对于开发人员的要求很高,仅有少量的专家型开发人员能够做到(他们在大模型的加持下成为少数的超级个体)。
但这并不意味着二者相互之间就是“绝缘体”。事实上,低代码开发与大模型代码生成之间存在着良好的互补性,可以相互结合从而进一步提高软件应用开发的自动化程度。这可以从以下两个方面去看。
1
大模型代码生成需要特定领域知识及编程抽象的支持
大模型代码生成当前难以支持大规模企业级应用开发的一个主要原因是缺少特定领域知识及相关的编程抽象。大模型广谱的代码生成能力使得其所面对的候选解决方案空间巨大,同时相应的软件设计特别是架构设计能力也是大模型的短板(我此前的分享《迈向更高层次智能化开发之路:写给大模型的2023总结》中对于软件设计问题有所探讨)。而低代码开发专注于特定领域(例如基于云的Web信息系统),因此可以将领域知识和特定领域的编程抽象融入平台之中,从而大大缩小候选解决方案空间、增强其代码的模式化程度,同时可以以预定义的参考架构以及技术栈为应用奠定设计框架并提供运行时质量保障。低代码开发平台背后都存在一套特定领域语言(即DSL),这种DSL应用范围受限(局限在目标领域之中)但其编程抽象层次远高于通用编程语言。因此,如果专注于特定领域软件开发,那么面向DSL的代码生成效率和准确性无疑都会更高。
2
低代码开发需要自然语言交互及代码生成的支持
低代码开发平台虽然采用了可视化开发的支持,但在面对大规模复杂软件应用开发时其难度和复杂度仍然较高。例如,一个复杂页面中可能涉及业务流程、页面跳转关系、数据查询与更新逻辑、业务规则定义等多个不用层次上的细节,定制和配置工作量大,逻辑关系复杂。这些定制与配置逻辑如果可以通过自然语言交互的方式自动生成,或者基于上下文实现资源推荐(如界面控件、API等)以及定制和配置逻辑补全,那么将进一步提高低代码开发的效率和质量。此外,为了增强应用开发能力,低代码开发平台往往还支持通过直接编码(例如脚本语言)的方式实现扩展功能,这部分自然也是大模型代码生成可以应用的地方。
事实上,在低代码开发与大模型代码生成的结合方面业界已经进行了一些探索并取得了不错的效果。其探索的思路分为以下两类。
1
在大模型代码生成的基础上增强DSL
这类探索从基于大模型和自然语言交互的代码生成工具出发,通过引入DSL降低生成完整应用软件的难度。这方面在近期蚂蚁CodeFuse平台的一个分享(《AI写代码引发的春茶“事故”,以及真人程序员的复盘》)中有所体现。通过文中这段demo视频可以看出,这个应用开发所使用的工具以自然语言交互为主要的手段,同时结合少量的可视化操作(如选定界面区域来输入功能要求、通过可视化拖拽调整页面布局等)。通过与蚂蚁技术专家交流了解到,这个工具背后使用了面向蚂蚁自身云平台基础设施(例如相关中间件)的轻量级DSL,同时所使用的代码大模型针对该DSL进行了一些针对性训练。这一结合无疑大大提高了代码大模型生成完整应用软件的能力,同时借助背后的系统支撑解决了大模型所不擅长的软件设计问题。此外,虽然整个工具并没有实现重量级的低代码开发支持(例如各种界面控件的拖放添加和相关逻辑配置),但引入的可视化所见即所得能力无疑也大大改进了用户的交互式开发体验。有意思的是,蚂蚁的这个技术分享的初衷并不是彰显工具平台的生成式应用开发能力(虽然看起来确实比较惊艳),而是对这种生成式开发引发的生产事故(好在只是面向员工的内部小应用)的复盘分析。在我看来,这个分析所透露的恰恰是当前低代码开发和大模型代码生成的一个共性问题,那就是生成内容主要关注于软件的功能逻辑实现,而软件的运行时架构支撑和非功能性质量保障则主要依赖于特定领域编程抽象(DSL)背后的平台系统以及相关的运维保障支持。
2
在低代码开发平台中引入自然语言交互与大模型代码生成
这类探索在既有的低代码开发平台基础上引入基于大模型的自然语言交互与代码生成能力。这方面在网易数帆专家近期围绕他们的低代码开发平台CodeWave的一个分享(《AIGC在低代码领域的应用与实践》)中有所体现。在既有的低代码开发支持基础上,CodeWave平台引入了基于大模型的自然语言交互能力,包括开发意图、问题分解、方案规划以及代码生成。这里的代码生成也是面向平台所支持的DSL的代码生成,从而确保了生成结果能够被平台所理解以及可视化展示。此外,CodeWave平台还支持基于自然语言以及上下文的页面组件推荐和代码补全能力。最终的应用可运行代码生成则仍然是由平台在DSL代码基础上按照预定义的模板和规则实现的。
03
人机物融合场景应用需要低代码开发
当前,我们已经进入一个人机物融合的万物智能互联时代。计算与通信技术的发展使得我们所处的物理和社会空间的数字化程度不断提高,同时也不断拓展软件应用的疆域。软件定义一切、万物皆可编程的时代正在到来。在此背景下,每个用户所处的人机物环境都可以被认为是一台广义的计算机(即场景计算机),同时以用户为中心实现满足各种用户需求的应用(即场景应用),实现从“我在世界”到“世界在我”的转变。这种人机物融合场景应用尤其需要低代码开发的支持,其原因包括以下几个方面。
1
人机物融合场景具有更强的领域特定性
传统的软件应用面向单纯的信息空间,虽然也存在一些领域差异但所依赖的资源形态相对单一(底层的计算、存储和网络资源,上层的各种软件服务和API资源等)。同时,传统的软件应用所处的信息空间环境也相对统一,特别是对于互联网应用而言其所处的运行环境和资源具有更强的相通性。而人机物融合场景具有更强的领域特定性,这是由其社会物理特性所决定的。人机物融合场景建立在用户所处的物理和社会小环境之中,不同种类场景的社会物理环境与可用的人机物资源种类具有很大的差异性(试想一座办公楼与一条工业流水线的环境差异),因此具有更强的领域特定性。
2
人机物融合场景具有更高的编程复杂性
人机物融合场景中涉及的社会物理环境和人力、物理资源具有很强的复杂性和异构性,同时其中的社会物理特征也增加了编程的复杂性。例如,面向智慧大楼场景的应用编程需要考虑楼层和房间的空间拓扑、不同区域的访问控制权限、电梯和咖啡机等设备的运行规律、人员能力及其与各种设备的协作方式等,其中蕴含的时空及运动相关的物理规律以及与人相关的社会规律都需要考虑。因此,需要通过领域分析提炼特定领域的编程抽象及其背后的应用运行支撑机制,从而降低应用编程的难度。
3
人机物融合场景应用具有更强的个性化和易变性
传统面向信息空间的企业应用也具有一定的个性化和易变性,但当软件应用空间被拓展到人机物融合三元空间后个性化和易变性变得更强了。当用户感觉到所处的现实世界(社会物理环境)中一切皆可编程(按需集成和编排)并服务于自身的工作、学习和生活之后,应用需求的空间将会被极大拓展和打开。同时这种高度以用户为中心的应用模式个性化程度极高,且很容易随着时间的推移而发生变化。因此,这类应用更需要在低代码开发平台的支持下实现按需快速构造和演化。
04
总结与展望
低代码开发在企业级应用市场上已经取得了成功,其秘诀就是通过领域分析和设计形成的一套可以实现定制化开发(主要通过可视化拖拽和配置)并支持代码生成和运行支撑(主要通过模板化代码生成以及包含开发框架和中间件在内的运行环境支撑)的工具平台。大模型过去两年的飞速发展带来的生成式软件开发模式为我们打开了自然语言编程的想象空间。以上二者在能力上存在很强的互补关系,可以相互结合实现更强的生成式软件开发能力。它们的结合事实上也是“数据与知识双驱动”这一指导思想的又一具体体现。
另一方面,人机物融合万物互联时代的到来极大拓展和打开了应用需求空间,同时也极大拓展了软件的编程空间,从“我在世界”到“世界在我”的转变正在发生。而低代码开发与大模型代码生成的结合也将在这一发展过程中扮演重要的角色。其成功的关键包括以下几个方面:人机物资源及社会物理环境的“软件定义”,不仅实现资源及环境的数字化和网络化接入还需要提供体现社会物理特性的编程抽象和运行支撑;基于特定领域分析的领域特定语言(DSL)定义,不仅提供应用级的定制化编程支持而且还需要提供面向特定场景的工具平台快速定制能力(试想面向智慧大楼和工业生产线的应用开发平台的差异,同时两栋不同的智慧大楼在编程空间上也可能存在差异);灵活的人机交互与所见即所得的应用开发体验,这有赖于将基于大模型的意图理解、问题分解和方案规划能力与基于低代码开发的应用可视化预览能力相结合。
总之,面向人机物融合场景的应用开发和快速演化将成为推进新型数字化和新质生产力发展、实现信息化和人工智能技术更大范围应用的重要手段,而低代码开发与大模型技术有望通过相互结合在其中扮演重要的角色。
作者简介:
彭鑫,复旦大学计算机科学技术学院副院长、教授,中国计算机学会(CCF)杰出会员、软件工程专委会副主任、开源发展委员会常务委员,IEEE高级会员,《Journal of Software: Evolution and Process》联合主编,《ACM Transactions on Software Engineering and Methodology》、《Empirical Software Engineering》、《软件学报》等期刊编委。主要研究方向包括软件智能化开发与运维、人机物融合泛在计算、智能网联汽车基础软件等。
公众号**|**CodeWisdom