On this page · 6 sections
把显示、规则与状态分开
这不是换一种语法能解决的问题。我们必须区分查询与命令:查询解释当前有哪些可能性;命令验证前提、消耗资源并提交变化。随机流也是状态,不能因为它没有显示在界面上,就把它当成无关的实现细节。
- 01界面
展示可能性 · 收集意图
- 02规则
验证前提 · 决定变化
- 03状态
资源 · 随机流 · 结算
这种分离使测试不必先启动整个图形界面。规则可以面对固定输入与随机种子;界面则验证反馈、焦点和取消行为。如果所有逻辑都嵌在按钮回调里,想证明“预览没有副作用”就需要穿过更多无关条件。
测试的不只是输出,还有不变量
| 入口 | 允许的变化 | 必须单独检查 |
|---|---|---|
| 预览 | 返回当前条件下的候选说明 | 随机状态和资源不被消耗 |
| 确认 | 验证通过后提交约定变化 | 验证失败不能留下部分提交 |
| 取消 | 退出尚未提交的选择 | 不是撤销一项已经完成的业务动作 |
输出测试问“结果是否在允许范围内”;不变量测试还问“本不该变化的东西是否保持不变”。资源不足时,确认操作不应先扣一半费用;重复提交结算,不应记两次成绩。这类约束决定一段逻辑能否被安全地组合进更大的系统。
但通过单元测试仍不等于用户体验正确。界面可能显示过期预览,取消按钮也可能没有取消用户以为取消的操作。规则测试与交互测试回答不同问题,两者不能互相冒充。
这是不是把简单事情做复杂?
这是一个合理反问。一次性的计算脚本,没有必要复制大型系统的层次。抽象需要成本:接口、文件与概念增加后,读懂代码也可能更难。只有当规则被多个入口复用、状态错误难以追踪,或需要独立验证时,这种分离才更值得。
同样,“计算机科学不等于编程”不意味着编程不重要。不会读调用链、理解可变状态和定位边界错误,再漂亮的架构词汇也无法替代调试。AI 辅助生成代码可以进入工作流,但它不会免除检查前提、执行测试和理解失败的责任。这里是工程判断,不是对未来岗位数量的预测。
把抽象落实到一个可检查的问题
我希望保留的训练方式很朴素:为一个功能写下输入、允许的变化、禁止的变化和失败结果,再决定需要怎样的代码组织。学科框架可以帮助发现盲区,但具体能力仍要在实现与验证中表现出来。
下次再看一个“已经能用”的功能,可以多问一句:用户什么都没有确认时,系统是否也真的什么都没有改变?这比把代码行数当作工作量,更接近我理解的系统构建。
我需要修正“AI 只利空软件工程”
早期我把计算机科学与编程区分开时,说过 AI 只是利空软件工程。这个说法把软件工程缩成了写代码。需求、验证、可靠性与维护本来就是工程的一部分,而代码生成越快,这些问题未必越少。
更准确的判断是,学科内部的工作结构正在变化。重复表达的成本可能下降,理解约束和验证结果仍然重要。不能拿一个专业名称预测每个人的命运,也不能因为生成工具更强,就放弃理解它生成的系统。
Sources & further reading
- 零号试剂 · 规则核验记录 ↗
Source · 2026-09-06 核验:遗传规则测试 11 项通过。含核验范围与代码指纹,不含整个私有仓库。
- ACM / IEEE-CS / AAAI · CS2023 ↗
Further reading · 计算机科学课程框架,作为学科范围的延伸阅读。
