Claude Code 最佳实践

from: claude-code-best-practices

Claude Code 最佳实践

我们最近发布了 Claude Code,这是一款用于代理编码的命令行工具。作为研究项目开发的 Claude Code,为 Anthropic 的工程师和研究人员提供了一种更原生的方式,将 Claude 集成到他们的编码工作流程中。

Claude Code 采用了低级别和无偏见的设计理念,提供接近原始模型的访问,而不强制使用特定的工作流程。这种设计理念创造了一个灵活、可定制、可脚本化和安全的强大工具。虽然功能强大,但这种灵活性对于刚开始使用代理编码工具的工程师来说存在学习曲线——至少在他们开发出自己的最佳实践之前是这样。

本文概述了已被证明有效的通用模式,这些模式对于 Anthropic 的内部团队以及在各种代码库、语言和环境中使用 Claude Code 的外部工程师都是有效的。这个列表中的任何内容都不是一成不变的,也不是普遍适用的;把这些建议视为起点。我们鼓励你进行实验,找到最适合你的方法!

想要更详细的信息?我们在 claude.ai/code 的综合文档涵盖了本文中提到的所有功能,并提供了额外的示例、实现细节和高级技巧。

1. 定制你的设置

Claude Code 是一个代理编码助手,会自动将上下文拉入提示词中。这种上下文收集会消耗时间和令牌,但你可以通过环境调优来优化它。

a. 创建 CLAUDE.md 文件

CLAUDE.md 是一个特殊文件,Claude 在开始对话时会自动将其拉入上下文中。这使其成为记录以下内容的理想场所:

  • 常见的 bash 命令
  • 核心文件和实用函数
  • 代码风格指南
  • 测试说明
  • 仓库规范(例如,分支命名、合并 vs rebase 等)
  • 开发者环境设置(例如,pyenv use,哪些编译器可用)
  • 项目特有的任何意外行为或警告
  • 其他你希望 Claude 记住的信息

CLAUDE.md 文件没有必需的格式。我们建议保持简洁和人类可读。例如:

# Bash 命令
- npm run build: 构建项目
- npm run typecheck: 运行类型检查器

# 代码风格
- 使用 ES 模块(import/export)语法,而不是 CommonJS(require)
- 尽可能解构导入(例如 import { foo } from 'bar'
# 工作流程
- 在完成一系列代码更改时务必进行类型检查
- 为了性能,优先运行单个测试,而不是整个测试套件

你可以将 CLAUDE.md 文件放置在几个位置:

  • 仓库的根目录,或者你运行 claude 的任何地方(最常见的用法)。将其命名为 CLAUDE.md 并提交到 git,以便在会话和团队之间共享(推荐),或者将其命名为 CLAUDE.local.md 并将其添加到 .gitignore
  • 你运行 claude 的目录的任何父目录。这对于 monorepos 最有用,你可能从 root/foo 运行 claude,并且在 root/CLAUDE.mdroot/foo/CLAUDE.md 中都有 CLAUDE.md 文件。这两个都会自动拉入上下文
  • 你运行 claude 的目录的任何子目录。这是上述情况的逆过程,在这种情况下,当你处理子目录中的文件时,Claude 会按需拉入 CLAUDE.md 文件
  • 你的主文件夹~/.claude/CLAUDE.md),它适用于所有你的 claude 会话

当你运行 /init 命令时,Claude 会自动为你生成一个 CLAUDE.md

b. 调整你的 CLAUDE.md 文件

你的 CLAUDE.md 文件会成为 Claude 提示词的一部分,因此应该像任何经常使用的提示词一样进行改进。一个常见的错误是添加大量内容而不迭代其有效性。花时间实验并确定什么能产生最好的指令遵循效果。

你可以手动将内容添加到 CLAUDE.md,或者按 # 键给 Claude 一个指令,它会自动将其合并到相关的 CLAUDE.md 中。许多工程师经常使用 # 在编码时记录命令、文件和风格指南,然后将 CLAUDE.md 的更改包含在提交中,这样团队成员也能受益。

在 Anthropic,我们偶尔会通过提示词改进器运行 CLAUDE.md 文件,经常调整指令(例如,添加 "IMPORTANT" 或 "YOU MUST" 等强调)以提高遵守率。

Claude Code 工具允许列表

c. 精心策划 Claude 的允许工具列表

