2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

9 种方法使用 Amazon Q 快速构建应用

  • 2023-08-22
    北京
  • 本文字数:5340 字

    阅读完需:约 18 分钟

9 种方法使用 Amazon Q 快速构建应用

活动推荐: #生成式 AI 先锋开发者集结令 #

免费体验编程神器,丰厚大奖等你来拿!👉🏻👉🏻https://jinshuju.net/f/rVuKYa


Amazon CodeWhisperer 是一款很赞的生成式人工智能编程工具。自从在工作中使用了 CodeWhisperer,我发现不仅代码编译的效率有所提高,应用开发的工作也变得快乐起来。然而,任何生成式 AI 工具的有效学习都需要初学者要有接受新工作方式的心态和意愿。


  • Amazon CodeWhisperer

https://aws.amazon.com/codewhisperer/


作为一名早期的“探索者”,我发现了几个对我很有用的功能和可以提高生产效率的小技巧,将在这篇文章中和大家分享:


  • 减少输入

  • 函数生成

  • 类的生成

  • 算法的实现

  • 单元测试的编写

  • 创建示例数据

  • 简化正则表达式

  • 更快地学习第三方代码库

  • 代码的文档化


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 “入门” 资源

https://aws.amazon.com/codewhisperer/resources/


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 更多的测试建议。


提示:你会注意到我的测试描述包括:


  1. 我正在测试的函数;

  2. 我正在测试的条件;

  3. 我期望的结果。 


遵循这个由三部分组成的模式是确保 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

https://aws.amazon.com/codewhisperer/resources/


参考资料

  • 10 ways to build applications faster with Amazon CodeWhisperer:

https://aws.amazon.com/cn/blogs/devops/10-ways-to-build-applications-faster-with-amazon-codewhisperer/

  • Amazon CodeWhisperer Startup:

https://aws.amazon.com/cn/codewhisperer/resources/

  • Amazon CodeWhisperer User Guide:

https://docs.aws.amazon.com/codewhisperer/latest/userguide/sagemaker-setup.html


文章作者:Kris Schultz

3D Specialist Solutions Architect, Amazon Web Services 

文章译者:郑予彬

亚马逊云科技资深开发者布道师

代码校验:阙铭飞

亚马逊云科技大中华区解决方案研发中心 

解决方案架构师 

2023-08-22 16:526910

评论

发布
暂无评论
发现更多内容

带你全面认识CMMI V2.0(三)——实践域

IPD产品研发管理

CMMI

Flink 计算 PV UV

shengjk1

flink flink 实战

Flink 计算 TopN

shengjk1

flink flink 实战 flink topN

深入理解ES8的新特性SharedArrayBuffer

程序那些事

JavaScript ecmascript 程序那些事 es8

一文搞懂 FlinkSQL 的 KafkaSource

shengjk1

flink flink源码 flink sql

LiteOS内核源码分析:位操作模块

华为云开发者联盟

LiteOS 源代码 位操作 bit Huawei LiteOS

LeetCode题解:126. 单词接龙 II,BFS,JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

开源的 Switch 模拟器——GitHub 热点速览 v.21.12

HelloGitHub

GitHub 开源

JVM G1GC的算法与实现

Yano

Java JVM GC G1GC

Java学习笔记——实体类(ENTITY,VO,DTO,BO)

棉花糖

Java

Python OpenCV 图像处理二值化,取经之旅第 7 天

梦想橡皮擦

3月日更

Flink 提交作业运行的各种模式总结

shengjk1

flink flink 执行

寻找被遗忘的勇气(二十三)

Changing Lin

3月日更

FlinkSQL 平台

shengjk1

flink flink sql flink sql 平台

一文搞懂 Flink 中的锁

shengjk1

flink flink 锁

企业数字化转型,营销技术驱动超级增长!

博文视点Broadview

【IstioCon 2021】如何在Istio中进行源地址保持?

华为云原生团队

开源 云原生 istio 华为云 服务网格

java deep vs shallow copies

shengjk1

Java deep copy shallow cop

如何在Python中实现Round函数?

华为云开发者联盟

Python 函数 Numpy Round 舍入函数

人工智能能和人类辩论了;《云网产业发展白皮书》发布

京东科技开发者

人工智能

上帝视角掌管城市动向!智慧园区驱动城市数字化转型

一只数据鲸鱼

物联网 数据可视化 智慧城市 智慧园区

AIOT技术大起底:别人开发“软件”,海尔智家开发“生活”

DT极客

万众瞩目的EGG Network,备受期待的New-DeFi自治共识论坛在海口闭幕

币圈那点事

区块链

C语言性能优化:减少相关性依赖,利用指令并行提升性能

1

编程 性能优化 C语言 cpu 100%

适配器模式在Mybatis中的妙用

Java小咖秀

Java 源码 设计模式 mybatis 开发

实践解析丨Rust 内置 trait:PartialEq 和 Eq

华为云开发者联盟

rust hash Trait PartialEq Eq

Veema 寄来的新书

吴威

vmware 容灾 备份 veeam esxi

一文搞懂Flink SQL执行过程

shengjk1

flink flink源码 flink sql flink sql 执行过程

一文搞懂 FlinkSQL函数 LAST_VALUE 的原理

shengjk1

flink flink sql flink 源码

NA公链(Nirvana)NAC公链独步公链江湖

区块链第一资讯

区块链

图像视频压缩:深度学习,有一套

华为云开发者联盟

深度学习 自编码器 图像压缩 循环神经网络 视频压缩

9 种方法使用 Amazon Q 快速构建应用_亚马逊云科技_Kris Schultz_InfoQ精选文章