Blog

Six short notes on reliability, automation, security, Terraform, Docker and CI/CD. Pick the one you want to read.

← All notes
3 min read 6 Oct 2026 Reliability

Downtime is rarely just a technical problem

When an application goes down, the obvious problem is that the application isn't available.

But behind that outage, there can be a much bigger chain of consequences.

Customers may be unable to complete purchases. Employees may be unable to access internal systems. Support teams can suddenly receive a wave of tickets. Engineers who were working on planned improvements may have to stop everything and investigate the incident.

This is why reliability is such an important part of DevOps.

Practices like health checks, monitoring, automated deployments, redundancy and rollback strategies aren't simply technical features.

They're ways of reducing business risk.

A reliable system gives a business something incredibly valuable:

predictability.

You can deploy a change and have confidence that the application will remain available.

And when something does go wrong, you can detect it quickly, understand what happened and recover without turning a small problem into a major incident.

The interesting part about DevOps is that the infrastructure itself isn't the final product.

The final product is the reliable service that infrastructure enables.

That's where engineering decisions start becoming business decisions.

← All notes
3 min read 6 Oct 2026 Automation

Automation is really about consistency

One of the biggest misunderstandings about automation is that its main purpose is saving engineers time.

That's certainly a benefit.

But the bigger advantage is consistency.

Imagine a deployment that requires an engineer to manually build an application, push an image, update infrastructure, change configuration and then verify that everything is working.

It might work perfectly.

But what happens when the same process needs to happen again next week?

And again the week after?

Eventually, someone forgets a step.

A configuration is slightly different.

A command is run against the wrong environment.

A deployment behaves differently from the previous one.

Automation turns that process into something repeatable.

Terraform can define infrastructure. Docker can package an application. CI/CD can standardise how changes are built and deployed. Monitoring can continuously verify the resulting system.

The value isn't simply:

“We deployed faster.”

It's:

“We reduced the number of variables involved in deploying.”

That distinction matters.

Because businesses don't just need engineers who can make things work once.

They need systems and processes that can keep working repeatedly.

That's one of the reasons automation sits at the heart of modern DevOps.

← All notes
3 min read 6 Oct 2026 Security

Security is an architectural decision

Security is often treated as something that happens after infrastructure has been built.

But many security decisions are made long before an application reaches production.

Consider a simple AWS environment.

Should an application server be publicly accessible?

Should every service have administrator permissions?

Should secrets be stored directly inside the source code?

Should every component be able to communicate with every other component?

These aren't questions that can be solved by adding a security tool at the end.

They're architectural decisions.

A DevOps approach to security means thinking about these decisions while designing and deploying infrastructure.

Least-privilege IAM limits what identities can do. Security groups control which traffic is allowed. Private subnets can keep resources away from direct internet access. Secrets management prevents sensitive values from being embedded into code. HTTPS protects data while it travels between clients and services.

None of these guarantees that a system is completely secure.

That's not realistic.

But each decision can reduce unnecessary exposure and limit the potential impact of mistakes.

This is why “secure by design” is more than a security slogan.

The infrastructure itself should contribute to the security of the application.

Security isn't a final checkpoint. It's part of the system you're building from the beginning.

← All notes
3 min read 6 Oct 2026 Terraform

Terraform has to remember what it created

You write Terraform configuration. Terraform creates the infrastructure. So where does Terraform remember what it created?

That's where state comes in.

Your .tf files describe the infrastructure you want.

But Terraform also needs to keep track of the relationship between those resource definitions and the real infrastructure that exists.

For example, you might define an AWS VPC in Terraform. Terraform creates it. Later, you change the configuration. Terraform needs to determine whether that existing VPC should be modified, replaced or left alone.

State helps Terraform make that comparison.

Conceptually, you can think of the process as:

Configuration
What you want
State
What Terraform believes it manages
Real infrastructure
What actually exists

Terraform uses these together when creating an execution plan.

This is also why state becomes particularly important when working in teams. You don't want multiple engineers independently manipulating the same state at the same time. Remote state and locking mechanisms help coordinate those operations.

The more I learned about Terraform, the more I realised that understanding state is just as important as understanding the resource blocks themselves.

Terraform isn't simply:

“Write code → create AWS resources.”

There's an entire state-management system underneath that workflow.

And once you understand that, Terraform becomes much easier to reason about.

← All notes
3 min read 6 Oct 2026 Docker

Build the artifact once

“It works on my machine.” For years, this has been one of those frustrating phrases in software development.

A developer's machine might have a particular version of a runtime, dependency or system library. Another environment might have something slightly different. The application works in one place and behaves differently somewhere else.

Docker approaches this problem by packaging an application and its dependencies into an image that can then be run as a container.

That gives the team a consistent artifact to work with.

Instead of thinking:

“What environment does this application need?”

You can start thinking:

“What image are we running?”

That image can then move through different stages of the delivery process. A developer can run it locally. A CI pipeline can build and test it. A container registry can store it. A platform such as ECS or Kubernetes can run it.

Of course, containers don't magically eliminate environment differences. Networking, storage, configuration, permissions and the underlying platform still matter.

But Docker gives teams a consistent way to package and distribute applications.

And that's the important DevOps idea:

Build the artifact once, then move that same artifact through the delivery process. That's very different from rebuilding an application differently every time it reaches a new environment.

← All notes
3 min read 6 Oct 2026 CI/CD

CI/CD is a system for controlling change

CI/CD is often explained as “automating deployments.” That's not wrong. But it misses the bigger picture.

Software changes constantly. The challenge isn't simply getting a new version into production. The challenge is doing it consistently and safely.

A CI/CD pipeline creates a defined path for those changes. A developer pushes code. The pipeline can build the application, run tests, create an artifact, publish it and deploy it. Then the system can verify whether the deployment succeeded.

Instead of relying on a collection of manual commands and someone's memory, the process becomes documented in automation.

That has another important benefit:

change becomes visible.

You can see what was deployed, when it was deployed and which version was involved. If something goes wrong, that information becomes extremely useful when investigating the problem or rolling back.

But there's an important distinction. CI/CD doesn't automatically mean:

“Every commit goes straight to production.”

A mature delivery process can include testing, approvals, environment gates, security checks and deployment strategies appropriate to the system.

The goal isn't maximum automation at any cost. The goal is to create a repeatable path from change to delivery.

That's why I think of CI/CD less as a deployment tool and more as a system for controlling how change reaches your infrastructure.