The Impractical Engineer

Stumbling Toward Better Software Engineering Since July 2025.

This Month

Welcome to the third month of the Impractical Engineer! I’m your host and editor, Onorio Catenacci.

It’s July, a time to celebrate our freedoms and enjoy outdoor activities with friends and family. Also a time to sit indoors and read the musings of a certified (and certifiable) nerd.

A word about content. While I’ve titled it “Book Reviews Dept.” my writing in that particular section of the newsletter has always been more about drawing people’s attention to what I consider are worthwhile books and other resources. So even though I’ll continue to call it “Book Reviews” I won’t feel compelled to solely talk about books.

This month we’ve got a video review, another puzzle (with the solution to last month’s puzzle), a little bit of basic software engineering discussion, and some other goodies as well. Hope you enjoy and, as always, I consider feedback a gift so if you care to gift me with your feedback I’d greatly appreciate it!

Book Reviews Dept.

A Review Of:

Simple Made Easy by Rich Hickey

Yes, because Onorio cannot stick to reviewing technical books when there are so many other resources that are worth your time, this month I’m reviewing one of the best software development talks I’ve ever seen. Rich Hickey’s “Simple Made Easy” from the 2011 Strange Loop Conference.

I’ll say right out—I’m sort of a Rich Hickey fanboy. The man is one of the best public speakers I’ve ever heard and I don’t say that lightly. Beyond that he’s devised, to my mind anyway, one of the best languages to branch off of the LISP/Scheme tree; Clojure.

So why should you watch this talk? The first thing Hickey does is to explain the difference between “simple” and “easy”. Many of us conflate the two terms; they seem synonymous to us. They’re not synonymous and it’s very important to understand why, in fact, they’re somewhat at odds in terms of the goals that software developers strive to achieve.

Another great point that Hickey makes is that “easy” is relative. While I might think that speaking Italian is hard (since I don’t speak Italian) I’m sure my distant cousins in Italy would disagree with me. In the same way we must be careful to avoid assuming that because we struggle with some concept or idea that it’s inherently “hard”.

One of the most important points he makes in this talk (and it seems especially prescient given the current rush to use AI everywhere we can) is “We can only hope to make reliable those things we can understand”. If we forego building our own understanding and instead give it over to AI, we’re setting ourselves up for something worse than failure.

In short do yourself a large favor. If you’ve never watched this talk, watch it. If you have watched this talk, watch it again. There is so much that’s worthwhile in this talk it’s worth revisiting repeatedly!

5 out of 5 stars.

Puzzle Dept

Puzzle

June’s Puzzle:

You are an adviser to the king; the king has acquired three magical glass flasks and he’s asked you to determine if they are all using the same unit of measure. The enchantment on the flasks is rather unusual; you can pour any liquid into any of the flasks as often as you like. But every time you pour from one flask to another you risk the enchantment being broken so you want to avoid pouring between flasks as much as you can.

If you count pouring liquid from one flask to another as a “pour” and you don’t count filling the flask initially as a pour what’s the fewest number of pours you need to determine if the beakers are commensurate (that is using the same unit of measure)? You can also assume that you can fill each flask to the rim and that no liquid is ever spilled.

First fill the “2” flask. Pour from the 2 flask into the 10 flask. Fill the 2 flask again four more times each time pouring into the 10 flask. One of three things will happen.

A.) The 10 flask is filled to the brim. 2 and 10 are commensurate because five times the 2 flask is 10.

B.) The 10 flask overflows. 2 and 10 are not commensurate.

C.) The 10 flask is not filled to the brim. 2 and 10 are not commensurate.

If scenario C comes to pass then you’ll want to fill 10 to the brim. Otherwise, pour the 10 flask into the 5 flask. Then empty the 5 flask and pour the rest of the 10 flask into it. Again, the same three possibilities are present. If A comes to pass then all three flasks are proven to be commensurate. Hence the answer is that seven pours (between flasks) are required to check if the flasks are commensurate. If you came up with a different solution or if you think I’ve solved this wrong, please let me know!

July’s Puzzle:

“The shortest distance between two points is a straight line.” That particular bit of geometric observation is credited to Archimedes, the ancient Greek polymath and scientist. I was a bit surprised to find out that he’s credited with saying it; I had always expected it to be something from one of Euclid’s Elements before I looked up the details of the quote.