默认情况下,Claude Code 对任何可能修改系统的操作都会请求权限:文件写入、许多 bash 命令、MCP 工具等。我们采用这种故意的保守方法设计 Claude Code,以优先考虑安全性。你可以自定义允许列表,以允许你知道是安全的额外工具,或允许容易撤销的潜在不安全工具(例如,文件编辑、git commit)。

有四种方法可以管理允许的工具:

  • 在会话期间提示时选择"始终允许"
  • 在启动 Claude Code 后使用 /permissions 命令从允许列表中添加或删除工具。例如,你可以添加 Edit 以始终允许文件编辑,Bash(git commit:*) 以允许 git 提交,或 mcp__puppeteer__puppeteer_navigate 以允许使用 Puppeteer MCP 服务器导航
  • 手动编辑你的 .claude/settings.json~/.claude.json(我们建议将前者提交到源代码控制以与团队共享)
  • 使用 --allowedTools CLI 标志进行特定于会话的权限设置

d. 如果使用 GitHub,请安装 gh CLI

Claude 知道如何使用 gh CLI 与 GitHub 交互,以创建 issue、打开 PR、阅读评论等。如果没有安装 gh,Claude 仍然可以使用 GitHub API 或 MCP 服务器(如果你安装了它)。

2. 给 Claude 更多工具

Claude 可以访问你的 shell 环境,你可以像为自己一样为它构建方便的脚本和函数集。它还可以通过 MCP 和 REST API 利用更复杂的工具。

a. 将 Claude 与 bash 工具一起使用

Claude Code 继承你的 bash 环境,使其可以访问你的所有工具。虽然 Claude 知道常见的实用程序,如 unix 工具和 gh,但如果没有指令,它不会知道你的自定义 bash 工具:

  1. 告诉 Claude 工具名称和使用示例
  2. 告诉 Claude 运行 --help 查看工具文档
  3. CLAUDE.md 中记录常用工具

b. 将 Claude 与 MCP 一起使用

Claude Code 既作为 MCP 服务器,也作为 MCP 客户端。作为客户端,它可以连接到任意数量的 MCP 服务器,通过三种方式访问它们的工具:

  • 在项目配置中(在该目录中运行 Claude Code 时可用)
  • 在全局配置中(在所有项目中可用)
  • 在检入的 .mcp.json 文件中(对在你的代码库中工作的任何人可用)。例如,你可以将 Puppeteer 和 Sentry 服务器添加到你的 .mcp.json,这样在你的仓库中工作的每个工程师都可以立即使用这些服务器

在使用 MCP 时,使用 --mcp-debug 标志启动 Claude 也有助于识别配置问题。

c. 使用自定义斜杠命令

对于重复的工作流程——调试循环、日志分析等——将提示词模板存储在 .claude/commands 文件夹内的 Markdown 文件中。当你输入 / 时,这些可以通过斜杠命令菜单获得。你可以将这些命令检入 git,使团队的其余成员可以使用它们。

自定义斜杠命令可以包含特殊关键字 $ARGUMENTS,用于从命令调用传递参数。

例如,这是一个你可以用来自动拉取和修复 GitHub issue 的斜杠命令:

请分析和修复 GitHub issue:$ARGUMENTS
按照以下步骤操作:

1. 使用 `gh issue view` 获取 issue 详细信息
2. 理解 issue 中描述的问题
3. 在代码库中搜索相关文件
4. 实施必要的更改以修复 issue
5. 编写并运行测试以验证修复
6. 确保代码通过 linting 和类型检查
7. 创建描述性的提交消息
8. 推送并创建 PR

请记住,对所有 GitHub 相关任务使用 GitHub CLI`gh`)。

将上述内容放入 .claude/commands/fix-github-issue.md 中,使其在 Claude Code 中作为 /project:fix-github-issue 命令可用。例如,你可以使用 /project:fix-github-issue 1234 让 Claude 修复 issue #1234。类似地,你可以将自己的个人命令添加到 ~/.claude/commands 文件夹,以便在所有会话中使用这些命令。

3. 尝试常见的工作流程

Claude Code 不强加特定的工作流程,给你灵活地以你想要的方式使用它的自由。在这种灵活性提供的空间内,在我们用户社区中已经出现了几种有效使用 Claude Code 的成功模式:

