You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

18 KiB

15低代码平台应该优先覆盖应用研发生命周期中的哪些功能

你好,我是陈旭,今天我们来说说低代码平台除了开发能力之外还需要什么能力。

我们专栏的常规更新部分,到现在已经更新到尾声了。前面好几讲的内容,我们都在关注低代码平台的开发能力。对低代码平台来说,开发能力当然是最重要的一种能力,没有之一。毫不夸张地说,开发能力直接决定了低代码平台的综合能力上限

但低代码平台不能一味追究开发能力,也需要关注开发能力之外的能力。**开发能力之外的其他能力决定了低代码平台的总体能力下限。**在低代码平台发展初中期,我们当然是需要坚持优先发展开发能力,但是低代码平台有了一定成熟度之后,就需要开始关注并适当发展其他的能力了。

图片

那么低代码平台除了开发能力之外,还需要发展哪些能力呢?

我们可以以App开发的生命周期为线索来寻找这些功能。以开发能力为中心它的左侧为需求端功能右侧为交付端的功能上方为生产环境管理功能下方为资产管理功能

图片

我们简单分析一下这张图。在需求端,一般有两种协同方式:

  • 产品需求→UX设计团队→业务开发团队一般在App初创时走这个流程
  • 产品需求→业务开发团队一般在App迭代过程走这个流程。

低代码至少可以在这两个环节上发挥作用。对于第一种UX设计团队输出的是设计稿低代码平台可以自动将设计稿转为可用代码这个功能也就是D2C功能。对于第二种低代码平台可以提供数量众多的模板和业务组件给业务团队“抄作业”。

交付端App上线或者交付之前最重要的一个环节就是测试了自动化测试是效率最高、最可靠的测试方式那么低代码平台能否在App的自动化测试方面有所作为呢另外App上线之后想要获知用户对App的使用情况、App的运行状况就需要事先植入埋点用于采集数据然后要有办法拿到埋点数据并提供分析功能。

生产环境管理端低代码平台至少可以在运行时自动部署方面提供帮助特别是一些容器化的运行时每个App上线之前都需要制作和配置镜像蓝图、Dockerfile以及其他配置文件林林总总可能有数十个配置项需要填写任何一个填错就会导致部署失败。一些重要的App上线后还有一个灰度发布的过程需要进行灰度配置甚至紧急回退等功能也可以集成到低代码平台上。

资产管理端是将App作为一种业务资产来看待包括代码自动评审、入库等与代码托管相关的工作甚至还可以覆盖App的自动化版本管理等与办公自动化相关的一些功能。这些都可以集成到低代码平台上实现App从开发到管理的全生命周期管理能力。

这样一分析你看其实低代码平台在App开发的全生命周期中能做的事情还有很多。这些能做的事情也不是全部都要我们原创。我们可以把许多传统编码开发过程中需要人工完成的事情实现一定程度的自动化然后集成到低代码平台上实现一站式管理这样就已经可以发挥许多作用了。即使无法做到全自动哪怕实现了半自动化也是不小的进步。

这一讲的内容特别多,甚至我们还能在很多方向上展开聊聊,每块儿单独成一讲。所以我想着,索性将这讲作为一个提纲来总体分析,给你一个大致方向。后续在动态更新部分,我还会根据我的经验和同学们的需要与反馈,针对性挑选相应的功能,展开聊聊它们的具体实现。

需求端

需求端的D2C功能和模板能力都是非常有用的功能。其中D2CDesign to Code功能是UX设计稿转代码的功能这是一种很酷的能力但是它的优先级远没有模板功能高。模板是App的半成品或者是App中常用的、有代表性的一个部分。

模板最大的意义和价值就在于应用团队可以快速地抄作业不用从零开始开发。当积累了一定数量的模板后再对它们进行分门别类应用就可以根据自己的目标App挑选接近的模板然后在模板的基础上继续将其演进为一个完整App。从这个角度看模板和纯编码模式下的脚手架差不多但比纯编码的脚手架更优秀的是这是一个可视化的、所见即所得的脚手架

对任何具有开发功能的工具来说,模板有很大的意义。毕竟,开发的过程就是探索的过程,你想一下,如果你是一个缺乏经验的开发者,即使你手里握着低代码这样的先进生产力工具,但当你面对一片空白的画布的时候,依然会无所适从,不知道从何着手吧?模板就是一种极佳的破冰解决方案,给了开发者一个探索的方向。

而且,模板除了可以起到给应用团队抄作业的功能外,还有一个价值:模板天然就是一种学习的教材,它是一种样板实现范例。应用开发人员拿到一个模板之后,依葫芦画瓢,逐渐摸索,就能逐渐学会使用低代码平台。根据我的经验,大家不爱看使用手册,更喜欢直接上手摸索、试错。

利用代码直接识别UX设计稿并生成可用的代码的技术简称为D2C在过去两三年里也得到了长足的发展各大互联网巨头都纷纷推出各自的解决方案。实现的方法多种多样眼花缭乱简单的就是计算机视觉技术再复杂一点就是AI图像识别。之所以要搞得这么复杂门槛这么高是因为现在的D2C工具都自成一体它不仅需要识别UX设计稿还需要将识别到的设计稿转为对人类友好的代码。

