These days the world is abuzz with talk of cloud computing. Many of the more experienced developers out there chuckle at the term cloud computing. No one seems to know what cloud computing is, exactly, but everyone seems to be talking about it, offering services around it and has a great new idea for how to revolutionize something using it.
Anyone who made it through the tech world of the nineties will be all too familiar with diagrams like the following:
Note the internet cloud. The cloud symbol, in PowerPoint diagrams everywhere, always meant "something complicated that just works". It might be the internet. It might be the phone network. It might be some other opaque process that you just don't care to explain in detail.
At its core "cloud" means "ambiguity". That's why it's a cloud. Just like a foggy road at night: you can't see through it and you can't understand it. However, the more subtle meaning of the cloud icon is that it's reliable. You don't know how it works or why but you know that the arrow goes in one side and comes out the other and you can rely on that behaviour.
This is what we mean by cloud computing. It's reliable and it's a black box. It doesn't matter how it works or what it does as long as it continues to work. That's someone else's problem. I'm sure they have detailed diagrams somewhere that explain how the cloud works (and those diagrams probably have OTHER clouds in them for services they depend on that just work that they don't feel like explaining).
What else does it mean?
Cloud computing has come to mean something a bit more detailed. In fact, there are more detailed terms to talk about all the various things cloud computing is. It's more of a collective term to describe a variety of services for modern computing needs. You may have heard of SaaS aka "Software as a Service". Then there's IaaS, PaaS, and lots of other *aaS things out there. The key part is "as a service". The service part means someone else does it for you so you don't have to.
There's storage in the cloud, music in the cloud, friends in the cloud, applications in the cloud. There are services out there, on the internet, that do things for you so you don't have to. They organize and store your music for you and give you access to it from anywhere that has an internet connection. They can even suggest new music for you that you haven't heard about. They can do that with movies too. Great! No need for CDs, video tapes, VCRs, etc.. No more self-managed media access/devices. There are email services so you don't have to run a local Exchange server. Yada yada yada.
A while back the computing world was obsessed with parallel programming. Actually, we still are but people aren't talking about it quite as much as they were a couple of years ago. Why was it such a big deal then? We kind of hit a wall with Moore's Law. Processors couldn't get significantly faster, so code had to either get faster or more parallelized. Not everything can get faster or be parallelized but usually things that can't get faster can get parallelized.
However there are quite a few programming problems which could be parallelized but weren't. Those things became known as "embarrassingly parallel" problems (note: this term has been in use for a LONG time, far before a few years ago). Embarrassing, IMO, because they should have been parallelized from the beginning because they are so well suited to parallelization. The fact that they weren't parallel already meant we just didn't care about efficiency because Moore's Law made efficiency seem pointless to spend time on.
This should also be applied to cloud computing and we can use the term "embarrassingly cloudable".
What are Embarrassingly Cloudable Problems
Every product that exists and thrives in the internet ecosystem needs a host of services to play well in that environment. At the basic level, it needs a machine with an OS to run on, network access, possibly a database to store information in, possibly a runtime environment like the JVM, CLR, or Ruby. Those things are the core services offered by the IaaS and PaaS offerings we have today. But we can take this a bit further… what about user and identity management? What about social networking? These are all things we want to have in every application on the internet but end up re-writing OVER and OVER again and never see the benefit of "economies of scale" that a centralized resource would have.
A list of some common embarrassingly cloudable problems:
- Operating Systems
- Networking and Network Security
- Configuration Management
- Continuous Integration and Automated Deployment
- Databases and File Storage
- User and identity management and authentication
- Social graphs and networking
- Performance Management/Monitoring (thanks @bobuva)
- Routing, proxying and cacheing
Take a moment and think through your current product/project. How much of what you spend time on could be moved into a "cloud-based service" (aka, something you didn't write, you don't manage but fulfills its function reliably and in a generalized multi-tenant manner)? What pieces are cross-cutting through numerous applications? You might be surprised that there is probably already a service available to replace that for you.
Don't repeat yourself and don't waste time managing things that aren't part of your company's core competency or aren't relevant to your product's primary differentiators. Don't roll your own. If you are, you should be embarrassed.