Posted on ::

大人,时代变了。

编程语言其主要作用就是连接人与机器沟通的桥梁。而随着 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 的状态,更是使用者的痕迹——访问过的项目、运行过的命令、花费过的成本。这是人机协作的证明,也是新时代程序员日常的写照。

时代变了。而我们,正在书写这个时代。

Table of Contents