让 AI 写得快,也让团队看得懂:用 Context Store 守住演进式架构

2026-07-14 44 预计阅读时间: 1 分钟
来源: infoq.com AI 摘要 Original link

Disclaimer: This article is an AI-assisted summary. Read it together with the original source when precision matters. The summary may omit context, version differences, or edge cases and is not official documentation.

预计阅读时间:10 分钟

AI 可以迅速生成接口、测试和基础实现,让开发工作的前 80% 显得异常顺畅。真正危险的是剩下的 20%:隐含依赖、跨模块约束、历史决策和运行时边界往往要到集成阶段才暴露。此时,代码虽然增长很快,团队对系统的理解却没有同步增长。

解决方向不是单纯限制 AI 生成代码,而是把规格驱动开发(SDD)、测试驱动开发(TDD)和自动化架构适应度函数统一放进仓库,形成一个可版本化、可执行、可被人和 AI 共同读取的 Context Store。

Context Store 不是另一套文档系统

这里的 Context Store 可以理解为仓库内的“工程上下文控制面”。它至少包含三类信息:

  • 规格锚点:功能目标、输入输出、非功能约束和验收条件。
  • 行为证据:单元测试、集成测试、契约测试以及失败场景。
  • 架构护栏:依赖方向、模块边界、安全规则和性能阈值。

这些内容必须和代码一起提交、审查和演进。若规格只存在于聊天记录,架构决策只存在于资深工程师的记忆中,AI agent 就只能根据局部代码猜测系统意图。即使生成结果能够编译,也可能悄悄破坏边界。

一个简单的仓库布局可以这样实践。以下结构是根据文章思想构造的示例,并非某个固定产品的 API:

project/
├── context/
│   ├── specs/
│   │   └── create-order.md
│   ├── decisions/
│   │   └── ADR-001-module-boundaries.md
│   └── architecture-rules.json
├── src/
│   ├── domain/
│   ├── application/
│   └── infrastructure/
├── tests/
│   └── test_create_order.py
└── tools/
    └── check_architecture.py

这个目录不是为了增加文档数量,而是为了让关键上下文拥有稳定位置。开发者和 AI agent 在修改订单功能前,都应能找到对应规格、测试和架构规则。

把 SDD、TDD 和适应度函数连成闭环

三种机制解决的是不同问题。

SDD 说明“系统应该做什么”。例如,创建订单规格不应只写“新增下单接口”,还要明确幂等键、库存失败行为、金额精度和可接受延迟。规格越具体,AI 越不需要根据命名猜测业务规则。

TDD 把规格转换成可重复执行的行为证据。测试失败意味着实现尚未满足约定,而不是提示词写得不够长。对于 AI 生成的修改,测试还是最直接的反馈通道:agent 可以运行测试、读取失败信息,再缩小修改范围。

架构适应度函数检查的是单个测试通常覆盖不到的系统属性,例如:

  • 领域层不得导入基础设施层。
  • 新增公共 API 必须有对应规格。
  • 数据库迁移必须保持向后兼容。
  • 核心请求的延迟或包体积不得超过阈值。

三者组合后,变更流程形成闭环:规格定义意图,测试证明行为,适应度函数约束系统形状。代码生成速度可以提高,但合并条件不会因此放松。

一个可运行的最小架构检查器

可以先从最便宜、最确定的依赖规则开始。下面的 Python 脚本扫描 src/domain,阻止领域代码导入 infrastructure。它只使用 Python 标准库,可以直接运行。

将以下内容放入 tools/check_architecture.py

from __future__ import annotations

import ast
import sys
from pathlib import Path

ROOT = Path(__file__).resolve().parents[1]
DOMAIN_DIR = ROOT / "src" / "domain"
FORBIDDEN_PREFIXES = ("src.infrastructure", "infrastructure")


