最近我一直在我的日常编码中使用 Zed 内置的 AI 助手。 我对 AI 持怀疑态度,这已经不是什么秘密了,但我希望保持开放的心态,并给 AI 一个让我印象深刻的机会。
以下是一些最近的例子,在这些例子中,Zed 的 AI 集成给我留下了深刻的印象。
使用 AI 编写文档
在过去的两个星期里,团队一直在举办我们亲切地称之为“文档派对”的活动,我们所有人都会花一两个小时来记录 Zed 代码库的各个部分。
在其中一个派对上,我发现自己需要记录两个具有相同字段的结构体:一个内部设置结构体和一个用于序列化的单独结构体。 其中一个结构体记录了它的字段,而另一个没有。
#[derive(Debug, Clone, Deserialize)]
pub struct LanguageSettings {
pub tab_size: NonZeroU32,
pub hard_tabs: bool,
pub soft_wrap: SoftWrap,
// ...
}
#[derive(Clone, Default, Serialize, Deserialize, JsonSchema)]
pub struct LanguageSettingsContent {
/// How many columns a tab should occupy.
///
/// Default: 4
#[serde(default)]
pub tab_size: Option<NonZeroU32>,
/// Whether to indent lines using tab characters, as opposed to multiple
/// spaces.
///
/// Default: false
#[serde(default)]
pub hard_tabs: Option<bool>,
/// How to soft-wrap long lines of text.
///
/// Default: none
#[serde(default)]
pub soft_wrap: Option<SoftWrap>,
// ...
}
虽然我可以手动复制文档注释,但这个结构体有 16 个字段,并且每个文档注释中的行数不平衡,这使得多光标操作有点棘手。
我决定在内联助手中输入这个提示,看看会发生什么。
复制
LanguageSettingsContent
中字段的文档注释,并将它们添加到LanguageSettings
中的字段。 忽略关于默认值的说明。 只需带上文档注释。
AI 逐字复制了文档注释——没有包含我要求它忽略的关于默认值的说明——并将它们放在了相应的字段上。
#[derive(Debug, Clone, Deserialize)]
pub struct LanguageSettings {
/// How many columns a tab should occupy.
pub tab_size: NonZeroU32,
/// Whether to indent lines using tab characters, as opposed to multiple
/// spaces.
pub hard_tabs: bool,
/// How to soft-wrap long lines of text.
pub soft_wrap: SoftWrap,
// ...
使用 AI 翻译代码
在我的空闲时间里,我一直在重建我个人网站的骨架。 作为其中的一部分,我需要将我的模板从 Tera 转换为我在 auk
之上构建的新模板系统。
我需要将我编写的这个小组件移植到 Auk 的 DSL。
<div class="pv2 flex items-end">
<div class="pv1 w-20"> {{ label }} </div>
<div class="pv1 w-80">
<progress class="language-bar flex" value="{{ value }}" max="10"></progress>
</div>
</div>
再一次,我认为看看 Zed 助手能用它做什么会很有趣。 我用以下内容提示它
使用
auk
的 DSL 重写此 HTML,就像上面的post_link
函数一样。
助手吐出的最终结果看起来和我手动生成的结果完全一样。
pub fn language_stat(label: &str, value: u32) -> HtmlElement {
div()
.class("pv2 flex items-end")
.child(div().class("pv1 w-20").text_content(label))
.child(
div().class("pv1 w-80").child(
progress()
.class("flex language-bar")
.value(value.to_string())
.max("10"),
),
)
}
我特别惊讶于助手能够轻松适应我创建的这个全新的 DSL。 通过简单地与一些其他示例组合在同一个缓冲区中,AI 能够拼凑出足够的上下文来正确形成。
自从发现 Zed 助手非常擅长在 Tera 和 Auk 之间进行转换以来,我一直在迁移过程中继续使用它,以减少手动繁重的工作。 在撰写本文时,几乎有 1,300 行 Auk 模板代码,其中大部分是在 AI 助手的帮助下编写的。
λ nix-shell -p cloc --command "cloc --vcs=git crates/site/src/{components,templates}"
-------------------------------------------------------------------------------
Language files blank comment code
-------------------------------------------------------------------------------
Rust 16 130 2 1293
-------------------------------------------------------------------------------
SUM: 16 130 2 1293
-------------------------------------------------------------------------------
虽然我仍然不相信 AI 会让软件开发人员过时,但这些经历让我相信,将 AI 谨慎地集成到我们的开发工具和工作流程中肯定是有空间的。
在 Zed,我们正在探索如何利用 AI 的力量来增强开发人员编写软件的能力,而我们才刚刚开始。
这篇文章最初发表在 maxdeviant.com