大人,时代变了。
编程语言其主要作用就是连接人与机器沟通的桥梁。而随着 AI 极速发展,写代码的方式也在随着技术的发展更新。
抽象的阶梯
回望历史,编程范式一直在攀登抽象的阶梯。从最初直接操作硬件开关,到穿孔卡片,到汇编语言,再到高级语言——每一次跃迁都让程序员离机器更远一步,离问题域更近一步。
AI 辅助编程不是终点,而是这漫长阶梯上的又一级台阶。
当我们用 Claude Code 这样的工具时,实际上是在用自然语言描述意图,让 AI 负责将其翻译成机器能理解的指令。这与当年用 C 语言替代手写汇编,何其相似。本质都是:把低层次的细节交给工具,把高层次的设计留给自己。
新的工作流
过去写代码,我们是建筑师,也是搬砖工。现在,我们更像是指挥家。
不需要再为每一个语法细节劳神,不需要在 Stack Overflow 上翻找半天只为了一个正则表达式。描述你想要什么,AI 帮你实现。描述出现了什么问题,AI 帮你调试。
但这并不意味着可以停止思考。
恰恰相反,新范式对程序员的要求更高了。你需要:
- 更清晰的思维:只有想得清楚,才能说得清楚。AI 无法理解模糊的意图。
- 更强的判断力:AI 给出的方案需要你来评估、选择、改进。
- 更广的知识面:知道什么是可能的,才能提出正确的问题。
- 更深的领域理解:业务逻辑、架构设计、权衡取舍——这些 AI 暂时还无法替代。
人机协作的艺术
Claude Code 最好的使用方式,不是当作一个外包工,而是当作一个博学但不熟悉项目的同事。
给它足够的上下文,它会给出惊艳的回答。问它模糊的问题,它会给出平庸的回答。
一个有趣的发现:用 AI 写代码时,提问的质量决定了回答的质量。这恰恰印证了一个古老的道理——提出好问题,比回答问题更重要。
学会提问,成了新时代程序员的核心技能。
保持审慎
然而,不要盲目信任。
AI 会自信地给出错误的答案。它会编造不存在的 API,会用过时的库函数,会忽略边界情况。代码审查的重要性非但没有降低,反而更高了。
每一行 AI 生成的代码,都应该经过你的审视。你可以让 AI 帮你写,但不能让 AI 帮你负责。
配置与上下文
Claude Code 会在本地存储一份配置文件,记录着会话历史、项目信息、使用统计等数据。这是一份真实配置的脱敏版本:
{
"numStartups": 20,
"installMethod": "native",
"autoUpdates": false,
"hasCompletedOnboarding": true,
"lastReleaseNotesSeen": "2.1.63",
"projects": {
"/xxx/xxx/candy": {
"allowedTools": [],
"mcpServers": {},
"hasTrustDialogAccepted": true,
"lastCost": 0.35,
"lastTotalInputTokens": 59456,
"lastTotalOutputTokens": 604,
"lastModelUsage": {
"ark-code-latest": {
"inputTokens": 59456,
"outputTokens": 604,
"costUSD": 0.35
}
},
"exampleFiles": [
"serve.rs",
"mod.rs",
"config.rs",
"main.rs",
"service.rs"
]
},
"/xxx/.config/nvim": {
"allowedTools": [],
"mcpServers": {},
"exampleFiles": [
"autocmds.lua",
"keymaps.lua",
"options.lua"
],
"lastCost": 0.63,
"lastTotalInputTokens": 189218,
"lastTotalOutputTokens": 3034
},
"/xxx/xxx/blog": {
"allowedTools": [],
"mcpServers": {},
"exampleFiles": [
"zola.toml",
"_index.md",
"configuration.md"
],
"lastCost": 0.82,
"lastLinesAdded": 86,
"lastLinesRemoved": 72
}
},
"firstStartTime": "2026-02-26T02:22:07.970Z",
"githubRepoPaths": {
"xxx/candy": ["/xxx/xxx/candy"],
"xxx/nvim": ["/xxx/.config/nvim"],
"xxx/blog": ["/xxx/xxx/blog"]
},
"userID": "xxx",
"mcpServers": {
"fetch": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://xxx/xxx"]
}
},
"toolUsage": {
"mcp__fetch__fetch": {
"usageCount": 1
},
"Bash": {
"usageCount": 8
}
}
}这份配置文件揭示了 AI 辅助编程工具的几个关键特点:
项目感知。工具会为每个项目记录独立的上下文——示例文件、会话历史、Token 消耗。这意味着它能在不同项目间切换时保持记忆,而不需要每次重新理解代码库。
成本透明。每次对话的成本、Token 数量都有精确记录。这让开发者能够理性评估 AI 辅助的投入产出比。当一次会话花费 0.35 美元时,你会思考:这些 Token 换来了什么?
工具追踪。toolUsage 记录了 Bash 命令和 MCP(Model Context Protocol)服务的调用次数。这不仅仅是统计,更是一种审计——AI 在你的系统上执行了什么操作,一目了然。
MCP 扩展。通过 mcpServers 配置,工具可以接入外部服务。fetch 服务让 AI 能够访问网络资源,而理论上,任何提供 MCP 接口的服务都可以被接入。这是一个开放生态的雏形。
记忆与遗忘
有意思的是,这份配置也暗示了 AI 工具的局限性。
exampleFiles 字段显示,工具会缓存项目中的代表性文件名。这是一种启发式学习——它试图通过文件名来推断项目结构。但这也意味着,当项目结构发生重大变化时,这些缓存的"记忆"可能变得过时。
会话 ID、Token 统计、性能指标——这些数据对用户大多不可见,却在幕后影响着体验。比如缓存读取的 Token 数量(cacheReadInputTokens)直接影响响应速度和成本。聪明的开发者会意识到,保持会话的连续性比频繁开启新会话更高效。
但这里有一个悖论:记忆越久,负担越重。过长的上下文不仅增加成本,还可能引入噪声。知道何时"遗忘",和知道何时"记住"一样重要。
作为数字同事
把这份配置和前面的讨论结合起来,一个图景浮现出来:AI 编程工具正在演变成某种"数字同事"。
它记得你之前的对话(通过会话 ID 和历史记录)。它了解你的项目(通过 exampleFiles 和项目配置)。它知道你的偏好(通过 allowedTools 和信任设置)。它甚至有自己的"工具箱"(通过 MCP 服务扩展)。
这种演进带来的改变是深远的。过去,开发者需要在文档、搜索引擎、IDE 之间来回切换。现在,这些边界正在模糊。你不再是在"查找资料",而是在"与工具对话"。
但请记住:这位数字同事不是魔法。它的知识有边界,它的判断可能出错,它的建议需要验证。配置文件中的每一项设置——从信任对话框的接受状态到工具权限——都在提醒我们:这是协作,不是委托。
写在后面
也许几年后,回看这篇文章会觉得过时。就像我们现在看当年的穿孔卡片编程。
但有些东西不会变:对清晰思维的追求、对代码质量的执着、对问题本质的洞察。工具在变,工匠之心不变。
那个 JSON 配置文件,某种意义上是一面镜子。它映照出的不仅是 AI 的状态,更是使用者的痕迹——访问过的项目、运行过的命令、花费过的成本。这是人机协作的证明,也是新时代程序员日常的写照。
时代变了。而我们,正在书写这个时代。