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 |