
Serverless removes infrastructure management from the developer's plate — but it introduces its own constraints. This article explains how FaaS and BaaS work, why the model suits custom software development, and what teams need to weigh before adopting it.
Despite the name, serverless computing does not eliminate servers. It eliminates the need for developers to provision, configure, or maintain them. The servers are still running in data centres owned by cloud providers; what changes is that their operation is entirely abstracted away from your team.
Serverless architecture splits into two complementary domains:
Function as a Service (FaaS) is the execution layer. A developer writes a small, self-contained function — a unit of business logic — and deploys it to a cloud runtime such as AWS Lambda (launched in 2014, the first commercial FaaS platform), Azure Functions, or Google Cloud Functions. The function has no persistent process. It wakes up in response to a trigger, runs to completion, and disappears. The cloud provider handles everything underneath: the container lifecycle, the operating system, security patches, and capacity.
Backend as a Service (BaaS) is the services layer. Rather than building authentication, file storage, databases, or push notifications from scratch, teams wire third-party managed services directly into their application. BaaS shifts entire categories of backend work off the team's plate — not by writing code that manages those capabilities, but by subscribing to services that already handle them.
Used together, FaaS and BaaS let a team assemble a complete backend without owning any of the infrastructure it runs on.
Understanding serverless means internalising a few principles that differ sharply from traditional application hosting.
Event-driven execution. Functions do not run on a schedule or idle waiting for connections. They respond to events: an HTTP request arrives, a message lands in a queue, a file is written to object storage, a database record changes. Every invocation is initiated by something observable happening in the system. This ties execution tightly to actual demand — nothing runs when nothing is happening.
Statelessness. Each function invocation starts with a clean slate. There is no in-memory state carried forward from one call to the next, and there is no guarantee a subsequent request will land on the same instance. Persistent state must live outside the function — in a database, a cache, or object storage. Designing for statelessness is a discipline; teams accustomed to long-running servers often need to rethink how they manage session data and shared context.
Auto-scaling by default. The runtime scales function instances up and down in response to load, automatically and without configuration. At zero traffic, there are zero instances running. Under a sudden spike, many instances run in parallel. This is not a feature you enable — it is the default behaviour of every major FaaS platform.
Pay-per-invocation pricing. Billing is calculated on the number of function calls and the compute time consumed, typically measured in milliseconds. An application that receives ten requests per day costs nearly nothing to run; one that receives ten million costs accordingly. This is a fundamentally different cost structure from reserved capacity, where you pay for uptime whether or not your server is busy.
Managed operations. Patching the OS, rotating TLS certificates, monitoring host health, tuning the runtime — none of these tasks belong to the development team. The cloud provider accepts responsibility for the platform layer. Teams own their code and their data; the provider owns everything below.
The operational shift changes the economics of custom software in concrete ways.
Faster time to production. When infrastructure setup is not a prerequisite to writing business logic, teams can begin building meaningful features earlier. A new integration or a new API endpoint can be a self-contained function, independently deployed and independently scaled. This separability keeps deployments small and reversible.
Cost aligned to usage. Custom software built for a growing business often carries uneven traffic — low in the early months, growing unpredictably over time. A pay-per-use model means early-stage systems carry minimal infrastructure cost, and that cost grows only as the product does. There is no need to overprovision capacity for anticipated future load.
Reduced operational surface. The serverless model removes entire categories of operational work. Teams do not need to staff for server maintenance, OS upgrades, or capacity planning in the traditional sense. For product-focused teams — particularly smaller ones — this is a meaningful reduction in cognitive load and ongoing cost.
Independent deployment of capabilities. Writing single-responsibility functions means individual capabilities are deployable and versioned independently. A change to an order-processing function has no coupling to a notification function. The architecture reinforces the kind of separation that makes systems easier to change over time.
A clear picture of serverless requires acknowledging its real limitations.
Cold starts. When a function has been idle long enough for its container to be reclaimed, the next invocation must wait for the runtime to initialise a new instance. This cold start introduces latency ranging from tens of milliseconds to over a second, depending on the language runtime and the function's dependencies. For latency-sensitive workloads — login flows, real-time APIs — this can be a genuine problem. It is mitigable with provisioned concurrency, but that partially restores the always-on cost model.
Vendor lock-in. Functions deployed to AWS Lambda use Lambda-specific configuration, IAM roles, event source mappings, and SDK conventions. Migrating to another provider — or back to a container-based deployment — requires rewriting the interface layer and rethinking event routing. Frameworks that abstract across providers help reduce this coupling, but they add their own complexity and do not eliminate it entirely.
Observability is harder. A traditional server gives you a clear unit of observation: one process, one log stream, one set of metrics. A serverless system may fan out to thousands of concurrent function instances, each producing its own trace. Assembling a coherent picture of a distributed invocation requires structured logging, distributed tracing, and tooling built for the purpose. Teams that treat logging as an afterthought find debugging production issues in serverless systems significantly harder.
Not every workload fits. Long-running processes, workloads requiring persistent TCP connections, tasks with significant warm-up costs, and jobs that process large amounts of local state are all awkward fits for the FaaS model. Maximum execution durations — AWS Lambda currently allows up to fifteen minutes — rule out certain batch-processing patterns. The model works well for discrete, bounded tasks; it works poorly for sustained, stateful computation.
The fit is strongest when:
Teams with strict latency budgets, highly stateful workloads, or regulatory requirements around data residency and vendor dependency should evaluate the trade-offs carefully before committing. Serverless is not a universal default — it is an architectural model that suits a particular class of problem well.
The operational discipline the model imposes — stateless functions, event-driven design, single responsibility per unit of code — is sound regardless of the deployment target. Understanding those principles clearly is what allows a team to decide whether serverless is the right choice, rather than adopting it because it is fashionable.