I'm working on a rewrite of some existing automation - never where you want to be. My justification is that the solution we have in place is over fit -- it deliciously low maintenance on the happy path, but absurd to work with in all other circumstances. Extending it to meet my current requirements promises to absolutely suck, so I'm going the other way around, leave the existing system untouched, prove out the new approach on the new problem, migrate the old approach as circumstances demand.
One of the problems I'm trying to address; in the current implementation, it's very difficult to see the motivation behind what's going on. In my new work, I'm making a deliberate effort to write things out long hand.
Making things more interesting is the fact that I've chosen to implement the "human operator override" use cases first. Motivation: if a human must be involved, that makes the exercise appreciably more expensive. So smoothing that path out -- in particular, making it as easy as possible to remember how the contingency designs work -- is a priority even though the use is rare.
In a manner of speaking, in the first use case the human operator is acting as a surrogate for the automation to follow. As this exercise is intended to provide a surface for the user, I start with a single input field and a button with VERB written on it in large friendly letters.
I then proceed to hard code into the handler the remainder of the state required to achieve the desired result. Test. Green. Moving on...; there are two problems with the hard coded state that need to be addressed. First, it needs to be exposed to give the human operator additional control when required. I had, in fact, already run into problems with this when I tried to use as my input data that was not representative of the happy path. One simple input field and I had already managed to over fit my solution.
The second is to provide the correct provenance of the data. This begins with meaningful names, but also includes faithfully representing where in the business the data is coming from. The argument from the input control is a String, but that String is really just a representation of a URL, which provides an address for the projection I'm working with. But the spelling of the URL is not arbitrary: it in fact expresses within it details about the source that was used to create the projection, or more specifically about the instance of the process that created the source....
With the provenance written out long hand, it becomes much easier to see where the future seams might lie.
It also exposes that the existing process isn't particularly well thought out, that names are not preserved when crossing from one context to another, and quite honestly that the don't align particularly well with the language of the business as we speak it today.
No comments:
Post a Comment