收藏
0
0
分享
举报
·9 小时前发布·112次阅读

既然没人再手写汇编,你为什么还执着于Review AI Diff

推荐独立开发商业增长付费用户

1957 年,IBM 公司向全世界推出了一门革命性的新技术,名字叫 Fortran。

这是人类历史上第一门真正意义上的“高级编程语言”。

在那之前,程序员写代码是极度痛苦的。他们必须在纸带和打孔卡片上一孔一孔敲下如同天书般的机器码与汇编指令(Assembly,用最底层的助记符号直接指挥计算机硬件的每一个内存地址与寄存器)。

当 Fortran 诞生时,发明者告诉大家:“以后你们不需要再记什么寄存器、内存寻址了,只要用类似于英语句子的公式写代码,编译器会自动把它翻译成底层的机器指令!”

你猜当时的老程序员们是什么反应?

他们没有鼓掌,反而爆发出了强烈的抵触与鄙视。

技术杂志和实验室里充斥着质疑声:
“编译器翻译出来的机器码太臃肿了!”
“机器怎么可能比我更懂底层优化?”
“凡不是自己亲手一行行写出来的汇编指令,我绝对不信任,必须人工逐行检查!”

然而,历史的列车从不等人。

短短几年后,几乎所有业务系统的开发者都投奔了高级语言。到了今天,除了极少数专门写芯片驱动、操作系统内核或编译器本身的极客,全世界千千万万的程序员里,几乎再也没有人在做业务开发时,去逐行手写汇编代码,更不会在提交代码时去人工审查它被编译成了什么汇编指令。

因为所有人都明白了一个朴素的真理:抽象层一旦升上去了,就再也退不回来了。

今天,历史的钟摆又停在了同一个刻度上。

当大模型以秒级速度吐出几千行 Python、TypeScript 或 Go 代码时,无数工程师依然坐在电脑前,通红着双眼,一行一行审阅那长达两千行的代码差异(Diff)。

我们似乎忘了:今天的编程语言,正在迅速退化成当年的“汇编”。


一、 认知错位:我们在用审查汇编的方式,看 AI 写的代码

很多人一听到“编程语言是新时代的汇编”,第一反应是本能的抗拒:

“这怎么能一样?高级语言是严格有语法的,汇编也是代码,难道我们敲的不是代码吗?”

为了把这个逻辑彻底讲透,我们先用一句大白话把“抽象层”解释清楚:

  • 大白话解释:计算机技术的进步史,本质上就是不断给底层“盖盖子”的历史。
  • 贴近日常的例子:
    • 第一代(手摇时代):就像早期汽车,司机启动车辆前得走到车头前面,用铁摇把去手动摇动曲轴给发动机打火。这时候司机必须懂机械结构。
    • 第二代(钥匙时代):有了点火开关和变速箱(高级语言),司机只要拧钥匙、踩油门就行了,没人需要去关心火花塞具体在哪个微秒点火。
    • 第三代(自动驾驶时代):你坐进车里,直接告诉它:“去最近的医院,开稳一点”(自然语言提示词)。这时候你还在方向盘前面纠结每一度转向角,就是在做无用功。

当敲键盘的成本归零,语法的防线就失守了

过去三十年,为什么我们要严格做代码审查(Code Review)?

因为代码是人写出来的。人类敲键盘又慢又容易笔误,常常把 = 敲成 ==,或者把数组下标写越界。由同伴帮你看一眼,能有效查漏补缺。

但面对 AI 时,情况彻底倒过来了:

  1. 信息量完全不对等:AI 5 秒钟能重构 10 个文件、2000 行代码;而人类审阅 2000 行代码至少需要一个半小时。审查的吞吐量彻底被击穿了。
  2. 形式完美掩盖了深层危机:AI 生成的代码排版极佳,命名优美,甚至把注释写得比人还详尽。人类的大脑面对这种“看起来挑不出毛病”的代码,审查意志会在 10 分钟后迅速涣散,最后沦为闭着眼睛点同意的“橡皮图章”。

你在屏幕上苦苦盯着那 2000 行 diff,你以为自己在当守门员,其实你只是在用极高的认知成本,给自己的心理安全感买单。


二、 核心反驳:编译器不会骗人,但 AI 会胡说八道啊!

肯定会有敏锐的读者站出来反驳我:

“作者,你这个类比有个致命漏洞!当年大家不看汇编,是因为编译器是确定性的——同样的 C 语言代码,编译器绝对不会编出幻觉来。但今天的大模型是概率模型,它会**幻觉(Hallucination,就像一个人一本正经地胡说八道)**啊!我不看代码,系统怎么死的都不知道!”

