关于amazon:9-种方法使用-Amazon-CodeWhisperer-快速构建应用

81次阅读

共计 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 更多的测试倡议。

提醒:你会留神到我的测试形容包含:

  1. 我正在测试的函数;
  2. 我正在测试的条件;
  3. 我冀望的后果。

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

正文完
 0