Cloud Computing is the latest trend in the world of computers. The term refers to where computation is done. The Cloud is this thing, somewhere out there, on which your programs run - you don't need to know where exactly, but don't worry, it's out there alright. You also don't need to worry about whether there's enough resources or how you're going to manage those resources. The Cloud is this layer of abstraction that hides away all that dirty work; you just give it your program and it'll worry about finding the resources to run it. Sounds great doesn't it? Well, this wouldn't be a Terrifying Tech Tale if there wasn't something amiss.

Fundamentally (and by that I mean at the very core of the whole computation process), there isn't anything particularly new about how a Cloud is set up. Traditionally (and really presently, as many entities are still in the process of migrating to the Cloud), an entity (be it a company or otherwise) would maintain a data center filled with computers and disks. These computers play the role of servers. A Server is a computer that is set up to listen (over a network, such as the Internet) for requests sent by clients. Clients are computers that make these requests - when you go to https://www.google.ca, your computer is a Client making a request to a Google Server; the Google Server sends back HTML that the browser on your computer renders for you. Any interaction you have on the browser essentially boils down to your computer making requests to some server somewhere; even the JavaScript that runs on your browser had to come from some Server1. When an entity is "on the Cloud", it does not change how you, the client, request and get data; it changes how the entity, the server, responds to and provides you the data.

Traditional servers were (are) these big monolithic programs that do all the things you need a server to do, such as listening for requests, processing requests, interacting with the database, doing any necessary computation, sending data to the client, and so on. However, this model, while technically implementable on the Cloud, is not in line with the spirit of the Cloud. The program model that is more in line with the Cloud is Microservices, which essentially means breaking down the big monolith program into smaller components. Additionally there are several Cloud Computing service models. They include Infrastructure as a Service (IaaS), Platform as a Service (PaaS), Software as a Service (SaaS), Serverless Computing, and Function as a Service (FaaS). You'll notice that there's a lot of "Service"s. This is the core of what Cloud Computing means. Things are implemented as services so that your workload can be scaled up and down dynamically on an as needed basis. I said "Things" on purpose - Software, Virtual Machines, Servers, Services, and even Hardware resources are provisioned dynamically to minimize cost and maximize output; any part of the computation process at any level can be turned into a service.

So what exactly is the problem here? If resources (at any level of abstraction) can be made to be provisioned dynamically, then why is this a bad thing? Well, the idea of the Cloud isn't a bad thing in and of itself. The problem comes from the inherently opposing ideas of code reuse and reinventing the wheel. There are a few companies out there (Amazon, Microsoft, IBM, etc.) that are Cloud Providers; they take on the pain and hassle of maintaining the real machines that the Cloud runs on - after all the Cloud boils down to real programs that run on real machines. These Cloud Providers provide access to their Cloud, as well as software that runs on their Cloud; this software can either be used to deploy traditional applications, or it can provide hooks and APIs for programs that have been redesigned/newly developed to run on the Cloud. The value for non Cloud Provider companies is that they don't have to worry about machine resources - they buy resources from the Cloud Providers and deploy their software there. They could develop their own full Cloud Stack (Machines, Infrastructure, Software) and spend scads of money on it, dealing with maintenance and bugs that come out of it, or they could go out there and use someone else's Cloud for a fraction of the cost.

This means that you no longer know where your code is running, nor do you know where your data is. It's there...somewhere...on some machines that the Cloud Provider has. In a sense, it's out of your control. What happens if that Cloud Provider has a data breach? How do you guarantee your data isn't compromised? The way some (affluent) companies deal with this is by having a Private Cloud. A Private Cloud is a Cloud instance that runs on machines that are controlled by the company itself; these companies have to put in the effort of getting some Cloud Provider's (or perhaps even their own) Cloud software installed and configured to manage their resources - it also means the company needs to be able to buy and maintain this data center full of machines. A non-trivial number of companies cannot afford (or are unwilling) to have a Private Cloud. So, they work with the Public Cloud, trusting the Cloud Provider to continue to do the right thing - or continue to not go bankrupt.

And therein lies the scary part of the Cloud - the data of many is dependent on the discipline and success of a few. To put it bluntly: there is no Cloud, just someone else's computer.

The Cloud has become ubiquitous in our world. However, it is important to not get too dependent on it. It's nice to use things like Google/Apple Cloud for the convenience it offers, but we should always have offline backups. We should also be careful not to put compromising or sensitive data on a system we have no control over. As with everything in life, it's about being cognizant of the context and situation.


1. Amusing side story, some websites would send over JavaScript code that mined for Bitcoins; because the code runs on your computer using electricity that YOU have to pay for, they were able to essentially mine Bitcoins for free.

Resources:
https://en.wikipedia.org/wiki/Cloud_computing