Software Unscripted · Richard Feldman

Type System Complexity with Chris Krycho

·50 min·4 clips
Chris Krycho reveals how LinkedIn tackled migrating millions of lines of code to TypeScript.
This episode of Software Unscripted features host Richard Feldman interviewing Chris Krycho, a front-end infrastructure engineer at LinkedIn. They explore the practical and philosophical complexities of adopting and using type systems in large-scale software engineering. The conversation centers on Krycho's experience leading LinkedIn's migration to TypeScript and broader type system design trade-offs. The migration began with internal experiments before Krycho joined LinkedIn in early 2019, despite millions of lines of member-facing application code still using plain JavaScript. Krycho contrasts this large-company challenge with the simpler adoption process at a small startup. He details the initial phase of gaining official support and creating internal tooling, including a custom wrapper for the TypeScript compiler. A major technical hurdle involved managing the migration's impact on developer productivity and build times across thousands of engineers. Krycho explains that LinkedIn's codebase was converted incrementally, file by file, rather than in a single disruptive rewrite. The discussion shifts to TypeScript's use of "strict semantic versioning" for its compiler API but not for its language features, which Krycho finds unusual. Feldman and Krycho compare type system complexity across languages, specifically discussing Haskell, Rust, and Elm. They analyze how different languages manage complexity, with Krycho noting that Rust places more complexity on library authors to simplify work for library consumers. A key insight is that type system complexity is not inherently good or bad but represents a series of deliberate trade-offs for language designers. Krycho argues that the choice between structural and nominal type systems is a major architectural decision with widespread implications. He suggests that gradual typing, as in TypeScript, introduces its own unique complexity compared to languages with type systems from the start. The conversation highlights that migrating a massive codebase requires careful consideration of both technical infrastructure and developer experience. The tone is deeply technical and educational, grounded in real-world engineering experience. The style is a thoughtful, conversational dialogue between two knowledgeable practitioners. This episode is ideal for software engineers interested in type theory, large-scale migrations, or the design philosophies behind TypeScript, Rust, and Elm. Listeners seeking a high-level, non-technical overview of programming languages would likely find it too specialized.
Listen to the show on