【得物技术】自动化生成代码几种方案的演变

2023-11-06

今天我们聊一聊自动化生成代码的问题,试想一下,假如有一天机器替代你编写代码,你是应该感到开心还是难过?

方案

目前代码生成技术主要有以下几类:

1)基于模版编排生成代码

首先说下基于模版生成代码的方式,这种属于最原始最简单也是目前应用最广泛的一种代码生成方式,可以说,几乎所有的代码生成方式都是建立在模版的基础上繁衍而来。

前端最有名的莫过于vue-cli和create-react-app两款脚手架的代码生成了,他们分别基于vue和react框架进行的一键初始化项目生成代码,包括各公司内部的项目生成的脚手架,其实本质上是一样的,只是加入了公司内部集成的很多公共的组件和方法而已。

其实最早的代码生成并不是前端,因为那个时候还没有前端这个概念,在WWW万维网的时代,页面基本是由后端进行开发,因此在模版代码生成这一领域我们只是走了后端走过的路。

记得最早接触模版代码生成的是在刚开始开发后端项目的时候,那时候还是采用MVC架构,要开发一个新的功能模块的时候,往往需要分别对controller,service,dbService中进行新的代码注入,有点类似于egg中的结构(如果不熟悉后端开发的话),因此这种机械化比较固定的结构化组织中,往往通过命令一键生成即可,然后再对service/dbService中写入独特的逻辑即可。

这种开发模式能节省很多开发时间,且上手容易,开发者往往只需要关注逻辑开发即可,但往往会出现很多重复性的代码,这也是自动化代码生成一直存在的弊端。

2)基于可视化UI生成代码

基于可视化搭建的代码生成,这也是目前市场上最多的一种产物,也是很多可视化搭建文章强行给它带上的一种帽子,但准确的说它并不完全属于自动化生产代码,只是其中的一个环节而已,由于它需要过多的加入人为干预,最终才能得到我们想要的运行程序,感觉它一点都不自动化,如何对得起“自动化”三字?

但可视化搭建的确能带来一些节约生产力的功能,同时也给其他角色赋能,搭建应用的不一定是开发了,他们甚至可以不需要懂任何程序,可以是设计、产品和运营。

其中最为成熟的莫过于汽车行业生成代码。对,你没看错,就是汽车行业,在我们的印象中,汽车行业属于比较传统的行业,似乎与新兴产业互联网的代码编程八竿子打不着。然而,在2010年之前,大多数的汽车控制软件,如发动机控件、变速箱软件、车身控制软件等都是通过手写C代码完成的。开发流程如下:

其中设计师是不懂代码的,从设计图交付开始到最终控制器的完成,这一过程会出现两个问题,设计师与码农之间的沟通成本以及码农的交付质量,项目越大这两大问题就越突出,直接影响交付日期、成本和质量,通常情况下交付时间与成本成反比,与质量成正比,而时间就是金钱的今天,要同时保证成本和质量,更好的办法就是设法将将代码标准化,同时降低沟通成本。

因此,可视化UI生成代码似乎是最合适的途径。它从设计师的角度出发,将视图UI与命令行一一绑定,设计师拖动一个视图即生成一个对应的C代码。最终,码农下岗了。

上面这种成熟的Simulink软件处理的可视化逻辑的控制,只能处理简单的逻辑,与现代的逻辑编排的设计理念相同。当然它也有自己的缺点就是不适合复杂的项目工程,在这种场景,它反而比直接写代码的效率更低。

另一个著名的可视化UI生成代码例子,便是.NET时代的eclipse的web搭建,使用过eclipse编辑器开发web界面都应该知道这个工具,如图

只是它在开发者的用户体验上比不上网页三剑客,最终被淘汰了,毕竟它只是主打JAVA开发的IDE,开发Web可视化也只是其中一个扩展而已,这里也告诉我们一个道理,一个产品的精而美,比大而强反而更容易获得成功。专注而顶尖,是很多产品的成功奥秘。

当然目前可视化搭建的系统,是在太多了,目前主要分为两种方式,运行时搭建和生成源码搭建,这里就不一一展开介绍了。

3)基于代码语料生成代码

基于代码语料生产代码的前提是要有足够的语料,也就是代码片段。这种方式,通常都是基于IDE的插件而开发的应用。因为它最终的目的是为了开发提效,针对的用户群体是开发者,必须有开发介入生成一个半成品的代码片段或模块。

假如你有耐心阅读到此,说明你是对代码生成领域感兴趣的同行,为了表示感谢,接下来会安利一波福利。这里的福利也只是针对前端开发,主要是针对vscode插件展开介绍。

