{"id":53470,"date":"2026-10-07T14:47:51","date_gmt":"2026-10-07T18:47:51","guid":{"rendered":"https:\/\/mjtsai.com\/blog\/?p=53470"},"modified":"2026-10-07T14:47:51","modified_gmt":"2026-10-07T18:47:51","slug":"the-unreasonable-effectiveness-of-constructive-data-modeling","status":"publish","type":"post","link":"https:\/\/mjtsai.com\/blog\/2026\/10\/07\/the-unreasonable-effectiveness-of-constructive-data-modeling\/","title":{"rendered":"The Unreasonable Effectiveness of Constructive Data Modeling"},"content":{"rendered":"<p><a href=\"https:\/\/www.youtube.com\/watch?v=0BXuYlNrUmE\">Alexis King<\/a> (<a href=\"https:\/\/x.com\/lexi_lambda\/status\/2081754749154574630\">tweet<\/a>):<\/p>\n<blockquote cite=\"https:\/\/www.youtube.com\/watch?v=0BXuYlNrUmE\">\n<p>The type systems provided by mainstream languages have grown vastly more sophisticated, but how much value does that complexity actually provide programmers in practice? I would like to make the case that it is somewhat less than one might think. While at times convenient, invariants can be captured in the type system using a small set of simple tools applied in principled fashion, and while fancy type systems may be convenient, they have misled many programmers by obscuring what is possible to model without built-in type system support. This talk aims to provide a simple shift in perspective, plus a set of concrete design principles, to make modeling invariants in types feel accessible to the working programmer without fancy language support.<\/p>\n<\/blockquote>\n\n<p>&ldquo;Type system as obligation tracker&rdquo; is a catchy phrase, like her previous &ldquo;<a href=\"https:\/\/lexi-lambda.github.io\/blog\/2019\/11\/05\/parse-don-t-validate\/\">parse, don&rsquo;t validate<\/a>&rdquo; (<a href=\"https:\/\/news.ycombinator.com\/item?id=46960392\">Hacker News<\/a>).<\/p>\n\n<p>See also: <a href=\"https:\/\/matt.diephouse.com\/2020\/05\/you-might-not-want-a-boolean\/#fnref-why-is-bool-a-struct\">Matt Diephouse<\/a>.<\/p>","protected":false},"excerpt":{"rendered":"<p>Alexis King (tweet): The type systems provided by mainstream languages have grown vastly more sophisticated, but how much value does that complexity actually provide programmers in practice? I would like to make the case that it is somewhat less than one might think. While at times convenient, invariants can be captured in the type system [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"apple_news_api_created_at":"2026-10-07T18:47:55Z","apple_news_api_id":"7797c7a3-77fb-441f-8c4e-f76bf2d1f311","apple_news_api_modified_at":"2026-10-07T18:47:55Z","apple_news_api_revision":"AAAAAAAAAAD\/\/\/\/\/\/\/\/\/\/w==","apple_news_api_share_url":"https:\/\/apple.news\/Ad5fHo3f7RB-MTvdr8tHzEQ","apple_news_coverimage":0,"apple_news_coverimage_caption":"","apple_news_is_hidden":false,"apple_news_is_paid":false,"apple_news_is_preview":false,"apple_news_is_sponsored":false,"apple_news_maturity_rating":"","apple_news_metadata":"\"\"","apple_news_pullquote":"","apple_news_pullquote_position":"","apple_news_slug":"","apple_news_sections":"\"\"","apple_news_suppress_video_url":false,"apple_news_use_image_component":false,"footnotes":""},"categories":[4],"tags":[27,263,361,84,46,71,408,901,2744],"class_list":["post-53470","post","type-post","status-publish","format-standard","hentry","category-programming-category","tag-craft","tag-theory","tag-haskell","tag-java","tag-languagedesign","tag-programming","tag-rust-lang","tag-swift-programming-language","tag-typescript"],"apple_news_notices":[],"_links":{"self":[{"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/posts\/53470","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/comments?post=53470"}],"version-history":[{"count":1,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/posts\/53470\/revisions"}],"predecessor-version":[{"id":53471,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/posts\/53470\/revisions\/53471"}],"wp:attachment":[{"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/media?parent=53470"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/categories?post=53470"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/tags?post=53470"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}