I know a lot of programmers play music. I do—not all that well—but I've been struck by something I've started to enjoy about retro music gear: immediacy.
Here is a synthesizer that was very popular in the early 2000's called the Alesis Micron (note: this is not considered "retro" :).
This synth has a lot of features and tons of options for doing sophisticated sound design.
Here is a much older synth called the SH-101, released in 1982 (this is retro):
It may not be obvious by looking at them, but the SH-101 has almost no features compared to the Micron. The SH-101 can only play one note at a time—you can sequence an entire song including a drum track using the Micron. The SH-101 can only make sounds by combining two basic waveforms and cutting the higher frequencies. The Micron can do that and much, much more.
How does this Micron do all this? Behind that tiny screen that you navigate using the knob to its right. The menu system behind it is both wide and deep. Many synthesizers work this way, and musicians often refer to this pejoratively as "menu diving".
The SH-101 has no screen. All of its controllers are there. Those sliders and knobs represent everything you can change. But you can change them just by reaching out your hand, and you can change as many of them at once as you have hands available. And when you DO change something you hear it immediately (in fact, many songs are built around real-time changes of parameters like these).
As a result, the SH-101 is a lot more fun to play around with. It affords exploration and tweaking. And because of the immediacy, you can actually learn a lot about sound design, even if you walk up to it knowing nothing.
There's some lessons here about software. The most obvious to me is that cycle time is really important for learning. The easier it is to change something and see that effect in real time, the easier it is to understand how everything actually works. It's also just a lot more fun.
Stuff like hot module reloading, Zeitwerk (Rails' code auto-reloader), and your browser's dev tools are some examples of reducing the cycle of time and bringing us close to this notion of immediacy.
I think this concept is deeper than just reloading, though. Think about your work and what is required between making a change and understanding the effect of that change?
When I'm editing HTML to design a UI, I found that using utility-style CSS to give me that sense of immediacy (note this is not a post about how awesome utility CSS is…keep reading). Suppose I'm making a nav. I might write this HTML:
<nav>
<a href="#">Link 1</a>
<a href="#">Link 2</a>
<a href="#">Link 3</a>
</nav>
To begin designing how this will look and feel, I need CSS to style it. With a utility-style framework I can say inside the HTML and tweak things quickly and easily, especially if I know the framework. I can stay in one place, focus on the task, and see results immediately.
With normal CSS in a separate file, there is a disconnect. I have to switch back and forth, changing selectors, naming, etc. It's hard to explore the design because of frequent breaks in workflow.
But, more to the point, I've learned a lot about CSS by using a Tachyons—a utility style framework. The complexity of CSS comes from the way properties and markup interact with each other. Like sound design, it can be hard to predict what will happen, especially if you are still learning. Connecting cause and effect directly and quickly is powerful.
And yet.
I bought the SH-101 to have fun, but I did use it with my band, playing it at shows. The SH-101 has no way to save the different sounds you can design, so between each song, I had to feverishly move the sliders, switches, and knobs to the right place. From memory. In front of people who grow notoriously bored with each passing second between songs.
Knowing that the Micron could do everything the SH-101 could do, but also save preset sounds, I bought it. I sat down and painfully programmed in the various sounds for my band's set. It was not enjoyable.
But, the next time we played a show, I could press one button to move to the next programmed sound and be ready to go. No messing with any nonsense on stage. I was even able to enhance some of the sounds with features not available on the SH-101 to improve workflow and interoperability with our songs and live set up. That was enjoyable.
If you've worked with a large app that uses utility CSS, it can become quite a mess. You really need a large organizational scheme to make it scalable and usable. Whatever that scheme is naturally reduces immediacy, increases cycle time, and is certainly not going to be much fun.
But you have to do it sometimes, because it's really unpleasant trying to get work done inside a mess.
Knowing the difference between exploration/learning, and producing stable software is critical to selecting tools and approaches.
To make a third example, Justin Searls famously said that his job as a developer was to "put spreadsheets on the Internet". This is exactly what I'm talking about. A spreadsheet has immediacy, and allows a wide range of people to achieve complex things because it's so easy to tweak and change stuff. You see your mistakes immediately, and you learn quickly what does what. It's easier to graph a quadratic equation in Excel than it is to add 2 numbers in Ruby.
But Excel falls over eventually. It's immediacy becomes unmaintainable. Here is a picture of what is called a modular synthesizer that provides more flexibility than the SH-101, and yet still doesn't have all the features of the Micron. I guarantee you this is not fun to use.
The way out of these messes is abstraction. Building a digital recreation of an analog circuit, extracting a single class from an element using utility classes, or building an app to automate data entry and analysis all help clean up the mess we make by learning and exploring a problem.
But it's also worth understanding that sometimes it's really fun to navigate a mess and see what happens when you flip some switches and turn some knobs.
Unless otherwise noted, my emails were written entirely by me without any assistance from a generative AI.