From Hack to Skip: Building Incremental Everything (with Julien Verlaguet)

Developer Voices
18,535 views •

How would you manage 30 million lines of PHP? You can't rewrite it - you'd be fired long before you delivered. That was the problem facing Facebook around 2011, and their answer was to add a type system, giving birth to the Hack language. But adding types to PHP turned out to be the easy part. The hard part was building a type checker that developers used to "edit, save, refresh" would actually tolerate. So how do you type-check tens of millions of lines of code fast enough that nobody notices? Julien Verlaguet co-designed Hack at Facebook, and has spent the fifteen years since chasing a better way to build incremental systems. We start with the internals of Hack's language server - forked OCaml workers, a shared immutable heap, lock-free dependency tracking, and the months spent hunting non-deterministic bugs. From there we follow the thread to Skip, a language designed around tracking mutability in the type system, with stops at why Haskell's monads and "reactive Java" didn't fit, functors vs type classes, and Skip's bang operator for working with immutable objects. Then it's on to the Skip reactive framework: eager vs lazy collections, a garbage collector without long pauses, a reactive SQL database that didn't find a market, TypeScript bindings, and Skipper, an AI coding agent built on a sound version of TypeScript. If you're interested in compilers, language design, or building real-time systems that stay fast as they grow, Julien has plenty of hard-won lessons to share. --- Support Developer Voices on Patreon: https://patreon.com/DeveloperVoices Support Developer Voices on YouTube: https://www.youtube.com/@DeveloperVoices/join SkipLabs: https://skiplabs.io/ Skip Framework Docs: https://skiplabs.io/docs Skip on GitHub: https://github.com/SkipLabs/skip Skiplang: https://skiplang.com/ Skipper Launch Announcement: https://skiplabs.io/blog/press_release Hack: https://hacklang.org/ HHVM: https://hhvm.com/ OCaml: https://ocaml.org/ OCaml Functors: https://ocaml.org/docs/functors Haskell: https://www.haskell.org/ Clojure: https://clojure.org/ Scala Implicit Parameters: https://docs.scala-lang.org/tour/implicit-parameters.html Salsa (Incremental Computation for Rust): https://github.com/salsa-rs/salsa ReactiveX: https://reactivex.io/ SQLite: https://www.sqlite.org/ TPC-H Benchmark: https://www.tpc.org/tpch/ PostgreSQL: https://www.postgresql.org/ PostgreSQL NOTIFY: https://www.postgresql.org/docs/current/sql-notify.html Server-Sent Events: https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events JavaScript Proxy Objects: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy Doxygen: https://www.doxygen.nl/ SKDB and Reactive Databases (Materialized View): https://materializedview.io/p/skdb-reactive-databases-julien-verlaguet Julien on LinkedIn: https://www.linkedin.com/in/julien-verlaguet-b5710a20/ Julien on X: https://x.com/JulienVerlaguet Kris on Bluesky: https://bsky.app/profile/krisajenkins.bsky.social Kris on Mastodon: http://mastodon.social/@krisajenkins Kris on LinkedIn: https://www.linkedin.com/in/krisjenkins/ --- 0:00 Intro 2:59 Static Analysis For Facebook's PHP Codebase 9:57 Why Hack Needed A Blazing Fast Language Server 14:50 Inside The Type Checker's Parallel Pipeline 22:11 Making Type Checking Incremental 31:59 Why Incremental Computing Needs True Immutability 37:02 Why Not Haskell? Monads vs Independent State 44:50 How Skip Tracks Mutability In The Type System 48:55 A Flavour Of Skip: Where OO Meets FP 53:27 The Bang Operator: Lenses For Immutable Objects 1:00:03 Can OO and FP Coexist Happily? 1:03:33 Functors vs Type Classes 1:14:29 A Persistent Heap That Works Like SQLite 1:20:03 Push vs Pull: Eager And Lazy Collections 1:28:58 What Is Skip Used For? 1:32:30 Why Port Skip To TypeScript? 1:36:54 Garbage Collection Without Long Pauses 1:46:13 Handling Concurrency Without Rollbacks 1:49:20 SKDB: Why A Reactive Database Didn't Sell 1:53:10 Reactive Postgres Views & Server-Sent Events 1:59:12 Keeping Client-Side Data In Sync 2:07:43 When Should You Use Skip? Run Your Logic Backwards 2:11:09 Skipper: A Coding Agent Built On A Sound TypeScript 2:14:52 Why Latency Matters For AI Coding Agents 2:21:12 Outro

Keyboard shortcuts

On. Switch them off if they collide with your assistive tools; ? still opens this sheet.

Go to

Press g then the letter.

  • gh Latest
  • gs Sources
  • gm Media
  • gv Videos
  • gp Podcasts
  • gc Calendar
  • gd Decoder
  • gz Dataviz
  • ga Datasets
  • gb Blog
  • gk Markets
  • gj Careers
  • gn Prompt Notebook

On this page

  • / Focus search, where there is one
  • t Back to top
  • ? This list
  • Esc Close