Or “you learn by doing, and doing, and doing”
One of the most consistent comments I hear about cloud applications is that it fundamentally changes the way applications are written. I’m not talking about the technologies, but the processes and infrastructure.
Since our underlying assumption of a cloud application is that node failure is expected then our development efforts need to build in that assumption before any code is written. Consequently, cloud apps should be written directly on cloud infrastructure.
In old school development, I would have all the components for my application on my desktop. That’s necessary for daily work, but does not give me a warm fuzzy for success in production.
Today’s scale production environments involve replicated data with synchronization lags, shared multi-writer memcache, load balancers, and mixed code versions. There is no way that I can simulate that on my desktop! There is no way I can fully anticipate how that will behave all together!
The traditional alternative is to wait. Wait for QA to try and find bugs through trial and error. Or (more likely) wait for users to discover the problem post deployment.
My alternative is to constantly deploy the application to a system that matches production. As a bonus, I then attack the deployment with integration tests and simulators.
If you’re thinking that is too much effort then you are no thinking deeply enough. This model forces developers to invest in install and deployment automation. That means that you will be able to test earlier in the cycle. It means you will be able to fix issues more quickly. And that you’ll be able to ship more often. It means that you can involve operations and networking specialists well before production. You may even see more collaboration between your development, quality, and operations teams.
Forget about that last one – if those teams actually worked together you might accidently ship product on time. Gasp!