这个质疑非常漂亮,直接扎到了问题的最核心。

是的,AI 确实会幻觉。但解决方案,绝不是靠肉眼去看 2000 行代码!

为什么?

因为在长达几千行的海量代码里,AI 的幻觉往往是极度隐蔽的:

  • 它引用了一个长得非常像标准库、但实际根本不存在的参数名;
  • 它在极端边界条件下(比如网络超时重试第 3 次),偷偷漏掉了一个状态清理操作;
  • 它把一段涉及高并发的共享内存读写,写成了一个看起来很合逻辑但实际上会发生死锁的代码。

请问:面对这种级别的致命 Bug,是你揉着惺忪的睡眼在屏幕上扫视能找出来的,还是靠自动化的测试机把它跑崩找出来的?

答案毫无疑问是后者。

当年高级语言取代汇编时,工程师也没有赤手空拳,他们发明了类型检查器(Type Checker)和静态分析工具;
今天,当我们面对概率性的 AI,我们用来防范幻觉的工具,必须从“肉眼审 diff”升级为**“契约约束 + 机器审判”**。


三、 新的工程范式:如果不在 Diff 上花时间,我们的精力该往哪放?

真正清醒的技术领袖,已经在用一套全新的“三道防线”范式来组织软件开发:

防线层次参与角色核心职责与防守动作
第一道:前期防线<br>(架构立法)人类架构师 + Claude Opus 5.5(总管)用严格的类型定义与接口契约,把输入、输出、状态流转和边界安全定死,绝不让 AI 盲目自由发挥。
第二道:中期防线<br>(极速交付与深度防腐)DeepSeek V4.1 Flash(码农) + Claude Opus 5.5(审核) + 高阶大模型(重构保洁)极速专精模型负责吞吐实现;顶配模型只审不改严把契约;高阶大模型做跨文件引用分析与重复方法消除,深度防腐抗击技术债。
第三道:后期防线<br>(真实验收)独立测试 AI(GPT-6 Luna / Haiku 5.5) + 人类第一体验官敏捷测试 AI 在独立沙箱里跑自动化真机压测与极端边界;人类亲自深度试用产品,用肉身直觉把关交互与手感。

1. 抓两头:把防线前移到“契约”,后移到“真机”

  • 在动手写代码前,跟 AI 过方案:花 80% 的时间确定数据库怎么建、接口契约怎么定、高可用怎么防范。地基打扎实了,AI 闭着眼睛砌砖也不会歪到哪里去。
  • 在交付完代码后,看自动化运行的证据,而不是看代码文本:测试覆盖率有没有达标?真实网络压测下的延迟有没有飙升?用户报错率是不是为零?看证据,不看代码。

2. 把时间花在有肉身的人类优势上

  • 去理解复杂的商业逻辑;
  • 去和真实的用户对话,挖掘真实痛点;
  • 去亲自点开构建好的软件,像一个挑剔的顾客一样挑出每一个反人类的交互细节。

四、 工具断层:多 Agent 协作时代的终端控制台重构

理解了“两头锁死 + 中间自动化”的新范式后,工程师在工程落地中面临的最大阻碍,往往来自现有工具链的断层。

目前主流的开发环境基本分为两类,但它们在多 Agent 并发工程中都暴露出明显的局限:

  1. 传统 IDE 模式的结构性限制:VS Code 或各类编辑器插件,本质上仍以“单人、单光标、单文件”为核心交互范式。当模型在后台生成跨数十个文件的代码变更时,IDE 只能将其粗暴地折叠进一个双栏 Diff 视图,要求人类逐行审查确认。这种审查机制的吞吐上限,与模型的生成速度存在几个数量级的结构性冲突。
  2. 终端 CLI 单体运行的协同缺失:使用 Claude Code 或各类独立 CLI 时,在系统终端中开多个 Tab 分别跑前后端和测试,很容易退化为手动中继:在不同窗口之间复制粘贴接口信息、处理权限确认;遇到依赖安装确认(如 y/n)时,终端常常陷入静默等待,导致长耗时任务中断;同时各会话上下文独立,一旦重置便丢失协作上下文。

这也正是 Polter(基于 Ghostty 终端构建的本地多 Agent 工作台)所要解决的工程问题:为多 Agent 时代提供一个具备集中调度、状态持久化与静止感知的控制中枢。

在这套体系下,多角色协作可以通过几个明确的机制稳定运行:

1. 总管调度(Supervisor)与工单外置

