2023年初,我在一家总部位于美国的公司实习,那时智能代理还远未成为日常开发中不可或缺的一部分。

我们当时可以使用ChatGPT、Gemini和Copilot这类工具,但它们大多只是聊天界面:你输入代码,得到回复,然后继续下一步操作。

在那段时间里,我的经理从事人工智能/机器学习领域的工作,他告诉我,总会有那么一天,开发者会与智能代理协同工作,而学会如何编写有效的提示语也会成为一项非常有价值的技能。

我认真对待了这个建议。我花了无数个夜晚去尝试不同的提示语格式、优化指令内容,并学习如何有效地与人工智能系统进行交流。

如今,虽然我仍然会手工编写代码,并且非常重视基础知识的掌握,但那些早期的努力确实带来了回报。在当今这个人工智能已经深入开发流程的时代,我能够充分利用这些技术,从而大幅提高自己作为软件工程师的工作效率。

你们可能都看到了人们对人工智能编码助手的浓厚兴趣。但如果你们真的在一个实际的Flutter项目中使用过这类工具——无论是金融应用、电子商务平台,还是任何架构结构清晰的应用程序——你们也应该体会过其中的挫败感吧。

这些辅助工具会生成一些代码片段,你将其粘贴到项目中后,却发现它们并不符合你的项目架构,也不遵循你的命名规范;有时甚至会重复创建代码库中已经存在的功能。很快,你就会发现自己花了二十分钟去修改那些本应节省你时间的代码。

问题并不在于人工智能本身,而在于大多数开发者仍然把人工智能仅仅当作一个高级的自动完成工具来使用。实际上,人工智能完全可以发挥更强大的作用:它应该成为你的“第二位工程师”——理解你的代码库,遵循你的编码规范,在你专注于解决复杂问题的时候帮助你处理那些重复性的任务。

在这篇文章中,我会向你们分享一些对我来说真正有效的方法。我们会探讨如何构建Flutter项目结构,以便Claude Code能够高效地处理这些项目;同时也会介绍如何利用技巧、循环和子代理来自动化重复性开发任务,从而大幅提升你的工作效率。

先决条件

在开始学习之前,你需要掌握Flutter开发的基础知识,包括如何构建组件、管理状态以及如何在终端中运行应用程序。当然,你不需要成为这方面的专家。

在工具方面,你需要准备以下内容:

  • Flutter SDK(3.x版本或更高):我们将会使用这个框架进行开发。请通过flutter.dev进行安装。

  • Claude Code:这是Anthropic公司开发的智能编码工具,可以在你的终端中与编辑器一起使用。请使用npm install -g @anthropic-ai/claude-code命令进行安装,然后在项目目录中运行claude来启动会话。使用这个工具之前,你需要拥有Anthropic的账户和API密钥。

  • 代码编辑器:VS Code或Android Studio都是不错的选择。Claude Code直接在终端中运行,能够直接读写文件,因此它可以与你使用的任何编辑器配合使用。

  • Git:整个开发过程都需要使用版本控制工具。Claude Code支持与Git集成,可以方便地进行代码提交、差异对比以及分支管理。

以下是我们将在整篇文章中使用的Claude Code概念的简要概述:

  • CLAUDE.md:位于项目根目录中的Markdown文件,Claude会在每次会话开始时读取该文件。可以将其视为一份说明文档,其中包含了你的应用程序架构、编码规范以及所需使用的命令。

  • 技能包:存储在.claude/skills/目录中的可重复使用的指令集。你只需定义一次这些技能包,当任务需要使用时,Claude会自动调用它们;或者你也可以通过/skillname命令手动触发它们。

  • 子代理:独立运行的Claude实例,它们会在自己的独立窗口中处理特定的任务,并仅返回相应的结果。这种机制非常适合并行执行任务,而不会干扰你的主会话流程。

  • 钩子脚本:在应用程序的生命周期事件发生时执行的shell命令或脚本(例如工具启动前、某轮操作完成后等)。这些脚本完全绕过了Claude的判断机制,因此非常适用于强制执行某些规则。

  • /loop:一个内置的技能包,它会不断重复执行某个任务,直到满足你设定的条件为止。

