AI 结对编程:如何让 AI 跳出死循环?

问题背景

在一次开发过程中,遇到了一个典型但又颇具迷惑性的渲染问题:Markdown 表格的行分割线在 Xcode 预览中正常显示,但在运行时完全消失。

代码块中的代码内容在 Xcode 预览中正常显示,但在运行时完全消失。

这类问题通常与运行环境差异、渲染上下文或视图修饰符有关。接下来,我记录了自己与 AI 结对编程、一步步定位并解决问题的过程。

问题分析过程

我并没有一开始就把两个现象同时抛给 AI。原因很简单,第二个问题(代码块消失)涉及的代码更复杂,极容易把 AI 带进错误方向。

直觉告诉我,这两个现象很可能是同一个根因的不同表现。因此,我选择先挑一个"看起来更简单"的现象:表格分割线消失,作为切入点,让 AI 先集中精力解决一个问题。

第一阶段:错误的假设

AI 的第一反应非常"教科书式",它将注意力放在了表格样式配置上:

swift 复制代码
// Theme+Zane.swift
.table { configuration in
  configuration.label
    .fixedSize(horizontal: false, vertical: true)
    .markdownTableBorderStyle(.init(.horizontalBorders, color: .grid))
    .markdownMargin(top: .em(1.6), bottom: .zero)
}

它提出了几个假设:

  1. 颜色 .grid 在运行时未正确解析
  2. MarkdownUI 的边框样式在运行时未正确应用
  3. 环境变量(colorScheme)未正确传递

这些假设看起来合理,但都隐含着一个前提:问题一定出在 Markdown 样式本身。

第二阶段:调试验证

为了验证这些假设,我按 AI 的建议加入了一些调试代码:

swift 复制代码
// 打印 colorScheme 值
.onAppear {
    print("colorScheme: \(colorScheme == .dark ? "dark" : "light")")
}

// 临时改为红色验证
.markdownTableBorderStyle(.init(.horizontalBorders, color: .red))

结果非常明确:

  • Xcode 预览:红色边框可见
  • 实际运行:依然不可见
  • colorScheme 值正常

这一步基本可以确认:

  • MarkdownUI 的样式机制是生效的
  • 边框颜色、主题配置本身没有问题
  • 问题只存在于运行时渲染环境

第三阶段:陷入死循环(重复多次)

我明确向 AI 反馈:

MarkdownUI 和自定义主题之前一直正常,现在才出问题,说明根因很可能不在这里,请从其他方向排查。

但 AI 并没有真正"换脑子",而是开始在同一条错误路径上反复尝试:

  • 修改 .grid 颜色定义
  • 改用系统颜色
  • 调整边框样式配置
  • tableCell 中添加 overlay

这正是 AI 结对编程中最常见的问题之一在错误假设下不断做局部优化,形成思维死循环。

第四阶段:跳出循环

我不得不更明确、甚至有点"强硬"地约束 AI:

MarkdownUI 和 MarkdownView 本身没有问题。禁止再修改任何 Markdown 相关代码。从其他方向重新排查。

这一次,AI 才真正开始切换视角,把注意力转向:

  1. MarkdownView 的修饰符
  2. 父视图的布局容器
  3. 父级容器滚动视图配置

最终,问题定位到了这一段代码:

swift 复制代码
LazyVStack(alignment: .leading, spacing: 16) {
    // ...
}
.padding()
.drawingGroup()  // ← 问题根源
.transaction { transaction in
    transaction.animation = nil
}

当我移除 .drawingGroup() 后:表格分割线恢复显示,代码块内容也一并正常了!

为什么 .drawingGroup() 会导致问题?.drawingGroup() 将视图内容合成到离屏渲染层,用于性能优化。但这个过程可能影响细线渲染:

  1. 合成精度:细线(1px)在合成时可能被抗锯齿或采样影响
  2. 渲染上下文:离屏渲染与直接渲染的上下文不同
  3. 颜色混合:合成过程中的颜色混合可能使浅色边框变淡或消失

关于 AI 结对编程的思考

AI 在结对编程中并不是"不会解决问题",而是很容易在错误前提下持续消耗时间。

AI 高度依赖模式匹配。一旦问题被归类为"表格渲染异常",它就会自然地把注意力集中在样式、颜色、主题等常见因素上,而对"之前一直正常、最近才出问题"这类时间线线索不够敏感。当初始假设没有被及时推翻时,AI 往往会在同一方向上不断微调,形成事实上的思维死循环。

要让 AI 跳出这种状态,关键并不是提供更多细节,而是强制改变它的分析边界。明确指出当前方向可能是错的、强调哪些部分已经被确认没有问题,甚至直接禁止继续修改某类代码,反而能显著提升排查效率。一旦分析范围被重新划定,AI 才会开始关注父视图、修饰符链或最近的改动这些更有价值的线索。

这也决定了 AI 结对编程的合理分工方式。人类负责判断方向、提供上下文和时间线;AI 负责搜索、枚举和验证可能性。当人类不主动介入纠偏时,AI 很容易在"看似合理"的路径上反复打磨,却始终无法触及根因。

最终,这次问题能够被定位到 .drawingGroup() ,并不是因为 AI 突然变得更聪明,而是因为分析视角发生了改变。这也提醒我,在与 AI 协作调试时,比"如何写代码"更重要的,是如何约束和引导它的思考方式。有时候,问题不在你盯着的地方,而在你忽略的地方。

相关推荐
同勉共进1 天前
记一例 vibe coding + gcc bug 导致的线程池死锁问题
c++·线程池·gcc·死锁·vibe coding
小码农叔叔2 天前
【AI编程】Vibe Coding 开发环境搭建与项目实战操作详解
vibe coding·vibe coding环境搭建·vibe coding使用·vibe coding详解·vibe coding实战·vibe coding使用详解·vibe coding实战详解
HarderCoder2 天前
SwiftUI 可复用视图设计解剖:从语义到 API 的完整实践
swiftui·swift
东坡肘子2 天前
当灵感跑在了结果前面 -- 肘子的 Swift 周报 #145
人工智能·swiftui·swift
hhzz3 天前
飞算Java实战:制造业设备预测性维护与工单闭环系统
vibe coding·飞算javaai·飞算java ai炫技赛
云泽8085 天前
飞算 JavaAI 实战:如何自动化生成全流程追溯系统
运维·自动化·vibe coding·飞算javaai·飞算java ai炫技赛
一战成名9965 天前
一条巡检任务如何安全起降:飞算Java搭建低空无人机调度平台
vibe coding·飞算javaai·飞算java ai炫技赛
七月稻草人6 天前
通过飞算Java智能体协作:把短视频审核、确权与推荐串成一条可追溯的业务链
vibe coding·飞算javaai·飞算java ai炫技赛
承渊政道6 天前
飞算Java炫技赛:Java×Unity数字孪生园区平台的从零落地记录
java·开发语言·unity·技术分享·vibe coding·飞算javaai·飞算java ai炫技赛
AI-Frontiers7 天前
企业级落地方案:Docker 部署 CodeGraph 多项目统一 MCP 网关,附源码
vibe coding