如何让代码更容易 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 口喷的,感觉很不错
现在 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 口喷的,感觉很不错
很多有趣的故事、令人振奋的情绪。比如下面这段关于 leadership 的质朴描述,很多时候 leader 就是大家的啦啦队长:
在闪电说官网想找找官方社群的入口,只看到这个“直接向创始人反馈问题”,看完感觉是直接加企微 1-1 聊天,出于社交压力就很犹豫。
想了好一会决定扫一下看看有没有可能其实是群聊,最后扫完发现果然是群聊,压力舒缓不少。
就有时候创始人 1-1 这种宣传点也未必总是有利因素,以及也是形式的原因,如果这里是留的创始人手机号或者是小红书可以留言留短信,不是企微这种要 1-1 聊天的社交软件,可能我就也还好
想了好一会决定扫一下看看有没有可能其实是群聊,最后扫完发现果然是群聊,压力舒缓不少。
就有时候创始人 1-1 这种宣传点也未必总是有利因素,以及也是形式的原因,如果这里是留的创始人手机号或者是小红书可以留言留短信,不是企微这种要 1-1 聊天的社交软件,可能我就也还好
Mole 小鼹鼠继续更新啦,2 个月时间 Star 到 8.5k,谢谢大伙喜欢和包涵之前的不成熟版本,这次发布 V1.12 版本,加上了 12 月份的专属圣诞节彩蛋小红帽,Mole 也过圣诞节
https://github.com/tw93/Mole
1. 清理能力升级:mole clean 新增对各种本地模型、Docker 及浏览器缓存的清理规则,--dry-run 模式支持导出详细清单供审查,让你在执行前对清理内容更加了解,支持 --debug 用于更好排查问题。
2. mole optimize 新增 --whitelist 参数,支持选择跳过防火墙或系统更新特定检查,只优化你需要的优化。
3. mole status 支持识别 CPU/GPU 核心数量,并新增电池健康、系统负载及网络吞吐的实时监控,也增加的温度的获取。
4. 安全还是第一位,所有文件操作接入安全 API,新增 130+ 自动化测试用例确保稳定性。
@https1024
https://github.com/tw93/Mole
1. 清理能力升级:mole clean 新增对各种本地模型、Docker 及浏览器缓存的清理规则,--dry-run 模式支持导出详细清单供审查,让你在执行前对清理内容更加了解,支持 --debug 用于更好排查问题。
2. mole optimize 新增 --whitelist 参数,支持选择跳过防火墙或系统更新特定检查,只优化你需要的优化。
3. mole status 支持识别 CPU/GPU 核心数量,并新增电池健康、系统负载及网络吞吐的实时监控,也增加的温度的获取。
4. 安全还是第一位,所有文件操作接入安全 API,新增 130+ 自动化测试用例确保稳定性。
@https1024
🌟 爆庄王者 首充1000,6天狂赚120万U🌟 爆奖接力 玩家500一拉爆奖133万U🌟 麻将传说 · 一局起飞 · 豪揽100万U🌊 亿万备用金坐镇|大额无忧 · 真硬实力✅ 所有爆奖记录公开可查|真数据 真提现
#权威认证 #亿万资金保障 #爆奖无限
这是一个基于 Next.js 16 的管理中后台,开箱即用。
🛠️ Next.js 16 + PostgreSQL + Prisma + Better Auth + Antd Pro
✨ 核心功能:
🔐 认证授权(邮箱/OAuth)
👥 RBAC 权限系统
📊 配置化 CRUD 管理
📁 文件管理 + 国际化
🌏 官网:https://nextjsbase.com
📖 文档:https://nextjsbase.com/docs
🎯 演示:https://admin-demo.nextjsbase.com
🔧项目本身可能有很多问题和改进空间,如果你有兴趣,欢迎提交PR、一起维护!
⭐ 如果对你有帮助,欢迎 Star!
「不懂机制」就会让人只懂机械复读碎片鸡汤经验。比如「不要说服教育用户」,大老板焦虑业务时最喜欢复读这种鸡汤金句给下属听。
但从机制视角,一切人际交互都是在「教育别人」:银行会教育顾客不能抢劫,你去公共场合会被教育要穿衣服,你踢足球也会被教育不能用手,你玩moba也会被教育不能杀害队友……
大部分人只是对这些早已形成的「底层规则」熟视无睹,才觉得自己从未被教育过,都是自己自愿的,所以成功的产品不会教育人。
你开奶茶店会默认它是个「店」而非「摊」,但不是每个领域的每个问题都如此固定答案。
感觉这几年,行业舆论的集体共识智商下滑了,甚至需要重新掰扯「什么是第一性原理」了
但从机制视角,一切人际交互都是在「教育别人」:银行会教育顾客不能抢劫,你去公共场合会被教育要穿衣服,你踢足球也会被教育不能用手,你玩moba也会被教育不能杀害队友……
大部分人只是对这些早已形成的「底层规则」熟视无睹,才觉得自己从未被教育过,都是自己自愿的,所以成功的产品不会教育人。
你开奶茶店会默认它是个「店」而非「摊」,但不是每个领域的每个问题都如此固定答案。
感觉这几年,行业舆论的集体共识智商下滑了,甚至需要重新掰扯「什么是第一性原理」了
2025年12月12日,北京第一场雪。
在这个提醒人们添置冬衣的购物节,好几年了,已经一点存在感都没有了。
别说双十二,连双十一也是如此。翻看我的备忘录,早在2019年我就记下了一行字:“今年双十一全天淘宝没有购买任何东西”。
曾几何时,618和双11是真正的节日。当时网上买东西像赶集一样,把很长一段时间的需求积攒起来,忍着不买,研究复杂的满减规则,就等着那一天的零点爆发。
甚至日常买什么东西之前,我都习惯上一下“什么值得买”,检索下是不是好价。
那时候好价是稀缺的,潜意识里也觉得需要一个特定的日子,只有通过流量和订单的瞬间洪峰,消费者才有资格向商家换取一点让利。
然而拼多多终结了这种博弈,彻底改变了这一切。
小学的时候,读到过一篇题目叫“MADE IN CHINA"的作文,作者应该是北上的小朋友,感叹国外的阿姨邮寄过来一件玩具,价格不贵,特别精美,底部写着“MADE IN CHINA"。
他惊讶这么精美的玩具,是中国出口给外国的,为什么外国人可以买到,但是我们自己却买不到?文章的结尾,他感叹,也许需要我们这代人来回答这个问题。
这篇文章给了我非常深刻的印象,尽管我当时都不知道"MADE IN CHINA"是什么意思,我觉得他提出一个很有深度的问题。
这么多年,这个问题一直萦绕在我脑海。
某种意义上,今天的拼多多其实回答了这个问题,它撕开了渠道的层层包装,把中国过剩且强大的供应链产能,直接对接给了国内消费者。
那个曾经只存在于外贸单里的“物美价廉”,终于通过拼多多实现了对内的“普惠”。
当好价格成为常态,这就是时代红利,这就是答案。
拼多多App第三个Tab,没有活动的时候是“分类”tab,但实际上,它一年365都被各种名目的“节日”占据,天天都是节日。
更绝的是,不管什么节,拼多多用的全都是一套公共活动模板,连双十一这种“大日子”,也是同一个界面,只是改一下标题,都懒的专门设计一套UI来营造紧迫感,装都不装。
这种“敷衍”的本后,反而讲了一个常识:当每一天都是好价格,节日就失去了特殊性,变成了日常的背景音”。
左手百亿补贴,右手全站比价,你还在等待什么?
当“总是好价”成为一种确定性,我们终于不需要再为了省钱而焦虑等待,也不需要再为凑单而往购物车里塞一堆无用的垃圾。
这或许才是“MADE IN CHINA”该有的结局:不再是外贸统计表里那个冰冷的出口数据,而是普通人终于有资格以最日常的价格,享用我们亲手制造的一切。
在这个提醒人们添置冬衣的购物节,好几年了,已经一点存在感都没有了。
别说双十二,连双十一也是如此。翻看我的备忘录,早在2019年我就记下了一行字:“今年双十一全天淘宝没有购买任何东西”。
曾几何时,618和双11是真正的节日。当时网上买东西像赶集一样,把很长一段时间的需求积攒起来,忍着不买,研究复杂的满减规则,就等着那一天的零点爆发。
甚至日常买什么东西之前,我都习惯上一下“什么值得买”,检索下是不是好价。
那时候好价是稀缺的,潜意识里也觉得需要一个特定的日子,只有通过流量和订单的瞬间洪峰,消费者才有资格向商家换取一点让利。
然而拼多多终结了这种博弈,彻底改变了这一切。
小学的时候,读到过一篇题目叫“MADE IN CHINA"的作文,作者应该是北上的小朋友,感叹国外的阿姨邮寄过来一件玩具,价格不贵,特别精美,底部写着“MADE IN CHINA"。
他惊讶这么精美的玩具,是中国出口给外国的,为什么外国人可以买到,但是我们自己却买不到?文章的结尾,他感叹,也许需要我们这代人来回答这个问题。
这篇文章给了我非常深刻的印象,尽管我当时都不知道"MADE IN CHINA"是什么意思,我觉得他提出一个很有深度的问题。
这么多年,这个问题一直萦绕在我脑海。
某种意义上,今天的拼多多其实回答了这个问题,它撕开了渠道的层层包装,把中国过剩且强大的供应链产能,直接对接给了国内消费者。
那个曾经只存在于外贸单里的“物美价廉”,终于通过拼多多实现了对内的“普惠”。
当好价格成为常态,这就是时代红利,这就是答案。
拼多多App第三个Tab,没有活动的时候是“分类”tab,但实际上,它一年365都被各种名目的“节日”占据,天天都是节日。
更绝的是,不管什么节,拼多多用的全都是一套公共活动模板,连双十一这种“大日子”,也是同一个界面,只是改一下标题,都懒的专门设计一套UI来营造紧迫感,装都不装。
这种“敷衍”的本后,反而讲了一个常识:当每一天都是好价格,节日就失去了特殊性,变成了日常的背景音”。
左手百亿补贴,右手全站比价,你还在等待什么?
当“总是好价”成为一种确定性,我们终于不需要再为了省钱而焦虑等待,也不需要再为凑单而往购物车里塞一堆无用的垃圾。
这或许才是“MADE IN CHINA”该有的结局:不再是外贸统计表里那个冰冷的出口数据,而是普通人终于有资格以最日常的价格,享用我们亲手制造的一切。