亚马逊AWS官方博客

从零开始:使用 HAQM Q CLI 开发一款软件

一、项目背景

在现代软件开发中,依赖包的生命周期管理是一个常被忽视但至关重要的环节。当前市面上没有一款专门检查代码中依赖包生命周期(EOL, End of Life)的工具,但存在一个第三方网站 http://endoflife.date,可以查询常用库的 EOL 时间。我发现许多开发团队往往使用已经过期或即将过期的依赖包,这些过期的依赖包可能存在以下问题:

  • 缺少安全更新;
  • 不再获得技术支持;
  • 可能存在已知的安全漏洞;
  • 影响整体系统的稳定性和性能。

因此,我决定开发一个轻量级但功能强大的工具 eol-check,旨在帮助开发者快速、准确地检查项目依赖包的生命周期状态,提高软件供应链的安全性和可维护性。这个工具将直接对接 http://endoflife.date 网站的数据,为开发者提供实时、准确的依赖包生命周期信息。

在探索解决方案的过程中,我决定借助 HAQM Q CLI 这一创新的 AI 开发辅助工具来构建 eol-check。HAQM Q CLI 提供了强大的 AI 驱动的代码生成和智能辅助能力,这为快速开发高效、准确的依赖包生命周期检查工具提供了绝佳的技术支持。通过利用 HAQM Q CLI 的自然语言理解和代码生成能力,我能够全面实现这个工具的所有功能。

二、什么是 HAQM Q Developer CLI

HAQM Q Developer CLI 是 AWS 推出的一款命令行界面工具,为开发者提供 AI 驱动的编程和云资源管理辅助功能。它是 HAQM Q 产品家族中专为开发者设计的命令行工具,能够直接在终端中提供智能帮助。

1. 核心功能

  • 基于自然语言的代码生成和问答能力;
  • 智能化的 AWS 资源管理和操作;
  • 本地文件系统和命令执行支持;
  • 上下文感知的开发辅助。

2. 与其他 HAQM Q 产品线的关系和区别

HAQM Q Developer CLI 是 HAQM Q 产品家族的一部分,但与其他产品有明显区别:

  • HAQM Q Developer:IDE 插件形式,集成在开发环境中
  • HAQM Q Business:企业级知识库和业务助手
  • HAQM Q Developer CLI:专注于命令行体验,适合终端工作流

相比其他产品,CLI 版本更适合习惯命令行操作的开发者,提供了更直接的系统交互能力。

3. 技术架构概述

HAQM Q Developer CLI 采用客户端-服务器架构:

  • 客户端:轻量级命令行工具,处理用户输入和输出展示
  • 服务端:由 AWS 托管的 AI 模型和服务,处理自然语言理解和代码生成
  • 中间层:安全通信层,确保数据传输加密和用户认证

三、HAQM Q Developer CLI 能做些什么

1. 代码辅助功能

HAQM Q Developer CLI 提供了强大的代码辅助能力,帮助开发者提高编程效率:

  • 代码补全和生成:通过自然语言描述需求,Q CLI 可以生成完整的代码片段、函数甚至整个模块。例如,只需输入”创建一个处理 S3 事件的 Lambda 函数”,它就能生成相应代码。
  • 代码解释和优化建议:开发者可以粘贴现有代码,要求 Q CLI 解释其功能或提供优化建议。它能识别性能瓶颈、安全隐患和最佳实践偏差,并给出改进建议。
  • 代码重构和转换:支持将代码从一种语言转换到另一种语言,或者将传统架构代码重构为云原生架构。例如,将 Java 8 代码升级到 Java 21,或将单体应用拆分为微服务。

2. AWS 资源管理

作为 AWS 原生工具,Q CLI 在云资源管理方面表现出色:

  • 资源查询和状态检查:通过自然语言查询 AWS 资源状态,如”显示所有运行中的 EC2 实例及其利用率”,无需记忆复杂的 AWS CLI 命令。
  • 配置文件生成和修改:能够生成和修改 CloudFormation、CDK、Terraform 等 IaC 配置文件,简化基础设施管理。
  • 资源优化建议:分析现有 AWS 资源配置,提供成本优化、性能提升和安全加固的建议。

3. 系统操作

