HackerTube ?

Maybe Not - Rich Hickey

ClojureTV在 YouTube 播放 ↗

字幕解读

Rich Hickey 反对在可复用数据 schema 中预先把字段定为必需或可选,因为 optionality 取决于具体使用上下文。稳定 schema 应描述可扩展的数据形状,调用边界再表达需要哪些信息;过早固定约束会妨碍数据演进与组合。Clojure spec 让规格可检验、生成数据并服务于不同边界,同时保留结构演进空间。

自动字幕 · 引文按字幕原文展示,可点时间戳回看片段。

内容要点

  • 字段是否必需取决于某次调用的上下文,不应被固化为所有用途共享的 schema 属性。
  • 把数据形状与边界要求分开,可以让 schema 复用并逐步增加信息。
  • 规格除验证外还可生成样本,帮助检查约束及兼容性。
视频章节 6
  1. 从 optional 的含义开始
  2. 要求与放宽要求
  3. 使用上下文决定必需性
  4. 数据形状与 schema 演进
  5. 边界上的请求规格
  6. 规格的范围与组合
具体观点与证据 4

放宽输入要求或增强输出保证在语义上应兼容,但把普通值改装Maybe等包装可能让调用者必须改代码。

针对演讲所比较的包装类型接口,不是否认静态类型检查的作用。

an easing of requirements should be a compatible change
探索此观点 →

字段是否必需取决于使用场景,把可选性固定进通用聚合定义会阻碍schema复用。

函数调用边界可以规定要求;批评的是脱离上下文的统一要求。

it's a mistake to put optionality in aggregate definitions
探索此观点 →

是否需要地址与提供地址时需要哪些字段是两个独立约束,应可分别表达。

嵌套schema需要深入到属性树表达条件。

addresses are optional but if you give me an address you have to give me a whole address
探索此观点 →

调用边界的选择器表达最低信息要求,允许额外字段流经不关心它的处理阶段。

开放式spec设计原则,不是要求安全协议接受任意未知输入。

this is just minimal requirements you can always have more stuff
探索此观点 →
补充字幕原文 2

同一字段是否有用或必需,需要结合消费该数据的上下文判断。

information in a certain context so when

共享 schema 不应仅因某个局部上下文就收紧所有用途的要求。

schemas just because the contexts are
解读边界

这是 Rich Hickey 对数据建模和 Clojure spec 的论证,不是对所有静态类型系统的完整比较;字幕中的部分示例 ASR 有误,且演讲没有量化该方法的工程成本。

相关视频与证据 1

原则到设计修正形式分层不足以消除语义纠缠

Simple Made Easy警告分开类与层次并不自动带来简单;Maybe Not用schema示例指出把数据形状和调用场景的可选性绑定会造成复用困难,修正需要分离这两个语义维度。

当前视频

Maybe Not - Rich Hickey

通用聚合定义不应绑定场景可选性。

it's a mistake to put optionality in aggregate definitions
关联视频

"Simple Made Easy" - Rich Hickey (2011) ↗

代码分层本身不等于消除复杂性。

don't associate simplicity with partitioning and stratification, right?
▶ 34:50–35:20 · 观看片段

适用边界 不主张任何模块拆分都无效;Maybe Not讨论特定信息约束建模。

Hacker News 评论

查看 HN 原评论 ↗