a. 探索、计划、编码、提交

这个通用的工作流程适合许多问题:

  1. 要求 Claude 阅读相关文件、图像或 URL,提供一般指针("阅读处理日志记录的文件")或特定文件名("阅读 logging.py"),但明确告诉它暂时不要编写任何代码。
    • 这是工作流程中你应该考虑强烈使用子代理的部分,特别是对于复杂的问题。告诉 Claude 使用子代理来验证细节或调查它可能有的特定问题,尤其是在对话或任务的早期阶段,往往有助于保持上下文可用性,而在效率损失方面没有太大缺点。
  2. 要求 Claude 制定如何处理特定问题的计划。我们建议使用"think"一词来触发扩展思考模式,这给 Claude 额外的计算时间来更彻底地评估替代方案。这些特定短语直接映射到系统中思考预算的增加级别:"think" < "think hard" < "think harder" < "ultrathink"。每个级别为 Claude 分配递增更多的思考预算。
    • 如果这一步的结果看起来合理,你可以让 Claude 创建一个文档或 GitHub issue 及其计划,这样如果实现(第 3 步)不是你想要的,你可以重置到这个位置。
  3. 要求 Claude 在代码中实现其解决方案。这也是让它明确验证其解决方案合理性的好地方,因为它实现了解决方案的各个部分。
  4. 要求 Claude 提交结果并创建 PR。如果相关,这也是让 Claude 更新任何 README 或变更日志以解释它刚才所做事情的好时机。

步骤 #1-#2 至关重要——没有它们,Claude 往往会直接跳转到编写解决方案。虽然有时这正是你想要的,但要求 Claude 首先研究和规划会显著提高需要预先深入思考的问题的性能。

b. 编写测试、提交、编码、迭代、提交

这是 Anthropic 最喜欢的工作流程,用于易于通过单元测试、集成测试或端到端测试验证的更改。测试驱动开发(TDD)通过代理编码变得更加强大:

  1. 要求 Claude 根据预期的输入/输出对编写测试。明确说明你正在进行测试驱动开发,这样它会避免创建模拟实现,即使对于代码库中尚不存在的功能。
  2. 告诉 Claude 运行测试并确认它们失败。明确告诉它在这个阶段不要编写任何实现代码通常很有帮助。
  3. 当你对测试满意时,要求 Claude 提交测试
  4. 要求 Claude 编写通过测试的代码,指示它不要修改测试。告诉 Claude 继续进行,直到所有测试通过。通常需要几次迭代让 Claude 编写代码、运行测试、调整代码,然后再次运行测试。
    • 在这个阶段,要求它使用独立的子代理验证实现没有过度拟合测试可能会有帮助
  5. 当你对更改满意时,要求 Claude 提交代码

当 Claude 有一个明确的目标来迭代时——视觉模型、测试用例或其他类型的输出——它的表现最好。通过提供预期的输出(如测试),Claude 可以进行更改、评估结果并增量改进,直到成功。

c. 编写代码、截图结果、迭代

类似于测试工作流程,你可以为 Claude 提供视觉目标:

  1. 给 Claude 一种截取浏览器屏幕截图的方法(例如,使用 Puppeteer MCP 服务器、iOS 模拟器 MCP 服务器,或手动将屏幕截图复制/粘贴到 Claude 中)。
  2. 通过复制/粘贴或拖放图像,或给 Claude 图像文件路径,给 Claude 一个视觉模型
  3. 要求 Claude 在代码中实现设计,截取结果的屏幕截图,并迭代直到其结果与模型匹配。
  4. 当你满意时,要求 Claude 提交

与人类一样,Claude 的输出往往随着迭代而显著改善。虽然第一个版本可能很好,但在 2-3 次迭代后,它通常看起来会好得多。给 Claude 提供查看其输出的工具以获得最佳结果。

安全的 YOLO 模式

d. 安全的 YOLO 模式

除了监督 Claude,你可以使用 claude --dangerously-skip-permissions 绕过所有权限检查,让 Claude 不间断地工作直到完成。这适用于修复 lint 错误或生成样板代码等工作流程。

让 Claude 运行任意命令是有风险的,可能导致数据丢失、系统损坏,甚至数据泄露(例如,通过提示注入攻击)。为了最小化这些风险,请在没有互联网访问的容器中使用 --dangerously-skip-permissions。你可以使用 Docker Dev Containers 遵循此参考实现。

