Deployment best practice and the cloud
I have now worked for a number of years in cloud environments and in traditional environments. But something I just noticed is how much easier the cloud makes it to implement best practice in development, testing and UAT. Let me give some examples:
Best practice says that the configuration of TEST / UAT should be the same as production. I think most people attempt this in all environments, but it's very easy to accidentally do one little thing slightly differently in one environment and from then it's impossible to get them to converge again. Within the cloud you don't keep a TEST environment, you clone production whenever you want to do testing. As a result the test environment is always at exactly the same patch level and with an identical configuration in every other way.
Best practice says that the QA / UAT server should have the same hardware specifications as the production environment. That's completely impractical in a normal environment, production is high performance and high reliability because everything depends on it working perfectly. The number of additional surprises that get caught in UAT by having a perfect replica is almost never enough to justify the cost. However in a cloud environment the cost of having production mirror UAT is almost zero - just clone production and call the clone UAT. If production uses database mirroring then so will UAT - no more bugs due to slightly different database configurations.
Best practice says you should develop and test using real data. But snapshotting production for QA is a pain, especially to do regularly. Not so in the cloud, where it would be harder to boot a QA environment that differs from production than one which is identical.
Best practice says you should develop deployment scripts which automate the upgrade to the next version. Such scripts are very hard to test in a normal environment because you have to repeatedly go back to the old version as part of testing. However in a cloud environment you can easily clone production and test the deployment script as many times as necessary until it runs perfectly. You can even determine exactly how long the deployment takes, and if it will affect users during the deployment.
Best practice says you should run UAT and production in parallel for a while to validate they give identical results. That's pretty easy to do when you can just spin up another server, but next to impossible where it would mean dedicating a server for a few days just to check it gives the same results.
Best practice says you should only upgrade a few users initially to ensure everythign continues to run smoothly. I'd hate to think how you'd even start to do that without the cloud - something like a front server that redirects requests based on logins? Incidentially, this is something Xero does not do despite having a cloud backend.
Every time I've used the cloud I've been disapponted by how expensive it is, and amazed at how valuable it is during the release process. I wonder if there's a middle ground where a private cloud provides the ability to use a pool of cheap hardware while providing all of the benefits.