这些功能都不需要额外的配置即可使用。只要安装了Claude Code,它们就能立即投入使用。

目录结构

1. 为什么架构设计是首要任务

在编写任何技能包或配置任何钩子脚本之前,你的文件夹结构必须能够让人工智能系统轻松理解。

Claude Code会通过读取这些文件来了解你的项目结构。如果你的代码分散存储在不同的文件夹中(例如lib/models/lib/services/lib/widgets/),Claude就需要在各个文件夹之间来回切换才能理解每个模块的功能。这样一来,它很容易出错,也可能会在错误的位置创建文件,或者生成与应用程序其他部分编码规范不一致的代码。

这种设计采用“功能优先”的结构。每个功能都是一个独立的模块。例如,Claude理解转账流程所需的所有信息都存储在lib/features/transfer/目录中。

lib/
├── core/
│ ├── constants/
│ ├── errors/
│ ├── router/
│ └── theme/
├── features/
│ ├── auth/
│ │ ├── data/
│ │ │ ├── models/ # 被冻结的模型
│ │ │ └── repositories/
│ │ ├── presentation/
│ │ │ ├── screens/
│ │ │ ├── widgets/
│ │ │ └── providers/ # Riverpod提供的组件
│ │ └── auth.dart # 通过“barrel”机制导出的文件
│ ├── transfer/
│ │ ├── data/
│ │ ├── presentation/
│ │ └── transfer.dart
│ └── wallet/
│ ├── data/
│ ├── presentation/
│ └── wallet.dart
└── main.dart

这种结构能让Claude立刻明白:“与转账功能相关的所有内容都位于lib/features/transfer/目录中。”当你要求它“在转账流程中添加受益人验证机制”时,它就会知道该去哪里查找相关代码,以及应该在哪里创建新的文件。

这种结构还能通过代码生成机制与Riverpod完美对接。每个功能的组件都会被放置在与其相关的界面文件附近,因此build_runner生成的编译结果也会被存放在正确的位置。

2. 设置您的CLAUD.md文件

CLAUDE.md可以说是您Claude代码配置中最重要的文件。它在每次会话开始时都会被加载,而且在整个对话过程中都会保持有效性,这样无论会话持续多长时间,Claude都能始终遵循您项目的架构规范、开发习惯。

请在您项目的根目录下创建这个文件:

touch CLAUDE.md

以下是一个专为Flutter/Riverpod项目设计的模板:

# 我的Flutter应用

## 常用命令
- `flutter pub get` — 安装依赖项
- `dart run build_runner build --delete-conflicting-outputs` — 生成代码
- `flutter analyze` — 运行代码检查工具
- `flutter test` — 运行测试
- `flutter run` — 启动开发构建过程

## 架构设计
采用“功能优先”的文件夹结构。每个功能都存储在lib/features/<名称>/目录中。
状态管理:使用Riverpod及@riverpod生成的代码(遵循AsyncNotifier模式)。
HTTP请求:通过lib/core/network/中的拦截器来处理。
导航系统:使用GoRouter,并在lib/core/router/中定义路由规则。
模型:使用被冻结的模型结构,并支持JsonSerializable格式;任何模型发生变更后都需要运行build_runner进行重新生成。

## 开发规范
- 所有金额数值都应使用最小单位表示(例如,尼日利亚奈拉用kobo为单位),并且存储为整数类型——切勿使用double类型来表示金钱数值。
- 应使用refinvalidate()而不是ref.refresh()来更新数据。
- 组件中不应包含任何业务逻辑代码;所有逻辑都应该放在通知器或仓库类中。
- 每个组件文件中只能包含一个公共组件。
- 通过每个功能目录下的feature.dart文件来实现组件的导出。
- 私有组件文件的前缀应为下划线。

