AI 不会写的代码
我常把表单验证作为技术面试题。它看起来很简单,但人们解决问题的方式能体现他们的思维模式。
我在 Claude、ChatGPT 和 Gemini 上测试了这个题目。它们都给出了相同的解决方案。
大多数人会用以下三种方式之一来解决:
- 使用带有标志位(flags)的单一函数来处理不同类型。
- 使用递归来遍历数据结构。
- 使用 Schema 来驱动验证。
AI 模型全都选择了 Schema 方案。从技术角度来看,它是合理的。它能处理缺失的键(keys),且扩展性良好。如果你的数据在运行时会发生变化,Schema 是正确的选择。
但对于大多数软件来说,还有一种更好的方法。
不要试图为所有事情寻找一种通用的模式,而要使用组合(composition)。为每个业务概念分配它自己的函数。
- 创建一个基础地址验证器。
- 创建一个使用基础验证器的收货地址验证器。
- 创建一个使用基础验证器的账单地址验证器。
这种方法不使用递归,也不使用 Schema。它使用的是清晰、独立的函数。
好处显而易见:代码反映了业务逻辑。账单地址是一个独立的业务概念,理应拥有自己的逻辑。当你添加新类型时,不需要修改现有函数,只需添加一个新函数即可。这能让你的改动保持在局部。
AI 很少会选择这条路径。它倾向于选择将逻辑集中的模式。我们的教育教导我们要消除重复并进行泛化。AI 正是从这种文化中学习的。
AI 并没有失败,它只是在遵循我们教给它的工程直觉。
最好的解决方案并不是代码行数最少的那个,而是最真实地反映你业务领域(business domain)的那个。
下次当你构建解决方案时,问自己一个问题:
这种变化性(variability)是存在于我的代码中,还是存在于我的数据中?
这个答案会改变你的整个设计。