This month’s puzzle poses a slight variation on this ancient bit of geometry. For the following discussion, apologies in advance to any mathematicians who may see this because I’m going from my memory of high school geometry.

The line between two points a and b is signified ab. Now if there is an impenetrable barrier between a and b (let’s say it’s another line called cd), what is the shortest distance between a and b? Remember you cannot directly connect a and b. For sake of easing the solution of this problem you can make some assumptions about the geometry of ab and cd.

July Puzzle

What’s Happening Dept

Selected Conferences and Event Calendar

Date/Time

Event

Location

RSVP/Details

4 - 8 August 2025

Visual Studio Live

Microsoft HQ

Redmond, WA

Visual Studio Live

27 - 29 August 2025

ElixirConf US

Renaissance Orlando at Seaworld

Orlando, FL

ElixirConf

2 - 5 September 2025

RustConf 2025

Seattle, WA

RustConf 2025

4 - 5 October 2025

(fifteenth RacketCon)

UMass Boston

Boston, MA

(fifteenth RacketCon)

12-14 November 2025

Clojure/Conj

Charlotte Convention Center

Charlotte, NC

Clojure/Conj 2025

10 - 13 November 2025

KubeCon + CloudNativeCon North America 2025

Atlanta, GA

KubeCon + CloudNativeCon

I know there are a lot more interesting events in the world and if you have more events you’d care to add please send them to the editor.

Last Minute Additions:

These items came in right before my publication date . . .

Care to help shape CodeMash 2026? Take their survey and help them to figure out what folks want to see!

Like Rust? My friend Xander Cesari (apologies if I spelled your last name wrong Xander!) who’s been leading a couple of local Rust meetups is doing a bit more to link folks who like Rust here in Michigan and beyond. Check out his Rust Midwest community!

Learn Software Engineering Dept.

Coupling

Along the same lines as the excellent talk I’ve linked in my “Book Review” this month, I’m going to try to explain some basic software engineering terminology.  I’m always interested in learning more and exposing my ignorance to the public is a great way to learn. The (relatively) old saying is true; if you want the correct answer to a question, post the wrong answer online and you’ll have the right answer in 12 seconds flat.

I ran across the notion of “coupling” in Steve McConnell’s seminal work on software engineering Code Complete.  The term coupling was coined by Larry Constantine who was the originator of several terms which we use in discussing code quality and software engineering. 

I can guess that probably a few of my readers will be familiar with the term but I’ll define it anyway just to ensure we all have the same understanding of terms.  Coupling is a way of discussing how interdependent two parts of code are.  You might think of it as a shorthand way of saying—if I were to move this (function/module/class) to another code base, how much other code would I need to take along with it for it to compile?

I don’t know about anyone else but a concrete example usually helps me to grasp a concept so here’s some pseudocode to help illustrate my point:

fn CalculateSalesTax(grossSales: float) : float

{

grossSales * salesTax

}

Again just to ensure we’re all understanding things the same, this is a function that takes a gross sales amount as a floating point value and returns the sales amount with sales taxes included as a floating point value.

If we were to move this code to a different source file, it’s pretty straightforward except for one thing. We need to know the definition of salesTax.  The definition of CalculateSalesTax is coupled to the definition of salesTax. It shouldn’t be terribly hard to fix this particular bit of code so the coupling is relatively loose.

Now let’s consider what might be a slightly more realistic scenario:

fn CalculateSalesTax(grossSales: float, state: string) : float

{

grossSales * getSalesTaxRate(state)

}

Now if we were to move this code to another source file we cannot simply move the function in isolation; we also need to find the definition of getSalesTaxRate and move that too.  Slightly less loosely coupled but nothing insurmountable either. 

It’s worth noting that it’s not just an issue of needing to pull a definition across.  Most languages support constants–that is names bound to values that are usually visible to every part of the code but are unchangeable.  This is extremely useful for things such as error codes and things of the like.  But consider that the only difference between a global variable (bad) and a constant (good) is that the former is writable anywhere in the code but the latter can only be read and not changed. They’re both forms of coupling but most experienced software developers avoid global variables like an IRS audit and with good reason.  It doesn’t take many global variables to make a code base incredibly hard to maintain. 