## 不应做的事情
- 在未经许可的情况下不要添加新的包。
- 不要直接修改*.g.dart或*.freezed.dart文件——应该使用buildrunner来重新生成这些文件。
- 不要将API调用直接写入通知器类中——必须通过仓库层来进行处理。

关于这个文件有几点需要注意:

保持一致性: 如果你的编码规范与代码库中的实际实现不一致,Claude会感到困惑。CLAUDE.md文件应该反映当前代码的实际运行方式,而不是理想化的设计。

“不要做什么”这一部分非常重要: AI助手往往过于乐观,它们会不考虑副作用就直接解决问题。明确告诉Claude哪些行为是不可取的,可以避免后续出现很多不必要的清理工作。

不要写得过长: CLAUDE.md文件中的每一行内容,在每次会议中都会被反复读取并消耗相应的资源。因此,请在这里只编写那些对整个团队来说始终都重要的规则;其他内容则应该通过专门的技能文件来处理(具体方法将在后面介绍)。

3. 以功能为导向的文件夹结构——详细说明

让我们以“钱包”功能为例,更详细地看看这种文件夹结构的实际应用:

lib/features/wallet/
├── data/
│   ├── models/
│   │   ├── wallet.dart             # 冻结后的模型文件
│   │   ├── wallet.freezed.dart     # 生成后的文件
│   │   ├── wallet.g.dart           # 生成后的文件
│   │   └── transaction.dart
│   └── repositories/
│       ├── wallet_repository.dart  # 抽象类
│       └── wallet_repository_impl.dart
├── presentation/
│   ├── screens/
│   │   ├── wallet_screen.dart
│   │   └── transaction_history_screen.dart
│   ├── widgets/
│   │   ├── balance_card.dart
│   │   └── transaction_tile.dart
│   └── providers/
│       ├── wallet_provider.dart
│       └── wallet_provider.g.dart  # 生成后的文件
└── wallet.dart                     # 最终输出的文件

在这种结构中,一个规范的Riverpod提供者文件应该如下所示:

lib/features/wallet/presentationproviders/wallet_provider.dart

import 'package:riverpod.annotation/riverpod_annotation.dart';
import '../../data/models/wallet.dart';
import('../../data/repositories/wallet_repository.dart';

part 'wallet_provider.g.dart';

@riverpod
class WalletNotifier extends _$WalletNotifier {
  @override
  Future〈Wallet〉 build() async {
    return ref.watch(walletRepositoryProvider).getWallet();
  }

  Future〈void〉 refreshBalance() async {
    state = const AsyncValueloading();
    state = await AsyncValue.guard(
      () => ref.readwalletRepositoryProvider).getWallet(),
    );
  }
}

当Claude Code看到多个功能中都存在这种结构模式时,它就会学会模仿这种写法。你的代码结构越统一、越规范,Claude生成的代码就越符合你预期的效果。

4. 为那些重复性较高的任务培养相应的编写技能

“技能”其实是可复用的指令集,当Claude Code认为某些操作需要使用时,就会加载这些技能文件。这些文件通常保存在.claude/skills/<名称>/SKILL.md路径下,可以通过/skillname命令手动调用,或者当Claude识别到相应的上下文时自动执行这些指令。

可以将“技能”理解为团队中的专家。想象一下,如果你与一名设计师、一名质量保证工程师以及一名安全专家一起工作,每次需要他们帮忙时,你并不需要详细解释他们的职责——每个人都已经清楚自己的任务,并且会按照既定的流程来开展工作。

技能的工作原理也是如此。例如,你不必反复告诉Claude如何生成Riverpod提供者、编写测试代码或检查安全问题,而是可以将这些指令封装成一项“技能”,让Claude在需要时自动执行这些操作。

