Most of what I enjoy about software is working out how something functions and then building with what I've learned. Operating systems, networking, multimedia, and system software have all held my attention that way. What keeps me there is that they're knowable. You can always trace what happened and why. I try to build things general enough that a new case means changing inputs, not internals.
I started out building utilities. Tools that pulled data off equipment, carried it between systems, and audited what was running across networked machines. The work was practical and the feedback was quick, but I kept meeting the edge of what I actually understood. I could open a socket without knowing what happened once the send returned, or rely on a file system without knowing how it tracked anything. Working down through those layers is most of what I've done since. I've built a Unix-like kernel with its own scheduler, file system, and virtual memory, written image and video codecs from scratch, and put together servers that speak raw TCP and UDP with nothing in between. Plenty is still unfamiliar to me. But I understand a good deal more of what I'm building on than I did two years ago.