def imported_modules(path: Path) -> list[tuple[int, str]]:
    tree = ast.parse(path.read_text(encoding="utf-8"), filename=str(path))
    imports: list[tuple[int, str]] = []

    for node in ast.walk(tree):
        if isinstance(node, ast.Import):
            imports.extend((node.lineno, alias.name) for alias in node.names)
        elif isinstance(node, ast.ImportFrom) and node.module:
            imports.append((node.lineno, node.module))

    return imports


def main() -> int:
    violations: list[str] = []

    if not DOMAIN_DIR.exists():
        print(f"Domain directory not found: {DOMAIN_DIR}", file=sys.stderr)
        return 2

    for path in sorted(DOMAIN_DIR.rglob("*.py")):
        for line, module in imported_modules(path):
            if module.startswith(FORBIDDEN_PREFIXES):
                relative_path = path.relative_to(ROOT)
                violations.append(
                    f"{relative_path}:{line}: forbidden dependency on {module}"
                )

    if violations:
        print("Architecture fitness check failed:")
        print("\n".join(f"- {item}" for item in violations))
        return 1

    print("Architecture fitness check passed")
    return 0


if __name__ == "__main__":
    raise SystemExit(main())

创建最小目录并验证它:

mkdir -p src/domain src/infrastructure tools
printf 'from dataclasses import dataclass\n\n@dataclass\nclass Order:\n    order_id: str\n' > src/domain/order.py
python tools/check_architecture.py

预期输出为:

Architecture fitness check passed

如果在 src/domain/order.py 中加入下面这行,检查器应以非零状态退出:

from src.infrastructure.database import save_order

这类检查并不理解完整架构,但它把一条重要规则从口头约定变成了可执行约束。后续可以逐步增加规则,而不是一开始建设庞大的治理平台。

让 CI 和 AI agent 使用同一份上下文

Context Store 的价值取决于它是否进入日常工作流。可以在 CI 中同时运行测试和架构检查:

name: context-store-checks

on:
  pull_request:
  push:
    branches: [main]

jobs:
  verify:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-python@v5
        with:
          python-version: "3.12"
      - name: Install test dependencies
        run: python -m pip install pytest
      - name: Run behavior tests
        run: pytest -q
      - name: Run architecture fitness functions
        run: python tools/check_architecture.py

给 AI agent 的任务也应引用仓库内的锚点,而不是重复粘贴一大段临时背景。提示可以这样写:

实现 context/specs/create-order.md 中的验收条件。

修改前请读取:
- context/decisions/ADR-001-module-boundaries.md
- context/architecture-rules.json
- tests/test_create_order.py

约束:
1. 不得让 src/domain 依赖 src/infrastructure。
2. 先补充失败测试,再修改实现。
3. 运行 pytest -q 和 python tools/check_architecture.py。
4. 输出修改文件、测试结果和仍未覆盖的风险。

这种提示的关键不是措辞技巧,而是让 agent 使用与 CI、代码审查者相同的事实来源。上下文发生变化时,应修改仓库中的规格或决策记录,而不是依赖某次会话里的补充说明。

推行时要防止 Context Store 失真

Context Store 也会腐化。过期规格、永远通过的空洞测试,以及只检查文件名的伪架构规则,都会制造错误的安全感。因此,团队需要把上下文本身纳入评审:功能行为变化时更新规格,边界调整时记录决策,规则误报时修正规则和例外机制。

落地时可以按以下顺序推进:

  1. 选择一个频繁变更且边界清晰的模块作为试点。
  2. 为关键用例补齐规格、验收条件和现有行为测试。
  3. 把两到三条最重要的架构规则实现为快速检查器。
  4. 在拉取请求中强制运行测试和适应度函数。
  5. 要求 AI agent 在结果中列出读取的上下文、验证命令和未解决风险。
  6. 定期删除无价值规则,修复与真实系统脱节的规格。

AI 提高了代码生产速度,也压缩了团队发现错误方向的时间窗口。工程组织真正需要优化的指标不只是提交量,而是系统意图能否被快速、准确地恢复。把规格、测试和架构规则绑定到仓库,能够让这种理解具备版本、证据和自动反馈,也让演进式架构在 AI 加速的开发节奏下仍然可控。


相关推荐