可以把“技能”想象成一份保存好的食谱。每次想要做饭时,你都不必再次列出食材和烹饪步骤,而是将食谱保存在一个地方,在需要的时候直接使用它即可。

技能对于开发工作流程来说也起到了同样的作用:你可以一次性将一组指令保存下来,之后每当遇到类似的任务时,Claude就会自动按照这些指令来执行操作。

需要理解的关键点是:描述技能的文字内容才是触发该技能执行的依据。Claude会在每个步骤中都会检查这段描述,判断当前任务是否与之匹配。因此,在描述技能时,应该使用开发人员在实际工作中会使用的动词,比如`build`、`commit`、`release`或`fix lint`,而不是采用文档编写风格的语言。

创建你的第一个技能

在开始编写技能之前,先思考一下那些你需要反复执行的任务。一个好的技能应该能够概括你已经熟练掌握的工作流程。如果你发现自己每次都会给Claude下达相同的指令,比如“运行`flutter analyze`,然后运行`build_runner`,接着执行测试”,那么这个任务就很适合被封装成一项技能。

先从一项具体的任务开始着手。确保步骤的顺序与你期望Claude执行的顺序完全一致,并且要明确界定什么是成功的执行结果。不必试图涵盖所有可能的边缘情况——我们的目标是将日常工作流程自动化,让Claude能够自动完成重复性任务,而只有当出现意外情况时,你才需要介入。

mkdir -p .claude/skills/flutter-release
touch .claude/skills/flutter-release/SKILL.md
---
name: flutter-release
description: |
  用于构建发布版APK或准备应用程序进行部署。
  触发条件:"build release"、"generate apk"、"prepare release"、"release build"。
  允许使用的工具:Bash Read
---

# Flutter发布流程检查清单

请按顺序执行以下步骤,不要跳过任何一步。

1. 运行 `flutter pub get`
2. 运行 `dart run build_runner build --delete-conflicting-outputs`
3. 运行 `flutter analyze` — 在继续之前,请修复所有出现的错误。对于被标记为错误的警告,也必须进行修复。
4. 运行 `flutter test` — 如果有任何测试失败,请先修复这些问题再继续。
5. 运行 `flutter build apk --release`
6> 在 `build/app/outputs/flutter-apk/app-release.apk` 文件夹中确认构建结果是否正确。
7. 创建一个Git提交:`chore: release build vX.X.X`

如果任何步骤失败,请立即停止并详细报告错误情况,不要跳过后续步骤继续执行。

现在,每当您输入"准备发布""构建apk"时,Claude都会自动按照这个检查清单来执行相应的操作,而无需您再提醒它该步骤。

常规提交任务所需的一项技能

mkdir -p .claude/skills/commit
touch .claude/skills/commit/SKILL.md
---
名称:commit
描述:|
  用于提交更改或编写提交信息。
  触发条件:“commit”、“git commit”、“commit changes”或“write a commit message”。
---

请遵循常规提交格式:

类型:feat | fix | chore | refactor | docs | test | perf

格式:`type(scope): 简短的命令式描述`

规则:
- 主题行最多72个字符
- 使用命令式表达方式,例如“add”而非“added”
- scope表示功能名称(如auth、transfer、wallet、cards)

示例:
- `feat(transfer): 为金额输入添加验证功能`
- `fix(wallet): 更正kobo与naira之间的显示转换问题`
- `chore(deps): 将riverpod升级到2.6.1版本`

在提交之前,请务必运行`flutter analyze`。如果有lint错误,切勿提交代码。

动态上下文注入

这些技能支持一种非常实用的功能:您可以使用!`command`语法将shell命令的输出直接嵌入到技能内容中。Claude会将这些输出作为技能执行结果的一部分来接收,而不会将其视为单独的步骤。

例如,您可以在某个技能中嵌入!git status这样的命令,这样在使用该技能时,Claude就能实时显示您的代码库当前的状态。在Flutter开发流程中,您也可以使用!flutter test来让技能自动获取最新的测试结果,从而帮助Claude给出改进建议。

