Programming to the Interface

May 31, 2022

Interfaces are the building blocks of software. Interfaces explain what software can do but not how. They can be an API, a wire protocol (think HTTPS), or ABI (application binary interface). How you implement these interfaces is up to you. And if done correctly, the software should be a drop-in compatible replacement for anything else that shares the same interface.

Sometimes the implementation is wildly different than the original intention. Compatibility means that it's easier for existing users to switch over. New products can start with a large addressable install base (technical wedge). New implementations can deliver stepwise increases in performance and efficiency with only incremental work from the user.

Here's how you can get creative with programming to the interface.

Make the interface embeddable

  • SQLite (SQL)
  • rBPF (BPF)
  • QuickJS (JavaScript)
  • Deno (NodeJS)

Make the interface available in a different environment

  • Pyodide (Python in the browser)
  • gVisor, netstack (kernel emulation in userspace)
  • MinGW, Windows Subsystem for Linux (Linux on Windows)
  • WINE (Windows on Linux)
  • Electron (Browser applications on Desktop)

Reimplement the interface with a permissive license (or avoid copyright infringement)

  • musl (glibc)
  • AWS OpenSearch (ElasticSearch), AWS MemoryDB (Redis), AWS DocumentDB (MongoDB)
  • Phoenix (IBM BIOS)

Specialize an implementation

  • Yugabyte, ScyllaDB (Cassandra-compatible)
  • AWS Aurora, Google Alloy DB (Postgres-compatible)

Optimize the interface

  • Deno (NodeJS)
  • esbuild (Webpack)
  • Redpanda (Kafka)

Virtualize an interface

  • Virtual machines (Hardware)
  • Containers (OS)