精华内容
下载资源
问答
  • 代码编程

    万次阅读 多人点赞 2019-04-02 09:05:27
    中台之后,便是无代码编程。 规模化的组织,经常要面临这样的挑战:每个应用的基础设施是相同的,部分的代码也是相同的,甚至于它们可能只是数据模型不同而已。结果却导致了,他/她们要一次又一次地重新编写一个...

    中台之后,便无代码。

    规模化的组织,经常要面临这样的挑战:每个应用的基础设施是相同的,部分的代码也是相同的,甚至于它们可能只是数据模型不同而已。结果却导致了,他/她们要一次又一次地重新编写一个应用。

    对于一个新的应用而言,它需要对接大量的三方(非自己团队)服务。服务之间的不断变化 ,导致了对应的使用方也需要发生变化。不断变化的业务,导致了前台的设计不断变化。为了应对快速谈的的前台服务,后台便诞生了中台,以提供快速的响应能力。而随着中台进一步沉淀,从某种形式上趋于稳定,而前台仍然需要快速地响应能力。

    于是乎,作为一个前端开发人员,我们不断提炼和复用代码,想着的模式在上一篇文章 减少代码量的 7~8 种方式 中提到了:

    • 脚手架
    • 组件库
    • 模式库
    • 模板和模板应用

    对应的,我们还创建了一系列的 CLI、工具集、编程器插件以及设计系统,以完成整个系统的快速开发。然而,我们还缺少一套有效的工具,来统一化的管理这些工具。

    换句话来说,就是:我们需要一个前端的中台,它便是无代码/低代码编程。

    什么是无代码编程?

    无代码/低代码是一种创建应用的方法,它可以让开发人员使用最少的编码知识,来快速开发应用程序。它可以在图形界面中,使用可视化建模的方式,来组装和配置应用程序。开发人员可以直接跳过所有的基础架构,只关注于使用代码来实现业务逻辑。

    当然,从开发人员的角度来看,降低代码量,可能是:

    1. 框架本身处理了复杂性。毕竟 “复杂度同力一样不会消失,也不会凭空产生,它总是从一个物体转移到另一个物体或一种形式转为另一种形式。”
    2. 代码生成减少了工作量。大量的复制、粘贴需要更多的时间。

    流程

    只是凭借这个概念,我们是无法理解无代码编程的。于是,我画了一张图来展示相应的架构和流程:

    在这里插入图片描述

    依照我的观点来看,我将无代码编程分为了两部分:

    • 用于构建 UI 的编辑器——一种在线的拖拽式 UI 设计和页面构建工具
    • 用于编写业务逻辑的流编辑器——通过流编程的方式来编写业务代码(多数是对于数据的处理)

    UI 编程器。为了设计出我们的 UI 构建器,我们需要准备好一系列的基础设施:

    • UI 编程器。用于拖拽式设计 UI。
    • 空白脚手架。一个带有完整的应用生命周期的项目,但是它是一个空白的项目——用于我们在构建 UI 的过程中,随时随地的添加组件和代码。
    • 设计系统。我们需要一个完整的组件库,大量的页面模板,以及一定数量的模板应用,减少相应的开发工具量。
    • 代码片段集。它将设计系统中的组件库进一步实例化成代码段,在完成编辑后通过 CLI 来动态编辑代码。
    • DSL(领域特定语言,可选)。中间生成物,用于隔离框架与设计。

    流编程器。随后,为了在

    • 流编程器。用于拖拽式、输入编写业务代码。
    • 后端服务。如果不能提供现成的后端服务,则需要拥有一个标准的 API 规范,以及相应的 mock server。
    • 模式库。包含相应的业务处理代码,如通用的登录、数据获取、UI 交互等。
    • DSL(领域特定语言,可选)。同上

    当然了,我们还需要能实时预览构建出来的应用。随后,我们执行了构建,而后构建出了一个半成品应用。开发人员只需要在它的基础上开发应用即可。而在开发人员开发的过程中,我们可以设计一系列的工具,来帮助开发人员更快速地构建应用。

    • 编辑器插件。包含设计系统、模式库等的自动完成代码,以及组织内部常用的代码库。
    • 调试工具。对于混合类型的应用而言,我们还需要一个开发工具来快速构建应用。

    从上述的流程上来看,无代码编程还具有以下的特点:

    • 拖放式界面。又或者是可视化模型——基于节点和箭头
    • 基于视觉的设计。
    • 可扩展的设计。如对于插件、插件商店,社区等一系列的支持。
    • 跨平台功能。支持 PC Web 应用开发,支持移动应用构架等。
    • 强大的部署后。即平台包含着整个应用的生命周期。
    • 拥有丰富的集成支持。可以随意的找到需要的组件,以及对应的后台服务。
    • 配置化。它也意味着大量的自定义配置。
    • 自制的领域特定语言(可选)。用于构建时优化。

    优缺点

    相应的,它具有以下的一些特点:

    1. 高效。不用多说,节省时间和开发成本。
    2. 有限的 Bug,安全性。
    3. 低成本。其所需的预算非常有限。
    4. 易用(取决于设计)。
    5. 开发速度更快。
    6. 开发过程中的 AI 。
    7. 维护成本低。

    对应的相应的缺点有:

    1. 仍然需要编程技能。
    2. 受限的自定义能力。
    3. 可扩展性成了新的问题。
    4. 集成受限。

    就当前而言,低代码开发平台通常分为两大类:

    • 对于外部:制作简单的产品,如网络移动应用程序
    • 对于内部:为您的团队或企业创建业务应用程序

    诸如只使用 CRUD、表单、验证、简单聚合、分页等简易的服务。最常见的例子就是表单构建了,诸如金数据这样的应用,便是可以直接通过拖拽元素来生成,相应的开源实现有 jQuery Form Builder。对于开发人员来说,我们只需要定义好数据模型,再通过拖拽来决定元素的位置即可。从这种角度来看,只要能使用 Serverless 构建的应用和服务,都可以直接使用低代码开发模式。

    开发流程对比

    从我们的理解来看,传统应用的开发流程是:

    1. 分析、设计、确认、规划需求
    2. 设计系统架构
    3. 搭建前后端项目。选择技术栈、从零开始搭建或者从脚手架中创建。
    4. 搭建持续集成。
    5. 创建线框图和高保真原型。
    6. 设计数据模型,定义前后端契约,即 API URI、方法、字段等。
    7. 前后端实现业务逻辑。
    8. 前端实现 UI 页面。
    9. 集成第三方后端服务。
    10. 功能需求测试(DEV、QA、ST、UAT)
    11. 跨功能需求测试(安全性、性能等)
    12. 部署到生产环境。

    而,低代码开发流程:

    1. 分析、设计、确认、规划需求
    2. 选择需要的第三方 API
    3. 在可视 IDE 中绘制应用程序的工作流程、数据模型和用户界面。
    4. 连接 API——通常使用服务、函数发现。
    5. 编写业务逻辑(可选)。手动代码添加到前端或者自定义自动生成的 SQL 查询。
    6. 用户验收测试。
    7. 部署到生产环境。

    从步骤上来看,无代码编程少了几个步骤。这些步骤都因为大量丰富的内部系统集成,而变得非常简单。

    适用场景

    就当前而言,无代码编程实际上是一种高度的场景预设的模式。因此,它存在一定的适用场景:

    • 模型驱动开发
    • 快速 UI 构建
    • 极简的业务功能。使用这样的工具,也意味着,我们对于交互和可
    • IT 资源受限。在资源受限的情况下,能快速开发出符合业务需求的应用最重要。

    而从流程上来看,对于一部分的应用来说,我们并不能实现无代码编程——存在一些业务上的不同之处。因此,多数场景之下,只是实现了低代码编程

    若是想真实的无代码编程,则需要一些更特定的场景:

    • 设计表格(输入数据)
    • 创建报告(组织数据)
    • 常规调度和自动化过程(操纵数据)

    更多的场景正在探索中。

    无代码编程的挑战

    无代码编程,除了需要准备好上述的一系列基础设施,还不可避免地会遇到一系列挑战。

    • 谁来写这部分代码?
    • 客户端的基础设施准备。
    • 服务端的服务平台搭建。
    • 统一用户体验设计。设计出一系列能便利组合的组件,及对应的模板页面。与此同时,它们还能适应于不同的风格,即有多样性的主题支持。
    • DevOps 流水线设计。低代码编程,依赖于一系列的自动化工具,以实现构建、调试、部署以及维护,同时还包含应用的测试。
    • 领域语言设计。
    • 自动化测试。如果我们的前端代码是自动生成的,那么我们还需要对它们进行测试吗?这是一个好问题,而如果代码是自动生成的,那么测试也应该是自动生成的。毕竟要在平台上,编写大量的自动化测试,以保证平台的质量。

    其中,有一些部分略微复杂一些,我们大概可以探索一下。

    谁来写这部分代码?

    在我们创建这样一个平台和工具时,我们要考虑的第一个问题是,我们这个工具是为谁写的?

    • 没有编程经验的人。如业务人员,他/她们对于业务系统有着非常丰富的经验。这也意味着,我们
    • 有编程知识,但是没有经验的人。
    • 有一定经验的开发人员。
    • 有丰富经验的开发人员。对于专业的人来说,自动化就意味着缺少灵活度。甚至与自己编写相比,他/她们要花费更多的时间来修复生成的代码。

    显然,对于相当有经验的开发人员而言,这个工具并不一定是他/她们所需要的。

    客户端基础设施

    从我的理解来看,它适合于 快速的 MVP 构建,并且生成的代码还应该方便修改,而不是诸如早期的 DreamWeaver 或者 FrontPage 这样的工具。

    而与此同时,由于面向的开发人员水平不同,我们所需要做的工具也不同:

    1. 支持云构建和调试。
    2. GUI 编程应用。
    3. 代码生成。
    4. 设计系统体系构建。组件库搭建,模板应用创建等。

    更难的是,容易让开发人员能接受代码生成。

    服务端

    对于一个低代码平台而言,它对应的后端应该:

    1. 大量可用地现有服务。身份验证、安全性、推送能力、地图等等
    2. 快速构建出后端服务。若是有内部 Serverless 或者 FaaS 方案,可以说是再好不过了。
    3. 方便与第三方服务集成。
    4. 灵活性。支持多语言等。

    统一的后端服务 API,对于后端服务来说,我们需要一个通用的范式。所有的 API 应该按照这样的范式来设计。不过,作为一个 API 的消费方,我们可能没有这么大的权力,但是我们可以采用装饰器模式,即封装第三方 API 成统一的方式。为此,我们采用的方式,仍然是:

    • 契约。诸如 Swagger UI,它可以直接创建一个简易可用的服务。
    • BFF。即我们一一去按我们的需要,去封装这些第三方应用。
    • 查询语言。与自己编写 BFF 相比,更简单的方式是采用:GraphQL 这样的后端查询语言,便捷性更高、模式更加灵活。

    在开发前的设计期里,我们需要首先设计出对应的领域模型。

    领域语言设计

    低代码环境使用(图形)建模语言来指定整个系统、产品的行为。它意味着:

    1. 将数据结构、领域模式应用到程序的各个层级中。
    2. 将业务规则、决策融入到应用中(层级)。

    这也就意味着,我们需要设计一个模型语言。而它对于我们而言,实际上是领域特定语言(DSL)。如下是一个简单的 DSL 示例,用于描述使用到的组件:

      {
        'style': '',
        'id': 2,
        'blocks': [
          {
            'content': {
              'content': 'content',
              'title': 'hello'
            },
            'type': 'card'
          }
        ]
      }
    

    除此,我们还需要设计对应的布局 DSL,诸如于:

    H:[circle1(circle1.height)] // set aspect-ratio for circle1
    HV:[circle2..5(circle1)]    // use same width/height for other circles
    H:|[circle1]-[circle2]-[circle3]-[circle4]-[circle5]|
    V:|~[circle1..5]~|          // center all circles vertically
    

    最后,我们还需要将流代码,转换为真实的项目代码。三种类型的 DSL 结合下来,都不是一个轻松的工具。

    原型设计

    写好现有的组件,通用型接口。如常见的登录接口,。对于使用登录接口的业务来说,它们只关心三部分的内容:

    1. 成功登录。
    2. 取消登录。
    3. 登录失败。对于客户端而言,可以视为取消登录。对于服务端来说,则可能是密码错误、用户名不存在、账号被锁定等。

    对应于以上情景,又有一些通用的逻辑处理:

    1. 登录成功。保存 Token,并返回历史页面。
    2. 登录失败。弹出一个自定义内容的提示框。

    这些代码是相似的。

    前端原型

    在一些简单的前端应用里:

    • 模板。只是在使用这些模板,再为这些模板设置相应的属性,绑定对应的值。
    • 数据。其过程都只是在各种保存变量的值,并 CRUD 这些变量的路上。为此,我们需要一个数据处理的管道架构设计,用于处理这些值。
    • 函数。事实上,我们的所有函数都只是一些管理函数,只用于处理这些对应的逻辑。

    这些常见的功能都可以做成一些组件,它们对于某些应用来说,代码相应的重复。

    • 无限加载页面。只需要绑定上 API,再控制一下元素的显示与隐藏即可。
    • 表单。定义好字段即类型,对应的前后台逻辑都有了。除此,我们还需要为它们自定义好常见的规则,如正则表达式。而一旦表单之间有联动,那么这个组件的设计就更加麻烦了。
    • 卡片式元素。
    • 表单和表格展示。
    • 常见图表。事实上,已经有一系列的图表工具了,我们只是在它们在基础上,进行了二次封装而已——使得它们可以变成领域语言的形式。
    • 高级的响应式布局。与每个应用独立开发布局不同的是,低代码平台需要提供一套强大的自定义、响应式布局设计——即要满足移动端的通用模式,还要满足桌面版的通用模式。如对于大量数据来说,桌面端使用的是 Pagination,移动端使用的是无限滚动。

    后端原型

    事实上,对于后端来说,低成本平台意味着,代码生成及服务生成。而服务本身是有限的,既然是业务上发生了一些变化,后端服务也可能并不会发生变化。

    它也意味着:

    • 微服务化。每个后端服务要尽可能的小。
    • API 规范化。即采用统一的 API 格式,接受统一的权限管理
    • 大量的 API 服务。
    • 快速集成第三方服务方案。集成第三方服务是开发应用不可避免的情况。为了应对这个问题,我们需要做准备好对应的创建服务逻辑,传入第三方服务所需要的参数,便可以直接生成我们的转发服务。

    那么,问题来了,既然如此,我们是否能提供一个定制的工具呢?让每个人可以创建自己的组件流?

    答案,显然是可以的。

    概念证明

    于是乎,在我最近设计的 PoC (概念证明)里,采用的是 Anguar 框架。相应的基本思想如下:

    1. 使用 Material Design 作为组件库,使用 CDK 的 Drag 来实现拖拽功能。每个拖拽的组件,称为 element(元素),由 ElementDispatcher 由根据数据生成对应的组件。可拖拽的部分由两部分组成:布局 + 元素
    2. UI 构建完后,生成对应的 DSL,目前采用的是 JSON。毕竟数据结构是最简单的领域特定语言。
    3. 借由 Angular Schematics 解析这部分的 DSL,来生成相应的项目代码。

    其它

    相关开源项目:

    参考资料:

    1. https://www.process.st/low-code/
    2. https://medium.com/@stefan.dreverman/decisions-to-take-for-your-low-code-architecture-c0768b606f
    3. https://medium.com/@stefan.dreverman/analyzing-coinmarketcap-data-with-neo4j-4930ba0068e1
    4. https://www.outsystems.com/blog/what-is-low-code.html
    5. https://medium.com/@stefan.dreverman/starting-a-low-code-application-architecture-13170fcd6fc7
    6. https://www.quora.com/What-is-low-code
    7. 无代码编程
    展开全文
  • “中台之后,便是无代码编程。”无代码编程是什么?开发流程是怎么样的?有何优缺点?无代码编程时代来了,就不需要程序员编写代码了吗?下面作者将跟大家聊聊无代码编程的那些事儿。规模化的组织,经常要面临这样的...
    “中台之后,便是无代码编程。”无代码编程是什么?开发流程是怎么样的?有何优缺点?无代码编程时代来了,就不需要程序员编写代码了吗?下面作者将跟大家聊聊无代码编程的那些事儿。

    规模化的组织,经常要面临这样的挑战:每个应用的基础设施是相同的,部分的代码也是相同的,甚至于它们可能只是数据模型不同而已。结果却导致了,他/她们要一次又一次地重新编写一个应用。对于一个新的应用而言,它需要对接大量的三方(非自己团队)服务。服务之间的不断变化 ,导致了对应的使用方也需要发生变化。不断变化的业务,导致了前台的设计不断变化。为了应对快速谈的的前台服务,后台便诞生了中台,以提供快速的响应能力。而随着中台进一步沉淀,从某种形式上趋于稳定,而前台仍然需要快速地响应能力。

    于是乎,作为一个前端开发人员,我们不断提炼和复用代码,想着的模式在之前的文章已提到了:

    • 脚手架
    • 组件库
    • 模式库
    • 模板和模板应用

    对应的,我们还创建了一系列的 CLI、工具集、编程器插件以及设计系统,以完成整个系统的快速开发。然而,我们还缺少一套有效的工具,来统一化的管理这些工具。

    换句话来说,就是:我们需要一个前端的中台,它便是无代码/低代码编程。

    01 什么是无代码编程?

    无代码/低代码是一种创建应用的方法,它可以让开发人员使用最少的编码知识,来快速开发应用程序。它可以在图形界面中,使用可视化建模的方式,来组装和配置应用程序。开发人员可以直接跳过所有的基础架构,只关注于使用代码来实现业务逻辑。

    当然,从开发人员的角度来看,降低代码量,可能是:

    1. 框架本身处理了复杂性。毕竟 “复杂度同力一样不会消失,也不会凭空产生,它总是从一

    个物体转移到另一个物体或一种形式转为另一种形式。”

    1. 代码生成减少了工作量。大量的复制、粘贴需要更多的时间。

    流程

    只是凭借这个概念,我们是无法理解无代码编程的。于是,我画了一张图来展示相应的架构和流程:

    15b93e84fc517b4a0150ae613e1c3f2e.png
    低代码编程流

    依照我的观点来看,我将无代码编程分为了两部分:

    • 用于构建 UI 的编辑器——一种在线的拖拽式 UI 设计和页面构建工具
    • 用于编写业务逻辑的流编辑器——通过流编程的方式来编写业务代码(多数是对于数据的处理)

    UI 编程器

    为了设计出我们的 UI 构建器,我们需要准备好一系列的基础设施:

    • UI 编程器。用于拖拽式设计 UI。
    • 空白脚手架。一个带有完整的应用生命周期的项目,但是它是一个空白的项目——用于我们在构建 UI 的过程中,随时随地的添加组件和代码。
    • 设计系统。我们需要一个完整的组件库,大量的页面模板,以及一定数量的模板应用,减少相应的开发工具量。
    • 代码片段集。它将设计系统中的组件库进一步实例化成代码段,在完成编辑后通过 CLI 来动态编辑代码。
    • DSL(领域特定语言,可选)。中间生成物,用于隔离框架与设计。

    流编程器

    • 流编程器。用于拖拽式、输入编写业务代码。
    • 后端服务。如果不能提供现成的后端服务,则需要拥有一个标准的 API 规范,以及相应的 mock server。
    • 模式库。包含相应的业务处理代码,如通用的登录、数据获取、UI 交互等。
    • DSL(领域特定语言,可选)。同上

    当然了,我们还需要能实时预览构建出来的应用。随后,我们执行了构建,而后构建出了一个半成品应用。开发人员只需要在它的基础上开发应用即可。而在开发人员开发的过程中,我们可以设计一系列的工具,来帮助开发人员更快速地构建应用。

    • 编辑器插件。包含设计系统、模式库等的自动完成代码,以及组织内部常用的代码库。
    • 调试工具。对于混合类型的应用而言,我们还需要一个开发工具来快速构建应用。

    从上述的流程上来看,无代码编程还具有以下的特点

    • 拖放式界面。又或者是可视化模型——基于节点和箭头。
    • 基于视觉的设计
    • 可扩展的设计。如对于插件、插件商店,社区等一系列的支持。
    • 跨平台功能。支持 PC Web 应用开发,支持移动应用构架等。
    • 强大的部署后。即平台包含着整个应用的生命周期。
    • 拥有丰富的集成支持。可以随意的找到需要的组件,以及对应的后台服务。
    • 配置化。它也意味着大量的自定义配置。
    • 自制的领域特定语言(可选)。用于构建时优化。

    优缺点

    相应的,它具有以下的一些优点:

    1. 高效。不用多说,节省时间和开发成本。
    2. 有限的 Bug,安全性。
    3. 低成本。其所需的预算非常有限。
    4. 易用(取决于设计)。
    5. 开发速度更快。
    6. 开发过程中的 AI 。
    7. 维护成本低。

    对应的相应的缺点有:

    1. 仍然需要编程技能。
    2. 受限的自定义能力。
    3. 可扩展性成了新的问题。
    4. 集成受限。

    就当前而言,低代码开发平台通常分为两大类:

    • 对于外部:制作简单的产品,如网络移动应用程序
    • 对于内部:为您的团队或企业创建业务应用程序

    诸如只使用 CRUD、表单、验证、简单聚合、分页等简易的服务。最常见的例子就是表单构建了,诸如金数据这样的应用,便是可以直接通过拖拽元素来生成,相应的开源实现有 jQuery Form Builder。

    对于开发人员来说,我们只需要定义好数据模型,再通过拖拽来决定元素的位置即可。从这种角度来看,只要能使用 Serverless 构建的应用和服务,都可以直接使用低代码开发模式。

    欢迎工作一到五年的Java工程师朋友们加入Java开发:828697593
    本群提供免费的学习指导 架构资料 以及免费的解答
    同时大家可以多多关注一下小编 纯干货 大家一起学习进步

    02 开发流程对比

    从我们的理解来看,传统应用的开发流程是:

    1. 分析、设计、确认、规划需求。
    2. 设计系统架构。
    3. 搭建前后端项目。选择技术栈、从零开始搭建或者从脚手架中创建。
    4. 搭建持续集成。
    5. 创建线框图和高保真原型。
    6. 设计数据模型,定义前后端契约,即 API URI、方法、字段等。
    7. 前后端实现业务逻辑。
    8. 前端实现 UI 页面。
    9. 集成第三方后端服务。
    10. 功能需求测试(DEV、QA、ST、UAT)
    11. 跨功能需求测试(安全性、性能等)
    12. 部署到生产环境。

    低代码开发流程:

    1. 分析、设计、确认、规划需求
    2. 选择需要的第三方 API
    3. 在可视 IDE 中绘制应用程序的工作流程、数据模型和用户界面。
    4. 连接 API——通常使用服务、函数发现。
    5. 编写业务逻辑(可选)。手动代码添加到前端或者自定义自动生成的 SQL 查询。
    6. 用户验收测试。
    7. 部署到生产环境。

    从步骤上来看,无代码编程少了几个步骤。这些步骤都因为大量丰富的内部系统集成,而变得非常简单。

    03 适用场景

    就当前而言,无代码编程实际上是一种高度的场景预设的模式。因此,它存在一定的适用场景:

    • 模型驱动开发。
    • 快速 UI 构建。
    • 极简的业务功能。
    • IT 资源受限。在资源受限的情况下,能快速开发出符合业务需求的应用最重要。

    而从流程上来看,对于一部分的应用来说,我们并不能实现无代码编程——存在一些业务上的不同之处。因此,多数场景之下,只是实现了低代码编程。

    若是想真实的无代码编程,则需要一些更特定的场景:

    • 设计表格(输入数据)
    • 创建报告(组织数据)
    • 常规调度和自动化过程(操纵数据)

    更多的场景正在探索中。

    04 无代码编程的挑战

    无代码编程,除了需要准备好上述的一系列基础设施,还不可避免地会遇到一系列挑战。

    1. 谁来写这部分代码?
    2. 客户端的基础设施准备。
    3. 服务端的服务平台搭建。
    4. 统一用户体验设计。设计出一系列能便利组合的组件,及对应的模板页面。与此同时,它们还能适应于不同的风格,即有多样性的主题支持。
    5. DevOps 流水线设计。低代码编程,依赖于一系列的自动化工具,以实现构建、调试、部署以及维护,同时还包含应用的测试。
    6. 领域语言设计。
    7. 自动化测试。如果我们的前端代码是自动生成的,那么我们还需要对它们进行测试吗?这是一个好问题,而如果代码是自动生成的,那么测试也应该是自动生成的。毕竟要在平台上,编写大量的自动化测试,以保证平台的质量。

    其中,有一些部分略微复杂一些,我们大概可以探索一下。

    05 谁来写这部分代码?

    在我们创建这样一个平台和工具时,我们要考虑的第一个问题是,这个工具是为谁写的?

    • 没有编程经验的人。如业务人员,他/她们对于业务系统有着非常丰富的经验。
    • 有编程知识,但是没有经验的人。
    • 有一定经验的开发人员。
    • 有丰富经验的开发人员。对于专业的人来说,自动化就意味着缺少灵活度。甚至与自己编写相比,他们要花费更多的时间来修复生成的代码。

    显然,对于相当有经验的开发人员而言,这个工具并不一定是他们所需要的。

    06 客户端基础设施

    从我的理解来看,它适合于快速的 MVP 构建,并且生成的代码还应该方便修改,而不是诸如早期的 DreamWeaver 或者 FrontPage 这样的工具。

    而与此同时,由于面向的开发人员水平不同,我们所需要做的工具也不同:

    1. 支持云构建和调试。
    2. GUI 编程应用。
    3. 代码生成。
    4. 设计系统体系构建。组件库搭建,模板应用创建等。

    更难的是,容易让开发人员能接受代码生成。

    感兴趣的来Java架构群,可以获取免费的学习资料,828697593 对Java技术,架构技术感兴趣的同学,欢迎加群,一起学习,相互讨论。

    07 服务端

    对于一个低代码平台而言,它对应的后端应该:

    1. 大量可用的现有服务。身份验证、安全性、推送能力、地图等等。
    2. 快速构建出后端服务。若是有内部 Serverless 或者 FaaS 方案,可以说是再好不过了。
    3. 方便与第三方服务集成。
    4. 灵活性。支持多语言等。

    统一的后端服务 API,对于后端服务来说,我们需要一个通用的范式。所有的 API 应该按照这样的范式来设计。不过,作为一个 API 的消费方,我们可能没有这么大的权力,但是我们可以采用装饰器模式,即封装第三方 API 成统一的方式。为此,我们采用的方式,仍然是:

    • 契约。诸如 Swagger UI,它可以直接创建一个简易可用的服务。
    • BFF。即我们一一去按我们的需要,去封装这些第三方应用。
    • 查询语言。与自己编写 BFF 相比,更简单的方式是采用:GraphQL 这样的后端查询语言,便捷性更高、模式更加灵活。

    在开发前的设计期里,我们需要首先设计出对应的领域模型。

    08 领域语言设计

    低代码环境使用(图形)建模语言来指定整个系统、产品的行为。它意味着:

    1. 将数据结构、领域模式应用到程序的各个层级中。
    2. 将业务规则、决策融入到应用中(层级)。

    这也就意味着,我们需要设计一个模型语言。而它对于我们而言,实际上是领域特定语言(DSL)。如下是一个简单的 DSL 示例,用于描述使用到的组件:

    {'style': '','id': 2,'blocks': 
     [{'content': {'content': 'content','title': 'hello'},'type':'card'}]
     }

    除此,我们还需要设计对应的布局 DSL,诸如于:

    H:[circle1(circle1.height)] // set aspect-ratio for circle1
    HV:[circle2..5(circle1)] // use same width/height for other circles
    H:|[circle1]-[circle2]-[circle3]-[circle4]-[circle5]|
    V:|~[circle1..5]~| // center all circles vertically

    最后,我们还需要将流代码,转换为真实的项目代码。三种类型的 DSL 结合下来,都不是一个轻松的工具。

    09 原型设计

    写好现有的组件,通用型接口。如常见的登录接口,对于使用登录接口的业务来说,它们只关心三部分的内容:

    1. 成功登录。
    2. 取消登录。
    3. 登录失败。对于客户端而言,可以视为取消登录。对于服务端来说,则可能是密码错误、用户名不存在、账号被锁定等。

    对应于以上情景,又有一些通用的逻辑处理:

    1. 登录成功。保存 Token,并返回历史页面。
    2. 登录失败。弹出一个自定义内容的提示框。

    这些代码是相似的。

    前端原型

    在一些简单的前端应用里:

    • 模板。只是在使用这些模板,再为这些模板设置相应的属性,绑定对应的值。
    • 数据。其过程都只是在各种保存变量的值,并 CRUD 这些变量的路上。为此,我们需要一个数据处理的管道架构设计,用于处理这些值。
    • 函数。事实上,我们的所有函数都只是一些管理函数,只用于处理这些对应的逻辑。

    这些常见的功能都可以做成一些组件,它们对于某些应用来说,代码相应的重复。

    • 无限加载页面。只需要绑定上 API,再控制一下元素的显示与隐藏即可。
    • 表单。定义好字段即类型,对应的前后台逻辑都有了。除此,我们还需要为它们自定义好常见的规则,如正则表达式。而一旦表单之间有联动,那么这个组件的设计就更加麻烦了。
    • 卡片式元素。
    • 表单和表格展示。
    • 常见图表。事实上,已经有一系列的图表工具了,我们只是在它们在基础上,进行了二次封装而已——使得它们可以变成领域语言的形式。
    • 高级的响应式布局。与每个应用独立开发布局不同的是,低代码平台需要提供一套强大的自定义、响应式布局设计——即要满足移动端的通用模式,还要满足桌面版的通用模式。如对于大量数据来说,桌面端使用的是 Pagination,移动端使用的是无限滚动。

    后端原型

    事实上,对于后端来说,低成本平台意味着,代码生成及服务生成。而服务本身是有限的,既然是业务上发生了一些变化,后端服务也可能并不会发生变化。

    它也意味着:

    • 微服务化。每个后端服务要尽可能的小。
    • API 规范化。即采用统一的 API 格式,接受统一的权限管理
    • 大量的 API 服务。
    • 快速集成第三方服务方案。集成第三方服务是开发应用不可避免的情况。为了应对这个问题,我们需要做准备好对应的创建服务逻辑,传入第三方服务所需要的参数,便可以直接生成我们的转发服务。

    那么,问题来了,既然如此,我们是否能提供一个定制的工具呢?让每个人可以创建自己的组件流?

    答案,显然是可以的。

    10 概念证明

    于是乎,在我最近设计的 PoC (概念证明)里,采用的是 Anguar 框架。相应的基本思想如下:

    1. 使用 Material Design 作为组件库,使用 CDK 的 Drag 来实现拖拽功能。每个拖拽的组件,称为 Element(元素),由 ElementDispatcher 由根据数据生成对应的组件。可拖拽的部分由两部分组成:布局 + 元素。
    2. UI 构建完后,生成对应的 DSL,目前采用的是 JSON。毕竟数据结构是最简单的领域特定语言。
    3. 借由 Angular Schematics 解析这部分的 DSL,来生成相应的项目代码。

    【End】

    竟然都看到最后了,给小编点个关注吧,小编还会持续更新的,只收藏不点关注的都是在耍流氓!

    【推荐文章】

    java软件开发思维构架:国内程序员这次牛逼了,「微博热搜」「GitHub 」双双霸榜了zhuanlan.zhihu.com
    java软件开发思维构架:程序员不过愚人节???zhuanlan.zhihu.com
    java软件开发思维构架:骗子的面具在Java程序猿面前不值得一提!zhuanlan.zhihu.com
    展开全文
  • 从硬件方面着手带您学会ARDUINO的硬件原理和编程。 只有懂了硬件原理才能更清楚代码的含义。 零基础入门,快速学会ARDUINO,上手做自己的小设计。 从小白到大神之间就缺这部视频o(* ̄︶ ̄*)o
  • Python:python代码编程带你玩转双色球(了解双色球的概率逻辑) 目录 输出结果 代码实现 输出结果 后期更新…… 代码实现 import random red_totals = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,...

    Python:python代码编程带你玩转双色球(了解双色球的概率逻辑)

     

     

    目录

    输出结果

    代码实现


     

     

    输出结果

    后期更新……

     

    代码实现

    import random
    red_totals = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                  0, 0, 0, 0, 0, 0, 0, 0]
    blues = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
    for i in range(1000):
        red1 = random.randint(1, 33)
        red_totals[red1] +=1
        red2 = random.randint(1, 33)
        while red2 == red1:
            red2 = random.randint(1, 33)
        red_totals[red2] += 1
        red3 = random.randint(1, 33)
        while red3 == red2 or red3 == red1:
            red3 = random.randint(1, 33)
        red_totals[red3] += 1
        red4 = random.randint(1, 33)
        while red4 ==red3 or red4 == red2 or red4 == red1:
            red4 = random.randint(1, 33)
        red_totals[red4] += 1
        red5 = random.randint(1, 33)
        while red5 == red4 or red5 == red3 or red5 == red2 or red5 == red1:
            red5 = random.randint(1, 33)
        red_totals[red5] += 1
        red6 = random.randint(1, 33)
        while red6 == red5 or red6 == red4 or red6 == red3 or red6 == red2 or red1:
            red6 = random.randint(1, 33)
        red_totals[red6] += 1
        blue = random.randint(1,13)
        blues[blue] += 1
    for i in range(1,33):
        print (red_totals[i])
    for i in range(1,13):
        print (blues[i])

     

     

    展开全文
  • 代码编程过程

    千次阅读 2017-02-14 23:38:31
    当用编程语言的语法来描述时,你的伪代码设计就降到了一个更低的层次。3、在意图的层面上去编写伪代码,用伪代码来描述该解决方法的意图,而不是去用目标语言去编写实现方法。4、在一个和目标语言足够适合的层次来写...

    一、伪代码

    伪代码的指导原则:
    1、用类似的 英语来描述特定操作。

    2、避免使用目标语言的语法来描述,伪代码能让你在一个比代码更高的层次上进行设计。当用编程语言的语法来描述时,你的伪代码设计就降到了一个更低的层次。

    3、在意图的层面上去编写伪代码,用伪代码来描述该解决方法的意图,而不是去用目标语言去编写实现方法。

    4、在一个和目标语言足够适合的层次来写伪代码,比如 一个伪代码语句能够代表当前 主流的高级语言c++/java/python等的一句目标代码。这样才能更加合适一句伪代码写目标代码。
    (实际上如果代码的层次太高,就会掩盖代码中的问题的细节,应该不断的精化伪代码,加入更多的实现细节,直到看着伪代码就能自动写出目标语言代码为止)

    二 、创建一个类

    1、创建类的总体设计
    定义类的特定职责,定义类索要隐藏的秘密,精确定义类的接口所要表达的抽象概念;

    决定这个类是否从其他类派生出来,或者其他类从该类派生;

    指出这个类中的关键的公用方法,标识并设计出所需要用到的重要数据成员;

    多次重复迭代设计,最终能直接设计出子程序为止;

    2、创建类中的子程序

    在编写子程序的时候还会引出更多的或者重要的 或次要的子程序, 创建这些新加入的子程序的过程往往还会重新 影响类的总体设计

    3、复审并测试整个类
    创建子程序的时候要经过测试,
    在整个类可以工作之后,再对整体进行复查和测试。

    三、用伪代码创建子程序

    1、设计子程序
    2、编写子程序代码
    3、代码检查
    4、收尾
    p220 仔细读读

    展开全文
  • Java代码编程格式规范

    千次阅读 2019-06-12 20:05:34
    为确保系统源程序可读性,从而增强系统可维护性,java编程人员应具有基本类似的编程风格,兹制定下述Java编程规范,以规范系统Java部分编程。系统继承的其它资源中的源程序也应按此规范作相应修改。 适用范围 本...
  • 第九章--伪代码编程过程

    千次阅读 2014-10-10 08:38:29
    第九章--伪代码编程过程 9.1 创建类和子程序的步骤概述 1. 创建一个类的步骤(是个迭代过程): (1)创建类的总体设计。 (2)创建类中得子程序。 (3)复审并测试整个类。 2. 创建子程序的步骤(是个...
  • php代码编程需要好习惯 优质代码

    千次阅读 2014-02-24 11:56:26
    尽管在其它编程语言使用者看来,PHP 程序并不简洁美观,但是我们可以通过一些优秀的编程习惯,也能让PHP的代码看起来比较舒服优雅。有哪些方法呢?下面逐一说下。 1. 规划代码结构  优秀的PHP代码应该有清晰...
  • java代码编程时,做初始化(不用new()方法),怎么做?
  • 使用pycharm连接远程代码编程

    千次阅读 2018-01-15 11:35:25
    pycharm远程连接代码
  • 代码编程的存在就好比纸质图书之于当代阅读,言传身教之于网络时代,享受型就餐之于快餐式进食,不论时代怎么发展变化,精华的部分总会随岁月沉淀反而历久弥新更显珍贵,代码编程就是如此。 首先, 代码编程更具效率...
  • 第九章,伪代码编程过程前言 9.1 创建类和子程序的步骤概述创建一个类的步骤1、 创建类的总体设计:定义类的特定职责,定义类说要隐藏的秘密,以及精确的定义类的接口所代表的抽象概念,决定这个类是否要从其他类...
  • 数控G代码编程详解大全

    千次阅读 2017-07-18 13:24:00
    一、G代码功能简述 G00------快速定位 G01------直线插补 G02------顺时针方向圆弧插补 G03------逆时针方向圆弧插补 G04------定时暂停 G05------通过中间点圆弧插补 G06------抛物线插补 G07------Z 样条...
  • 从静态检查工具谈代码编程规范

    千次阅读 2016-01-10 10:05:31
    提升自身编程能力是每一个码农的追求,也许我们每日都可以写上几百几千行代码,抑或每日只能修修补补添加几行代码,可是编写代码的行数的增加确实是提升编程能力的体现吗?从我个人的理解来看并不是这样。 从学校到...
  • iVX的简介 1、iVX是什么 ...iVX属于首款零代码开发语言,它去掉了程序语法,但保留程序逻辑。它的组件体系如下: 2、iVX能干什么 3、iVX中的0代码 4、如何使用iVX ...
  • 代码编程---开始使用块代码

    千次阅读 2011-10-26 22:40:45
    本章的几节使用例子代码来开始块代码的学习。 定义和使用块代码 插入符^有两个作用,一个是声明一个块代码变量,另一个是开始一个块代码的定义。块代码代码部分是包含在一对大括号中的,就像下面演示的...
  • -语法高亮、代码提示补全、代码折叠、自定义皮肤/配色方案、多便签 -代码地图、多种界面布局与全屏免打扰模式 -完全开放的用户自定义配置与神奇实用的编辑状态恢复功能 -强大的多行选择和多行编辑 -雷电般快速的...
  • 代码编程---声明和创建块代码

    千次阅读 2011-10-27 15:09:27
    声明一个块代码的引用 块代码变量用来保存到块代码的引用。使用和声明函数指针相识的语法声明块代码变量,只是把其中的*换成占位符^。块代码类型基本上都是C语言的格式。下面就是一些有效的块代码变量声明: ...
  • 学会使用伪代码编码,让编码结构更优工作量更小
  • 腾讯面试题----全是代码编程

    千次阅读 2018-03-12 12:33:02
    提取一段标识语言( html 或 xml )代码段中指定标签的指定属性值(需考虑属性值对不规则的情况,如大小写不敏感,属性名值与等号间有 空格等)。此处假设需提取 test 标签的 attr 属性值,请自行构建包含该标签的串...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 315,251
精华内容 126,100
关键字:

代码编程