---
名称:sprint-status
描述:|
  用于查询当前项目状态、剩余待办任务或已发生的变更。
---

## 当前git状态
!`git status --short`

## 未提交的更改
!`git diff --stat HEAD`

## 最近的提交记录
!`git log --oneline -10`

## Lint检查结果
!`flutter analyze 2>&&1 | tail -20`

请仔细查看以上信息,并简要总结:哪些功能已经实现,哪些地方出现了问题,以及在下次提交之前还需要关注哪些事项。

输入/sprint-status,Claude会立即显示您项目当前的实时状态,然后才开始回应您的请求。

5. 使用/loop实现自我纠错的工作流程

/loop是Claude内置的一项代码技能,它可以反复执行某项任务,直到满足某个条件为止。这种机制使得“修复这个lint错误”这样的一次性操作,与“自动修复所有lint错误”这样的持续循环操作区分开来。

例如,您不必每次都输入“修复这个lint错误”,而是可以直接使用/loop fix lint errors in this Flutter project until there are no warnings left。Claude会不断检查执行结果,应用相应的修复措施,并重新检查,直到条件得到满足为止。

一个更为实际的Flutter开发流程可能是这样的:/loop run flutter analyze 并修复所有报告的问题,直到分析结果显示“无问题”为止。在这种情况下,Claude会持续进行分析、修复问题,并重新验证,直到项目达到“无误的状态”。

值得注意的是,/loopSkill解决的是两种不同类型的问题,我们可以这样来理解它们:

  • Skill代表的是知识或具体的技能。

  • Loop则代表随着时间推移而发生的行为或过程

其基本模式始终是相同的:告诉Claude该执行什么操作、检查什么内容,以及何时停止。

修复问题,直到项目无误为止

/loop
Run flutter analyze.
如果存在任何错误或警告,请仔细阅读并逐一修复这些问题。
再次运行flutter analyze。
持续这个过程,直到flutter analyze显示“无问题”为止。
在还有错误存在的情况下,切勿继续下一步操作。

TDD循环

/loop
Run: flutter test --name "WalletNotifier"
如果测试失败,请仔细阅读失败原因。
进行必要的最小限度的代码修改以解决故障问题。
不要更改测试本身。
再次运行测试。
直到测试成功且没有任何错误时才停止。

构建屏幕、检查结果、迭代开发

/loop
查看CLAUDE.md文件中“剩余屏幕”部分中的Figma设计说明。
选择下一个尚未完成的屏幕。
按照lib/features/wallet/presentation/中的架构规范来构建该屏幕。
构建完成后,运行flutter analyze并修复任何存在的问题。
在已完成开发的屏幕文件的顶部添加注释`// DONE`。
然后进入下一个屏幕的开发流程。
完成3个屏幕的开发后停止这个循环。

需要提醒的是:/loop虽然非常强大,但必须为Claude设定明确的停止条件。“一直持续下去,直到结果完美为止”显然不是一个有效的停止条件。正确的停止条件应该是“当flutter analyze和flutter test都显示‘无问题’时才停止”。

6. 用于并行屏幕开发的子代理

子代理是独立的Claude实例,它们在各自的独立环境中执行任务,最后只向主会话返回总结结果。这种机制改变了我们在多屏幕项目中使用Claude进行开发的方式。

简单来说,可以这样理解:假设我们要构建一个包含多个屏幕的Flutter应用程序。如果没有使用子代理,我们就需要一次性完成首页、个人资料页和设置页的设计工作。随着开发过程的进行,上下文信息会变得越来越复杂,导致Claude难以准确记住之前的设计决策。

而使用子代理的话,就相当于让不同的工程师分别负责不同的屏幕开发。一个人负责首页的开发,另一个人负责个人资料页,还有一个人负责设置页。每个人独立工作,但都遵循相同的项目规范,只有当某个屏幕的开发完成后才会向主会话报告结果。最后,我们可以将这些各个部分的成果整合到最终的项目中,从而保证代码的清晰性和一致性。

