共计 7011 个字符,预计需要花费 18 分钟才能阅读完成。
文章作者:Kris Schultz
3D Specialist Solutions Architect, Amazon Web Services
文章译者:郑予彬
亚马逊云科技资深开发者布道师
代码校验:阙铭飞
亚马逊云科技大中华区解决方案研发核心 解决方案架构师
亚马逊云科技开发者社区为开发者们提供寰球的开发技术资源。这里有技术文档、开发案例、技术专栏、培训视频、流动与比赛等。帮忙中国开发者对接世界最前沿技术,观点,和我的项目,并将中国优良开发者或技术举荐给寰球云社区。如果你还没有关注 / 珍藏,看到这里请肯定不要匆匆划过,点这里让它成为你的技术宝库! |
Amazon CodeWhisperer 是一款很赞的生成式人工智能编程工具。自从在工作中应用了 CodeWhisperer,我发现不仅代码编译的效率有所提高,利用开发的工作也变得高兴起来。然而,任何生成式 AI 工具的无效学习都须要初学者要有承受新工作形式的的心态和志愿。
作为一名晚期的“探索者”,我发现了几个对我很有用的性能和能够进步生产效率的小技巧,将在这篇文章中和大家分享:
- 缩小输出
- 函数生成
- 类的生成
- 算法的实现
- 单元测试的编写
- 创立示例数据
- 简化正则表达式
- 更快地学习第三方代码库
- 代码的文档化
CodeWhiperer 的装置部署
应用 Codewhiperer,须要在你的集成式开发环境(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 为输出需要主动提供倡议。如果没有收到倡议,能够随时应用 Option + C (Mac) 或 Alt + C (Windows) 快捷方式手动触发。
CodeWhisperer 有时还会向你提供多种倡议以供选择。你能够按 → 和 ← 键循环浏览所有可用的倡议。
CodeWhisperer 提供的倡议是非确定性的,这意味着开发者收到的倡议可能与本文中显示的倡议略有不同。如果收到的倡议不合乎需要,能够尝试应用箭头键循环浏览所有可用的倡议,或者尝试略微改写任何代码正文提醒。即便是标点符号的变动也可能产生新的倡议。
本文中的示例是用 JavaScript 和 TypeScript 编写的。当然,演示操作同样实用于 CodeWhisperer 反对的其余编程语言。
缩小输出
对于常见的代码性能实现,CodeWhisperer 的作用在于性能实现自动化,这大大减少了编写 单行代码 或代码块 时的键入次数。CodeWhisperer 在键入时主动提供倡议。当倡议有用时承受这些倡议,当倡议没有帮忙时则疏忽这些倡议。依据我的教训,仅以这种形式应用 CodeWhisperer 能够使我的文字输出缩小 50% 或更多。
函数生成
依据函数名主动生成函数
资深的程序员为其函数和参数提供清晰精确的描述性名称。如果你在本人的编程中遵循这种做法,CodeWhisperer 将领有为你实现许多性能所需的所有上下文。
在输出上面的函数名后,CodeWhisperer 生成的函数体。
用户输出 (JavaScript)function standardDeviation(numbers)
后果:
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)
/**
* 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.
*/
后果:
/**
* 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):
/**
* A folder has a name, children, and an optional parent. A child can't be added
* twice.
*/
后果:
在实现下面的函数块正文之后,CodeWhisperer 提供了多种倡议,并附有每种办法的文档正文!
/**
* 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)
const actors = [...];
// Sort the actors by age using the merge sort algorithm.
后果:
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)
describe("Folder.addChild()", () => {it("when adding an existing folder should not add duplicate"
后果:
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)
const fakeUsers = [{ name: "User 1", id: "user1"},
后果:
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)
const fakeUsers = [{ name: "Sally", id: "user1"},
后果:
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)
/**
* Function that validates whether a string is a valid email address.
*/
后果:
/**
* 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 提醒:一条导入申明和一条形容我目标的形容。
import pako from "pako";
/**
* Accepts a base64-encoded, gzip-compressed JSON string and returns
* a parsed JSON object.
*/
后果:
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() 办法生成文档正文。
class FavoritesFilter implements IAssetFilter {
...
matches(asset: Asset): boolean {...}
}
咱们知须要在办法名称的正上方键入文档正文分隔符(/* /),CodeWhisperer 就会为我生成文档正文的注释。
留神:当 CodeWhisperer 用于这个场景时,咱们须要应用 Option + C (Mac) 或 Alt + C (Windows) 手动触发倡议。
论断
心愿下面的分享能激发你开始尝试应用 CodeWhisperer 这样智能的代码工具的想法。立刻装置 CodeWhisperer,并开始在本人的我的项目中应用这些节省时间的办法和技巧。当然,这些倡议和技巧只是 CodeWhisper 的局部性能。随着更多有开发者开始将 CodeWhisperer 利用到他们的日常工作流程中,我置信更多的技巧、教训和最佳实际还将继续呈现。如果你也有心得体验,请发表评论让咱们晓得。你的分享会对更多的人有所帮忙。
参考资料
- 10 ways to build applications faster with Amazon CodeWhisperer
- Amazon CodeWhisperer Startup
- Amazon CodeWhisperer User Guide
文章起源:https://dev.amazoncloud.cn/column/article/64d4c757de0d7b2798e…