2025-12-11 16:52:49
使用 Claude Code(又名 cc) 作为编程工具已经有一段时间了,claude code 也陆陆续续迭代了好几个版本,在编程上的体验可以说是越来越好,对我来说唯一还能吐槽的点就是由于网络的原因,速度上还是有些慢。
使用 claude code 这一段时间,其实还改变了我一个坏毛病:接到需求直接编码。其实,不管使用哪款 AI 工具,都不能上来直接编码,其实你可以把 AI 当成一个普通员工,初次见面,你头脑里的很多想法不可能一次让对方全部理解。
我总结出来的黄金工作流程是:Research → Plan →Code
不论让 Claude 开始编写一个新需求,还是修改任何代码之前,先探索你的代码库并收集上下文信息,都是最重要的事,也是整个流程的核心要义,具体来说:
无论我们用哪个工具(更准确的应该叫 AI Agent)去协助我们编程,claude code、gemini 或者 cursor,他们都需要一份"说明书"来了解这个项目的背景和规则,否则每次它都要猜你的意图。在 Claude Code 中这份初始设置文件名是 CLAUDE.md。
注意:各家 AI Agent 的初始设置文件的名字和位置不同,创建文件的时候一定要注意。
初始设置文件的优先级顺序由高到低如下: 1.对话指令 2.项目中的设置文件 3.系统级的设置文件
如果团队使用多种 AI 工具,可以试一下下面的结构:

接下来,初始设置文件的内容该写些什么呢?
1.项目基本背景、技术栈 2.代码风格 3.安全规范 4.测试要求 5.特殊规则
举个例子,
claude.md
项目背景(Project Context)
本项目是一个基于 Node.js / TypeScript 的 API 服务,使用 Express 作为 Web 框架,并采用 Prisma ORM 进行数据库操作。
代码风格(Code Style)
- 使用函数式组件与 hooks 风格
- 优先使用 async/await,避免直接使用 promise 链
- 单行最大长度限制为 100 字符
测试要求(Testing Requirements)
- 每个新功能都必须包含 单元测试
- API 接口需撰写 集成测试
- 使用 Jest 作为测试框架
常见问题与注意事项(Common Pitfalls)
- 始终对用户输入进行验证
- 使用参数化查询,绝不拼接字符串
- 在访问数据前必须进行身份验证
- 记录错误日志,但不要向客户端暴露堆栈信息
- 列名使用 snake_case
- 表名使用复数形式
- 每张表必须包含 created_at 与 updated_at 字段
- 使用 deleted_at 字段进行软删除
有了初始设置文件作为"规范"后,我们还需要了解和 AI 沟通协作的技巧:
举个例子, 每次提交代码都要思考如何撰写 commit message,能否自动生成提交信息?
在项目根目录下建立文件:.claude/commands/commit.md
输入以下内容:
---
description: Generate commit message and commit
---
请执行以下步骤:
1. 执行 `git status` 和 `git diff` 查看变更
2. 分析变更内容,生成符合 Conventional Commits 规范的 commit message
3. 格式:`type(scope): description`
- type: feat/fix/refactor/docs/test
- 描述需要清楚说明「做了什么」以及「为什么」
4. 询问我是否要执行 commit
请不要直接 commit,先让我确认 message。
下次提交代码的时候在命令行中,直接输入/commit 就可以了。

其实 mcp 也算是一种使用技巧,和上面介绍的通用技巧比需要提前安装一些插件。Claude Code 的 mcp 默认安装路径是在全局设置中,这一点要格外注意,默认路径在/Users/xxxx/.claude.json
这里以常用的 pgsql 和 cotext7为例,介绍一下安装和使用的方法。
#安装
claude mcp add postgres npx -- -y @modelcontextprotocol/server-postgres postgresql://localhost:5432
claude mcp add --transport http context7 https://mcp.context7.com/mcp --header "CONTEXT7_API_KEY:去官网申请"
记得在 claude.md 中增加下面内容,不然以后每次输入需求后,还要在最后加一句 use context7,特别麻烦。
Always use context7 when I need code generation, setup or configuration steps, or
library/API documentation. This means you should automatically use the Context7 MCP
tools to resolve library id and get library docs without me having to explicitly ask.
# 查看 mcp,只针对本项目,不是全局的
claude mcp list
# 使用 mcp
claude "Query the users table"

