即刻App年轻人的同好社区
下载
App内打开
zxch3n
265关注1k被关注1夸夸
🦜 创业在做 Loro.dev
💻 GitHub @zxch3n
zxch3n
3天前
ai agent 太容易 overengineering 了,又健忘

叠加起来就是屎山堆得快,但又忘记为什么堆起来的,靠 agent 自己就铲不掉
20
zxch3n
7天前
如何让代码更容易 Review

现在 AI Agent 开始有能力接管更多工作了。每个程序员的亲手写代码的必要性减少了,交给 Agent 的工作更多之后意味着 Review 容易成为效率瓶颈。

虽然 Vibe Coding 是不 Review 代码的,但这带来的后果是,Vibe Coding 的产品往往不适合用来做持续迭代,Vibe Coder 会逐渐失去对代码库的控制。所以,如果想在一个生命周期长需要持续迭代的产品上写代码,Review代码还是有必要性的。

# 老方法

以往很多老生常谈的代码规范实践,仍然能让review工作轻松不少。

## 静态类型

首先是静态类型检查。这些都是老生常谈了,静态类型检查也是现在TypeScript这类语言如此受欢迎的原因。在AI环境下,TypeScript应该是使用量最高的语言了,很大原因是它兼顾了灵活性和静态检查。它不需要受静态类型约束,可以变得非常灵活,另一方面又能提供超级灵活的类型去做很多检查,在编译期就能帮助我们检查掉很多问题。

但是,TypeScript语言毕竟还不是完美无缺的,因为TypeScript的类型是和它的Runtime分开的。所以,有时候你标注的类型和具体执行时的类型是错开的,Runtime可能拿到的是错误的类型。

在这种情况下,TypeScript实践的最好方式是:
1. 在类型检查方面,要打开所有严格的检查。
2. 从外部系统来的类型上加上 Zod 这样的 schema 检查

Lint 也很重要。

举个例子,如果你有一个 Promise 没有被await,然后你就直接拿它的值去做一些事情,TypeScript编译器本身是不会对这种行为报错的。但是在Linter下面是可以检查到这种问题的,而且这种问题很容易造成各种bug。我之前就因为类似的问题被卡过好多次。

这里面很大的原因是一个Promise在没有被await的时候,它是可以被拿去做if-else判断的。比如说,你的一个Promise返回的是一个boolean值,你没有await它,然后你直接去做真值判断,这个判断就过了。像这种问题就是Linter可以检查出来,而TypeScript编译器是查不到的。所以,也需要配上Linter的这种正确性检查。

## 测试

### 减少 Mock-heavy 的测试

测试大致可以分为单元测试和集成测试。单元测试往往测试的就是一个纯函数的行为,它是很小的。集成测试则是更完整的,比如把一个应用真的跑起来,或者直接测试一个 Lib 暴露出来的 API。

Mock-heavy 的集成测试应该尽量减少。因为这种测试实在太麻烦了,你需要模拟环境,写的Mock代码有时甚至比业务代码还要多。而且你Mock的可能不准确,行为又容易变,会导致你的代码变更变得不灵活。因为一旦中间层的抽象变了,Mock 层也要变化,从要要更改大量测试,往往从成本上来说是得不偿失的。

### 代码组织形式决定测试难度

很多时候代码是可以拆分出可独立进行单元测试的模块的,但是很多人没有意识到。因为很多人会把纯逻辑的代码和网络层、文件 IO 以及各种非必要的外部模块建立起依赖。

而外部依赖尽可能少的纯逻辑的函数才是高度可测的。因为固定的输入就会有固定的输出,让测试的 Expect 变得很好写并且很稳定。对于这样的模块,被测试充分覆盖之后,就不用担心 AI 改错代码造成 regression,就敢大胆交付,review 的心智负担就小不少。

### UI Components

UI Components 也是可以变成纯逻辑的。这意味着它们要不涉及 IO,没有 Side-Effect,不会被全局变量影响。

这样的 Components 上固定的输入可以有固定的输出,也就是固定的 Props 要产生固定的渲染结果。

那么配合 Storybook 这样的工具,给每个 Component 一组 Stories,就可以很清晰看到他们在各种不同场景下的渲染效果,而不用去 Mock 或者真的把应用跑起来观察。

这让我们很方便地去做 Snapshot Test。可以在类似 Chromatic 提供的服务,或者是我们自己通过Playwright的方式去做接入。

# Context

有时候是因为人缺少相对应的context,这时候你会很难判断改的某一段逻辑它是不是对的。

我发现这种场景非常适合让AI去提供context。

AI确实能提供非常大的帮助,因为我们现在缺少的context都可以让AI帮我们补齐。最近的体验在这上面还是非常好的,因为我们可以让GPT 5.2 或者 Opus 4.5去帮我们找到缺失的那部分context。比如某个算法不了解,我们可以让它在注释里面把这个算法完整介绍一遍,每个地方的原理是什么样的,它都可以帮我们写清楚。这让review过程变得非常丝滑。它还可以帮你补全执行流程。

目前最主要的感受是智能还是第一位的。更智慧的模型能提供的信息量和对我们意图的理解都会更准确,对指令的遵循也会更好,而且会有自己的判断。它有时候会拒绝你的请求,因为它觉得它自己才是正确的,这确实是好的模型表现出来的一些行为。

另外,之前Winsurf出的CodeMap,虽然它里面也有提供这种帮你review的工具,专门针对帮助你理解代码的场景,并提供了自己的可视化功能。但那个东西用下来目前感受还是帮助不大。一方面它交互不太符合直觉;另一方面,一个模型如果足够智能,它最终输出的就算是没有什么可视化修饰的 Plaintext 能够提供的价值就足够高。

所以现在还是模型本身的智能带来的体验差距最大。现在去买200刀每个月的套餐还是很划算的,毕竟不限制最好的模型的 Quota。

(这一篇大部分直接用 typeless 口喷的,感觉很不错
11
zxch3n
8天前
有时候推特想看点新消息很容易看着看着被视频吸引走。受@自然卷的Neil 启发,把手机工作模式设置成了黑白的,带短视频的应用设置成了反色的 😌 马上不上头了
33
zxch3n
22天前
00
zxch3n
1月前
都三十了还在因为小学被霸凌的事情半夜被气醒,哎
10
zxch3n
1月前
退订了 Cursor 买了 Windsurf

现在大量用 Codex,感受不到 Cursor 的价值了。但是 Windsurf DeepWiki Codemaps 来辅助读代码确实是现在非常需要的能力,而且 SWE-1.5 真快啊。
31
zxch3n
2月前
知乎的戾气也太重了 😷
00
zxch3n
2月前
2024 iPad App of the Year 现在在用 Loro 🤩
00