Q CLI 能够执行各种系统级操作,简化开发者的日常工作:

  • 文件系统操作:支持读取、写入和修改本地文件,帮助开发者快速处理文本和代码文件。
  • 命令执行和自动化:能够执行系统命令并自动化常见任务,如批量文件处理、数据转换等。
  • 故障排查和日志分析:协助分析日志文件,识别错误模式,并提供解决方案建议。

4. 开发工作流集成

Q CLI 设计为与现代开发工作流无缝集成:

  • 与常见开发工具的集成:支持与 Git、Docker、npm/pip 等开发工具协同工作,增强现有工具链。
  • CI/CD 流程支持:能够生成和优化 CI/CD 配置文件,帮助开发者构建自动化部署流程。

四、我如何打造这个工具

1. 软件安装

官网下载 Q CLI,目前支持的操作系统包括:

macOS

  • 提供 dmg 安装包

Linux

  • Ubuntu – 提供 deb 安装包
  • 其他(包括 HAQM Linux) – 使用 AppImage 安装,或者 zip 安装

Windows

  • 安装 WSL(Windows Subsystem for Linux)
  • 使用 Linux 虚拟机

具体参考安装适用于命令行的 HAQM Q

2. 开始构建

2.1 使用 Q

打开命令行工具,执行 q login 命令,进行注册/登录,然后执行 q chat 开启交互界面。

按照我们的一般思路,简单描述我们的功能需求,我们先让 Q 先产生一份详细的产品规格说明书。

本例使用提示词使用:

我要用 python 写一个包依赖检查是否过期工具,这个工具会从 http://endoflife.date 上通过 API 获取软件版本过期信息,然后与指定目录中的项目依赖文件进行比对。工具需要支持 python,nodejs,java。生成一份详细的产品规格说明书,并生成代码。

经过一番等待,我们中间可能要按数次 y 以确认 Q 要执行的命令行。如果你想让 Q 一次性完成所有指令的执行,可以输入 t

等待任务完成后,我们已经获得一份代码,并生成了 README.md 文件。

2.2 关于调试

如果发现代码运行失败,我们可以直接将运行错误信息复制过来,然后粘贴到 q chat 中,Q 会自动帮我们分析错误日志,并修复代码。

2.3 迭代与完善功能

排除运行错误后,然后我们需要测试一下这个工具。根据测试,我们可能会发现,工具只是简单从 java 的 pom.xml 中解析了<dependency>中的依赖,但是没有检查依赖包的子依赖。

再使用提示词进行修改项目:

我发现现在检测只解析了 pom.xml 中解析了<dependency>中的依赖,没有解析子依赖项目。检查并修复这个问题。同时检查 nodejs 和 python 项目是否存在同样问题,并修复。

经过等待一段时间,现在这个项目已经可以用 npm、pip、mvn 等工具来检查子依赖项,并去重后进行比对版本。到了这个时候,这个工具已经基本可用。

最后我们再优化一下交互功能和性能:

添加网络请求缓存功能,缓存时间可以配置。增加网络请求的连接池,并发数默认为 CPU 数*2。添加扫描进度条,提取项目名在扫描报告中,扫描的报告需要支持 text、json、html 格式,扫描结果的不同状态用 emoji 进行表示。添加 REAMDE 的中文版本。

等待 Q 的一番操作,最后我们就获得了 eol-check 这样一个工具。

3. 成果展示

该工具目前已经发布在了 http://pypi.org/project/eol-check

扫描报告示例

0.2.0 版本,还额外添加了 GUI 的部分,可以查看本地 Cache 的情况。使用 eol-check --ui 启动 GUI 界面。

GUI 界面

五、经验总结

在 HAQM Q CLI 几个小时的体验中,我总结了以下几点建议。

1. 提供详尽的需求说明

如果一开始我们对软件就有明确且详尽的功能说明文档,就可以减少任务调用的次数。以下情况 b 就会比 a 开发完成整体任务的对话次数少。虽然 a 和 b 在后期都需要进行继续优化调整,即便这样,b 总体耗时也会少很多。

a. 用 python 开发一个可以将程序依赖包对比 http://endoflife.date 上版本信息的程序。

