即刻App年轻人的同好社区
下载
App内打开
zxch3n
265关注1k被关注1夸夸
🦜 创业在做 Loro.dev
💻 GitHub @zxch3n
zxch3n
2天前
如何让代码更容易 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
4天前
有时候推特想看点新消息很容易看着看着被视频吸引走。受@自然卷的Neil 启发,把手机工作模式设置成了黑白的,带短视频的应用设置成了反色的 😌 马上不上头了
33
zxch3n
17天前
00
zxch3n
29天前
都三十了还在因为小学被霸凌的事情半夜被气醒,哎
10
zxch3n
1月前
退订了 Cursor 买了 Windsurf

现在大量用 Codex,感受不到 Cursor 的价值了。但是 Windsurf DeepWiki Codemaps 来辅助读代码确实是现在非常需要的能力,而且 SWE-1.5 真快啊。
31
zxch3n
1月前
知乎的戾气也太重了 😷
00
zxch3n
2月前
2024 iPad App of the Year 现在在用 Loro 🤩
00
zxch3n
2月前
ChatGPT Pulse 很不错,会推荐最近关注的问题的解析和 Tips。有下一代推荐系统的感觉了
00
zxch3n
4月前
飞书这也卷。。。
10