Now if you look up coupling on Wikipedia you’ll see there’s a whole taxonomy of types of coupling involving code.  And that’s important to be aware of.  While avoiding coupling is a good thing like any good thing it can be taken to unhealthy extremes.  In many ways, avoiding coupling is the opposite of “don’t repeat yourself”.  That is, to avoid coupling we’d need to repeat certain parts of the code over and over. We use coupling when we use library routines provided by a language or an OS. We’re coupling our code to their implementation of something.  It’s a rare case when this becomes something we need to concern ourselves about so we mostly ignore the coupling and get on with our jobs. Again, sometimes decoupling code will lead to duplication. As far as I know there’s no golden guideline on how much decoupling is good and how much is simply creating extra code in a misguided effort to avoid any coupling. 

Humor (We Hope) Dept.

Lately I’ve been reading books on what folklorists are now calling “wonder tales”—what most of us call “fairy tales.” And so I thought I’d try my hand at a little wonder tale aimed specifically at developers. I hope you enjoy it!

The Coder And The Elves

Once upon a time in a large corporation there was a software developer named Joan. Joan was abused by her evil step-supervisor, Steve. Joan always tried her best to please Steve; she wrote unit tests, she documented her code, she avoided hacky solutions. Nothing she could do would please Steve though and Joan was very unhappy.

One day Steve approached Joan’s desk; this was in the days prior to the great plague! “Joan”, he said, “we’ve got to create a new screen for the finance team! How soon can you have it done?”

Joan looked up from the code she was working on and said “What does it need to do? How many fields will be on the screen? I need some details before I can figure out how long it will take!”

“Poppycock!” Steve replied. “You developers always make things so complicated! Just look at one of the existing screens. It shouldn’t take you more than an hour or two! Let me know when you’re done!” And with that Steve strode away in order to schmooze the prince of the IT department.

Joan decided to get herself some coffee and was sitting and quietly weeping by the coffee maker when she heard a tiny voice say “What’s wrong Joan?” Thinking that one of her coworkers had seen her crying and feeling quite embarrassed she dried her eyes and looked around. But she couldn’t see anyone. “Who said that?” she asked.

“I did!” And at that a small man with a white beard down to his waist appeared on the table at which she was sitting. “I’m a coding elf and I’ve seen how badly Steve treats you! So my coding elf friends and I are going to help you! Don’t worry at all Joan; we’re going to create that new screen for the finance team and we’ll have it all done when you come back to your desk!” And with that he vanished.

Joan thought she must have fallen asleep and been dreaming or that perhaps she had started to lose her mind but since she saw no harm in simply sitting and trying to figure out where else she could get a job she didn’t bother to return to her desk.

Later, having decided on a short list of other places that she could apply to, Joan returned to her desk. To her great surprise the screen was finished and already checked into version control! And even more startling the elves had left her a keyboard of solid gold.

Just then Steve walked up. Not paying any attention to Joan or her solid gold keyboard he said “How’s the new screen coming Joan? Done yet?”

Joan smiled and said, “Yes it’s done and I’ve already checked it in! Take a look!”

Steve examined the work of the coding elves and Joan waited anxiously for the verdict. A moment later Steve looked up. “Joan,” he thundered, “that screen is all wrong! We can’t use it at all! Fix it and hurry up! I promised the finance team you’d have it done by 4 pm and it’s already 3:30!” And he stalked off.

Joan was quite puzzled. Hadn’t the coding elves been able to work their magic? Since the rest of her team was at the mandatory company happiness ball, she was alone. So she said out loud “Oh elves! I know you were trying to help but you’ve made things worse than ever!”

Just then the little man appeared sitting on her desk. “What did you expect Joan? You had no requirements, no list of fields needed on the screen, nothing! We can only work so much magic!” And then he promptly vanished.

So Joan sold the solid gold keyboard at a handsome profit and decided to change careers to the much less stressful job of being a test pilot for Boeing. And she lived happily ever after until her fourth test flight but that’s a story for another time!

Feedback Dept.

If you’d care to share

  • feedback

  • suggestions

  • events

  • questions

or anything else, please contact me, Onorio Catenacci, editor of the Impractical Engineer at my email.

If this newsletter has been forwarded to you and you like what you see and you’d like to see more please subscribe at https://impractical-engineer.beehiiv.com/subscribe. It’s free and it’s very simple to unsubscribe should you decide it’s not for you.

And if you’re a subscriber and you’d like to do a small favor for the editor, please share this with your developer friends!