不知道你有没有从D2C实现的关键步骤里发现了什么你看生成代码这样的功能不就是低代码平台擅长做的事情吗这个功能我们已经在专栏里多次讨论到了呀那么在低代码平台上来实现D2C功能会不会比传统的D2C解决方案要简单许多呢

事实也确实如此我们只需要从UX设计稿里识别出足够多的信息“喂”给低代码编译器低代码编译器就可以把代码给生成出来了。

那么哪些信息是“足够多”的信息呢?我们以通用场景为例,必须得到的信息是设计稿中各个组件的种类、位置、尺寸这几个值,其他可选信息有文本,颜色,图标等。

其中组件的类型是最关键的信息。有了组件的类型我们仅仅根据UX设计规范就可以获得这个组件的大量预设数据了而UX设计规范是静态的任何设计稿都是它的一个实例而已。因此只需要从设计稿里读出组件类型无须其他数据我们就可以把这个组件的大部分信息推断出来了。

不过位置和尺寸是UX规范给不了的这两个信息决定了生成出来的UI是否可用因此我们必须从设计稿中读取出来。其他的信息就都是可选的了不会影响最终成败但如果我们能从设计稿里识别出更多的其他的信息也能提升自动化率。

所以说在低代码平台上实现D2C的功能虽然不能说有多简单但是也不至于需要用上计算机视觉甚至AI这样的高精尖技术。在动态更新部分我们会有专门一讲讲解如何采用“平民化”的技术为低代码平台增加D2C能力。

交付端

自动化测试是软件交付过程中一个非常有价值的手段而UI的自动化测试是软件自动化测试皇冠上的明珠。

UI自动化测试的成本很高这一点不是因为测试用例代码难写主要是测试用例代码调试成本高测试用例代码的维护成本更高。这样的特点往往会让参与UI自动化测试的人笑着进去哭着出来。刚开始的时候轻轻松松十来行代码就可以驱动浏览器完成被测Demo页的自动化操作很酷但是一旦被测页面复杂起来之后特别是与鼠标相关的操作多起来之后人工轻而易举就可以实现的操作调试用例时却要花大力气才能完成。

然后你坚持不懈好不容易跑通了几个功能点的测试用例调试结果还没跑上几天就发现测试用例跑不过了。调试一番后才发现有人修改了页面的一个class名或者调整了dom结构导致用例的selector找不到DOM节点了。这是导致用例跑不过的大多数原因。

而且日常Web页面的开发就充斥着大量这样的操作会导致测试用例代码常常莫名其妙跑不过。这样的问题主要看需求紧不紧张。需求不紧张的时候调试调试就可以解决了但在需求紧张起来时你猜第一个被砍掉的代码是哪些显然是测试用例代码说好过几天再修复然后就没有然后了。

这就是UI自动化测试的现实和困境。那低代码平台能为此做点啥吗

低代码平台对整个App的UI结构和交互过程了如指掌甚至比开发人员自己还更了解这个App的UI和交互。虽然低代码平台没有开发人员智能但开发人员能写得出来UI的自动化测试用例低代码平台应该也能生成出一些基本的来。

而能自动生成测试用例也就意味着低代码平台有能力自动维护这些用例代码不至于UI上有点风吹草动就导致用例跑不过。这样看来人工编写UI自动化测试用例的两大痛点都可以被解决了。

那么解决这个问题的思路是啥呢其实也很简单就是通过跟踪UI上的事件整理出被测App的功能点加上低代码对App交互过程的了解我们就可以生成模拟人工操作的代码了从而也就可以自动生成自动化测试代码了。这部分更详细的方法我会在动态更新部分专门介绍。

App上线之后那我们得知道App的使用情况、App的运行状况以及异常情况等信息这都需要事先植入埋点用于采集数据然后我们还得要有办法拿到埋点数据并提供分析功能。这个做法在纯代码模式下已经很成熟了所以低代码平台也不需要再次发明新方法只要提供自动化程度更高的植入埋点能力和自动分析数据的功能就可以帮助没有经验的人获取到所需的数据用来改进App了。

生产环境管理

除了前面说的需求端和交付端外,低代码平台还要能在生产环境的运维上,提供一定的自动化能力。

在这方面主流的低代码平台有两种差异比较大的解决方案第一种是低代码平台将开发和运行环境合一直接将开发好的App“一键”推送给运行时自动生成一个URL对外提供业务价值第二种是开发环境和运行环境物理隔离彻底解耦。

我们这个专栏介绍的低代码平台不严格区分这两种模式不过Awade采用的是第二种将开发和运行时隔离的方式。

开发和运行时隔离的方式的好处是可分可合,按需处理。低代码平台可以再独立开发一个运行时与开发时环境对接,实现第一种方式的一样的效果,也可以不提供运行环境,由业务单位自行解决运行环境的问题。

