If you've read previous issues of this newsletter, then you've seen the ads for our Advanced Software Design Course, which has helped approximately 250 engineers take their skills to the next level. Perhaps you were intrigued, but didn't have the 60-100 hours over 13 weeks demanded by our course. Perhaps you only have a few years experience and felt you weren't ready. Then perhaps our new offering is for you.
Next month, we're launching the Express Course. Same big ideas, but in a streamlined format, designed to take 2-3 hours/week for just 5 weeks.
Join the course, starting November 21st.
Solving the Dog-Bunny Puzzle with Formal Methods
Last month, Conrad Barski of "Land of Lisp" fame released a very simple yet surprisingly difficult puzzle. It received an astonishing 1849 karma on Hacker News — among the top 200 posts of all time. For a few days, it felt like it was everywhere.
I got stuck pretty quickly, and was about to put it down to get back to work, when I realized that the puzzle was actually a Petri Net, a formal modeling technique used to build solvers for everything from concurrent programs to chemical reactions. Inspired by Hillel Wayne's post on using the Alloy analyzer to prove a certain Zelda mod is winnable, I decided to bust out a Petri Net solver and take it on. Sometimes it's nice to do something zany when inspiration strikes.
Attaining conscious competence means being able to explain what you are doing and why. Yet the basic qualities we strive for in software design avoid precise characterization, at least in the common eye.
So I've been working to popularize, and occasionally invent, rigorous ways of speaking about software design ideas. Earlier this year, I presented the definition of abstraction. In the course and its bonus materials, I present definitions of coupling, encapsulation, and modularity.
Unlike abstraction though, dependence has been vaguely understood even by researchers. So, nearly three years ago, I teamed up with famous software engineering professor Daniel Jackson, creator of the Alloy analyzer and concept design, to figure out a definition of dependence in software engineering that explains it in all context, from basic build dependencies to thornier concepts like the idea of a trusted base in security. We published the answer two years ago in an academic conference, to much acclaim. Now you can learn the answer as well.