Software Design by Example

The (hopefully) final version of Software Design by Example: A Tool-Based Introduction with JavaScript has gone to the publisher, and physical copies should be available by the end of the year.

Lots of things didn’t get into the book, partly because I ran out of steam but also because I wanted to see if the book had any impact before investing more effort. The most important was a text editor about the size of kilo (1, 2) with undo/redo (which is complex enough to need a whole chapter). The second would be a message queue or pub/sub system like RabbitMQ because partial failure in distributed systems is now a fact of most programmers’ lives, but is rarely taught. I would also have liked to include a fuzz tester, the world’s smallest useful database, something to show readers how model checking works, and other tools.

But what I’d like most is to edit these chapters rather than write them. It’s not less work (trust me), but I’d really like to help other people get a chance to raise their profiles. So if you’re a junior developer and would like to see your name in a book, or an undergrad student who needs a senior project that combines research, design, coding, and writing, please reach out, especially if you’re from an underrepresented or marginalized group.

We make beautiful things, and we ought to share them.


I’ve also now started on a Python version; the topics and some key ideas are listed below, and I’d be grateful for feedback on what else you’d like to see included.

Tool Key Ideas
unit testing framework code as data; introspection
file backup hashing; interface vs. implementation
an interpreter code as data; the read-eval-print cycle
dataframes interface vs. implementation; performance optimization
pipelines inheritance vs. composition; traceability; task execution
a build manager dependencies as graphs; task execution
pattern matching recursive search; composability
a regular expression parser lazy vs. greedy execution; composability
a web server event-driven computation; error handling; security
a large file cache hashing; interface vs. implementation
a log-structured database systems programming; performance optimization
a persistence framework introspection; interface vs. implementation
binary data storage interpreter internals
a page templating tool code as data; introspection
a package manager recursive search; performance optimization
a page layout tool recursive search; interface vs. implementation
a code quality checker recursive search; introspection; extensibility
a code generator code as data
a virtual machine interpreter internals
an interactive debugger interpreter internals