这里其实需要分为简单和复杂两种场景:

  • 固定语料
  • 智能化语料

固定语料

用户提前设置的代码片段,通过监听用户输入快捷键值,搜索出对应的片段,提示用户。
针对vue的提示插件Vue 3 Snippets
针对react的提示插件ES7 React/Redux/GraphQL/React-Native snippets
上面两款插件的下载量都是百万级别以上的,所以流行程度是绝对杠杠的,当然如果你觉得它们不好用,或者不够贴切公司内部的代码片段,也可以自己定制。

这种生成代码方式,简单而快速,但也存在其弊端,固定化不好扩展,而且最令人不快的是使用者需要一定的学习成本,需要提前了解键值以及对应的代码片段。

为了解决这个弊端,于是聪明的程序员们便加入智能化,利用训练学习法找出对应的代码片段,于是有了接下来的智能化语料。

智能化语料

1)Kite Autocomplete插件
首先介绍第一个智能化代码提示vscode插件Kite Autocomplete,在超过2500万个文件上训练的ML模型,Kite 为您的代码编辑器添加了 AI 驱动的代码完成功能,赋予开发人员超能力。

它会根据用户输入的上下文以及当前输入,预判用户将要输入的内容。

在安全方面,kite在本地运行,您的代码是私有的,不会离开您的机器。

这种智能化输入是依赖n-gram模型(不了解n-gram模型的童鞋可以自行搜索了解一下),只不过它比n-gram模型做得更前一步,会预先读取整个文件的上下文,结合当前的输入再推断出用户的行为。

总体上,Kite Autocomplete插件还是蛮好用的,它支持多种语言,使用vscode编辑器的同学强烈建议使用,在这里给你们种草了,超好用,谁用谁知道

2)GitHub Copilot插件
接下来介绍另一个智能化代码提示vscode插件GitHub Copilot,它是OpenAI与微软联手推出的一款AI代码生成代码工具,可以说它是vscode官方亲儿子也不为过,不过要使用它需要注册。让我们看看你它的官方介绍

GitHub Copilot 由 OpenAI 创建的新 AI 系统 Codex 提供支持。GitHub Copilot 比大多数代码助手理解的上下文要多得多。因此,无论是在文档字符串、注释、函数名称还是代码本身中,GitHub Copilot 都会使用您提供的上下文并合成代码以进行匹配。我们正在与 OpenAI 一起设计 GitHub Copilot,以便在开发人员使用它时更智能地生成安全有效的代码

它最大的核心竞争力便是可以根据注释自动生成代码,也就是说你告诉编辑器功能描述,它便可以自动帮你生成你想要的代码了,听起来是不是很酷?它实现原理如下:

当然,它也可以自动填充重复代码,GitHub Copilot 非常适合快速生成样板和重复代码模式,这个功能完全就是将上述介绍的固定语料包含了进去,可以说对需要写大量模版代码的程序员是非常香的一个操作。

另一个比较重要的功能便是测试代码,官方表示无需辛苦的测试。 测试是任何强大的软件工程项目的支柱。导入单元测试包,让 GitHub Copilot 建议与您的实现代码匹配的测试。

据官网介绍,它是一款基于训练集却可以生成从来没出现过的新代码的工具,听起来是不是很牛?它居然可以“创建”代码了。

最后也是最重要的一点,GitHub Copilot插件暂时只提供有限用户的试用体验,目前只有预览版本,总之一句话,暂时用不了

4)基于智能化生成代码

1)sketch2code
介绍完GitHub Copilot后,下面让我们了解微软的另一款智能化生成工具sketch2code

它的主要功能是将手绘图转化HTML代码。

它实现的过程如下:
1.首先,用户通过网站上传图片。
2.自定义视觉模型预测图像中存在哪些 HTML 元素及其位置。
3.手写文本识别服务读取预测元素内的文本。
4.布局算法使用来自预测元素的所有边界框的空间信息来生成容纳所有元素的网格结构。
5.HTML 生成引擎使用所有这些信息来生成反映结果的 HTML 标记代码。

于是我赶紧试了一波,效果如下:


左中右分别为草稿原图,识别分析图,结果html
由于是横屏的角度,嗯嗯,我原谅你,再来个正常的吧


识别度还是不太理想呀。

同时它还支持摄像头识别,也就是说只要加上硬件设备,产品就可以一边在上面bibi……哦不对,是一边规划,一边生成代码,只不过是原生的html代码,我又赶紧试了一波,结果:


上面是摄像头拍到的快照,上传之后……


