Back in the 80’s, Fred Brooks wrote a wonderful paper “No Silver Bullet: Essence and Accident in Software Engineering”. Every software developer should read it, but not before you finish this essay, so I’m going to summarize: “The best way to improve programmer productivity is not to do things someone else can do for you.”

We’ve gone from owned servers in owned air-conditioned aquaria to virtual server images: we turn all the hardware over to companies like Amazon and Google. Similarly, we’ve moved from handwritten applications behind web servers to frameworks like Django and Ruby on Rails and JavaScript frameworks in the browser: we turn the common parts of all web applications over to the frameworks.

Until recently, though, even with cloud-based applications we’ve looked at the world in terms of servers that we managed more or less the same way we always have, even if they were now virtual machines running in Seattle or Mountain View.

The next step is “FaaS” — Function as a Service, for example with Amazon Lambda or Microsoft Azure’s Functions. You don’t manage, or pay for, even those virtual machines — instead, you provide code to perform your business functions and your provider launches that code for you, only charging you for the resources you use while it’s running.

In general, the basic requirement for this code is that it be ReSTful: it exposes its functions to the world through the HTTP(S) protocol, and it doesn’t preserve any session state between invocations. Web applications based on using FaaS are called serverless — which can be confusing, since there certainly are servers involved. The difference is, they’re someone else’s servers.

Serverless applications depend on what can be called the JAM stack: JavaScript, APIs, and static Markup. A sequence diagram for a serverless JAM application might look like this: