9 种方法使用 Amazon CodeWhisperer 快速构建应用
Amazon CodeWhisperer 是一款很赞的生成式人工智能编程工具。自从在工作中使用了 CodeWhisperer,我发现不仅代码编译的效率有所提高,应用开发的工作也变得快乐起来。然而,任何生成式 AI 工具的有效学习都需要初学者要有接受新工作方式的心态和意愿。
-
Amazon CodeWhisperer
AI Code Generator - Amazon CodeWhisperer - AWS
作为一名早期的“探索者”,我发现了几个对我很有用的功能和可以提高生产效率的小技巧,将在这篇文章中和大家分享:
-
减少输入
-
函数生成
-
类的生成
-
算法的实现
-
单元测试的编写
-
创建示例数据
-
简化正则表达式
-
更快地学习第三方代码库
-
代码的文档化
CodeWhisperer 的安装部署
使用 CodeWhisperer,需要在你的集成式开发环境(IDE)中安装最新的 Amazon Toolkit。支持的 IDE 包括 Visual Studio(VS)Code 和 JetBrains IDE(IntelliJ、PyCharm、CLion、GoLand、WebStorm、Rider、PhpStorm、RubyMine 和 DataGrip)。另外,CodeWhisperer 被内置了 Amazon Cloud9 和 Amazon Lambda 控制台, 也可以在 JupyterLab、Amazon SageMaker Studio、以及 Amazon Glue Studio Code 中通过加入 CodeWhisperer extension 进行使用。有关设置说明,请参阅:CodeWhisperer “入门” 资源。
-
CodeWhisperer “入门” 资源
AI Code Generator - Amazon CodeWhisperer Resources - AWS
CodeWhisperer 为输入需求自动提供建议。如果没有收到建议,可以随时使用 Option + C (Mac) 或 Alt + C (Windows) 快捷方式手动触发。
CodeWhisperer 有时还会向你提供多种建议以供选择。你可以按 → 和 ← 键循环浏览所有可用的建议。
CodeWhisperer 提供的建议是非确定性的,这意味着开发者收到的建议可能与本文中显示的建议略有不同。如果收到的建议不符合需求,可以尝试使用箭头键循环浏览所有可用的建议,或者尝试稍微改写任何代码注释提示。即使是标点符号的变化也可能产生新的建议。
本文中的示例是用 JavaScript 和 TypeScript 编写的。当然,演示操作同样适用于 CodeWhisperer 支持的其他编程语言。
减少输入
对于常见的代码功能实现,CodeWhisperer 的作用在于功能完成自动化,这大大减少了编写单行代码或代码块时的键入次数。CodeWhisperer 在键入时自动提供建议。当建议有用时接受这些建议,当建议没有帮助时则忽略这些建议。根据我的经验,仅以这种方式使用 CodeWhisperer 可以使我的文字输入减少 50% 或更多。
函数生成
根据函数名自动生成函数
资深的程序员为其函数和参数提供清晰准确的描述性名称。如果你在自己的编程中遵循这种做法,CodeWhisperer 将拥有为你实现许多功能所需的所有上下文。
在输入下面的函数名后,CodeWhisperer 生成的函数体。
用户输入 (JavaScript)
JavaScript
function standardDeviation(numbers)
结果:
JavaScript
function standardDeviation(numbers) {
const avg = average(numbers);
const variance = numbers.map((x) => Math.pow(x - avg, 2)).reduce((a, b) => a + b, 0) / numbers.length;
return Math.sqrt(variance);
}
根据描述生成函数
有时,仅凭一个好的函数签名不足以传达函数的预期行为。在这些情况下,可以使用详细的代码注释作为提示发给 CodeWhisperer。建议在选择这种方式时使用相应语言的文档注释分隔符。
用户输入 (JavaScript)
JavaScript
/**
* Given a list that contains some numbers and strings, format them into a string
* in which the numbers are prepended with "#" and the strings are wrapped in
* double quotes.
*/
结果:
JavaScript
/**
* Given a list that contains some numbers and strings, format them into a string
* in which the numbers are prepended with "#" and the strings are wrapped in
* double quotes.
*/
function formatList(list) {
return list
.map((item) => {
if (typeof item === "number") {
return `#${item}`;
} else {
return `"${item}"`;
}
})
.join(", ");
}
类的生成
可以通过单个代码注释生成完整或部分的类实现。注释应描述该类的关键属性和行为。
用户输入(TypeScript):
TypeScript
/**
* A folder has a name, children, and an optional parent. A child can't be added
* twice.
*/
结果:
在完成上面的函数块注释之后,CodeWhisperer 提供了多种建议,并附有每种方法的文档注释!
TypeScript
/**
* A folder has a name, children, and an optional parent. A child can't be added
* twice.
*/
class Folder {
constructor(name, parent) {
this.name = name;
this.children = [];
this.parent = parent;
}
/**
* Add a child to the folder.
* @param child The child to add.
* @returns True if the child was added, false if it was already present.
*/
addChild(child) {
if (this.children.includes(child)) {
return false;
}
this.children.push(child);
return true;
}
/**
* Remove a child from the folder.
* @param child The child to remove.
* @returns True if the child was removed, false if it wasn't present.
*/
removeChild(child) {
if (!this.children.includes(child)) {
return false;
}
this.children.splice(this.children.indexOf(child), 1);
return true;
}
}
算法的实现
CodeWhisperer 能够轻松实现通用的算法。只需告诉 CodeWhisperer 你想将哪种算法应用于特定的编码问题,它就会执行。
用户输入 (JavaScript)
JavaScript
const actors = [ ... ];
// Sort the actors by age using the merge sort algorithm.
结果:
JavaScript
const actors = [
{name: 'Tom Cruise', age: 56},
{name: 'Meryl Streep', age: 49},
{name: 'Jack Nicholson', age: 39},
{name: 'Christopher Walken', age: 53}
];
// Sort the actors by age using the merge sort algorithm.
function mergeSort(arr) {
if (arr.length <= 1) {
return arr;
}
const middle = Math.floor(arr.length / 2);
const left = arr.slice(0, middle);
const right = arr.slice(middle);
return merge(mergeSort(left), mergeSort(right));
}
function merge(left, right) {
const result = [];
while (left.length && right.length) {
if (left[0].age < right[0].age) {
result.push(left.shift());
} else {
result.push(right.shift());
}
}
while (left.length) {
result.push(left.shift());
}
while (right.length) {
result.push(right.shift());
}
return result;
}
单元测试的编写
CodeWhisperer 加速了单元测试的实现。不仅能够实现我请求的大多数明确的单元测试的逻辑,而且经常为我甚至没有想到的边缘情况来建议单元测试。
当我想让 CodeWhisperer 实现一个单元测试时,我会像下面的例子一样,首先声明我正在测试的条件和预期的结果。
用户输入 (JavaScript)
JavaScript
describe("Folder.addChild()", () => {
it("when adding an existing folder should not add duplicate"
结果:
JavaScript
describe("Folder.addChild()", () => {
it("when adding an existing folder should not add duplicate", () => {
const folder = new Folder("root");
const child = new Folder("child");
expect(folder.addChild(child)).toBe(true);
expect(folder.addChild(child)).toBe(false);
});
it("when adding a new folder should add it", () => {
const folder = new Folder("root");
const child = new Folder("child");
expect(folder.addChild(child)).toBe(true);
});
it("when adding a new folder should add it to parent", () => {
const folder = new Folder("root");
const child = new Folder("child");
folder.addChild(child);
expect(child.parent).toBe(folder);
});
}
在完成一两个测试之后,即使没有明确的提示,CodeWhisperer 也会建议更多的测试。在后续的文章和视频里,我们将展示 CodeWhisperer 更多的测试建议。
提示:你会注意到我的测试描述包括:
-
我正在测试的函数;
-
我正在测试的条件;
-
我期望的结果。
遵循这个由三部分组成的模式是确保 CodeWhisperer 拥有实现高质量测试逻辑所需的上下文的好方法。
创建示例数据
我发现,CodeWhisperer 可以生成虚拟数据,或者实际的、具有可重复模式的代码。举例来说,在下面的列表中,我只输入了第一个 “用户” 对象作为示例,CodeWhisperer 就很好的延续了这个模式。
用户输入 (JavaScript)
JavaScript
const fakeUsers = [
{ name: "User 1", id: "user1" },
结果:
JavaScript
const fakeUsers = [
{ name: "User 1", id: "user1" },
{ name: "User 2", id: "user2" },
{ name: "User 3", id: "user3" },
{ name: "User 4", id: "user4" },
{ name: "User 5", id: "user5" },
{ name: "User 6", id: "user6" }
]
它甚至可以生成随机但看似合理的值,如下所示:
用户输入 (JavaScript)
JavaScript
const fakeUsers = [
{ name: "Sally", id: "user1" },
结果:
JavaScript
const fakeUsers = [
{ name: "Sally", id: "user1" },
{ name: "Bob", id: "user2" },
{ name: "Joe", id: "user3" },
{ name: "Jane", id: "user4" },
{ name: "Jill", id: "user5" },
{ name: "Jack", id: "user6" }
]
Regular Expression 简化正则表达式
虽然 CodeWhisperer 还不能将自然语言自动转换为自定义 Regular Expression,但它确实知道很多常用的 Regular Expression,帮助开发者节省时间。每当你需要正则表达式时,它们随手可得。
让我们来看一个相对复杂但常见的 Regular Expression。
用户输入 (JavaScript)
JavaScript
/**
* Function that validates whether a string is a valid email address.
*/
结果:
JavaScript
/**
* Function that validates whether a string is a valid email address.
*/
export function isValidEmail(email) {
return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email);
}
快速学习第三方代码库
当使用不熟悉的库、模块或框架时,CodeWhisperer 有助于加快自学习速度。
在下面的示例中,我需要编写一个实用函数,该函数将获取来自 API 的 gzip 压缩值并将其转换成其余代码可以理解的值。我知道 “pako” 库会帮助到我,但我不知道如何使用。于是我给 CodeWhisperer 提示:一条导入声明和一条描述我目的的描述。
JavaScript
import pako from "pako";
/**
* Accepts a base64-encoded, gzip-compressed JSON string and returns
* a parsed JSON object.
*/
结果:
JavaScript
import pako from "pako";
/**
* Accepts a base64-encoded, gzip-compressed JSON string and returns
* a parsed JSON object.
*/
export default function decompress(str) {
const buffer = pako.inflate(atob(str));
const json = buffer.toString();
return JSON.parse(json);
}
代码的文档化
CodeWhisperer 能为生成的代码和现有的代码生成文档和注释。
例如,假设我想要 CodeWhisperer 帮我为 FavoritesFilter TypeScript 类的 matches() 方法生成文档注释。
TypeScript
class FavoritesFilter implements IAssetFilter {
...
matches(asset: Asset): boolean {
...
}
}
我们只需要在方法名称的正上方键入文档注释分隔符(/** */),CodeWhisperer 就会为我们生成文档注释的正文。
注意:当 CodeWhisperer 用于这个场景时,我们需要使用 Option + C (Mac) 或 Alt + C (Windows)手动触发建议。
结论
希望上面的分享能激发你开始尝试使用 CodeWhisperer 这样智能的代码工具的想法。立即安装 CodeWhisperer,并开始在自己的项目中使用这些节省时间的方法和技巧。当然,这些建议和技巧只是 CodeWhisperer 的部分功能。随着更多开发者开始将 CodeWhisperer 应用到他们的日常工作流程中,我相信更多的技巧、经验和最佳实践还将持续出现。如果你也有心得体验,请发表评论让我们知道。你的分享会对更多的人有所帮助。
-
安装 CodeWhisperer
AI Code Generator - Amazon CodeWhisperer Resources - AWS
参考资料
-
10 ways to build applications faster with Amazon CodeWhisperer:
10 ways to build applications faster with Amazon CodeWhisperer | AWS DevOps Blog
-
Amazon CodeWhisperer Startup:
AI 代码生成器 - Amazon CodeWhisperer 资源 - AWS
-
Amazon CodeWhisperer User Guide:
Setting up CodeWhisperer with Amazon SageMaker Studio - CodeWhisperer
相关文章:
9 种方法使用 Amazon CodeWhisperer 快速构建应用
Amazon CodeWhisperer 是一款很赞的生成式人工智能编程工具。自从在工作中使用了 CodeWhisperer,我发现不仅代码编译的效率有所提高,应用开发的工作也变得快乐起来。然而,任何生成式 AI 工具的有效学习都需要初学者要有接受新工作方式的心态和…...
性能测试-性能工程落地的4个阶段(21)
性能工程按照不同的内容和目的划分为4个阶段,分别是线下单系统压测分析阶段、线下全链路压测分析阶段、生产只读业务压测及容量评估阶段、生产读写业务全链路压测及容量评估阶段。(也可以理解为一个企业性能测试体系的发展阶段) 线下单系统压测分析阶段 针对单系统的性能…...
小程序 navigateBack 携带参数返回的三种方式(详细)
如果觉着主图好看,点个赞,你早晚也会看到这么好看的景色! 第一种方式 getCurrentPages 获取当前页面栈。数组中第一个元素为首页,最后一个元素为当前页面。不要尝试修改页面栈,会导致路由以及页面状态错误。不要在 App.onLaunch 的时候调用 getCurrentPages(),此时 page …...
通过内网穿透实现远程连接群晖Drive,轻松实现异地访问群晖NAS
文章目录 前言1.群晖Synology Drive套件的安装1.1 安装Synology Drive套件1.2 设置Synology Drive套件1.3 局域网内电脑测试和使用 2.使用cpolar远程访问内网Synology Drive2.1 Cpolar云端设置2.2 Cpolar本地设置2.3 测试和使用 3. 结语 前言 群晖作为专业的数据存储中心&…...
vue3 + vite常用工具
1. plop 1.1 安装 yarn add plop -D1.2 使用 1.2.1 package.json 配置脚本命令 "scripts": {"dev": "vite --mode dev","build": "vue-tsc --noEmit && vite build","serve": "vite preview"…...
Vue框架分享与总结
总结开发中最常用的vue语法,以及对特定语法的理解。vue官网 文章目录 一、创建vue项目1、使用开发工具创建2、使用命令行创建3、vue框架结构4、Vue文件结构 二、Vue 常用模板语法1、v-if、v-show2、v-for3、v-on4、v-bind5、v-model 三、组件通信1、父组件给子组件传…...
声音生成评价指标——使用声音分类模型评价生成声音质量(基于resnetish、VGGish、AlexNet)
文章目录 引言正文数据预处理将wav转成log-mel频谱图进行保存创建dataset类保存数据 模型定义模型训练过程训练代码定义loss为nan从AlexNet到ResNetloss上下剧烈波动——使用学习率衰减策略学习率调整——根据准确率来调整学习率数据处理问题 模型的测试 总结 引言 这篇文章主要…...
HarmonyOS学习路之方舟开发框架—学习ArkTS语言(状态管理 六)
AppStorage:应用全局的UI状态存储 AppStorage是应用全局的UI状态存储,是和应用的进程绑定的,由UI框架在应用程序启动时创建,为应用程序UI状态属性提供中央存储。 和LocalStorage不同的是,LocalStorage是页面级的&…...
SPA首屏加载速度慢
什么是首屏加载 首屏时间(First Contentful Paint),指的是浏览器从响应用户输入网址地址,到首屏内容渲染完成的时间,此时整个网页不一定要全部渲染完成,但需要展示当前视窗需要的内容 首屏加载可以说是用…...
JVM执行流程
一、Java为什么是一种跨平台的语言? 通常,我们编写的java源代码会被JDK的编译器编译成字节码文件,再由JVM将字节码文件翻译成计算机读的懂得机器码进行执行;因为不同平台使用的JVM不一样,所以不同的JVM会把相同的字节码…...
laravel 凌晨0点 导出数据库
一、创建导出模型 <?php namespace App\Models;use Illuminate\Support\Facades\DB;class DbBackup {private $table;public function __construct(){$this->table env(DB_DATABASE);}public function run($file ){$file !$file ? public_path($this->t…...
mysql MVCC多版本并发控制
mvcc的概念 mvcc 的实现依赖于: 隐藏字段 行格式(row_id,trx_id,roll_ponter)UndologRead view innodb 存储引擎的表来说,聚集索引记录中都包含两个必要的隐藏字段,row_id(如果没有聚集索引,才会创建的) …...
new/delete, malloc/free 内存泄漏如何检测
区别: 首先new/delete是运算符,malloc/free是库函数。malloc/free只开辟内存不初始化;new/delete及开辟内存也初始化。抛出异常的方式:new/delete开辟失败使用抛出bad_alloc;malloc/free通过返回值判断。malloc和new区…...
Java开发推荐关注的网站
一、开发者社区 阿里云开发者社区:https://developer.aliyun.com/腾讯云开发者社区:https://cloud.tencent.com/developer 二、开发规范 阿里巴巴Java开发规范 github地址:https://github.com/alibaba/p3c gitcode地址:https:/…...
OpenHarmony社区运营报告(2023年8月)
本月快讯 2023年8月3日,OpenAtom OpenHarmony(以下简称“OpenHarmony”)发布了Beta2版本。OpenHarmony 4.0 Beta2在系统能力、应用框架、分布式通信、媒体功能、安全性等方面进行了全面升级。其中,ArkUI增强了界面组件能力&#x…...
Web学习笔记-React(路由)
笔记内容转载自 AcWing 的 Web 应用课讲义,课程链接:AcWing Web 应用课。 CONTENTS 1. Web分类2. Route组件3. URL中传递参数4. Search Params传递参数5. 重定向6. 嵌套路由 本节内容是如何将页面和 URL 一一对应起来。 1. Web分类 Web 页面可以分为两…...
MySQL无法查看系统默认字符集以及校验规则
show variables like character_set_database; show variables like collation_database;这个错误信息表示MySQL在尝试访问performance_schema.session_variables表时,发现该表不存在。这个问题可能是由于MySQL的版本升级导致的。解决这个问题的一种方法是运行mysql…...
不负昭华,前程似锦,新一批研发效能认证证书颁发丨IDCF
亲爱的认证学员, 恭喜你成功获得由国家工业和信息化部教育与考试中心颁发的职业技术证书——《研发效能(DevOps)工程师国家职业技术认证》。你的努力和才华得到了官方的认可,这是你职业生涯中的一个重要的里程碑。 这个证书不仅代表着你的专业知识和技…...
深入理解ES6模块化:语法、特性与最佳实践
目录 一、前言 二、ES6模块化基础 1. 模块的定义与导出 2. 模块的导入与使用 3. 模块默认导出与命名导出 4. 模块的循环引用与解决方案 三、模块化语法进阶 1. 模块的命名导出与默认导出的混合使用 2. 模块的别名导出与导入 3. 命名空间的使用与作用 4. 动态导入模块…...
Matlab图像处理-HSI模型
HSI模型 HSI模型是从人的视觉系统出发,直接使用颜色三要素色调(Hue)、饱和度(Saturation)和亮度(Intensity)来描述颜色。 亮度是指人眼感知光线的明暗程度。光的能量越大,亮度就越大。 色调是颜色最重要的属性。 它决定了颜色的…...
【Springboot】Springboot如何优雅停机?K8S中Pod如何优雅停机?
什么是优雅停机: 就是对应用进程发送停止指令之后,执行的一系列保证应用正常关闭的操作。这些操作往往包括等待已有请求执行完成、关闭线程、关闭连接和释放资源等 就是对应用进程发送停止指令之后,能保证正在执行的业务操作不受影响&#x…...
伦敦银一手是多少?
伦敦银是以国际现货白银价格为跟踪对象的电子合约交易,无论投资者通过什么地方的平台进入市场,执行的都是统一国际的标准,一手标准的合约所代表的就是5000盎司的白银,如果以国内投资者比较熟悉的单位计算,那约相当于15…...
Language Adaptive Weight Generation for Multi-task Visual Grounding 论文阅读笔记
Language Adaptive Weight Generation for Multi-task Visual Grounding 论文阅读笔记 一、Abstract二、引言三、相关工作3.1 指代表达式理解3.2 指代表达式分割3.3 动态权重网络 四、方法4.1 总览4.2 语言自适应权重生成语言特征聚合权重生成 4.3 多任务头4.4 训练目标 五、实…...
面试算法4:只出现一次的数字
题目 输入一个整数数组,数组中只有一个数字出现了一次,而其他数字都出现了3次。请找出那个只出现一次的数字。例如,如果输入的数组为[0,1,0,1,0,1,100],则只…...
#与##的用法
# 作用: 左右加双引号,使其变成字符串 #的作用:是在形参左右各加双引号,使它变成字符串。#define STR(param) #paramchar *pStr STR(hello); // 展开后 char *pStr “hello”; ## 作用:胶水,使…...
Flutter的路由router-页面跳转
文章目录 概念介绍基本路由(Basic Routing)跳转到某个页面弹出页面 命名路由(Named Routing)第三方路由管理库(Third-Party Routing Libraries) Android原生的路由Intent-based Routing(基于Int…...
24v转5v稳压芯片-5A大电流输出ic
这款24V转5V5A汽车充电芯片具有以下特性和参数: - 宽输入电压范围:4.5V至36V - 最大输出电流:5.0A - 高达92%的转换效率 - 恒流/恒压模式控制 - 最大占空比100% - 可调输出电压 - 2%的输出电压精度 - 集成40mΩ高侧开关 - 集成18mΩ低侧开关 …...
Layui + Flask | 表单元素(组件篇)(06)
表单元素是输入框、选择框、复选框、开关、单选框等表单项组件,用于对表单域进行输入。layui 的表单元素对原生的表单元素进行了大幅的用着,有好看的 UI 同时又有非常方便操作的 API。 输入框 https://layui.dev/docs/2.8/form/input.html 输入框组件是对文本框 <input ty…...
Kakfa - Producer机制原理与调优
Producer是Kakfa模型中生产者组件,也就是Kafka架构中数据的生产来源,虽然其整体是比较简单的组件,但依然有很多细节需要细品一番。比如Kafka的Producer实现原理是什么,怎么发送的消息?IO通讯模型是什么?在实…...
基于图像形态学处理和边缘提取算法的路面裂痕检测matlab仿真
目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 [Rr,Cc] size(Image1);% 获取 Image1 矩阵的大小(行数和列数) % 创…...
备案需要网站空间/珠海百度关键词优化
0.前言在上一篇中初略的介绍了一下SQL的基本写法,这一篇开始我们正式步入C#操作数据库的范围。通过这一系列的内容,我想大家能对于数据库交互有了一定的认识和基础。闲话不多说,先给大家介绍一个C#操作数据库的方式。1. ADO.NET的介绍在ADO.N…...
wordpress资讯自媒体中文主题/营销推广费用方案
✿今日屋主✿户型:两室一厅面积:77㎡风格:北欧全部花费:40万屋主是一个美食博主,一位自称爷的姑娘,也是一个标准的“颜控”。为了满足自己梦想中的开放式的大厨房有自然光的餐厅(主要是要吃的开…...
英文网站建设服务合同模板/网络舆情优化公司
1、为什么选定了webmagic? webmagic的doc文档地址:http://webmagic.io/docs/zh/ 刚开始做的时候采用的是 httpclienthtmlparserdom4j,主要说下为什么使用了dom4j,现在的webmagic也是采用了dom4j,这里主要是需要解析一个…...
有什么网站建设比较好的公司/定制网站开发公司
本章要点 表达式是javascript中的一个短语,javascript解释器会将其计算出一个结果。 程序中的常量、变量名就是一种简单的表达式。复杂的表达式是由简单的表达式组成的,比如数组访问表达式、函数调用表达式等等。 将简单表达式组合成复杂表达式最常用的方…...
数据分析案例网站/无锡今日头条新闻
服务器终端输入命令 jupyter notebook --no-browser --port8889 本地终端输入命令 ssh -N -f -L localhost:8888:localhost:8889 usernameip username和ip替换为服务器的username和ip地址 本地打开浏览器,http://localhost:8888/ 即可访问 可能出现的问题 如果ju…...
专业团队ppt/疫情优化调整
起初,我自己连什么叫CSV文件都不知道,这个问题是来自一个网友的问题,他要我帮他做一个对csv文件数据的操作的题目。要求:如果原来数据是“江苏省南京市南京街……”换成“江苏 省 南京 市 南京 街 ……”也就是把出现类似&…...