Types are a basic tool of software design (2018)

Scope of “Types as the Basic Tool”

  • Some agree that once function bodies are removed, what remains (types, signatures, data structures) is essentially the design.
  • Others argue this is overstated: design also includes algorithms, IO, performance, distribution, and UX, not just types.
  • Several see types more as “vocabulary” or “contracts” than “tools,” and find the title rhetorically inflated.

Static vs Dynamic Typing in Design

  • Many report starting design from data structures, function signatures, and types, even before implementation.
  • Others say they think first about architecture and non-functional requirements (location of data, policies, latency), with types following later.
  • A recurring theme: even in dynamic languages, developers must implicitly think about types; writing them down just offloads checking to tools.

TypeScript, Tooling, and the Turbo PR

  • One camp sees TypeScript annotations as lightweight documentation, refactoring aid, and “always-on unit tests,” especially valuable in large JS codebases.
  • Another welcomes removal of TypeScript (and tools like Prettier) as simplifying the code; they prefer the “after” state, even at the cost of compiler checks.
  • Disagreement over whether losing explicit optionality and structure (e.g., an optional parameter) is adequately compensated by reading implementation bodies.
  • Side debate on trailing commas: some want them for clean diffs; others see this as better solved by smarter diff tools.

Type Inference and Ripple Effects

  • F#, Scala, Haskell, and Rust are discussed: inference can make code concise but changes can “ripple” and produce confusing error chains.
  • Some mitigate this by adding explicit types as “anchors” or using interface files.
  • Viewpoint: these ripples exist in any system; static types just surface them earlier.

Domain Modeling, DDD, and Contracts

  • Several connect the article’s thesis to longstanding ideas: “show me your data structures and I’ll understand your code.”
  • Domain-Driven Design is cited as a parallel: model the domain via types and the rest of the system follows.
  • Many like thinking of types as contracts or interfaces: changing behavior often forces a signature change, surfacing broken “contracts” at compile time.

Dynamic Languages and Large Codebases

  • Some report painful experiences maintaining large untyped Ruby/Python/JS projects: unclear interfaces, harder refactors, more runtime or production bugs.
  • Others claim success with big JS codebases without static types, relying on careful design, runtime checks, and tests.
  • There’s disagreement over whether lack of types mainly hurts poorly written code or becomes a systemic liability at scale.

Alternative Perspectives

  • A few suggest the real “basic tools” are actors, messages, or denotational semantics rather than functions/types.
  • One angle reframes “types” as just one form of “templates” or patterns used in all design, from games to software.