啥?识别不出,好吧。估计是我画得比较潦草,而且可能图片背景不是全白的,于是乎我用了它官方提供的示例图


效果好一点,但还是不能完全识别出来。

所以它目前还是有些缺陷的

  • 生成结果只能是原生HTML
  • 识别率较低,草稿图还原度有待提升

2)teleporthq
另一款AI智能化代码生成工具是teleporthq,它与上面的sketch2code原理很相似,只是它更进一步,如图

产品经理一边在小黑板上画图,后面的机器一边扫描,识别并生成代码,同时实时给出预览效果。真正做到了一边画草稿一边生成代码,实现自动化生成代码功能,原文请前往(https://teleporthq.io/blog/we-believe-in-ai-powered-code-generation)。

teleporthq它的官网似乎与普通的可视化搭建器并没有什么不同,然而,如果仔细观察,你会发现它其实比普通的可视化搭建器更多一些东西,比如支持草图到代码,视觉API,而这些东西正是结合硬件设备实现代码实时输出必不可少的东西。当然它识别草稿图的辨识度就ememem~,除了草稿图,它也是支持识别Sketch素材的。

目前它支持生成的目标代码有React/Vue/Angular等,更多可前往其官网https://teleporthq.io/

teleporthq与国内阿里的imgcook原理上很相似,只是imgcook识别的是各种设计师的素材(Sketch/PS/Figma)并将其生成多种目标代码,imgcook就不一一展开介绍,读者可自行鉴赏。

结论

今天我们从互联网的发展历史分别介绍了自动生成代码的几种方式:

  • 基于模版编排生成代码
  • 基于可视化UI生成代码
  • 基于代码语料生成代码
  • 基于智能化生成代码

无论如何发展,其本质其实从来没有变过,那就都是基于模版本身,变的只是转换规则。

文/Alan

关注得物技术,做最潮技术人!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【得物技术】自动化生成代码几种方案的演变 的相关文章

  • 如何访问另一个 mobx 商店中的 mobx 商店?

    假设以下结构 stores RouterStore js UserStore js index js each of Store jsfiles 是一个 mobx 存储类 包含 observable and action index js只
  • React无限滚动scrollableTarget动态获取id?

    我在我的项目中使用react infinite scroll component 如何让scrollableTarget动态获取item id 我试过这样scrollableTarget item id 但它不起作用 必须与该 div 具有
  • 如何修复超出最大调用堆栈大小

    有一个 MERN Firebase 应用程序并收到此错误和一堆 atdeepExtend deepCopy ts 71 RangeError Maximum call stack size exceeded getApps as apps
  • Material-UI 4.8.1 API 更改 - 指定“组件”属性的新方法?

    Edit 这是 4 8 x 的打字错误 升级到 4 9 0 即可解决该问题 上版本4 8 0 以下代码编译并运行良好
  • JSX 支持哪些 ES6 功能?

    我在用着与 JSX 进行反应 with 反应工具 https www npmjs com package react tools将 JSX 代码编译为 JavaScript JSX 支持哪些 ES6 功能harmony选项已启用 感谢康加克
  • × TypeError:无法读取未定义的属性(读取“map”)

    当我尝试运行此代码时 它给出了此错误 TypeError 无法读取未定义的属性 读取 map 为什么会发生这种情况 我怎样才能让它发挥作用 import React from react import Grid from material
  • 禁用 chrome React DevTools 以进行生产

    我正在尝试使用 gulp 和 envify 对我的 React 应用程序进行浏览器化以设置 NODE ENV 因此 我可以删除反应警告 控制台中的错误报告 甚至我的代码来禁用某些功能 例如react addons perf的要求 而且效果很
  • React-Router v5 History.push 不触发组件

    很抱歉朋友们又问这个问题了 我找到了解决这个问题的几个方法 但他们让我很困惑 我只是想问一个优雅的方法来做到这一点 正如你通过标题所理解的 我有一个关于反应路由的问题 让我解释 我有一个按钮 其名称是Login 单击按钮后 我执行了一些逻辑
  • Google 跟踪代码管理器导致 SPA 中的整个页面重新加载 - React

    当我在 React 的 GTM 中添加触发器时 a a or 元素 它会导致单击时重新加载整个页面 而不是仅重新渲染应用程序的一部分 当我删除谷歌跟踪时 一切都会顺利进行 有没有办法 如何配置 GTM 不影响应用程序的行为 如果 Googl
  • 在reactjs中发生状态改变后调用函数

    我的问题是这样的 我有两个组件 第一个组件是图像裁剪器 第二个组件是我应该显示裁剪图像的组件 我面临的问题是我可以将裁剪后的图像传递到第二个组件 但我必须按下裁剪图像并传递到第二个组件的按钮两次 在第二次单击时 只有我的图像传递到第二个组件
  • React中ComponentDidMount生命周期方法被调用两次

    在我的 React 应用程序中 加载应用程序时会进行两次初始 API 调用 我查看了 Chrome gt inpsect 中的网络选项卡 启动器 调用堆栈显示第一个调用是从VM123000 bundle js而第二个调用只是从实际的bund
  • 新部署后,React 应用程序必须清除浏览器缓存

    我们正在使用 Jenkins 管道在 apache 服务器上部署 React 应用程序 当我们部署新代码时 大多数新功能都可以正常工作 但并非所有更改都反映浏览器中的最新内容 用户必须打开隐身窗口或清除缓存才能看到新功能 我见过一些相关的解
  • 如何在 render 方法中的 React const 变量内循环

    我有一个映射的 const 变量 我用它来注入渲染方法中的返回值 我现在的问题是 我正在映射的对象本身有一个对象集合 我想循环遍历每一个并添加 jsx 语法 这就是我所拥有的 const tasks this state tasks map
  • 在 React Storybook 的单个页面上显示组件的所有变体,但仍然有旋钮?

    我有一个可以是不同类型的按钮组件 例如primary secondary etc export const buttonTypes primary secondary tertiary positive negative const But
  • ReactJs 中输出事件的 Angular

    我正在寻找在 ReactJs 中创建类似 Angular 等输出事件的方法 我正在根据 Atomic 设计在 ReactJs 中制作一个组件库 因此 例如 我在其他组件中注入了一个 Button 我想知道如何为 Button 编写一个 pr
  • React Native - “this.setState 不是一个函数”试图设置背景颜色动画?

    好吧 我只是想循环视图的背景颜色 在 3 4 种颜色之间渐变 我发现如何在 React Native 中对 ScrollView 的背景颜色进行动画处理 https stackoverflow com questions 50356933
  • 检查所有子组件是否已安装

    有什么办法可以检测孩子是否已经挂载了吗 当我初始化同位素时 必须安装所有子组件才能初始化 超时时间为 5 毫秒 它按预期工作 但我确信有更好的方法 componentDidMount function var container this
  • 安装时反应 spring 错误

    你好 我有这个问题 如果我想将react spring安装到我的react项目中 它只会弹出一堆依赖项错误和警告 我不知道该怎么办 我试图检查react spring的文档 但找不到任何东西 我在 stackoverflow 上检查了几页
  • 为什么 useState 会导致组件在每次更新时渲染两次?

    我这里有一段简单的代码 import React useState from react import styles css export default function App const number setNumber useSta
  • ReactJS 无效校验和

    尝试使用 ReactJS 和 Node js 进行服务器端渲染时 我不断收到以下错误 React attempted to use reuse markup in a container but the checksum was inval

随机推荐

  • Coding-数组(Array)

    数组 Array 面试中最常见的就是围绕数组进行出题 主要原则数组可以随机读取 一般遇到数组相关的题目 都不是直观看到的那样 第一步暴力解法 第二步是否可以排序 是否可以二分 是否可以使用数据结构 哈希表 队列 栈等 要时刻注意一个数组中有
  • 经典神经网络( AlexNet,VggNet,NiN,GoogLeNet,ResNet)

    卷积神经网络演化史 AlexNet 模型结构 贡献 ReLU激活函数 分布式GPU运算 LRN 局部响应归一化 提高泛化能力 重叠池化 池化窗的步长小于池化层的大小 在池 化时产生重叠 正则化方法 数据集增强 dropout 随机关闭神经元
  • Powershell:如何创建自定义对象,以及如何给自定义对象添加属性和方法

    还记得我刚学会使用PowerShell的时候 那种兴奋和幸福感 终于找到了在Windows下一个强大的Shell 因为他叫Power Shell 可以一边使用着熟悉的Windows桌面系统一边装X的Shell编程了 当我使用它来处理CSV时
  • Qt中的UI文件介绍

    UI文件是什么 u i ui ui通常是指Qt设计师设计出来的界面文件的后缀 它本质上是一个标准XML格式的文本文件 需要通过 u i
  • 前端moment库时间戳转标准时间不准确的问题解决

    做前端项目的时候 根据后台返回的一个时间戳 将时间戳需要转换成标准时间 因为项目中有moment这个时间处理包 而且moment对于时间的转换比较强大 可以根据特定的格式进行转换 最终将时间戳转换成 年 月 日 时 分 秒 这种形式 但是转
  • SpringQueryMap -SpringCloud feign get method 接受自定义对象参数

    feign中和controller中不一样的地方 controller中可以get方法使用对象参数无需任何注解 可默认绑定到对象 示例代码如下 GetMapping value ClueClient LIST OPERATIONS publ
  • J2EE基础集合框架之Set

    前言 上次与大家介绍了集合框架的LIst集合 List集合的特点的是元素有序且可重复 今天与大家分享的是也是一种集合 叫做Set集合 他和List集合是相反的 今天我们就一起去探究Set集合 首先跟思维导图来了解我今天要分享的内容吧 说明
  • 卷积神经网络&目标检测

    卷积神经网络 目标检测 一 Inception网络 1 Inception网络基本思想 2 采用1 1卷积降低计算量 3 Inception模块和Inception网络 二 迁移学习 三 数据扩充方法 四 目标检测 1 特征点检测 2 通过
  • postman的json脚本转jmeter的jmx脚本

    一般研发同学会用postman做接口自测 但是我们做性能测试的时候 又不能用postman 对鉴权不了解的接口 自己调试脚本又很麻烦 这个时候 我们就可以用这个方法把json脚本转换成jmeter用的jmx脚本 环境准备 这几个工具需要提前
  • join python

    Python join 方法用于将序列中的元素以指定的字符连接生成一个新的字符串 1 join是针对字符串进行操作的 2 join里面的参数只能是一个 可以是字典 列表 元组 然后以前面的分隔 形成一个新的字符串 但是里面的东西必须是字符串
  • 百度智能云x蓝色光标共绘AI营销新篇章

    9月12日 百度集团副总裁袁佛玉参加蓝色光标Blue AI行业模型发布会 参与启动仪式并带来了主题演讲 大模型重塑数智世界 此次蓝色光标推出的行业模型 得益于百度智能云千帆大模型平台 以下简称千帆平台 的强大支持 标志着双方合作的深度与广度
  • element中Notification组件(this.$notify)自定义样式

    1 自定义样式效果 2 vue代码 this notifications this notify title dangerouslyUseHTMLString true duration obj remindMethod 3 0 4500
  • 风火编程-- 装饰器,reduce, 片函数,闭包概念

    python核心编程 读书笔记 六 第十一章 11 3 6装饰器 在不改变函数体的前提下 对函数添加前置或后置功能 def 装饰器函数 func def wrapper args kwargs before func func after
  • LeetCode刷题入门

    Letcode刷题入门篇 开始准备刷Letcode的题目 入门基础题 从简单的题目开始做 先考虑用python解题 一 两数之和 使用最简单的暴力解法 复杂度为O n 2 时间复杂度更低的解法 借用List 的相关函数求解 或使用hash求
  • java实现----猜数:随机生成一个数,判断大小,对错。

    需要用到Random 随机生成一个数 if语句 while语句 import java util Scanner 导包 import java util Random 随机生成一个数 public class 猜数 public stati
  • 3.2 创建Maven聚合工程

    3 2 1 构建父工程fmmall 创建一个maven工程 packing设置为 pom 父工程继承继承spring boot starter parent
  • 博世BMI160六轴传感器I2C通信配置

    博世BMI160简介 Bosch Sensortec公司推出的最新BMI160惯性测量单元将最顶尖的16位3轴重力加速度计和超低功耗3轴陀螺仪集成于单一封装 采用14管脚LGA封装 尺寸为2 5 3 0 0 8mm3 当加速度计和陀螺仪在全
  • 发布的qt程序出现libQt5Core.so.5 版本问题

    原因 发布版本跟别的机器qt环境不一样导致 解决方法 把 1 在客户机 去掉 bashrc 关于qt的环境变量 2 同样的方式去掉 etc profile的环境变量 或者吧qt的环境变量修改正确 因为你发布的软件首先回去系统路径中链接相关库
  • 28 openEuler管理网络-配置主机名

    文章目录 28 openEuler管理网络 配置主机名 28 1 简介 28 2 使用hostnamectl配置主机名 28 2 1 查看所有主机名 28 2 2 设定所有主机名 28 2 3 设定特定主机名 28 2 4 清除特定主机名
  • 【得物技术】自动化生成代码几种方案的演变

    今天我们聊一聊自动化生成代码的问题 试想一下 假如有一天机器替代你编写代码 你是应该感到开心还是难过 方案 目前代码生成技术主要有以下几类 1 基于模版编排生成代码 首先说下基于模版生成代码的方式 这种属于最原始最简单也是目前应用最广泛的一