低代码是一项可提升软件交付速度的开发技术,以降低编码工作量和开发成本为典型特征,是高级语言发展到一定程度的必然产物。
Page History
Table of Contents |
---|
经过数十年的发展,软件开发领域从“单打独斗”进入工程化阶段。围绕着软件开发和维护的全过程,行业积累了大量的实践经验,并形成了软件开发全生命周期等理论。作为软件开发技术发展的产物,面向企业级应用开发的低代码厂商将这些实践经验融入平台设计中,有效支撑软件全生命周期。具备这种能力的低代码开发平台可以帮助开发者复用来自高校的专业知识和来自开发实践的经验积累,轻松构建规模更大、更易维护的高价值应用,充分展现低代码技术的生产力优势。
软件工程的持恒
1960年代,计算机刚投入实际使用时,软件设计往往只是为了一个特定的应用而在指定的计算机硬件上设计和编程,采用了与计算机硬件密切相关的机器语言或特定平台的汇编语言。软件的规模较小,决定了当时的开发人员很少采用系统化的开发方法,开发软件的过程基本上同等于编制程序。一个人同时兼任设计者、开发者和使用者是当时的常态。随着高速计算机、通用操作系统和高级编程语言的出现,让计算机的应用范围迅速扩大。与应用范围同步扩大的,还有软件的规模和复杂度。经历了“计算机应用大爆炸”的兴奋后,人们发现大量软件的开发陷入僵局,和预期相去甚远。出现诸如软件开发进度难以预测、开发成本难以控制、功能要求难以满足、质量无法保证、产品难以维护等问题。1968年,图灵奖得主艾兹赫尔·韦伯·戴克斯特拉在NATO在德国召开的国际学术会议上,首次提出了软件危机(software crisis)的概念,认为现有的软件开发方法已经无法适应新的需求,并在随后的两年时间里连续召开两次会议,明确了改变软件生产方式,建立软件工程的理念。
作为一个新兴的工程学科,软件工程主要研究软件的客观规律性,建立与系统化软件生产有关的概念、原则、方法、技术和工具,指导和支持软件系统的生产活动,以期达到降低软件成本、改进软件产品质量、提高软件生产率水平的目标。软件工程学从硬件工程和其他人类工程中吸收了许多成功的经验,明确提出了软件生命周期的模型,发展了许多软件开发与维护阶段适用的技术和方法,并应用于软件工程实践,取得良好的效果。软件生命周期是指软件从产生到成熟的全部过程。软件工程着眼于软件生命周期,将其划分为若干环节,并针对各个环节进行有针对性的管理和控制,通过强化每一个环节的工作和检查,最终确保全生命周期的效率。
不同的软件开发方法模型下,软件生命周期中各环节的划分有着不同的标准。目前主流的软件开发方法有CMM模式和敏捷模式两种,敏捷模式是基于CMM模式改进而来。软件工程是由软件本身的复杂性和维护性等内生要求决定的,与开发技术无关。不论采用什么开发技术,开发团队都需要遵循软件工程的基本原则,不能聚焦于单一环节,而是站在软件全生命周期的角度,全面提升项目管理能力,以确保软件达成各种技术指标要求。
典型的软件生命周期(CMM模式)
环节 | 主要工作 | 产出 |
---|---|---|
需求定义 | 确定系统范围,澄清需求细节 | 需求说明书 |
设计 | 完成系统架构、数据结构、业务逻辑和界面交互的设计 | 产品设计说明文档 |
实现 | 将设计转化为可执行的代码,通常包含单元测试环节 | 代码和相关文档 |
集成与测试 | 将代码编译成模块,并组装成为系统,针对模块和系统进行人工测试和自动测试 | 经过测试的文件(包含软件包和文档) |
移交与维护 | 将软件移交给客户,并进入维护阶段 | 用户可用的软件系统 |
典型的软件生命周期(敏捷模式)
环节 | 主要工作 | 产出 |
---|---|---|
需求分析 | 分析用户故事,通过原型等工具,明确需求范围和关键流程 | PBI(产品开发项目)文档 |
设计 | 将需求拆解为数据结构、业务逻辑和UX设计要求 | 设计文档包(部分项目会产出原型) |
开发 | 将设计转化为可执行的代码,通常包含单元测试环节 | 代码和少量必要的文档 |
测试 | 自动化完成编译,进行人工测试和自动测试 | 经过测试的文件(包含软件包和文档) |
部署 | 将程序部署到全部或部分生产环境中 | 用户可用的软件系统 |
反馈 | 征集用户对产品的反馈 | 用户故事 |
低代码触发软件工程的嬗变
生产力决定生产关系。软件开发技术的进步会对软件工程理论的落地方式带来影响,软件开发生命周期也需要随之进行删改。这种删改需要遵从管理学的基本原则,即简化、合并由开发工具自动完成的部分,强化和聚焦人工操作的环节。
可视化设计体验
软件开发进入低代码时代,大量的手工编码工作被可视化操作所替代,为软件开发模式带来了创新性发展。
- 可视化开发:开发者通过托拉拽的形式,在低代码工具中可视化的创建出直观可见的页面、业务逻辑、工作流和数据服务;低代码工具则将这些可视化的内容自动生成源代码。这种可视化的开发方式,一方面成倍提升了软件开发效率,大幅缩短了从开发到可执行应用的交付时间;另一方面,也让更多人可以直接通过可视化的元素而不是代码,看懂程序的运行方式,更早参与讨论和评审。对于绝大多数应用场景来说,低代码开发模式下的设计阶段即涵盖了开发阶段的绝大多数工作,开发阶段可以与设计阶段合并,甚至可以将需求分析中的原型开发部分也纳入到设计中来,以缩减需求分析的占比。
- 可视化部署:此外,随着DevOps相关工具和方法论被引入低代码领域,部署工作也从手工编写脚本、修改配置文件变成了低代码工具上的可视化操作。当开发者进行Build / 生成和发布时,参数配置、应用部署脚本生成、数据库差分升级脚本生成、各脚本的执行与结果监控等都交给低代码平台自动完成,真正实现“ClickOnce / 一键发布”。这意味着部署升级工作的在软件生命周期的占比也会显著下降。
自动化代码生成技术
大量自动化代码和脚本生成技术的引入,让低代码时代的软件全生命周期在传统编码开发的基础上有所改变,从实践经验上看,主要的变化如下:
- 需求分析阶段,开发方可将需求分析的重点定位于项目范围界定、关键业务流程梳理和项目计划上。不再启动“可丢弃”的原型设计工作。
- 将设计和开发阶段合并,开发方可直接基于低代码平台上的可视化设计界面,对开发成果进行讨论和检查,不再需要专门的设计阶段,做到设计即开发。因为开发速度得到了成倍提升,开发方需提升迭代速度,争取在第一个冲刺即拿出可以和需求方沟通的可运行应用。与原型不同,此时的应用不会被丢弃,而是作为最终成果得到保留。
- 低代码平台提供了大量开箱即用的组件,设计和开发过程中的人工操作大幅减少,这通常意味着投入测试的应用质量比传统编码开发更稳定、Bug更少。开发方可酌情缩减测试投入,进一步提升交付速度,缩减成本投入。
- 部署阶段的大量人工操作被可视化操作替代,开发方一方面可以缩短部署阶段的时间计划,另一方面也可以更方便、更快速完成测试环境、仿真验证环境、线上验证环境的构建,进一步细化发布测试和验证测试的流程,提升项目的可控性。
支撑软件全生命周期的低代码
低代码对软件开发全生命周期进行了优化,在保证工程管理和项目质量可控的前提下,最大限度缩短了软件项目的研发周期。正在使用编码开发的团队向低代码转型时,团队可以沿用现有的大部分管理工具和方法论,只需将IDE等工具替换为低代码平台即可。
Info |
---|
本章节内容均针对“模型驱动的低代码平台”,可能不适用于部分“表单驱动的低代码平台”。 |
一、需求分析
低代码大幅缩短了从原型确认到部署上线的全过程,显著提升了软件迭代的速度。所以,低代码时代的需求分析可以进行一定程度的简化。因为直观的可视化界面代替了需求方难以理解的源代码, 开发团队可以直接使用低代码平台的可视化设计界面上,展示页面效果和业务处理逻辑。这就意味着,需求分析阶段将不再需要开发可丢弃的原型来完成功能和设计方面的验证,而是将其转移到设计与开发阶段。
此阶段建议采用现有的需求管理和协作工具,如Atlassian的Jira等。
二、设计与开发
“软件第一、文档第二”是敏捷项目管理的核心诉求,然而在编码开发方式下,开发团队依然需要通过UX原型、业务流程图等无法直接运行的文档,与需求方进行沟通确认。造成这种情况的主要原因是开发阶段产出的代码易读性差,评审和检查的技术门槛过高。而低代码时代,项目的技术负责人和业务专家,可以直接利用低代码平台的可视化设计界面,直观查看页面的效果和业务处理逻辑。于是,设计和开发阶段可以进行合并,简化不必要的中间环节,提升项目的整体效率。此外,这种工作方式,让开发方与需求方的协作更加紧密,项目成功率也有较大幅度的提升。
此阶段是低代码开发与传统编码开发方式相比的最大改进,得到了低代码开发团队的广泛认可。
三、测试
开发团队可以使用低代码平台提供的一键部署能力,快速搭建测试环境。对于提供私有化部署和桌面开发环境的低代码开发平台来说,开发团队可以将低代码平台的设计器与CI/CD工具进行集成,以实现“抓取代码”+“编译生成”+“发布到测试环境”全程自动化的效果,让开发团队的成果在第一时间接受手工测试和自动测试的考验。
因为低代码平台的机制和产出成果与编码开发一致,此阶段中,开发团队可以沿用成熟的技术方案,如开源工具Jekins(自动化调度),sosotest(WebAPI自动化测试,与Jekins集成性好)等。
四、部署
部署与升级是将软件正式呈现给用户的过程。为了降低部署的风险,尤其是数据库差分升级导致的错误,开发团队通常会与运维团队配合,搭建与生产环境高度类似的验证(也称Stage)环境,并在此环境上执行升级和验证测试,最终在生产环境上执行的部署操作将严格参照验证环境来执行。进入低代码时代,部署和升级工作的可视化程度显著提升,自动生成的部署操作脚本和数据库升级脚本减少了手工操作的失误概率。所以,开发团队仅需要在运维团队搭建的验证环境上,执行一键部署和必要的测试。通过测试后,再将部署的目标环境切换为生产环境,再次执行一键部署即可确保该阶段的质量可控。
如果开发团队有成熟的数据库比对和差分脚本升级解决方案,在该阶段中也可以采用数据库与应用分离的部署方式,即采用低代码平台升级应用程序,而采用Navicat等第三方工具完成数据库的部署工作。
五、反馈
收集最终用户的反馈是上一个迭代的结束,也是新一个迭代的开始。考虑到国内企业服务的现状,这一阶段主要依靠线下调研和实地探访,辅以线上问卷。这里不再展开介绍。
六、版本与分支管理
为了支撑上述环节,特别是设计与开发、测试和部署,开发团队需要采用低代码平台内置的版本和分支管理功能,或将低代码平台与码云、Github等成熟的第三方代码库进行集成。在代码访问权限、注释模板、pull/push规则、版本回滚操作、分支建立与合并等具体的工作方式上,低代码开发方式可与编码开发保持一致。
软件工程对低代码平台提出的挑战
根据权威行研机构的观点,低代码平台的最低标准为具备低代码能力(如模型驱动、可编程的可视化开发方式等),能用于开发包含有用户界面、业务逻辑、工作流和数据服务的完整应用程序。而软件工程和全生命周期对低代码平台在协同开发、版本和分支管理、部署、升级等领域提出了更高的要求。一款支撑软件开发全生命周期的低代码开发平台,需满足以下技术要求,建议将其纳入技术评估列表:
- 内置或兼容主流版本管理工具(如git、svn等),提供可视化的签入、签出、回滚等版本管理功能,以及分支管理方案
- 内置可定时执行或触发执行的CI/CD功能;或提供可以和第三方CI/CD集成的命令行工具(桌面版开发环境)或Webhook机制(Web版开发环境)
- 内置可配置的多套应用和数据独立的运行环境,至少需提供开发环境、测试环境和生产环境(公有云部署);或提供可视化的应用和数据库部署能力(私有云部署/本地部署)
- 内置可视化的数据库结构比对功能和差分升级脚本生成功能,提供可视化的数据库升级方案
守正方可出奇。从软件的诞生到如今,凝聚了全球软件开发团队心血和经验的软件工程一直保持了旺盛的生命力,已经成为“开发一个软件需要哪些步骤”的标准答案。从传统的CMM模式到当今流行的敏捷模式,软件生命周期的定义在不断演化,覆盖范围越来越大,影响的人群也越来越多。进入21世纪后,可视化、自动化的软件开发技术和工具也让软件生命周期有了更有效的支撑,有效帮助了开发团队在生命周期中做到“不走样”。软件工程的发展与软件开发技术的进步呈现出了相辅相成的状态。低代码技术是软件开发技术发展的必然产物,是可视化和自动化从少部分环节扩展到全生命周期的必然结果。我们相信,随着低代码技术的发展,软件生命周期的覆盖范围会进一步扩大,让软件工程发挥出更大的价值。