设置屏幕构建子代理

.claude/agents/screen-builder.md路径下创建一个文件:

---
名称:screen-builder
描述:根据应用程序以功能为导向的Riverpod架构来构建单个Flutter界面
模型:claude-sonnet-4-6
工具:[读、写、Bash、Glob]
---

你是一名Flutter工程师,正在为一家金融科技公司开发一个界面。

在开始开发之前:
1. 阅读文件`lib/features/wallet/presentationScreens/wallet_screen.dart`,了解现有的界面架构模式。
2. 仔细阅读CLAUDE.md文件,了解相关的规范和架构规则。
3. 查看`presentationproviders/`文件夹中该功能模块所使用的提供者类。

在构建界面的过程中:
- 必须遵循与现有界面完全相同的结构。
- 使用`AsyncValue`模式来处理数据加载、错误处理及状态管理。
- 组件内部不应包含任何业务逻辑,所有状态变化都应由相应的提供者类来处理。
- 所有显示的货币金额均以奈拉为单位,但实际上存储的是科博单位(显示时需除以100)。
- 使用`GoRouter`进行导航,而不是使用`Navigator.push`方法。

构建完成后:
- 对该文件运行`flutter analyze`命令进行检查。
- 修复所有发现的错误。
- 提供一份总结报告,内容包括创建的文件路径、使用的提供者类以及所做的任何决策。

使用方法

在你的主工作流程中,你可以这样使用它:

使用screen-builder子代理来构建“交易历史”界面。该界面应该会显示来自`WalletNotifier`提供者类的交易列表,每条交易记录应包含金额、描述、日期以及状态标识等信息。

Claude会自动调用这个子代理,它会读取你现有的代码以了解上下文信息,然后按照你的设计要求构建界面,同时会修复任何格式错误。最后,它会生成一份简洁的总结报告,而不会让你的主线程被各种中间步骤所占用。

你还可以同时运行多个子代理来实现真正的并行处理:

同时启动三个screen-builder子代理进行并行处理:
1. “交易历史”界面(显示交易列表);
2 “汇款”界面(用户输入金额并选择收款人);
3 “钱包充值”界面(用户输入金额并选择支付方式)。

这三个界面的构建都应遵循现有的钱包功能架构模式。等所有界面都完成后,请及时通知我。

7. 钩子——确定性地执行规则

技能和子代理会影响Claude的思考与工作方式,但钩子的作用截然不同。钩子是具有确定性的工具,它们会在特定的生命周期事件发生时自动执行,无论Claude做出了什么决定。因此,它们非常适合用于在你的工作流程中强制执行一些硬性规则。

简单来说,可以把钩子想象成工程流水线中的检测机制。例如,在任何代码被提交之前,可以运行一个`PreToolUse`钩子来检查代码格式或阻止不安全的修改;某个工具执行完成后,`PostToolUse`钩子可以用来验证输出结果;当会话结束时,`Stop`钩子可以触发清理操作或记录日志。而像`SessionStart`、`PreCompact`这样的其他事件,则有助于你在Claude继续工作之前初始化相关环境或管理内存资源。

在实际应用中,正是这些“钩子”确保了行为的一致性。虽然技能和子代理可以指导Claude的行为,但钩子能保证某些操作总是在恰当的时刻被执行,而无需依赖Claude去“记忆”或“决策”。

禁止编辑生成的文件

*.g.dart*.freezed.dart这样的生成文件绝对不能被手动修改——因为它们会被build_runner覆盖。这个钩子可以阻止Claude对这些文件进行写入操作:

创建文件.claude/hooks.json

{
  "PreToolUse": [
    {
      "matcher": "Write|Edit",
      "command": "bash -c 'if [[ \"\(CLAUDE TOOL_INPUT_PATH\" == *.g.dart ]] || [[ \"\)CLAUDE_tool INPUT_PATH\" == *.freezed.dart ]]; then echo \"禁止编辑生成的文件。请运行build_runner。\"; exit 1; fi'"
    }
  ]
}