e. 代码库问答

在加入新代码库时,使用 Claude Code 进行学习和探索。你可以问 Claude 与结对编程时询问项目上另一位工程师的同类问题。Claude 可以代理搜索代码库以回答一般问题,例如:

  • 日志记录是如何工作的?
  • 如何创建新的 API 端点?
  • foo.rs 第 134 行的 async move { ... } 是做什么的?
  • CustomerOnboardingFlowImpl 处理哪些边缘情况?
  • 为什么我们在第 333 行调用 foo() 而不是 bar()
  • baz.py 第 334 行在 Java 中的等价物是什么?

在 Anthropic,以这种方式使用 Claude Code 已成为我们的核心入职工作流程,显著提高了入职时间并减少了其他工程师的负担。不需要特殊的提示!只需提问,Claude 就会探索代码以找到答案。

使用 Claude 与 git 交互

f. 使用 Claude 与 git 交互

Claude 可以有效地处理许多 git 操作。许多 Anthropic 工程师将 Claude 用于 90% 以上的我们的 git 交互:

  • 搜索 git 历史以回答诸如"v1.2.3 中有哪些更改?"、"谁拥有这个特定功能?"或"为什么这个 API 这样设计?"等问题。明确提示 Claude 查看 git 历史以回答此类查询会有帮助。
  • 编写提交消息。Claude 会自动查看你的更改和最近的历史记录,以编写考虑所有相关上下文的消息
  • 处理复杂的 git 操作,如恢复文件、解决 rebase 冲突以及比较和移植补丁

g. 使用 Claude 与 GitHub 交互

Claude Code 可以管理许多 GitHub 交互:

  • 创建 PR:Claude 理解简写"pr"并将基于 diff 和周围上下文生成适当的提交消息
  • 为简单的代码审查评论实施一次性解决方案:只需告诉它修复你的 PR 上的评论(可选,给它更具体的指令),并在完成后推回 PR 分支
  • 修复失败的构建或 linter 警告
  • 通过要求 Claude 循环浏览开放的 GitHub issue 来对开放的 issue 进行分类和分流

这消除了记住 gh 命令行语法的需要,同时自动化了例行任务。

h. 使用 Claude 处理 Jupyter notebooks

Anthropic 的研究人员和数据科学家使用 Claude Code 阅读和编写 Jupyter notebooks。Claude 可以解释输出,包括图像,提供了一种探索和与数据交互的快速方法。不需要必需的提示词或工作流程,但我们推荐的工作流程是在 VS Code 中并排打开 Claude Code 和 .ipynb 文件。

你也可以在向同事展示之前,要求 Claude 清理或对 Jupyter notebook 进行美学改进。具体告诉它使 notebook 或其数据可视化"美观"有助于提醒它正在优化人类观看体验。

4. 优化你的工作流程

以下建议适用于所有工作流程:

a. 在指令中具体说明

Claude Code 的成功率随着更具体的指令而显著提高,尤其是在第一次尝试时。提前给出明确的方向减少了以后纠偏的需要。

例如:

为 foo.py 添加测试为 foo.py 编写一个新的测试用例,涵盖用户注销的边缘情况。避免使用模拟
为什么 ExecutionFactory 有这么奇怪的 api?查看 ExecutionFactory 的 git 历史并总结其 API 是如何形成的
添加日历小部件查看主页上现有小部件的实现方式以了解模式,特别是代码和接口如何分离。HotDogWidget.php 是一个很好的开始示例。然后,遵循该模式实现一个新的日历小部件,允许用户选择月份并向前/向后分页以选择年份。从头开始构建,不使用代码库其余部分中已使用的库之外的库。

Claude 可以推断意图,但它不能读心。具体性导致与期望的更好一致性。

给 Claude 图像

b. 给 Claude 图像

Claude 通过几种方法擅长处理图像和图表:

  • 粘贴屏幕截图(专业提示:在 macOS 中按 cmd+ctrl+shift+4 截图到剪贴板,按 ctrl+v 粘贴。请注意,这不是你在 mac 上通常用于粘贴的 cmd+v,并且不能远程工作。)
  • 将图像直接拖放到提示输入中
  • 提供图像的文件路径

