接着昨天的 code review 继续聊(Code Review:ChatGPT 碾压 Gemini,就差求饶),我之前文章提到的 llm pua 还是好使的。给出的大致技术方案,已经在我这几天折腾中,基本实现了。代码虽然是 ai 生成,但我在其中充当的角色也甚是麻烦,因为 terminal 实现代码过长,网页版 gpt 在多轮超长对话后会不断丢弃上下文、代码实现,导致的结果就是莫名其妙少了 1/2 左右代码,好在核心功能点我是知道的,可以快速扫过生成代码,让它进行补充,但这种方式很低效,也容易漏掉细节实现(这个我后面讲,其实有解决办法)。
Gemini 并非一无是处
Gemini 生成的前端界面是不赖,但这只是审美不错,代码一言难尽,比如 ts 类型各种丢失,或者到处 any,和 claude code、codex 之类的根本没法比。
上一篇文章虽是吐槽 Gemini,但并不代表它很弱。在模拟数学、物理特性时,表现都不错,可能也是得益于它的世界知识理解。但回到写代码真就是一言难尽,属于空有蛮力使不对地方,工程化总是差点意思...
也有群友表示说“可能是 deepmind 主攻人类复杂命题,就看不上工程化这种小儿科”。这也确实有可能,毕竟工程只是一种人类规范,最佳实践,并不是什么技术突破。
先扯点废话
我最近又在高强度写代码,最大的感受是自己更注重程序边界处理了。比如 terminal 在大数据读写下的性能优化,ipc 处理,超长数据应该如何截断兜底,cpu 在处理密集计算任务时如何避免卡死界面交互,如何避免任务无限增长爆内存,跨系统兼容等等。搞这种代码任务最是锻炼人,强制你思考很多关于架构层面的事,而不只是画页面,调颜色。
这些东西 ai 既擅长又不擅长,需要大量人力踩坑,来一步步引导 ai 完善架构。
回到项目
我本以为 Noi terminal 完成差不多了,就做了些极端测试:在无限 string 输出时会卡死,就改用切片+限流来避免 cpu 计算爆炸,结果导致了新的问题,字符残留无法清除、乱码等等(有种越改越错的崩溃感),然后又开始重新调整所有代码实现...
但是,当我发现 vscode 也有类似 bug 时,突然就放心了,可能确实不好处理吧!
我是用下面两条命令测试的:
Perl 命令:无限循环输出随机颜色的可打印字符,并不断用 ANSI 光标定位序列把光标随机跳到屏幕各处,用来压测终端的转义序列解析与重绘/定位性能。
urandom + hexdump:把/dev/urandom的随机字节流持续转成十六进制文本疯狂输出,用来压测纯输出吞吐、队列/背压与 UI 是否会卡死(如 Ctrl+C 响应)。
perl -e '$|++; while(1){ print "\e[".int(rand(30)+30)."m".chr(int(rand(94)+33)); print "\e[".int(rand(50)).";".int(rand(100))."H" }'
cat /dev/urandom | hexdump -v -e '1/1 "%02x"'
在优化前,执行 100 万行渲染,需要 15s。
限流优化:现在只需 10s 了(限流没有降速,反而提速了不少,可见之前实现有多垃圾)。无限写入随机字符串也将 cpu 控制在了 50-60% 之间(之前直接打满 cpu,界面卡死),结束命令 3s 左右,cpu 会自动回落到最低点。
何为限流
限流优化本质上就是“给数据流装刹车和缓冲”,让系统在高峰时也能保持稳定:当输出像洪水一样涌来时,不是全量一股脑灌进 UI,而是分批送达、按能力消化、超载就减速甚至暂停,并用上限避免越堆越多导致卡死或爆内存。简单说,它把“越忙越崩”的系统,改成“越忙越稳”的系统:UI 依然可交互、输入依然能及时生效、资源消耗有上限,最差也只是输出被延迟或被裁掉一部分,而不会把整个应用拖垮。
但分批次送达、消化、数据切片、减速、暂停这一系列操作就牵扯到了复杂的架构设计,处理不当就会造成缓存字符无法删除、字符乱码等等。
再回到我们文章开头的问题,如果再 gpt 网页版中产生了大量长对话代码片段,明知道丢了一些功能,但因为上下文太长,越聊只会越错该怎么办。我这里的处理办法是:尽量让网页版输出结构清晰的代码,然后把这些代码复制回项目,新创建文件保存。再让 codex 进行代码比对来粘合最新实现。很多时候,问题被卡住的点就是思想、架构层面的,而非具体的代码写法。有了宏观指导,一般 codex 都可以帮你补全其中的细节。