Technical environments are not easy to get right. Over the years I’ve seen relatively small shifts in the way environments are provisioned and configured, but one thing remained – they prove to be a constant source of issue on projects. I’m confident in saying I could go out to well over 90% of industry, ask them if they have problems with their environments and I’ll receive a resounding “yes!”, but that the issues are so universal that they are simply accepted.
The technical enablement side of DevOps has shown no mercy in addressing the issues created by environment provisioning and has clearly vindicated in its quest. The step changes resulting from addressing these issues are so significant that I firmly believe it is now becoming essential to adopt these techniques in order to survive. In this post I’ll attempt to outline some of the key issues and provide a high level explanation as to the shift in thinking when it comes to Environments.
Borrowing from the ‘Pets Vs Cattle ‘Pets Vs Cattle’’ analogy used increasingly within the industry, environments have traditionally been treated a like Pets; if something has gone wrong with them then we try to identify and fix it – patching the environments, finding the human error and addressing it, rather than just kill and replace. A primary reason for this is that environments take so long to acquire that development and test teams don’t have time to complete the admin to request, nor the days it will take to have another one provisioned; besides, even if they did, there is no guarantee that the same or a different error would be introduced that time.
In my previous post I stated: ‘In general, humans get better with repetition’. This was caveated in the footnote to be clear that I was talking about repetition of an approach, process used to solve problems, or collaboration. Where humans do not get better with repetition is when we get bored; where the task is repetitive in a way that we can switch off our brains and start thinking about chasing imaginary creatures using a phone, or that cute cat video, or… well, whatever floats your boat.
Stepping through a document selecting the correct configuration is one of those tasks where it’s easy for the mind to drift. It also takes a lot of time and resource and has to be repeated throughout the software development lifecycle; as such it is a prime candidate for Automation.
Through automation we can achieve two primary wins:
- Game changing speed increases
- Huge removal of wastage
The Speed increase is obvious, but the extent to which one can reduce wastage is best served with an analogy.
Haystacks and Environments
The traditional manual approach to provisioning and configuring an environment and the underlying infrastructure is akin to building a haystack within which to place a needle (the software application). As a result, the developers deliver their code and several days/ weeks later may be informed that it has ‘broken the build’. Their immediate response is; “it’s not my code, it’s your environment, it worked for me!” The mudslinging begins (as does the mockery, which peaked for me with this wonderful meme that anybody that has ever worked in the delivery of software can instantly identify with).
Faster feedback to developers is critical if firms are to deliver faster into live; to shorten that time from ‘customer asks’ to ‘customer gets’. Take too long and the developer has mentally moved on and has little chance of remembering the details of the feature/ bug and thus mentally they have to start all over again to fix it. Before the issue can be fixed by the appropriate team, the bug must got through a lengthy triage process to identify where the issue is.
The issue may be in the infrastructure provisioning, the configuration of the environment, a difference between production and development that hasn’t been communicated, a clash with another piece of software or a bug in the code itself. Pinpointing and resolving this requires a lot of unnecessary wasted effort.
Shortening the time between ‘customer asks’ and ‘customer gets’ is as much about what you don’t do as it is about what you do do. One must be ruthless in cutting out waste within the process.
I firmly believe in not creating the haystack before inserting the needle. Automation removes human error and delivers high quality, reliable, tested infrastructure and environments that can be delivered in minutes rather than days/ weeks. It’s worth pointing out that any automation script should follow the same principles for any other piece of code in that it is not completed until it has a batch of automated test scripts to verify it has been delivered successfully.
Areas to consider
Question to ask when evaluating your technical environments:
- Are they as close to production as economically viable?
- Can they be delivered in minutes/ hours?
- Are they exactly the same, every time, without fail?
- Can you empower your teams by delivering on a self-serve ‘on demand’ basis?
To pick out some high level benefits an organisation can gain through using automation as a way of enabling DevOps:
- Lower cost and fast deployment of applications
- Reduction in wastage
- lower triage and rework costs
- removes the need for complex scheduling and administration
- Known environment “state” thus ensuring it can be replicated if there is an issue
- Promoting collaboration between Development and Operations
- Knowing that if the application works in test, it has a higher chance that it will work in production
- Minimise the changes required as we move code from one environment to another
In years to come the idea of provisioning environments manually may well be seen as witchcraft and prehistoric. The question you need to ask yourself is, how much more are you prepared to waste before starting to address it?