在每次停止之前先运行分析

这个钩子在Claude认为当前轮次已经完成之前,会先运行flutter analyze命令,从而在错误积累到一定程度之前就将其发现并处理:

{
  "Stop": [
    {
      "command": "bash -c 'result=\((flutter analyze 2>&1); if echo \"\)result\" | grep -q \"error •\"; then echo \"Flutter分析发现了错误。请在停止之前先修复这些问题。\"; echo 「\(result\"; exit 1; fi'"
    }
  ]
}

现在,如果存在代码检查错误,Claude就无法完成当前轮次的任务——它会被阻止,必须先修复这些错误才能继续。

8. 整合所有步骤:一个真正的迭代开发流程

当所有这些设置都配置完成后,典型的功能开发流程会是这样的:

早上:检查项目状态

/sprint-status

Claude会读取实时的Git状态信息、最近的提交记录以及当前的代码检查结果,然后总结出哪些地方需要关注。

开始开发新功能

我需要开发受益人管理功能。用户应该能够保存、查看和删除转账流程中的受益人信息。首先从数据层入手——构建Freezed模型和仓库接口。

Claude会读取你编写的CLAUDE.md文件以及现有的功能开发模板,然后按照你的规范在适当的位置生成相应的模型和仓库结构。

并行生成所有页面界面

使用screen-builder子代理来生成以下页面:
1. BeneficiaryListScreen——用于显示已保存的受益人信息,并提供搜索功能
2. AddBeneficiaryScreen——用于输入账户号码和选择银行信息
3. BeneficiaryDetailScreen——用于显示受益人的详细信息,并提供删除选项

彻底修复所有问题

/loop
运行flutter analyze命令,修复所有错误。
然后运行flutter test,解决任何测试失败的问题。
当所有测试都通过且没有错误出现时,才结束迭代流程。

规范地提交代码

提交与“受益者功能”相关的代码更改。

执行提交操作后,系统会再次进行分析,并生成格式正确的常规提交信息。

关键要点

如果要说这一切带来的最重要的收获是什么,那就是Claude Code并不仅仅是一个提示工具。它的真正价值在于帮助用户进行项目设置。其输出的质量,在很大程度上取决于你在项目初期所设定的规则,而不是你当时输入的具体内容。

这也正是Claude Code与真正的AI辅助工程之间的区别所在。如果没有合理的结构作为支撑,人们最终就会陷入猜测和被动应对的境地,虽然这种方式看起来效率很高,但实际上很容易出问题。

只要设置了正确的规则,Claude就能成为你的编程伙伴——它会遵循你设定的流程来执行各项操作,而你可以把精力集中在那些确实需要运用工程判断力来解决的问题上。正是这种转变让你能够节省时间,不再花费太多精力去修改自动生成的代码,而是把更多时间用于解决真正重要的问题。

这种收益是逐步累积的。编写一份`CLAUDE.md`文件只需要20分钟,为你的发布流程配置一个相应的“技能”模块也只需10分钟。但一旦Claude能够正确地遵循你的工作流程,而你无需再一步步指导它,这些投入所带来的好处就会立刻显现出来。

可以从简单的事情开始做起:本周就编写你的`CLAUDE.md`文件吧,然后为那些你需要反复执行的操作(比如提交代码、发布版本或运行代码检查工具)配置相应的“技能”模块。等你熟悉了这个流程后,下次进行测试和修复工作时就可以尝试使用`/loop`功能了,其余的事情就会自然而然地跟着来了。

我们的目标并不是让AI来编写所有的代码,而是要避免把有限的工程时间浪费在那些不需要我们运用判断力的环节上,而是要把更多的时间投入到那些确实需要智慧和经验的领域中。

Comments are closed.