Ohhnews

分类导航

$ cd ..
Jetbrains Blog原文

如何利用 JetBrains Junie 和 GoLand 高效编程:PIRATE 开发工作流

#人工智能#go语言#goland#软件开发#编程效率

本文是 John Arundel 的客座文章。John 是一位 Go 语言作家和讲师,为 Go 语言学习者提供免费的电子邮件课程。他的最新著作是《The Deeper Love of Go》。

船员们,大家好!我是 Long John Arundel 船长,今天将为大家带来更多关于驾驶 GoLand 这艘好船的技巧。这一次,我们将登上瞭望台,用望远镜审视 JetBrains 的 AI 编程助手 Junie

如果你是 Junie 和 AI 工具的新手,且不知从何入手,可以将此文视为你寻找 GoLand 生产力隐藏宝藏的藏宝图。准备好像海盗一样写代码了吗?

升起黑旗

你与 AI 开发工具的第一次航行可能会充满危险,从平静的代码海洋转向语法错误和测试失败的风暴。那么,你的 AI 助手会是一位可靠的大副,还是只会坐在你肩头喋喋不休、胡言乱语的随机鹦鹉

Junie 非常聪明,可以处理你交给她的任何任务,但她需要一位优秀船长的指引。为了帮助你保持航向,我总结了一个实用的六步工作流程,我称之为“像海盗一样编程”(Code like a PIRATE)。是的,这又是我的一个自创首字母缩略词——但我相信你们会很容易记住它的,伙计们。(注:Anna 编注:我们整篇文章都要用海盗风格吗?

“P”代表规划 (Plan)

每一次伟大的航行都始于一张地图。当你给 Junie 布置任务时,要告诉她船要开往哪里,这样她才知道该往哪个方向掌舵。(我相信 Junie 不会介意我用“她”来称呼;有趣的事实是,历史上有很多海盗是女性——包括不少男性海盗也曾是女性)。

让 Junie 为这次航行画一张简单的图表,但在你批准之前不要起航:

嘿,Junie,我的好姑娘。我是一名海盗船长,需要一个 Go 程序来帮我分配刚从西班牙大帆船上夺来的战利品。先别急着写代码,先给我展示一个简单的计划,说明这个工具该如何运作。

[LOADING...]

在离开码头之前把这些事情搞清楚非常重要,所以不要害怕花时间完善计划。(注:Anna 编注:我“害怕”我们可能已经把海盗梗用得太过了

“I”代表迭代 (Iterate)

即使是最勇敢的船长也不会试图一步跨越整个海洋。跳岛航行更为有效,每次航行一段距离,并检查是否仍在航线上。给 Junie 一个个小任务,从最简单且实用的程序开始:

让我们从一个非常简单的原型开始。我想运行这个“战利品”计算器并回答两个问题:船员人数,以及要在他们之间分配的“八里亚尔”(pieces of eight)金币数量。

假设每人平分。该工具应打印出每位船员应得的份额。写出刚好能实现此功能的代码即可,剩下的等我们考虑下一阶段再说。

[LOADING...]

如果航向太模糊,Junie 可能会像我们任何人一样迷失方向:如果发生这种情况,请毫不犹豫地大喊“停下!”并打断她。当项目偏离方向太远时再回头,会浪费你大量的时间和金币。(注:Anna 编注:说真的,现在先把海盗话收一收)。抱歉,我本想说的是“Token”。

“R”代表评审 (Review)

一旦 Junie 完成了每次迭代,请逐行检查代码并评审她的工作。她很擅长交付你“要求”的内容,但她并不一定知道你“想要”如何实现。例如:

干得好,Junie,但我有几点改进建议。

  1. 不要在 main 函数中创建 bufio.Scanner 并将其指针传递给 askInt 函数,让我们精简一下。将 askInt 改为仅接收提示字符串,并在内部创建 scanner。
  2. 如果扫描出错,askInt 函数不应打印错误消息并调用 os.Exit。相反,让它返回错误以及整数结果。让 main 函数负责所有的打印和退出逻辑。
  3. 如果 strconv.Atoi 报错,请在错误消息中包含无效输入。例如:“抱歉,我不理解 %q。请输入一个整数。”
  4. 将份额计算逻辑移至其自己的函数中,以便将输入/输出代码与业务逻辑解耦。让它返回份额和余数,以便 main 函数打印它们。

[LOADING...]

在提供反馈时,将所有评论打包在一条消息中。这可以让 Junie 在单次步骤中生成新版本的程序,从而节省 Token。如果你总是只提小建议并要求她每次都重写整个程序,你会发现你的金币——我是说积分——会迅速耗尽。

优秀的程序具有和谐的架构,整体逻辑通顺:一切在各处以相同的方式工作,且衔接紧密。没有你的指导,Junie 无法做到这一点,所以请握紧舵柄,帮助她确保代码结构严谨统一。

“A”代表评估 (Assess)

当 Junie 完成了你要求的步骤后,不要只是扫一眼代码就继续——花点时间评估它是否真正实现了预期功能。程序运行干净吗?函数表现符合预期吗?船底舱里是否潜藏着奇怪的副作用,等着以后让你的船沉没?(注:Anna 编注:我刚才说了什么?

既然你已经看到了程序的运行效果,你可能会意识到它并不完全是你想要的。如果是这样,现在就是调整航向的时候,可以通过 Junie 的帮助,或者你自己进行微小的调整。

如果你对评估结果满意,就可以进入下一个迭代步骤,向最终程序迈进:

我的天哪,Junie,这活干得漂亮。

你现在能把业务逻辑函数移到项目根目录下的 booty 包中,并将 main.go 文件放入 cmd/booty 子文件夹吗?

另外,能不能修改掠夺计算逻辑,让船长的份额是普通船员的两倍?请单独打印出船长的份额。

[LOADING...]

“T”代表测试 (Test)

没有老水手会信任一艘未经海试的船,你也不应该。当你和 Junie 构建程序时,通过为每个函数添加测试来检查每一块木板是否防水。这样,一旦出现漏洞,你就能立即发现。

嘿,现在请为 CalculateShares 函数添加一些单元测试。至少生成十个测试用例。

askInt 函数也移到 booty 包中,并添加逻辑检查输入的数字是否始终大于等于 1,否则返回适当的错误。

让该函数接收一个 io.Reader 来读取输入,接收一个 io.Writer 来打印提示。

为此函数生成两个测试:一个针对有效输入,一个针对无效输入。

[LOADING...]

在起草测试时,Junie 可以成为一个有用的船员,但不要盲目接受她的工作成果。问问自己:这到底在测试什么?是否有我们遗漏的隐藏暗礁——边缘情况?而且,当测试失败时(如果不失败,它们就没用),它们打印出的信息有帮助吗?

这一套测试很棒,Junie。你能让它们全部并行运行吗?

在表格测试中,能使用以名称为键的测试用例 map,然后在测试循环中使用 t.Run 并将 map 键作为子测试名称吗?这对那些试图理解失败输出的笨蛋来说会更容易些。

不要试图检查错误字符串本身来判断无效输入;这会导致测试变得脆弱。相反,只需检查 AskInt 是否为这些情况返回了非 nil 的错误即可。

[LOADING...]

“E”代表评估与学习 (Evaluate)

机器学习固然好,但人类的学习更为重要。在每个任务之后,花点时间分析哪些奏效了,哪些可以做得更好。

你的提示词足够详细吗?Junie 是安全地驶入了港口,还是因为舵手忙着喝酒而搁浅在沙洲上?每一次航行都是一堂课,将帮助你磨练提示技巧,预见陷阱,并为下一次探险成为一名更稳健的海盗船长。

如果你记住了我们在这里绘制的图表,并用它来规划你的下一个项目,在 Junie 和 GoLand 的帮助下,你将真正做好像海盗一样编程的准备。(注:Anna 编注:够了,你去走跳板吧

起锚

查看 booty 计算器项目,看看 Junie 和我一起构建了什么——试试用它来和朋友分配你的战利品。说“booty”这个词也挺有趣的。

下次见,伙伴们,祝你们顺风满帆!

法律免责声明: JetBrains s.r.o. 不提倡海盗行为、在公海非法扣押船只或饮用朗姆酒。请负责任地进行海盗活动。