在 Polter 中,任意终端都可以通过调用 become_supervisor 将自身设定为调度总管(通常使用高智力推理模型如 Claude Opus 5.5)。

总管的核心职责是拆解需求与监督交付,而不是直接编写业务代码:

  • 前置契约对齐:总管根据人类输入的需求定义数据模型、API 契约(如 OpenAPI 规范)以及边界条件;
  • 任务状态持久化:通过 task_create 建立持久化看板,将开发任务拆解为粒度明确的工单,各 Worker 通过结构化状态(如 open、working、closed)汇报进度;任务面板保存在本地,即使会话重启也能无缝对齐进度。

2. 模型分级分工与中场自动化

在总管的调度下,不同终端可以绑定适合其任务特性的模型与角色,形成互不串岗的协作流水线:

  • 业务实现(Coder):分配给专精代码实现且吞吐高、成本低的模型(如 DeepSeek V4.1 Flash),专注于按总管给定的规范完成具体路由、组件和数据层逻辑的高效产出;
  • 架构审查(Reviewer):分配给逻辑严密的模型(如 Claude Opus 5.5),执行“只审不改”原则。其职责仅对照前置契约与静态安全规则对 Worker 提交的变更进行审查,不符合规范则打回修改,避免直接参与修改导致职责污染;
  • 代码防腐与重构(Cleaner):该角色需要高阶大模型支持。多 Worker 持续开发容易积累重复工具函数、无效引用与紧耦合代码。高阶模型具备全局上下文理解与抽象能力,可在后台分析跨文件 AST 语法树,提取公共逻辑并进行安全去重,控制系统技术债;
  • 真机验证(Tester):在隔离沙箱中运行轻量模型(如 GPT-6 Luna 或 Claude Haiku 5.5),负责拉起真实环境与数据库,执行自动化用例并使用压测工具(如 k6)验证极限指标,以客观的测试报告和延迟数据作为验收依据。

3. 本地小队群聊与上下文解耦

Worker 之间的协同不需要经过中心化的云端服务,而是通过本地小队群聊通道(group_post 与 group_read)进行异步解耦:

  • 码农完成开发后在群内广播交付信息,触发审查与测试任务;
  • 所有的决策记录与流转日志本地落盘,避免单会话因上下文膨胀而被截断导致的工程信息丢失。

4. 终端静止感知与分级代答

针对自动化任务中最常见的“等待输入卡死”现象,Polter 实现了针对终端屏幕变化的毫秒级静默监控:

  • 当检测到终端停留在非交互提示符超过阈值,总管会通过 terminal_read 读取屏幕内容;
  • 对于符合安全策略的常规操作(如依赖读取、标准包安装确认),总管可通过 terminal_answer_prompt 代为确认放行;
  • 仅当涉及高危变更(如越权文件修改、环境变量泄露风险)时,才会主动唤醒人类介入决策。

五、 结语:从代码审查者到系统设计者

回顾软件工程的发展史,每一次抽象层次的跃迁,都会带来工程师职责重心的迁移:

1957 年 Fortran 的推广,并未减少社会对程序员的需求,而是将工程师从繁琐的内存寻址与寄存器分配中解脱出来,使注意力集中到算法结构与业务逻辑之上。现代软件产业的庞大规模,恰恰建立在高级语言对底层汇编细节的有效抽象与封装上。

今天,当生成式模型使常规代码生成的边际成本趋近于零时,审查每一行语法的边际收益也在急剧递减。

软件工程的核心价值并未改变,改变的是输入输出的界面:

  1. 从逐行审查语法,转向前置架构契约的定义:能否在需求之初建立清晰的数据流、接口定义与错误处理边界,决定了整个多 Agent 小队的运行质量;
  2. 从人肉纠错,转向构建自动化的验证机制:依赖类型系统、静态分析、对抗式审查与真机压测证据,远比人工肉眼在 2000 行 diff 中排查幻觉更加严密可靠;
  3. 把人类感知留给最终的产品体验:终端与调度逻辑交给自动化控制台之后,工程师能够将更多时间投入到业务逻辑的深度理解、极端边界场景的推演以及对用户真实交互体验的把控中。

面对日益庞大的机器生成代码,建立分级协作的自动化工程防线,是应对复杂系统开发的必然选择。


 

讨论 (0)

0/250

    目录

    关于作者

    心得体会

    TA 还没有留下个人简介

    Solo 独立开发者社区support@solo.xin
    关于社区成长规则SOLO.cc隐私政策用户协议商务合作友情链接订阅更新(RSS)投稿赞助

    © 2023 SOLO · 为独立开发者而生