这在将设计模型作为 UI 开发的参考点以及视觉图表进行分析和调试时特别有用。如果你没有将视觉效果添加到上下文中,向 Claude 明确结果在视觉上吸引力有多重要仍然会有帮助。

提到你希望 Claude 查看或处理的文件

c. 提到你希望 Claude 查看或处理的文件

使用 tab 补全快速引用仓库中任何位置的文件或文件夹,帮助 Claude 找到或更新正确的资源。

d. 给 Claude URL

在你的提示词旁边粘贴特定的 URL 以供 Claude 获取和阅读。为了避免对相同域(例如 docs.foo.com)的权限提示,使用 /permissions 将域添加到你的允许列表。

给 Claude URL

e. 尽早且频繁地纠偏

虽然自动接受模式(按 shift+tab 切换)让 Claude 自主工作,但通过成为积极的合作者并指导 Claude 的方法,你通常会获得更好的结果。你可以在开始时彻底向 Claude 解释任务以获得最佳结果,但你也可以随时纠偏 Claude。

这四个工具有助于纠偏:

  • 要求 Claude 制定计划然后再编码。明确告诉它在确认计划看起来良好之前不要编码。
  • 按 Escape 中断Claude 在任何阶段(思考、工具调用、文件编辑),保留上下文以便你可以重定向或扩展指令。
  • 双击 Escape 跳回历史记录,编辑先前的提示词,并探索不同的方向。你可以编辑提示词并重复,直到获得你正在寻找的结果。
  • 要求 Claude 撤销更改,通常与选项 #2 结合使用以采用不同的方法。

虽然 Claude Code 偶尔在第一次尝试时完美地解决问题,但使用这些纠偏工具通常能更快地产生更好的解决方案。

f. 使用 /clear 保持上下文专注

在长会话期间,Claude 的上下文窗口可能充满无关的对话、文件内容和命令。这可能会降低性能,有时会分散 Claude 的注意力。在任务之间频繁使用 /clear 命令以重置上下文窗口。

g. 使用检查清单和草稿本处理复杂的工作流程

对于具有多个步骤或需要详尽解决方案的大型任务——如代码迁移、修复大量 lint 错误或运行复杂的构建脚本——通过让 Claude 使用 Markdown 文件(甚至 GitHub issue!)作为检查清单和工作草稿本来提高性能:

例如,要修复大量 lint 问题,你可以执行以下操作:

  1. 告诉 Claude 运行 lint 命令并将所有结果错误(带有文件名和行号)写入 Markdown 检查清单
  2. 指示 Claude 逐个解决每个问题,在检查并在移至下一个之前修复和验证

h. 将数据传递给 Claude

存在几种向 Claude 提供数据的方法:

  • 直接复制和粘贴到你的提示词中(最常用的方法)
  • 管道传输到 Claude Code(例如,cat foo.txt | claude),对于日志、CSV 和大数据特别有用
  • 告诉 Claude 通过 bash 命令、MCP 工具或自定义斜杠命令拉取数据
  • 要求 Claude 读取文件或获取 URL(也适用于图像)

大多数会话涉及这些方法的组合。例如,你可以管道传输日志文件,然后告诉 Claude 使用工具拉入额外的上下文以调试日志。

5. 使用无头模式自动化基础设施

Claude Code 包括用于非交互式上下文(如 CI、预提交挂钩、构建脚本和自动化)的无头模式。使用带有提示词的 -p 标志启用无头模式,使用 --output-format stream-json 进行流式 JSON 输出。

请注意,无头模式不会在会话之间持久存在。你必须在每次会话时触发它。

a. 使用 Claude 进行 issue 分流

无头模式可以为由 GitHub 事件触发的自动化提供动力,例如在仓库中创建新 issue 时。例如,公共 Claude Code 仓库使用 Claude 检查新进入的 issue 并分配适当的标签。

b. 将 Claude 用作 linter

Claude Code 可以提供超越传统 linting 工具检测的主观代码审查,识别拼写错误、过时注释、误导性函数或变量名等问题。

6. 通过多 Claude 工作流程提升

除了独立使用,一些最强大的应用程序涉及并行运行多个 Claude 实例:

a. 让一个 Claude 编写代码;使用另一个 Claude 进行验证