最后我还想回归到最开始的需求,明晰清楚需求的内涵和外延是做好一个项目最终的事情,在使用 Claude Code 来构建项目之前,花 15-20 分钟进行研究:
让人工智能将这些研究综合成一个计划,内容包括:
审查该计划并留意自己的反应。你的想法和反应很重要。当你认为 “这太复杂了” 或 “我们已经有更好的方法来做这件事” 时,不要只是修改这个计划,还要记录下你为什么会这么想。把它写下来。
最后根据该计划开发这个功能。
完成整个项目后,将最终的实现与原始计划进行比较。你在哪些地方偏离了计划?为什么?怎样才能让这个计划更好?将自己的反思记录下来,用于下一个项目的开发。
在下一个项目中,把自己的反思添加到你的 CLAUDE.md 文件中。写下一条规则,比如 “在做 X 类型的工作时,记得检查 Y”,或者 “我更喜欢方法 A 而不是方法 B,因为原因 C”。
另外,对于一些需求很模糊,甚至是只有一句话的需求,可以试试下面的提示词,让 AI 帮忙。
需求的确认:
你是一位资深产品顾问(C - Capacity)
背景:我在做一个电商平台,客户反应「结帐流程太慢」(I - Insight)
请用苏格拉底提问法,帮我厘清这个需求背后的真实问题(S - Statement)
请用反向提问的方式引导我思考,不要直接给答案(P - Personality)
最后提供 3 种可能的理解方向让我选择(E - Experiment)
2025-12-08 16:22:22
Claude AI skills 可以让 AI 获得特定领域的最新知识。实现某个专业领域的能力输出,对特定框架或者库的 API 理解,提供最佳代码实例。
人工阅读文档非常耗时,整理和分类内容需要专业知识,实时保持版本最新十分困难。
快速开发一个 skill 能力,可以通过大模型来帮忙。比如我想写一个 xx 领域风格的文档,可以使用下面提示词。
请为我开发一个简单的 Skill。如果你能构建正确的文件夹结构,并打包成一个 ZIP 文件供我下载,那是最理想的。
这个 Skill 的目的,是为了让 AI 更符合xx领域的写作风格。通常情况下,当我给 AI 一个 codebase 的项目时,他会仔细阅读项目代码,然后根据相应的模板写出一根专业的文档 我希望句子、段落之间能够更加顺滑、自然地衔接。我希望它能在目标语言中正确使用标点符号。 我并不擅长xx领域技术文书的写作风格。我希望你能通过提问来帮助理解我真正想要的风格,然后再完成这个 Skill 的开发。
还有一种场景,我们只是针对一个网站或者一份 pdf 文档,想把它转化为专业的能力输出,这时就可以用到Skill_Seeker[https://github.com/yusufkaraaslan/Skill_Seekers]这个工具。
# 安装
uv tool install skill-seekers
# 基本命令
skill-seekers scrape --url https://akshare.akfamily.xyz/ --name akshare
skill-seekers pdf --pdf docs/manual.pdf --name myskill
skill-seekers pdf --pdf docs/scanned.pdf --name myskill --ocr
举个例子,我想学习 akshare 这个库的基本功能,它的在线文档的地址是https://akshare.akfamily.xyz/,如果一页一页的看太麻烦,于是使用skill-seekers帮我自动化的学习。
学习完成后,会生成如下的目录结构。

我们只需要拷贝 akshare 这个目录到我们代码根目录下的.claude/skills 下面,claude 就具备了 akshare 的基础知识。

2025-11-11 16:55:43
读数据前,要考虑两个方面:数据的外观(对外呈现给我们的样子)和内在(具体存放的位置)。具体来说,要考虑:
df = spark.read.csv("s3://mybucket/large_dataset.csv", header=True, inferSchema=True)
df = spark.read.parquet("s3://mybucket/large_dataset/")
读完数据后,要查看(探索)数据
print(f"Total Rows: {df.count()}")
df.printSchema()
df.show(5)
这个阶段就涉对数据内容的操作了,可以通过函数算子的方式(记不住的话可以通过官网查看),也可以通过 sql 的方式。
from pyspark.sql.functions import col, when, avg
# Drop null values
df = df.na.drop()
# Filter out invalid entries
df = df.filter(col("age") > 0)
# Add a calculated column
df = df.withColumn("income_per_person", col("total_income") / col("family_size"))
# Replace missing values with mean
mean_val = df.select(avg("salary")).collect()[0][0]
df = df.na.fill({"salary": mean_val})
这个阶段也是对数据内容的操作,只是数据的内容和格式已经比较规范。这个阶段要注意对资源的利用,时刻通过 sparkUI 关注计算效率。尽量把 task 分配到不同 exector 上,最大化利用集群的力量。
region_stats = df.groupBy("region") \
.agg(avg("income_per_person").alias("avg_income")) \
.orderBy(col("avg_income").desc())
region_stats.show(10)
这一阶段可能会遇到数据倾斜的问题。
对于小表
from pyspark.sql.functions import broadcast
# Broadcast join for small tables
df = large_df.join(broadcast(small_df), "customer_id")
对于大表
df1 = df1.repartition("customer_id")
df2 = df2.repartition("customer_id")
joined_df = df1.join(df2, "customer_id")
一般保存成表或者文件
df.write.mode("overwrite").parquet("s3://mybucket/processed_data/")
df.write.format("jdbc").option("url", "jdbc:mysql://...").save()
import matplotlib.pyplot as plt
sample = df.limit(10000).toPandas()
sample['income_per_person'].hist(bins=50)
plt.title("Income Distribution")
plt.show()