Welcome back to Not So Random Software. This week’s links are dedicated to Automation and how we can keep a healthy relationship with it.
A random article or paper
In an automated system two roles are left for the human operator; (a) monitoring that the automated system is working correctly, and (b) taking over control if it isn’t. Unfortunately operator’s skills decline over time — because of lack of continuous practice — and the situations that require human intervention are the ones the machine can’t handle, by definition the most demanding ones. This article greatly summarize the paper Ironies of automation (Bainbridge, Automatica, Vol. 19, No. 6, 1983) where these challenges are described.
A random video or podcast
Easy choices are often the cause behind complex systems. To build Simple systems — the ones you can understand and reason about — you need to be constantly fighting the urge to take the easy choice to unlock the design insights that will lead you to a simpler solution. This talk by Rich Hickey, the creator of Clojure, explains the tradeoff in great detail.
A random book
In Shape Up, the author Ryan Singer describes how work is organized at Basecamp to take back control of Software development activities. One of my favourite hightlights is the work hill analogy where you separate the discovery phase from the execution phase. For that, a picture is worth a thousand words.
A random tool
Cooking; you either love it or hate it. When done with friend or loved ones on special occasions that’s one of the most fulfilling things you can do in life. But the remaining 90% of daily routine meals…well I just don’t find any value in it. I receive close to zero happiness as a result of my Wednesday work lunch meal. We might be far away from automating cooking, but this year I found Instant Pot. It is so good that feels like cheating.
A random line of code
If you are working in Ruby and you want to execute some code around another piece of code — for example log statements — you might be tempted to do something like this;
1 2 3 4 5 |
def call puts "Start API call" APIClient.new.call puts "End API call" end |
If the surrouding code is complex enough to distract you from the main goal of the method, try this instead;
1 2 3 4 5 6 7 8 9 10 11 |
def call with_logging do APIClient.new.call end end def with_logging puts "Start API call" yield puts "End API call" end |
A random quote
Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.Kernighan’s Law