Rugged Tooling: Forget AI - Integrate Human Intelligence

Search for a command to run...

No comments yet. Be the first to comment.
Why Least Privilege Security Engineering Is Frequently Skipped or Done Loosely In a previous life, I was on a team that reviewed the IAM policies specified by developers when they created new Cloud applications or required additional permissions for ...

Obscuring sensitive information like AWS account IDs in screenshots and videos is tedious and error-prone. Even with video editing tools that simplify the process, I still have to repeatedly add and remove blurring boxes as the view changes. You know...

AWS CloudShell joins the ranks of hostless shells for operating in your cloud environment. Cloud shells are a huge help to training and enablement scenarios because they remove the pain of fussy configuration of a user-owned endpoint - which can have...

This article is the third and final of a series. Part 1 justified that human-performed DevOps checklists are essentially source code, and according to GitOps principles, belong in Git just like any other code required for successfully managing a soft...

There are always those who feel checklists are an unnecessary waste of time because they think they can always remember the basics of the steps involved to complete a task. Many are also not aware of the huge, cross-discipline benefits that can come ...

I lead a team that builds highly shared, deep-in-the-stack automation at a large SaaS company that has many software stacks in AWS. This automation includes things like installing security scanners, log collection agents and monitoring agents - all for both Windows and Linux.
I inherited a lot of this code and was working together with a team member and a technician from the software company for one of these agents that was giving us trouble, when I realized we could improve the ruggedness of our code significantly!
In a 45 short minutes we learned a ton of things about how the agent registration worked as well as commands to reliably troubleshoot various failing behaviors we were seeing.
We had made some notes about how to do these steps and I was contemplating the best way to share them with our team. But I also wanted to share them with our development end users so they could be more productive and not have to engage us every time their configuration was failing in some of these self-diagnosable patterns.
While I welcome every opportunity to learn where my team’s code does not work as intended, I loathe the mind numbing monotony of repetitively performing identical troubleshooting steps just to learn that the root cause of the problem is some simple misconfiguration outside of our code.
A simple, but recurring example is that the API endpoint and port for registering the agent is not available because it was mistyped or networking is mis-configured.
As I was struggling with the prospect of escalations as a form of training the hundreds of developers we support, it hit me like a ton of bricks.
My entire job is about taking super repetitive tasks done by humans and get the automation to do them - because the computer does not care how many times it does something and does not lose focus like humans do.
And here I am repetitively doing the same steps over and over to come to very similar conclusions each time with different users of the tooling code.
After this realization we did two very simple things. First, we examined each troubleshooting step and we asked - “Can this step be coded right into the automation?”
A second action was equally important - logging the results of these steps - including successful outcomes. Logging must be used to expose results if the embedded intelligence is to deliver maximum value. By definition, tooling will first be debugged by a developer or development team who is trying to use the tooling.
The value of intelligent logging for tooling is multiplied because it means the logging is more likely to be sought out, reviewed and corrective action taken without a cross-team escalation. Intelligant logging also generally means better initial root cause determination by development users because: a) they can see what basics are being checked and can rule out those causes without effort, which b) gives strong hints and motivation on what to check next for root cause.
Earlier I mentioned that our intelligent logging includes logging positive test results - this brings strategic benefits including:
Code that lacks success logging for the sake of brevity is nicer to look at - but it is an area where brevity is an overall anti-pattern to robustness. If your code is truly of a tooling nature, your log messages will undergo human review much more often than the code itself.
We also follow some additional principles when deciding what and where to log:
Code reasonable troubleshooting queries even if you can’t imagine a failure condition in your specific implementation (e.g. testing the registration url even if we control the default data value given for the url)
Good troubleshooting code also helps with future automation development mistakes in the code or input data. For instance, maybe the data values received by your code are under your control, but at some future time someone mistypes a configuration value. It’s much better that your own code reveals this mistake during your automation development cycle than making it to prod.