b. 用 python 开发一个可以将程序依赖包和子依赖包对比 http://endoflife.date 上版本信息的程序,同时需要支持 java、python、nodejs 的项目。程序支持以多种格式进行结果报告的输出包括 text、json、html、csv。在检查过程中,应用程序会缓存网络请求的结果以优化下一次请求的速度。网络请求会使用多线程进行处理,默认线程数为 cpu 核心数*2。

2. 保证文档和代码一致

有时候代码和文档会出现不对齐的时候,可以让 Q 检查代码和文档是否一致。例如:“请根据 REAMME.md 文档检查代码和功能是否一致,如果不一致请更新文档。”

3. 尽量严谨地描述

功能需求不严谨的情况下,可能会生成一些硬编码,需要人工进行 review 发现,提出通用性改造的要求。例如我在实现  spring-boot-starter-parent 检查子依赖包 spring-boot 的时候,描述:“实现对 spring-boot-starter-parent 的子依赖包 spring-boot 的检查”。结果 Q 只对 spring-boot 这个包实现了硬编码的检查,而不是通用性的遍历子依赖的方式进行检查。这时候就需要人工检查并发现这个问题,然后及时提出修改建议。

4. 单文件行数不要过长

对于单文件非常长的时候,需要及时对 Q 提出优化代码的要求,减少单个文件的代码总行数。例如:“请根据单一功能的原则拆分源代码中的大文件。”拆分后的短小代码,在后续的修改中成功率会更高,步骤数更少。过长的代码可能导致 Q 阅读和修改代码的时候,只是进行了局部操作,忽略上了过长的上下文,导致局部逻辑正确,整体代码结构错乱,例如在一个 500 行的 python 代码中修改曾经出现,修改后的代码片段“缩进格式不正确”,然后 Q 会反复尝试修改以最小修改量来修复这个错误,最后花了很多时间迭代数十次才完成任务。

5. 及时保存里程碑

当我们完成一个里程碑任务的时候,建议使用 git commit 命令为项目保存状态,防止后续的连续开发过程中造成整体结构性的变化,导致项目无法正常运行。例如升级了某些依赖包的大版本,Q 又整体修改了一遍所有兼容代码后,发现这个依赖包出现了冲突无法使用,必须回退。这个时候用 git 的 commit 进行回滚,会比让 Q 来进行回滚处理,快得多。然后在下一次对 Q 提出要求的时候,将版本兼容问题同时写在“要求”里,则能更有效地让 Q 完成任务。

六、对开发工作未来的展望

1. 对开发者工作方式的潜在改变

AI 工具将重塑开发者的日常工作方式:

  • 关注点从编码转向设计:开发者将花更多时间在系统设计和问题解决上,而不是编写样板代码。
  • 更快的原型开发:从想法到原型的时间大幅缩短,加速创新周期。
  • 知识获取方式变革:从查阅文档到直接询问工具,获取知识的方式更加直接和高效。
  • 团队协作模式转变:AI 工具将成为团队中的”虚拟成员”,参与代码审查和知识共享。

2. 技能提升和学习方向建议

为了在 AI 辅助开发时代保持竞争力,开发者应该:

  • 培养系统思维:理解整体架构和系统设计原则,而不仅仅是编码技能。
  • 加强问题定义能力:清晰准确地定义问题是有效使用 AI 工具的关键。
  • 学习提示工程:掌握如何构建有效的提示,引导 AI 工具产生最佳结果。
  • 跨领域知识整合:将软件开发与领域专业知识结合,创造更有价值的解决方案。
  • 持续学习新兴技术:保持对 AI、云计算和软件工程新趋势的关注和学习。

我期望这篇文章不仅能帮助你了解 HAQM Q Developer CLI,更能启发你思考 AI 时代的软件开发方向。技术工具在不断进化,但核心始终是为人类创造价值。作为开发者,我们的使命是利用这些工具,构建更美好的数字世界。


*前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您了解行业前沿技术和发展海外业务选择推介该服务。

参考链接

本篇作者

林业

亚马逊云科技解决方案架构师,负责基于亚马逊云科技的云计算方案的咨询与架构设计。拥有超过 14 年研发经验,曾打造千万级用户 APP,多项 Github 开源项目贡献者。在游戏、IoT、智慧城市、汽车、电商等多个领域都拥有丰富的实践经验。