一个简单但有效的方法是让一个 Claude 编写代码,而另一个审查或测试它。类似于与多个工程师一起工作,有时拥有单独的上下文是有益的:

  1. 使用 Claude 编写代码
  2. 运行 /clear 或在另一个终端启动第二个 Claude
  3. 让第二个 Claude 审查第一个 Claude 的工作
  4. 启动另一个 Claude(或再次 /clear)以阅读代码和审查反馈
  5. 让这个 Claude 根据反馈编辑代码

你可以用测试做类似的事情:让一个 Claude 编写测试,然后让另一个 Claude 编写代码以使测试通过。你甚至可以通过给你的 Claude 实例单独的工作草稿本并告诉它们写入哪个和读取哪个来让它们相互通信。

这种分离通常比让单个 Claude 处理所有事情产生更好的结果。

b. 有多个仓库检出

而不是等待 Claude 完成每个步骤,许多 Anthropic 工程师做的是:

  1. 在单独的文件夹中创建 3-4 个 git 检出
  2. 在单独的终端选项卡中打开每个文件夹
  3. 在每个文件夹中使用不同的任务启动 Claude
  4. 循环浏览以检查进度并批准/拒绝权限请求

c. 使用 git worktrees

这种方法对于多个独立任务表现出色,提供了多个检出的更轻量级的替代方案。Git worktrees 允许你从同一个仓库中检出多个分支到单独的目录中。每个 worktree 都有自己的工作目录,其中包含隔离的文件,同时共享相同的 Git 历史和 reflog。

使用 git worktrees 使你能够同时在项目的不同部分运行多个 Claude 会话,每个都专注于其自己的独立任务。例如,你可能有一个 Claude 重构你的身份验证系统,而另一个构建完全不相关的数据可视化组件。由于任务不重叠,每个 Claude 都可以全速工作,无需等待其他人的更改或处理合并冲突:

  1. 创建 worktreesgit worktree add ../project-feature-a feature-a
  2. 在每个 worktree 中启动 Claudecd ../project-feature-a && claude
  3. 根据需要创建额外的 worktrees(在新终端选项卡中重复步骤 1-2)

一些提示:

  • 使用一致的命名约定
  • 每个 worktree 维护一个终端选项卡
  • 如果你在 Mac 上使用 iTerm2,请为 Claude 需要注意时设置通知
  • 为不同的 worktrees 使用单独的 IDE 窗口
  • 完成后清理:git worktree remove ../project-feature-a

d. 使用带有自定义线束的无头模式

claude -p(无头模式)以编程方式将 Claude Code 集成到更大的工作流程中,同时利用其内置工具和系统提示词。使用无头模式有两种主要模式:

  1. 扇出处理大型迁移或分析(例如,分析数百个日志中的情绪或分析数千个 CSV):

    1. 让 Claude 编写一个脚本来生成任务列表。例如,生成需要从框架 A 迁移到框架 B 的 2k 文件列表。
    2. 循环浏览任务,为每个任务以编程方式调用 Claude,并给它一个任务和它可以使用的一组工具。例如:claude -p "将 foo.py 从 React 迁移到 Vue。完成后,如果成功则必须返回字符串 OK,如果任务失败则返回 FAIL。" --allowedTools Edit Bash(git commit:*)
    3. 多次运行脚本并完善你的提示词以获得所需的结果。
  2. 管道传输将 Claude 集成到现有的数据/处理管道中:

    1. 调用 claude -p "<your prompt>" --json | your_command,其中 your_command 是处理管道的下一步
    2. 就是这样!JSON 输出(可选)可以帮助提供结构,以便更容易地自动处理。

对于这两个用例,使用 --verbose 标志来调试 Claude 调用可能会有帮助。我们通常建议在生产环境中关闭详细模式以获得更清晰的输出。

你在使用 Claude Code 时有什么技巧和最佳实践吗?

标记 @AnthropicAI,让我们看到你正在构建什么!

致谢

由 Boris Cherny 撰写。本文借鉴了更广泛的 Claude Code 用户社区的最佳实践,他们的创造性方法和工作流程继续激励着我们。特别感谢 Daisy Hollman、Ashwin Bhat、Cat Wu、Sid Bidasaria、Cal Rueb、Nodir Turakulov、Barry Zhang、Drew Hodun 以及许多其他 Anthropic 工程师,他们对 Claude Code 的宝贵见解和实践经验帮助塑造了这些建议。