无论是内置运行时,还是业务单位自建运行时,低代码平台都应该提供自动部署方面的能力。如果是容器化的运行时我们可以直接提供应用运行时镜像在镜像中直接把蓝图、Dockerfile以及其他配置信息都自动处理好应用团队拿到镜像后就可以直接部署或者由低代码平台自动推送给自带的服务器上直接部署。如果是物理机环境我们可以打包所需的各种依赖直接生成所需的各种脚本做到应用解压后直接一个run.sh就搞定的效果。

无论是集成式运行时还是独立式运行时低代码平台都可以为App上线时的灰度发布提供能力实现可视化的灰度发布策略选择可视化一键紧急版本回退等主要功能。当然如果灰度发布已经是一个成熟系统了那我们就可以考虑将它集成到低代码平台之上作为低代码平台在生产环境管理方面的能力之一。

而且,如果我们已经可以提供可视化灰度策略,内置多种不同的策略,根据灰度功能的特性,由业务团队选定特定的灰度发布策略,那当然也就可以支持发布策略的自定义配置了,包括:

  • 基本策略配置:包括用户规模、覆盖功能、回滚策略、新旧系统部署策略等;
  • 用户画像配置:包括用户特征、年龄、数量、地理、终端、常用功能、友好度、净值度等,根据手里的用户画像数据而定;
  • 分流规则配置这部分比较灵活多以手工修改配置文件如nginx.conf或者运维脚本为主容易出错可视化集成后收益较高。

最后还有一点,低代码平台内置植入埋点数据的功能,也可以和灰度发布策略功能配合使用,埋点数据可以收集到用户信息、运行时信息等,这些都可以作为灰度发布的策略支撑数据。

资产管理

最后我们再来说一下资产管理方面的问题。App是一种资产它可以统一托管在低代码平台中低代码平台提供可视化的代码托管服务这样可以降低非技术人员在使用Git时可能会碰到的困难。

Git作为一个专业的源码版本管理工具只提供MML人机命令接口这对许多非技术线的低代码用户来说太过专业。如果代码合入过程出了问题特别是有冲突时非技术线的用户往往束手无策。虽然现在已经有许多Git可视化工具了但也是要求用户理解Git的基本逻辑和概念不然也不可能用得好。

低代码平台上的代码托管功能不需要完整复刻Git的各种能力只需要把代码托管和App的工程管理融合在一起即可。

比如在应用开发者打开应用工程时自动执行git pull在退出应用工程时自动执行git commit提交所做的修改。甚至还可以依托于gitlab或者gerrit这样的工具自动就本次修改发起代码走查流程将当前所做修改推送给管理员进行代码走查。此时gitlab或者gerrit还可以触发DevOps流水线对当前的修改进行自动构建和测试等一系列操作然后才进入人工走查阶段。而这一系列操作都可以由低代码平台在后台静默执行。

这个过程看起来很复杂但是其实大多数动作都可以由DevOps流水线来执行低代码平台需要做的只是正确地配置好流水线任务以及触发DevOps流水线。像gitlab或者gerrit这种一站式代码托管工具本身就有非常完善的API几乎所有操作只需要一个后台shell命令就可以触发。其中gitlab是一个开源软件,社区版是免费的,gerrit是一个商业软件。

App的版本也可以作为一种资产来对待一般的软件企业肯定已有App版本管理系统了低代码平台可以打通App版本管理系统从而实现一站式的App版本发布和更新。这方面离我们专栏太远了而且没有统一的对接方法这里就只提出目标但实现上就不再深入了。

总结

低代码平台不能只关注开发能力开发能力固然是低代码平台最重要的能力即使它定义了低代码平台的能力上限但是也不能忽略其他能力。这一讲我从App开发生命周期的角度从4个维度整理出了低代码平台的其他能力这些能力共同定义了低代码平台的能力下限。这两种能力相辅相成、均衡发展才能从整体上推动低代码平台综合能力的发展。

图片

我们再次回顾一下这张雷达图水平方向上是从需求到交付以研发能力作为主线从D2C到模板和业务组件再到开发再到自动化测试再到运行时数据采集和分析等几个能力是应用开发过程中非常重要的几个环节这是低代码平台应该着重关注的几个着力点,应该优先发展水平线上的这几个能力

垂直方向上主要是从管理的角度来看低代码的功能的,从生产环境管理到资产管理,一共有灰度发布、自动化部署、版本管理、代码托管这几个着力点。相对研发能力这根主线来说,管理线上的能力优先级相对较低,如果你的低代码平台主要定位是面向内部使用,你甚至可以不需要发展管理线上的能力,但如果你的低代码平台有需要部署到客户现场的话,那么管理线上的这几个能力就不能无视了,这个情况下它们也是必须的。

最后我们再回顾一下能力示意图,相信你会有更系统的认知:

图片

思考题

  1. 研发能力线上,除了这讲列出的几个能力之外,在你的场景中,还有哪些能力是同等重要的?
  2. 除了研发能力和管理能力线,你认为还有其他的维度吗?

欢迎在留言区里留下你的看法。我是陈旭,我们下节课再见。