# Progressive Delivery, Platform Engineering, and AI-Driven CI/CD

**Podcast:** The Pragmatic Engineer Podcast
**Published:** 2026-06-17

## Transcript

CICD remains one of the hardest things to get right in software engineering.
But why?
Rob Ayers is a CICD expert, having worked in this field for more than a decade.
In the early 2010s, we were teammates on the Sky4Web team, and then Rob joined Octopus Deploy as one of the first engineers 10 years ago.
In today's episode, we cover progressive delivery and practice, canary deployments, blue-green, and why feature toggles are often still better.
What is GitOps and why it's not about Git, and where that everything in Git mindset breaks down.
why you should prioritize rollbacks less and focus on roll forwards, and many more.
If you want hard-earned lessons about CICD, progressive delivery, and what's coming as AI changes how much code we ship to production, then this episode is for you.
This episode is presented by Antithesis.
Verify your system's correctness without human review or traditional integration tests and avoid bugs or outages.
Today's episode will be about CICD.
CICD at scale is one of the hardest infrastructure problems to get right, and the teams who nail it know that the details very much matter.
This is where I need to mention our season sponsor, WorkOS.
WorkOS brings the same rigor as many of us use with CICD at scale to Enterprise Auth.
SSO skim are back, production-ready, battle-tested, and built to handle real load and real compliance requirements.
To add Enterprise Auth without the infrastructure project, visit workos.com.
Rob.
It's awesome to have you here on the podcast.
Hello, Gurgay.
It's good to be here.
I'm loving Amsterdam.
Yeah, it's been like, what, 11, 12 years since we worked together?
Yeah, I think 2015, 2014, 2015, I think I left UK.
Yeah, it's a while.
And Skype, when there was still Skype.
Our team somehow inherited.
the Outlook.com plugin, which had like 400 million users per month or something like that.
Yeah, it was crazy.
It was massive scale.
So this was an interesting job.
Deployments were very much a case of, you know, you ship once a week and you have to go to a CAD board, you know, a change advisory board.
You have to get sign off and approval.
And I always found that really weird, right?
Like we're building this piece of software.
It runs on the web.
We can ship it whenever we want.
It was running on Azure at the time.
And so, you know, we've got full access to push whenever we want.
We make these changes through the week, but we'd kind of have to hold them back.
I guess to Adela, our manager, both of our managers at the time, we kind of, I guess, worked around the system.
When the code was ready, we'd build it and ship it through the week.
And I was really sort of impressed and proud at this process that the whole team had kind of put together, right, where we'd commit the code, the test would run, several kind of layers of testing that would go to staging, et cetera.
And then...
it would get shipped to production.
So we're kind of, I guess, executing a form of, I guess, you know, continuous delivery at the time.
And we would then ship ourselves, you know, once a week.
I kind of always like to tell the story that at the time, you know, when we'd have a build ready to go, you know, we do a form of canary deployments.
And so this is where you kind of roll out to a small percentage of your customer base.
And we always found that the customer base that would be our test subject was New Zealand.
So New Zealand was always our canary.
Yep.
A bunch of reasons for that.
You know, they're in the first country to kind of reach this new date.
So they're always the first ones to kind of roll out into a time.
When it comes like, you know, like midnight passes, it's like 1 a.m.
First country is New Zealand.
Bang, exactly.
So the first country that's of, you know, significant size.
They speak English.
So if there's any bugs or issues or reports, it's kind of easy to understand.
But...
You know, to be honest, New Zealand is small enough that no one really cared if we shipped a bug and had to fix it quickly.
So sorry to all the New Zealanders listening.
But yeah, I think that's kind of this good example of using a continuous delivery technique to, you know, ship the code faster than what we otherwise could have if we had these kind of big bang releases.
And this whole process, I guess, opened my eyes to, you know, what progressive delivery, what good CICD could be.
And yeah, I guess from there, I spent a few years there.
at Skype and eventually wife and I decided it was sort of time to come home to Australia.
And then back in Australia you went to start to work at Octopus Deploy?
Yeah eventually I came back and actually worked at a place with a friend of mine just for a little while just to kind of get back on the feet and I remember they were using Octopus Deploy there and so Octopus Deploy for those who don't know is a deployment tool that was built and sort of developed originally in Brisbane so it was a strong kind of Brisbane Attachment.
Attachment to it.
Yeah, that's right.
So when I found out that they were hiring, I thought, okay, why not?
I'll give it a go.
I like CICD.
I like this space.
I think there's, you know, a lot of interesting problems in this space.
So applied and joined.
And at the time I was employee, I think employee number eight or nine or something like that.
So it was very much still a bit of a startup culture.
Definitely not startup in the sense of, you know, Silicon Valley wild parties and, you know, ridiculous spending, but startup in the sense that everyone who I worked with was an engineer.
Now even.
Paul Stavell, the CEO, he's an engineer.
This is kind of where it started from.
And so we'd all be working on code together.
I mean, if someone had an idea, you'd have a bit of a chat about it and ship it.
So we were the marketing, we were support, we were kind of a bit of everything.
And yeah, obviously the company has grown a lot since then.
The company was focused, Octopus deployed from the start, they were focused on deployments, right?
Can we talk a little bit on whenever I think about...
I always say CI, CD, Continuous Integration, Continuous Delivery.
Why was there a focus on deployments?
And is that the same as continuous delivery?
Yeah, interesting.
So you're right.
Like quite often people talk about CI and CD as this kind of interchangeable.
They're either interchangeable or the word is CI, CD.
It's just attached to itself.
It's hard for me to imagine a CD without a CI, Continuous Integration.
That's right.
And I guess the way to look at it is...
You know, you've got sort of multiple stages of maturity of software teams as they kind of move on their way from, you know, initially CI, which continuous integration.
This is the idea that...
Well, initially it's YOLO.
Initially it's YOLO.
Yeah, that's right.
You're all in a launch, you just deploy to prod or SSH into prod.
Or you used to.
We've all worked in places where we've done that, and that's the starting point.
So you're right, YOLO is the first stage.
The second stage is, you know, continuous integration.
And so this is this idea where...
You want to keep integrating, merging your code changes into a single branch, and you want to be continually running tests against it.
Now, continuous delivery is kind of the next stage where, you know, we talk about testing our code and there's, you know, unit tests, integration tests, et cetera.
But what you also really need to test is your deployment process itself, right?
So continuous delivery is this idea, okay, you want to make sure that at any point in time, when I click the button to deploy, I want it to go to production once we kind of get to this place.
The next stage beyond that, which not all companies necessarily reach, is continuous deployment.
So this is the idea that not only are your changes being merged and merged together at the same time and ready to go, but they're also being shipped to production, essentially.
So the stages we have is first YOLO, then continuous integration, then continuous delivery.
and continuous deployment.
That's right.
What is the difference between continuous delivery and continuous deployment?
The big difference, I guess, is the question of, do your changes go out to production automated?
Does it kind of flow through without any intervention, I guess?
And then for continuous delivery, they go out, but not necessarily to production, right?
That's right.
And so that's why you'll have environments like, you know, dev environment or testing or staging or whatever.
Now, it's possible that, you know, some parts of that process may also still be manual.
Maybe you only update the test environment once a week so the testers can play around with it again.
But the key principle is that you could.
You can kind of push it through sort of automatically the whole way through if you want.
And what teams would not want to do continuous deployment, right?
Because it seems to me continuous delivery, you kind of want to get to because then you just get more and more feedback, right?
But then it is a kind of good question, like, should it go out immediately?
This is the question, you know, everyone always...
ask like it's almost ready to go out why can't we just push your production put and as engineers as an engineer as soon as possible it's ready right the reality is it doesn't really suit every every every company right so um you know it may be the case that you know some some companies really do still have you know review boards where you need to validate is this good to go out um particularly if you're in an industry that has a lot of um regulation and compliance problems uh problems compliance uh requirements And they need to make sure that when it does go out to production, it's sort of done at the right time with the right people available, et cetera, et cetera.
It's not necessarily true to say that everyone should be going to continuous deployment because that's sometimes just not viable for various reasons.
But if you at least got to that point where you're sort of continually seeing your changes go through all the testing, you're promoting it through the different environments, which is you're therefore testing the process itself.
If you can only click that button to go to production once a week or whatever, okay, that's fine.
You know, you've done a lot of that hard work.
You've mitigated risk, which is what a lot of this process is about, right, is feel the pain as soon as possible and de-risk anything that could go wrong right up until that last point.
So I know you're deep into...
CI, CD, continuous integration, continuous delivery, continuous deployment.
You've been doing this for like, what, 10 plus years now.
But I was pretty surprised to see that when I checked Octopus Deploy, it said deployment, it says continuous deployment, continuous delivery, but it also says Kubernetes.
How has Kubernetes kind of arrived in the topic of CI, CD, and in general infrastructure?
What happened there?
Yeah, Kubernetes is the platform of the moment.
If we take a bit of a step back, Kubernetes came out of Google.
I guess they originally had Borg.
They were using it to host and run their infrastructure.
They ended up releasing Kubernetes partly, I'm not going to pretend I can read their minds and know exactly why, but partly as a way of helping to level the playing field between them and some of the other cloud vendors.
Yeah, so before Kubernetes, AWS was a clear leader.
And I talked with Kath Cozgrove, who came to the podcast, who works on the Kubernetes team.
And again, she speculated that by releasing Kubernetes, it was a lot easier to move workloads from between AWS and Google Cloud.
So it kind of leveled the playing field.
And now there was a reason to, like choosing Google Cloud was no longer as big of a risk or choosing Azure was not as big a risk and so on.
Yeah, that's right.
It kind of, it made it simple to move between vendors.
And so as a customer of one of these platforms.
if you wanted to move to AWS and you're using containers, no problem, you're just sort of putting it in a new place.
And so Kubernetes came along at the time when there was a bunch of plays in the field for container orchestration.
So you know you had, you know, Nomad, even Docker Swarm.
From HashiCorp.
Yeah, that's right.
A bunch of other options are out there because...
At CoreOS, Kelsey Hightower, just on the podcast, they built Fleet.
which was another container orchestration.
And this was all around like 2012, 2013, 2014.
And then Kubernetes came out and somehow it started to win market share.
Yeah, yeah.
I mean, I think some of the mechanics that it provided kind of really appealed to engineers and I guess DevOps teams out there.
And eventually, I think particularly because it was so easy to use cross-platform.
because some of the cloud vendors then did end up picking it up.
It kind of has ended up now being essentially the winner in this space.
I know even back then, even non-container orchestration tools like Azure Service Fabric was another kind of attempt to handle the fact that, you know, in this world, everyone's building microservices and they want to host them in a single platform.
And how do you orchestrate that and deal with dependencies, et cetera?
But Tribunetis has become the clear winner.
And when you say winner, I understand that, for example, when you have a bunch of backend servers on a service, like, you know, you have a website, there's a large backend, okay, I'll use Kubernetes for that.
But you're talking about infrastructure, right?
Or you're talking about even things like build servers.
That's right.
So it's kind of funny, you know, we talk about Kubernetes as being cloud native.
This is the term you always hear, it's cloud native.
That's what they say.
That's what they say.
And, you know, you look at the vendors that picked it up, it's Azure and AWS.
kind of the made it available on their platforms.
The reality is a lot of customers actually use Kubernetes for running on-premise.
So, you know, a non-insignificant number of our customers who are doing Kubernetes are running on potentially their own VMs, on their own server farms, or maybe they're running VMs in AWS or Azure, but they're maintaining Kubernetes itself.
The idea being that they have a lot more control then over exactly what's running.
It's particularly common, you'll find in things like financial industry and things like that, where again, wanting to fully sort of control the process and manage the whole sort of piece of infrastructure from end to end is kind of one of their goals, but they want to leverage the capabilities that Kubernetes provides by, you know, allowing the application team and the ops teams to just build and define kind of in that declarative fashion that Kubernetes provides exactly what runs and how does it run, et cetera.
So they chose Kubernetes because...
this is the best tool they can manage their on-prem infrastructure and say like, okay, I have like these physical machines and I want this many virtual machines and I want to run a database on this many nodes and an internal web server or like whatever.
So it just won this area as well?
Yeah, yeah.
I mean, so there's around the same time that Kubernetes came out, or actually before that, there was a lot of these other kind of declarative type tools, right?
So you have, you know, Terraform, which is a really popular one you can define.
kind of exactly what infrastructure you want and and what you're doing is you're essentially defining the the desired state and then the tool kind of applies it and you know you've got puppet etc and so kubernetes has this similar concept right where you define what you want your sort of infrastructure to look like and the internal kubernetes controllers and operators will basically ensure that whatever you've asked for always applies so if you say you want you know three replicas of something it will ensure that there's three replicas of something.
And so if one of those pods dies, for example, it will spin another one up.
And so it simplifies this process of being able to find declaratively kind of exactly what you as a sort of application team need to run your system.
It's fascinating because I always assumed that Kubernetes has won the cloud native space and the cyberscalers.
Can you tell a little bit more about...
how is being used on-prem?
Some interesting stories.
You must have seen some because you said that you're working with companies who are managing large on-prem Kubernetes or interesting situations.
Yeah, this is one of the nice things about working at a company like Octopus.
We talk to and deal with so many different customers and everyone's doing things a little bit different.
They've got slightly different needs and requirements and you kind of get exposed to a lot of different problems and patterns.
And it's easy to sometimes to get lost in you know, what people are talking about in conferences and everyone's saying it's all about cloud and this is the best practice and you should be doing this.
And the reality is, you know, everyone's kind of got their own little problems and they just want to solve them the way they kind of need to solve them.
And so some of our customers, in fact, a lot of our customers will run Kubernetes kind of, you know, quote unquote on-premise.
So for example, I was actually talking with one...
When you say on-premise, can you just be a bit more clear?
Is this...
a data center where they're like renting and co-locating?
Is this actually like I have my own data center or is this like I actually have my own machines in my closet?
Yes and yes, I guess.
What?
Even in a closet?
I mean, I was trying to joke there.
I'm sure there are still teams out there that are running, you know, the core accounting tools and et cetera, you know, under Steve's desk.
But even when we talk about, you know, small computers, some of our customers have Kubernetes clusters basically in their point of sale systems.
So they have hundreds and hundreds of stores and they have little Kubernetes classes essentially run in them and each one's independent.
They run into their own problems with that because particularly at scale when you've got thousands and thousands of clusters and these customers are following various GitOps practices, etc.
where they're pulling the actual state from a Git repository.
So the Git repository itself becomes the bottleneck or they start getting throttled.
And so they have to sort of resort to other mechanics to try to sort of mitigate and work around that.
I was talking to another one of our customers actually just the other day at Kudcom there, who they are deploying, they've got Kubernetes clusters running on research vessels.
And those research vessels, as in boats, as in ships, on the ocean.
That's right.
I'm not going to pretend to know exactly what they're doing on those ships.
We didn't quite get into that detail, but they've got Kubernetes clusters.
out in the open sea, right, which is apps given Kubernetes name.
The problems they run into though are a little bit different, right?
So for them, you know, those boats might be out at sea for, I don't know, weeks, months at a time, whatever that might be.
So when you want to do a deployment, the ship's not available.
So when that ship comes back into port, it needs to get the update, right?
So they'd be talking through how you'd achieve this, right, and how that process would work.
This is super interesting, and I love how you kind of get a peek into...
so many different types of teams through the fact that, you know, like you're talking with them with how they do the deployments, but you probably see some other things that they're doing or things they're struggling with.
What are some trends you're seeing across the industry in terms of this wide range of companies you work from startups to like finance companies to like these research vessels?
Yeah, I guess one of the big trends these days is a lot of focus on GitOps.
So GitOps is...
What is GitOps?
What is GitOps?
That's a good question, Guget.
Let's take a step back for a minute.
So, you know, we mentioned, we talked about Kubernetes earlier.
And we talked about the fact that it's kind of got this internal continuous reconciliation process where you say to the cluster, please spin up, you know, five pods and it takes that desired state and ensures it always sort of is true in the world.
And so there was a lot of products around that were doing similar thing.
You know, Terraform does that for infrastructure, et cetera.
And a bunch of people started wondering, why can't we sort of take that process and pull it back further so that...
Not only is Kubernetes just dealing with desired state, but we can pull it sort of directly out of Git.
And so, you know, I can, as an engineer, make changes to that Git definition, that desired state.
And I'd have some process that essentially pushes that to the cluster and ensures that it remains in line with what I'm asking, what I'm expecting.
And so the term GitOps was coined by Weaveworks in, I think it was 2017 or so.
And as a...
general practice it sort of started picking up steam particularly in tandem with kubernetes because at its core kubernetes is very declarative right later on um sort of in the early you know 2020s um it was kind of formalized a bit more and there was sort of four key pillars of of git ops the first being um essentially declare you want your state to be declarative so this is the idea that um you want to define what you want the state of your infrastructure to look like this is to basically make things a lot I guess, simpler to understand what the state of the world is going to be when a deployment takes place.
So if you think about deployments that are a bit more imperative, that has sort of a process, the end result is sort of the result of multiple steps.
But when you're wanting to just update some infrastructure, that desired state kind of works really well, particularly in the Kubernetes space.
And then in GitOps, the desired state will be just describing like how many nodes I want or like how many I don't know, replicas do I want on a database or how many web servers or load balance or how to be connected, that kind of stuff.
That's right, yeah.
So it's basically a way of being able to say, I want my infrastructure to have whatever state it is.
And then the GitOps agents, the GitOps products, basically ensure that remains the case.
So they'll keep applying it to Kubernetes.
So you've kind of got this situation where Kubernetes keeps its internal status in sync with reality.
And now you've got these GitOps tools that take the declarative configuration in sync with what Kubernetes is.
So they will take the whatever I put in Git and whatever format I use and they kind of translate it into something that makes sense for Kubernetes and now Kubernetes can apply it.
Yeah, I mean, ideally you want it as close as possible to what sort of, I guess, Kubernetes is expecting.
Or it allows, yeah.
That's right.
And so what you're describing there, I guess, is the continuous reconciliation.
And so this is the idea that...
these GitOps apps will essentially, as we said, sort of take that state and apply it.
And if there's any drift from Kubernetes side, so for example, someone runs kubectl, delete pod or delete deployment or whatever the case might be, because your desired state is now stored in Git in this case, that will kind of self-repair.
The second pillar of GitOps is that that desired state you've sort of defined.
should be stored somewhere that's immutable and versioned.
And so this is the idea that once I say that I want to have this state, I want to have sort of something I can point to, a pointer, and that might be a tag or a commit char or whatever, and I want to basically use that to define what that actual state should be.
And I don't want that to be able to change, right, because otherwise that kind of defeats half the point.
By having it versioned and immutable, you also...
makes things like auditing a lot simpler, right?
You can see the transition of that desired state over time.
What's interesting, though, is a lot of people will point to that and go, yes, version and immutable, I know what that is, that's Git.
I was about to say that, because Git gives you, definitely gives you versioning, or it gives you commit history.
I'm not sure if it gives you versioning, and immutable in the sense that, I mean, the past cannot be changed.
That's right.
Or actually, can it?
Because you can rewrite.
Yeah, it's a history.
You're right.
So depending on how you sort of configure your GitOps agent, you know, you certainly can rewrite history.
If you have it pointing at a tag, for example, you can change tags.
And so that's why there's, you know, best practices around that, I guess, kind of, you know, wiggle the finger a bit if you're using tags to manage that sort of state.
But what's interesting, though, is really nothing in these pillars and...
very quickly, the third one being pull versus push.
And so this is the idea that your GitOps agent will pull the state from GitHub and put it into the cluster.
And the fourth being continuous reconciliation.
But nothing in any of these sort of pillars actually talks about Git.
And I think that the naming of GitOps is kind of, kind of gets people to already have this expectation that everything has to be in Git.
I mean, why would you not have that expectation?
That's what I assumed.
That's right.
I think the problem, though, is not everything should be in Git, right?
So you've got this constant kind of conversation within that community about, you know, where do you put secrets, for example?
Not in Git.
We know that, right?
Do not put it in Git.
And so that's the thing.
So, you know, there's been all these solutions to try to put it in Git.
So there's things like sealed secrets where you encrypt it and put it in Git.
Sounds like a terrible idea.
But I guess what's really, this is highlighting is the reality that some things don't need to be in Git, right?
As long as you can have this sort of control over the versioning or immutability of it, then that's completely fine.
And then the trend around GitOps is what you're seeing that a lot more infra teams are moving from, okay, a few years ago, they might have just like made definitions for Kubernetes and now they're moving over to GitOps.
So saying, okay, we'd like to control infra.
in a tool in a way that's described, that's in version control.
Is that the trend or what is the trend around GitOps?
I guess it's more just the trend of the growth in general of GitOps in enterprises, right?
So not every company out there is using Kubernetes today.
And as they sort of approach Kubernetes and they're looking at, well, how do I perform the deployments?
How do I manage that process?
GitOps becomes the sort of de facto process.
And to some extent it is.
giving rise to this idea of using it to manage other things outside of Kubernetes.
And there are a few examples of projects and experiments that will use things like Terraform, and there's a continuous reconciliation service that keeps your actual state outside in sync.
At the moment, it's really about, the focus is on, I guess, Kubernetes, is the core place where it lives.
And I guess it's more the growth of Kubernetes itself means that GitOps is coming along for the ride.
And you mentioned enterprises, which means like these large companies with oftentimes thousands of people or in regulated environments.
That's what I think of enterprises.
Are you also seeing smaller teams pick up things like GitOps?
Is it like everywhere or is it more there's certain types of teams that seem to be just more interested in this?
That's a good question.
So I guess sometimes what we see is a lot of people go to conferences or they read blog posts and they hear that GitOps is what you should do.
potentially not necessary for all locations, all teams, right?
There's certainly a bunch of benefits to it, but the reality is there's some things you need to do outside of just GitOps.
You might use GitOps principles in parts of your process, but some of this absolutism, I think, that sometimes exists may not be necessary.
So there's often a bunch of other processes you do around your actual sort of, you know, quote-unquote deployment.
So things like maybe you run smoke tests.
Or maybe you want to send a notification when it's complete, or maybe you want to do a database update or something like that.
These kind of steps don't really lend themselves very well to kind of this declarative, everything is in Git kind of process, right?
And so that's why you get things like Argo workflows and rollouts and things come out to try to kind of GitOpsify this process.
And that works for some people.
But the reality, I guess, is that...
I think some people get really hung up on this idea that everything is Git, so therefore they've found the tool, and so therefore everything is a nail.
And this is the thing, like talking with customers, when we go through this process of, you know, you can use GitOps in Octopus, and, you know, we've got a bunch of support for various mechanics that integrate well with Kubernetes and Argo, but there's a bunch of other sort of operations you do around that process that doesn't need it.
And when you talk to them about it...
you know they realize that what they're trying to do is ultimately just ship software so again that difference between what you um hear when you talk at conferences and things where you know everything is everything is good and everything must be you know in in this particular format or whatever the case might be the reality is for most customers they're just trying to ship software and they don't care what name you give it if it's git ops and it works end to end and solves everything good if they want to use git ops as part of the process but then have other mechanics that are more sort of imperative than good.
It's just sort of the reality of, you know, there's tens and tens of thousands of companies out there in the world that are doing software delivery.
And not all of them are at conferences and not all of them are at the forefront, I guess.
As Rob says, most teams don't care whether you call it GitOps or anything else.
They just want to ship software and know that it works.
Our presenting sponsor, Antisysys, does exactly that.
It lets you ship knowing that it works.
Antisysys goes beyond code review.
It runs your whole system inside a hostile simulation.
By doing so, it finds every bug before your users do.
And because the simulation is fully deterministic, Antistasis doesn't only find bugs, it gives you a perfect reproduction of every issue.
I know this sounds like science fiction, but it's actually hardcore engineering under the hood.
Janestreet, Fly.io, and the Etsy, the Community Ship agent written code with full confidence because they know it's been verified by Antithesis.
To see more case studies and details, head to antithesis.com slash pragmatic.
That's antithesis.com slash pragmatic.
I also want to mention our season sponsor, TurboPuffer.
TurboPuffer is exactly the thing that just works.
A vector and full-text search engine built on object storage.
Fast, cheap, and extremely scalable.
No exotic architecture required.
Here's something I find interesting.
The teams building the smartest AI products out there, Cursor, Notion, Cognition, and Tropic, they all run on TurboPuffer.
But why?
Let's think about it.
An LLM without context, it can feel pretty dumb.
I can still remember shortly after ChatTPT launched early 2023, how it felt both incredibly smart, but also frustratingly stupid.
If you asked it a question that was outside its training data, it just made things up.
Fast forward to today and the models and their tools for retrieving context are much better, but hallucinations still happen frequently.
Here's a typical way to integrate TurboPuffer with an LLM.
Plug it behind your search tools, get fast responses and relevant context back.
The neat thing is how it gives you the perfect blend of low-cost storage, fast retrieval and a bunch of different search tools like vector, full text and filtering.
You can afford to index billions of documents and then you can query it with different tools to get the most relevant handful of documents in milliseconds.
This is how your LLM feels smart.
It gets the right context really fast without blowing through a bunch of tokens.
Of course, you can use TurboPuffer to search anything, not just code.
If you're building AI products, check out TurboPuffer at turbopuffer.com slash pragmatic.
With this, let's get back to Rob and talk about progressive delivery.
Yeah.
Another trend that we talked about just before is the rise of platform teams.
Can you talk about what you're seeing?
So platform teams are kind of...
I guess in the past several years, they've become this sort of new standard organizational structure to help teams manage their, I guess, deployment workflows, a bunch of the infrastructure around it.
And it's kind of come out of this evolution of DevOps, right?
So, you know, we mentioned before in the old days, you'd write a bit of code and you'd throw it over the wall to the ops team.
So it was dev teams and ops teams.
This was like in the 2010s, 2000s.
Back in the long, long ago.
And then DevOps became the practice that everyone sort of realized that actually we want to have the engineering teams be involved in and have ownership of part of that operational process.
Idea being, you know, you get faster feedback loops.
You are able to kind of, if you feel the pain, you sort of fix it.
You know, it's that saying, you know, you fix it, you ship it.
You know, we've all kind of heard that.
And so a lot of teams, you know, took that to heart.
That's good.
Great.
Good practice.
but as things start to scale up what you'd find is that there would end up being like a devops team again and sometimes sometimes separate to another ops team and so there'd be this separation of of development and devops and it kind of goes against some of the principles of what devops was you know trying to destroy but not only that these teams then end up um having lots of different ways of doing their um deployment so you know you've got every single you know a whole bunch of application teams and they've all got slightly different requirements and all building it from scratch and so you'd end up with these these teams either whether you had the devops teams or was still within the application teams where um there was just this this um large number of different ways of doing things right and that becomes difficult at scale so um you know you can't really move between teams And by scale, you mean typically when there's a lot of teams, right?
That's the easiest thing.
Yeah, that's right.
If you've got lots and lots of teams and each one is kind of owning that process end to end, you know, you sort of get this bifurcation of processes.
And not only that, the application teams themselves start kind of getting this context overload, right?
They now need to think about what's best practices of the different cloud tools.
Yeah, and there's a job of devs rarely wants to configure the deployment scripts and test them and testing is hard.
You can't stop unit testable.
So it's now a different job.
I remember when I was on earlier teams where, you know, like typically on a mobile team, like you have a mobile team of five people and one of them, one of us had to kind of specialize in Jenkins configurations because Jenkins is oftentimes the or used to be the mobile CICD.
And it's kind of like half a person dedicated to that.
And it was more like, you know, like we had to draw a stick on who's going to do it because we want to build stuff.
You want to write code, right?
You just want to focus on writing code.
And so if you're spending a bunch of your time sort of managing infrastructure and pipelines and things, you know, that's no fun for anyone.
And so platform teams have come about as a new way of solving that problem where it's different to kind of, you know, this idea of a DevOps team or Ops team that kind of own the whole process.
They more...
sort of define best practices and they provide ideally a self-service mechanism where application teams can essentially use often what's called as an IDP, an internal development portal, and they'll be able to essentially self-service and maybe they want to spin up a new project and they're able to use a template that the platform team have generated.
And so the platform team are able to sort of create these standards throughout the company and they can be responsible for So I guess the definitions of those processes and the best practices and how to achieve that.
But the ownership of the actual running operational sort of element is still within the teams, right?
So they still get those benefits of DevOps being close to the real code and feeling the pain if there's a problem and et cetera, et cetera, et cetera.
But they don't need to spend all that time becoming experts in all the different ways that you can deploy the software they've got.
And so this has become really common now where, particularly as you sort of get to a larger size, platform teams are a great way of solving that problem.
Now, that's not to say that every company everywhere should have a platform team.
I mean, if you're a smaller company, sometimes you've just got the apps team and they sort of are doing, you know, quote unquote DevOps.
But this is certainly something that as you sort of start seeing larger organizations with multiple teams and multiple projects.
these platform teams for a way of basically bringing some some sanity and control and focus i guess to to the whole space one trend across the industry of course is ai everyone's uh it's hard it's hard to see any teams where devs are not using ai agents specifically to code you know product managers will be using these things and of course we have a lot more code produced as a result when it comes to cicd systems what are you seeing changing there because of AI.
This is the elephant in the room, right?
That is AI affecting sort of this.
But the reality is, I think, to be honest, it's still very early.
I think what will happen is the impacts of CICD are really tightly coupled to how development teams end up using AI.
So there's going to be some sort of like a, I guess, a lagging process there.
But we're finding a lot of people...
a lot of teams are starting to use AI in the development process.
And so we're starting this process of going out and looking and talking to customers and learning what's the way that they're handling AI in their teams and their application teams, and then how we can best leverage sort of the CI side to support that.
But then in addition to that, use AI within the pipeline itself, again, in the right place.
So one of the things we've been, I think, pretty keen on at Octopus is, This idea that, you know, at KubeCon, we were probably one of the few companies there that didn't have, you know, AI plastered all over it.
Like we tried to be very, you know, that's what gets the sales.
You stand out now these days.
That's right.
By not having AI.
I mean, we've got AI in Octopus, but what we've been trying to do is think about, well, how do we actually use it in a way that's actually useful for our customers, right?
For engineers, et cetera.
And so we've been slowly adding capabilities within Octopus to provide AI support, whether it's a MCP server, whether it's a recovery agent that can review logs and tasks and all that sort of thing.
But that's within the product itself.
Some of the bigger changes will depend on, like I said, how actual application teams use AI.
What I think we're talking about, we'll find is there's going to be a lot more velocity.
I think that's one of the big...
big changes, right?
There's just going to be a lot more code coming through.
I think one of the questions is, okay, what does that mean for your pipeline?
One of the things you often talk about when, you know, there's a human element to the pipeline is speeding up the cycle to get that feedback quicker.
You know, if you've got engineers sitting there waiting for their code to run tests, they can get back to it and fix it.
The shorter and shorter you can make that feedback loop, the better it becomes because they don't need a context switch, etc.
I think in a world where the majority of your code is being developed by AI, that becomes perhaps less important.
You know, if you can kick out your build and test process and it takes 30 minutes versus 20 minutes, does it really matter if the engineer's already long gone, moved on to the next problem and the actual AI agent itself can kind of babysit the process and review the problem that came up and issue a new fix?
I guess there'll be a de-emphasis, I think, on some of the speed of the pipeline itself and more on...
increasing sort of or decreasing risk, right?
The risk that comes from having AI agents generate code.
And so exactly what that process looks like, I guess, remains to be seen.
I think what we'll see a lot more use of is things like progressive delivery.
And I think particularly feature toggles are going to be a really common tool in the tool belt of application teams, partly because it allows you to ship that code as fast as you can or as fast as you want, but manage the rollout of the actual feature set or changes.
sort of independent of the deployment.
So it decouples your deployment from your release.
And so in a world where, you know, we've got a lot more AI agents generating code and being involved in perhaps part of the build process, those agents themselves being able to use toggles to react to it quickly, I think then become a lot more important than perhaps what we see today.
Can we talk about progressive delivery, what it is, and what are the most common ways to...
you know, like to de-risk getting your code or your software out there.
The progressive delivery is the next evolution beyond continuous delivery.
So, you know, with continuous delivery, it's this idea that, you know, I've made a change to the system and I want to ship it to dev or stage, or typically, you know, if it gets to production, sort of in one hit, right?
With progressive delivery, what you're trying to do is basically...
release those changes in a little bit more of a controlled way, typically through things like a canary deployment.
So this is where you might deploy some subset of your instances that are out there.
So what is a canary?
What is a canary?
Canary deployment is, this is New Zealand, basically.
New Zealand's our canary.
So this is, as we said before, this idea where you select some subset of your customer base or whatever that might be.
And you would typically route traffic to a new instance.
So you'd ship, you know, you've got version one running and you want to release version two.
You essentially ship version two side by side and you might use, you know, most common one would be some sort of network traffic manager to route some percentage of your traffic to that new instance.
And you gradually roll that up.
Typically, you know, as you do this process properly, you've...
should have a fairly mature observability mechanisms in place to see that you know you can roll up or roll down and i guess this whole thing comes from a canary in a coal mine right that's right yeah yeah so the idea being that um you know in the old days when you'd be in a coal mine digging away and it would release um you know all sorts of toxic fumes and things like that canaries were a lot more sensitive to it so they have a little canary in a cage um and if that canary sort of died i guess i think the canaries uh as i understand they were like chirping and then okay that sounds better but when it stopped chirping well it also died oh okay so all right same same ending same ending but just you know a nicer a nicer way to go out they need to get out yeah so it's this idea that you get that advanced warning i guess that you know rather than you getting knocked out by the the toxic gases etc um you know you can get out of there sooner so it's that same principle i guess brought to the software There's various other mechanisms like blue-green deployments.
So you've got your first version there still receiving traffic, and your second version is up and running, and you can now do some tests against it, validate it.
Maybe you've got the IP details to access it directly.
You can basically validate that it's working.
Sometimes there may be a way of avoiding cold starts and things because that process may need to initialize a bunch of stuff.
But then when you've done that validation and you're ready, you can essentially swap.
top traffic around.
So all the new traffic goes the other.
In some ways, it's like doing a canary, but straight to 100%, but you're doing a bunch of validation sort of on the side before it actually reaches customers.
In my view, probably the more useful progressive delivery strategy is feature toggles.
So this is the idea that you've got some sort of feature flags, feature toggles.
Yeah, that's right.
Yeah, often used interchangeably.
So this is the idea that you've got some sort of variable in your system.
and it's linked to typically some sort of external service.
And through the state of that particular variable being sort of true or false, on or off, you can essentially have different code paths essentially take effect.
And there's a bunch of benefits that feature toggles have over, I say, Canary releases, particularly for application delivery, where your unit of change with a feature toggle is very granular.
It can be single lines of code.
Everything else remains the same, and all you're doing is tweaking that single line of code.
With a canary or any sort of versioned delivery deployment mechanism, your unit of change is the entire app.
So if you've had 20 commits since the last release went out, then you're essentially testing all 20 things in that one hit.
Your ability to target the actual customers, it's a lot more precise when using feature toggles.
So you can use all sorts of complex rules and say that...
I don't know, everyone from Germany who has this particular product in the basket has this kind of experience.
And that's really hard to do via network traffic rules, right?
The other is your ability then to actually roll back.
So to sort of roll back from a canary, hopefully you're still in the process where you're sort of going through that canary process and you can roll it back.
That could take minutes.
Maybe you have to redeploy the whole old version.
That could be minutes or more.
With a feature toggle, you can do that in seconds.
That's pressing a button and it happens immediately.
Not only that, but you've got more control, I guess, on when you sort of do that.
So with a deployment that you're doing via a standard versioned release, you're sort of tied to when that deployment takes place.
Because when it takes place, that's when essentially your new feature is available.
And as an application team, that means you need to know about exactly when it's taking place and make sure you're watching the logs at that point.
Maybe you and 10 other teams who are shipping things at the same time are all doing the same thing.
Whereas with feature flags, you've basically got control over when that takes place.
So you might ship the assemblies and that sort of thing on the Monday, but you release your feature on Tuesday when you come in and you've got the logs ready and you've kind of reviewed what the next steps are.
So it really makes things a lot easier to decouple releasing a feature from deploying software.
through carry, et cetera, they're really useful, particularly if you're doing like infrastructure type changes where there is no kind of application toggle that's relevant there, but you want to violate some changes to your infrastructure or your process or potentially, you know, things like things that will involve schema changes and schema changes are the big, big difficult part.
Database schema changes, right?
Database schema changes.
This is the big problem in any, like to be fair, in any progressive delivery.
And this is why, you know the question always is are you ready for progressive delivery um to do schema changes i guess this is the point that um application teams kind of need to be really mature and i don't mean mature in terms of you know not telling silly jokes but mature in terms of understand all the problems that are in place with this and know how to release these sort of changes in a gradual controlled fashion and do it over multiple stages that you know ironically is actually quite hard for us and octopus because our software is both SaaS hosted so we have a SaaS offering that customers can use and we have an on-premise version and it's kind of because we have both both sides we kind of have the best and worst of both worlds you know in the cloud system if you've got a SaaS product you have complete control over what versions go where so if you want to do expand and contract you can stage the whole process you know that it's all been updated before you kind of move to the next stage on the other hand for a self-hosted where they go and they install it on their own infrastructure somewhere, you don't know what version they're running and what they're coming from.
So they might upgrade from version one straight to version six.
And so you're not really forcing them to go through that expanding contract phase.
On the other hand, they've got a lot more control over when they upgrade.
And so you can kind of be a little bit more deliberate about making sure that they do backups before they change and maybe they can manage that migration.
and accept a little bit more downtime during migrations and updates and things like that, then would actually be acceptable in a SaaS product.
So one thing about, you know, we talked about progressive delivery, and you're kind of doing this to avoid surprises.
You know, if a regression goes out, a new bug or something doesn't work, you kind of want to catch it early.
Hopefully only a few customers have experienced it.
Or even if it's not 100%, you kind of, and you have a way to go back.
All you do is, if it's a feature flag, you hide it.
If it's a canary deployment, you go back to the other one.
But there's also this thing where when things do go wrong, at some point you want to do a rollback.
Can we talk about...
How have you seen rollbacks done well?
And what does it take to actually have a real rollback strategy?
A bunch of people talk about CICD.
Some people talk about feature flags.
I don't hear too much chatter about rollbacks.
Yeah, rollbacks.
This is always a spicy one.
We get a lot of customers who say, why don't you have a rollback button?
I want to roll things back.
Why can't we roll things back?
As in the deployment software, like Octopus or anything else, they're like, okay, if it can deploy, I want to do checkpoints and just do a rollback.
That's right.
How hard could it be?
How could it be?
Tell me.
Well, this is the problem, right?
So in a completely stateless system, that's pretty straightforward.
If you've got a completely stateless system and this is something that GitOps is really good at where you'll have that definition.
So it's somewhere in repo.
If it's completely stateless, you can do a Git revert and push it and it'll go back.
The reality is for most systems out there, you've probably got some state.
State being databases.
It could be any sort of...
any sort of information that you can't necessarily just kind of undo, I guess, because if you roll it back and now you've got your code talking with the schema of the database that's not in sync, you can provide schema.
If you've got a schema migration, let's say in a normal deployment, you can provide alongside that a secondary sort of anti-migration that kind of undoes the change.
But again, that's not always possible.
You need to do it.
What are you going to do with that data?
That's a lot of work.
We've gotten pretty far in basically trying to advise customers that you want to avoid ever talking about rollback.
It's always roll forward.
So if there's a bug, roll forward.
Get your change in as soon as possible.
This is where fast feedback loops are important, right?
This is what the hotfix processes are for, right?
So we all know that in a standard process, you want to go dev, staging, prod, and maybe you've got approval processes and it slows down, et cetera.
But if you've got a significant...
significant bug that you need to kind of quote unquote roll back sometimes the safest thing to do is actually make a hot fix to that that version and push it out sort of as quick as possible and your bottleneck might be the the build pipeline or whatever but depending on sort of your appetite for risk there you can resolve that sort of a lot quicker now obviously if the failure itself is just from some mechanism in the deployment process itself or somewhere further down that chain then your your time to recover is going to be a lot quicker but it's this idea that If I've got a failure in version 2, my rollback isn't to go to version 1, it's to go to version 3 and make sure I've got that fixed in version 3.
It's the sort of thing that, you know, when we talk to customers and some of them go, yeah, we roll back all the time if there's a problem.
And then when you ask them, what do you do if you've got a schema change?
They kind of stop and realize that they've never, it's just sheer luck that they've never sort of run into that, right?
Is it fair to say that you want to roll forward if...
It involves business logic or something that is not stateless?
Because if it is stateless or if it's application logic, you know, you have a code that says if this else then and you realize there's a bug there, you can just revert it as long as it doesn't touch the schema or the data.
Yeah, I mean, in an ideal world, you're reverting is through a feature flag, right, that you click and you're essentially reverting by changing the code path.
And this is why I always say feature flags are kind of a nice tool to use for doing this progressive delivery because, you know, it's just as easy, just as easy as to roll out that feature.
You can typically roll it back.
Now, you're still going to have some of those problems with schema issues, et cetera.
If, you know, if you're making a change and you've got parts of your code path that expect one and not the other, you're going to need to account for that.
But you can even account for that inside the feature flag.
That's right.
Yeah.
So that's the way you sort of ideally sort of manage that so that within, regardless of which path you go down the feature flag, it's kind of self-consistent with whatever version of the actual.
database schema that's out there.
So I guess the more feature flags you use, the fewer surprises you might have.
But it's a bit of extra work both to build and also to remove.
You get stuck with still feature flags all across your code base once you start to use it a lot.
I saw this at Uber.
Yes, yes.
A hundred times, yes.
So when you're adding a feature toggle to your app itself, so we at Octopus, we obviously use feature toggles in our code quite a lot.
And we use Open Feature as like the framework, the SDK to interact with it.
But we essentially have built a wrapper around it where the toggle itself within the code is sort of, we provide some details about which team owns it.
And that team sets an expiry on it.
Now, the expiry itself, when that time passes, nothing bad will happen.
But through parts of the CI process, if that time has passed, we can send a notification to that team and say, hey, it looks like this toggle is no longer used.
So the specific mechanics don't matter as much, but it's more a matter of, making sure that you know if you're adding feature toggles it's really easy to forget about it because you start rolling it out and you kind of forget about it and you know you want to keep it in there just in case for a while in case you need to roll it back and having the ability to understand how long the toggle has been there is it is kind of a key part of helping to maintain that that hygiene now the reality is even at octopus we've got a bunch and i know i've got a bunch in there that um i'm sure if i was to log in i'd probably get a bunch of notifications to remove.
You know, when we use that gardening metaphor in code, right, this is one of those sort of operations, this is weeding, right?
You need to just kind of keep on top of it.
There are some mechanisms around, even in lieu of the AI side, which will, you know, ideally if you're using feature toggles, you've probably got a bunch of observability and metrics and logging around it.
And there are some tools out there that will allow you to keep track of when the last time a toggle was kind of evaluated.
And that kind of gives you that signal.
Um, similarly, you know, you might remove it from the code because typically when you want to remove a feature toggle, you want to remove it from the code first before you touch your actual sort of toggle system.
And so having a mechanism so that once you remove it from the code, um, you know, it might take two weeks before it makes all the way out into production.
So you don't want to delete it before then.
By that time, you've kind of forgotten about the fact you removed it.
Oh yeah.
Um, and so having mechanisms that will keep track of that change, I guess, going through the system.
Um, and when it reaches the environment where.
you know, production where it's actually being used can kind of say, okay, that code's gone out, that's, you know, remove the toggle, it's fine and safe to actually remove the configuration because you've got that feature toggle information in two places, right?
You've got it in the code and you've got it in your platform.
Can we talk about how development environments evolve?
We talked about CI, CD, but I'm interested more in, you know, you go from like you have one environment, later you might have staging or something and what...
evolution have you seen across the all the teams that you work with all these hundreds or thousands of teams yeah i'm not sure if there is one particular pattern there i mean i i think you know most most common is you know dev test prod so these three different environments yeah and i mean even that i think is probably a a gross simplification of all the different And dev meaning my local machine.
Dev in the case of CD is often like the first point of integration.
So it's kind of test often.
Customers will keep tests kind of reasonably in sync with, let's say, production or some sort of sanitized data source.
So that way that whether it's the QA testers or the product team or whatever, it can go and review the code.
Dev is almost like the first point of integration.
Is the deployment process just at its core actually working or is it anything?
fundamentally broken at all i think more and more now we're finding that dev is less useful um in that respect and what we're seeing is more the growth of things like ephemeral environments and so this is the idea that you know i as an engineer i'm running some sort of feature on a feature branch and i want to kind of evaluate that it's actually doing what it what we're expecting to do but not only that i want the rest of my team to be able to see it working and If I've got it running on my machine, it's not exactly easy to give other people access, I guess.
And then I may want to completely context change, move on to something completely different.
So ephemeral environments is this idea from my branch pre-merge, I want to spin up a whole environment essentially from scratch, ideally with whatever dependencies are required to run this particular component of an urban building.
And then I want to basically deploy my app into that as if it was a normal full-fledged environment.
Once that's available, I want to sort of have access to, you know, if it's a web app, maybe it gives me the URL and I can poke around it and hand it around and other people can kind of evaluate.
And then the moment I kind of merge that PR, tear it down again.
You know, it's quite common to have multiple test environments because, you know, I've got a lot of stuff going through my pipeline and I've got three testers, so let's have three environments so they can all sort of have one at once or often you'll see a single test environment and a bunch of tests and they will kind of need to collaborate to see who's got access to the system at the moment, et cetera, et cetera.
Whereas with ephemeral environments, it doesn't roll off the tongue.
With ephemeral environments, you can essentially have a full-fledged deployment per feature.
And so again, that's about speeding up that feedback process, right?
Again, all of these processes are all about speeding up that feedback process to catch those failures or issues or bugs or whatever sooner.
There was a time a few years ago where cloud development environments were really talked about a lot, which was the idea is as a developer, you have an environment spin up in the cloud, let's say your Visual Studio Code connects to it, or maybe you just log in online, and it spins up all the dependencies, oftentimes done with containers.
Which reminds me of this as well.
And there's also like preview environments, but somehow it feels that both that discussion and this one kind of died down.
Maybe it's AI, maybe it's something else.
But I mean, the technology is there, right?
We have containers.
You can package things together.
I'm sure it depends, but it's all doable.
Yeah, it does get tricky.
This is, again, one of those sort of things that's really easy to talk about for simple cases.
It can get tricky when...
you know, what if I've got more than just a single app in my kind of quote-unquote environment?
And how do I make sure it's got all the data I need to validate?
So it can get true.
Or if you have a bunch of services that have state.
That's right, exactly.
So there are sort of complications that it does bring, but I guess the benefits that you get as an application team, particularly, you know, application team where you've still got engineers writing code, is sort of speeding up that.
that feedback process, I guess.
Well, now with AI agents everywhere, that's even better because in a sense that if one of the best ways to validate, you know, we have code reviews and AI agent generates and you look at the code, but is it not better to just confirm that this thing works, especially when it has the UI?
That's right.
I think even in that world where you've got AI agents kind of building the code and validating the code, any sort of scenario where you want that AI agent to kind of validate what it's done.
um you're essentially talking about ephemeral environments even if it's not exposed to people because it's doing its own testing and poking around um in whatever shape or form um that it's doing that still is i guess one of these kind of environments right so it's ephemeral it spins up you've got some sort of provisioning process um and then ideally once the job's down you kind of tear it down I'm interested in learning more about the reality of operating a large infrastructure platform.
And, you know, one big one you're working on is actually Octopus Deploy's SaaS offering.
How does that look like?
And what are the challenges of, you know, like running something where you're running all of these deploy processes, all these CD, you probably have a bunch of different things.
What is it like?
So at the moment, I'm not on the team that sort of builds that, but I can give some of the context, I guess, from history and kind of context there.
Originally, when we first sort of decided to sort of provide a Octopus SaaS offering, I think it was 2020 or something like that.
It was all VMs.
So every customer would basically get a VM spun up and we would have a virtual machine.
And the Octopus...
um you know self-installed would basically get installed onto that vm and they'd get a whole vm for running workloads on etc and that was very much not cost effective it was costing us something like 100 bucks per customer per month and they were paying i don't know 20 a month or whatever it was but this whole process was more an experiment to see was there a demand um and to his credit paul was happy to sort of hand you know pass out the credit card to kind of go through this process to see that is this actually the direction we we want to go is there a Is this something that's going to turn into a viable sort of direction for the company?
Because it's a big step, right, going from building software that you can kind of hand out and people can download and manage themselves.
It was like pretty much self-hosted or like run on your own infrastructure.
Exactly.
Yeah, that's right.
And so the demand was there.
So not long after that sort of first experiment, we basically started from scratch again.
And I worked with a couple of the other engineers back then to start building it on Kubernetes.
Octopus itself in that space, we have what we call kind of a reef.
So what you find is everything in octopus, we've always got octopus or nautical kind of names around it.
So a reef is basically a way of, it's this cell-based architecture where it contains all the resources that are needed for that particular customer's instance.
Well, some of it's shared, but it's kind of broken down into individual cells.
And so a reef will contain, you know, the cluster.
an Azure database, et cetera.
And each customer instance is running now in a pod in that cluster.
And so as part of that project, that was when I think I was working on converting it so it could run on Linux and inside containers and someone else was building the dynamic worker infrastructure.
So there were a couple of us that kind of just got in and yeah, really just got it up and running so that way we could kind of start moving forward and I guess stop losing money.
fast forward to today now there's an entire team that's kind of backs that and we've got you know several thousand customers on it and we run you know many many thousands of deployments um every every every month and so now what we're trying to do is there's a project at the moment to basically make the octopus deployment process itself more resilient so what that means is at the moment when a deployment kicks off a bunch of the the process as a it's kind of a imperative set of steps a bunch of that is stored in memory, which means that whenever we want to do an upgrade, we need to essentially stop running tasks for some period of time so we can kill their instance and spin another one back up.
Octopus itself at the moment doesn't sort of have zero downtime between upgrades.
So there's a bit of downtime between that.
We kind of want to reduce that and get that as close to zero as possible with the realization that, you know, going from downtime of five minutes to one, that's just...
work, right?
Let's, you know, move things around, you can maybe change the architecture.
Going from 10 seconds to zero is a much bigger shift.
I'm not sure if and when we'll get there, but yeah, there's definitely this big effort at the moment to make the whole process a lot more resilient to basically improve and reduce the amount of downtime that takes place so we can kind of perform upgrades quicker, etc.
One interesting thing you do is you have a SaaS, but you also have an on-prem offering.
What are interesting engineering challenges that come from that?
A lot of companies have decided to just like honestly just move to SaaS because now they control everything centrally.
I think Jira did this or maybe they're doing it, which is a well-known one, but clearly it's just a lot more work and a lot more headache to have both.
Yeah, and we touched on one of the big problems here a little earlier is that when we want to push out any updates, you know, to cloud, because we control the whole process, we can push it out.
And so we have a sort of a gradual rollout process there.
Because each customer is on their own instance, we can sort of deploy each one individually.
And that may take, I don't know, a few days to, let's say, roll out a change.
On-prem, though, is kind of another matter.
So actually, I was digging into some of the stats around this a little while ago and found it took about 200 days for, on average, 50% of our customers on-prem to get, let's say, let's say, ship new change today.
Takes about 200 days for, on average, 50%.
It's half a year.
But then there's kind of like almost an exponential, decay there where it takes 400 and something days for 75% to get it.
So just it's kind of this curve where, I mean, we've got customers that are still running, you know, versions of Octopus from five, six, seven years ago.
And so whenever we ship a new change, we need to basically make sure Octopus will work from version, you know, 2023.1 to 2026.4.
And so there's a bunch more baggage, I guess, that we have.
in terms of like schema upgrades and making sure that that whole process actually is achievable.
But why do you do it?
A lot of startups will be like, screw it, let's not support all versions.
This even happens on mobile.
What's the benefit?
And this, it feels like you're kind of swimming against the crowd with this one.
The majority of our customers are still on-prem.
And so this is, you know, you're talking about banks, financial institutions, governments, things like that, where they want full control over the system.
They want to run it on their own.
They may use their own cloud or whatever to run it, but they want to manage the whole process and be in control of, let's say, upgrades or downtime or things like that.
So it's certainly not uncommon, and I don't think that's going away anytime soon.
As for the upgrade support, we're kind of going through this process.
Actually, in the past couple of years, we've been getting a lot more, I guess, confident with deprecating features and things like that and just kind of cutting loose old capabilities.
And part of that has come from, you know, fully embracing feature toggles as part of that process.
I think we're getting a little bit braver in terms of, you know, removing capabilities that perhaps older customers may miss.
But I don't think that in the long term, self-hosted will kind of go away.
This is one of the sort of things, again, where I think it's really common to hear, you know, everything's in the cloud, we're all in the cloud.
Again, the reality is there's a lot of companies out there where for them it's just...
doesn't make sense or it's not viable or it's not you know it doesn't meet compliance requirements or whatever the case may be.
Also it's kind of a reminder I think that you actually might have a lot less competition if you build infrastructure software that also runs on-prem because it sounds like there's a demand where companies are like we want to give you money in order for us to run on-prem and I'm sure some of them would do SaaS if there's no other alternative but for SaaS it's it's easier to build anyway.
So there'll be more competition.
So if you're an entrepreneur or if you're a software engineer thinking to do a business or start a business, it might give you an edge.
Yeah, that's right.
It sounds like a lot of your customers, you know, the ones who have not upgraded your software for, let's say, five years on one end, you might say, oh my gosh, what are you doing?
But they might just be happy with it.
And if they keep paying you as a business, those are some of your most loyal customers.
You see what I mean?
That's right.
And this is the thing.
I mean, I remember when I worked in...
Like when I worked in the previous job that used Octopus or any of us who have any other sort of software that you've got running, potentially you've got running locally, if it just works, why touch it, I guess.
And so it's kind of the bane of our existence because it annoys us if we want to ship the features and give them all these great new things.
But on the flip side, particularly if there's something as critical as their deployment system, a lot of customers, once they've got it running, they kind of step away and go, okay, let's just let it be.
And it keeps happening with AI as well in the sense that, for example, I just read that Cursor, their latest coding model, it's updated like I think every five hours, which is amazing.
It just keeps getting better.
However, you know, there are customers who once you have an LLM and it works for you, you kind of tuned it, you have the instructions, great.
But oftentimes what happens, a new version comes out of a model or major version and it stops working.
And I assume that there will be more teams, companies, businesses who are like, look, it would be worth for me money to kind of pin this thing or to run it on my own infra and just have it stay as is.
And then I will decide when I want to change it.
As long as, you know, if it ain't broken, don't fix it.
That's right.
And I think to Octopus's credit, I think we have a really good history at sort of helping customers even when they're kind of on those older, sometimes to the extent of wanting to say the support team, just they're on old ins, like tell them that.
to get the fixed upgrade.
But support team are, I think, second to none in terms of their willingness to help.
And as you said, if they're willing to pay us, who am I to say no?
Yeah, I mean, it's a business strategy, but I think it's just a nice reminder that there's not just one size.
And even though I think SaaS is eating the world and we're hearing it and we're seeing it, it's nice to see that it's not just that.
As closing, if I'm a software engineer and I would like to...
move beyond continuous delivery, continuous deployment and go into progressive delivery, what pointers can you give me?
Yeah, I guess just start with something, right?
So start with adding one feature toggle.
It may be scary at first to kind of go, oh, it's in production.
If I toggle this, I'm going to break something production.
It's nice and comfortable to know that you're kind of well to the left of the running systems.
And if you ship code, everything will be caught by the test.
But if I toggle it...
what will happen it's kind of like a drug right once you start doing it you don't want to stop and that's that's why we've got this this hygiene problem for things like feature toggles right it's really easy to add them and actually end up with the opposite problem of how do you how to kind of control yourself how do you stop so i'd say just just kind of start doing it add one and and keep an eye on kind of as you roll it out and you look at the results from it and the reality is you know i've shipped features behind feature toggles where i've shipped a bug right and It's one thing to ship something and turn on a feature and go, okay, cool, customers have it.
It's a very different thing when you do the opposite of you ship something and there's a problem and you can reach immediately for the toggle and switch it back off.
You know, the amount of times you kind of, in the past, you have this kind of panic of, I don't know, I've shipped something.
It's, I don't know what's going wrong.
And particularly when you're in that state, you know, maybe you've got called up at 2 a.m.
because you've got an on-call and, you know, you don't know what the next step is to do and you kind of got a panic mind and should I, you know, build a new thing or do I somehow force a redeployment?
So having the capability of being able to sort of flick that switch just allows you then come right down and go, okay, I've stemmed the bleeding.
Now come back and reanalyze it and understand what's wrong.
And so having that capability, once you sort of experience that and realize the value that not just rolling things out, but I guess rolling that individual feature back off.
Yeah, you'll want to use it for everything.
What's one or two books you would recommend and why?
I'll give two kind of, I guess, technical ones and more of a fun.
Phoenix Project is still, for me, a good one.
This is one that...
By Gene Kim, yeah.
Yeah, and I can see, you know, you kind of remember that.
We got that in Skype.
This was one that Abdella kind of gave to everyone.
Yeah, our manager gave it to everyone.
Yeah, and, you know, parts of it are maybe a little bit outdated and, you know, some of the practices have changed a little bit.
But at its core, this idea of, as an engineer, being involved in that whole sort of operation side of what you're shipping.
And the value that gives to not just the company, but to you is amazing.
So I think that book has kind of a core, it's one of those core foundational ones that sets the context for everything we talked about today.
The other one from a more, I guess, organizational and communication side of things, Radical Candor by Kim Scott, allows you to communicate more efficiently and with more compassion with your peers and other people around you.
It's really common.
I'm an engineer, so I know sometimes it's really...
You kind of look back on what you said and you feel like, okay, maybe I can be a little bit blunt.
Whereas radical candor teaches us to think about, you know, you want to have those communications that are both sharing that you're caring and empathetic, but also direct.
And, you know, the benefits of that and kind of the inverse of that where, you know, you perhaps, like I said, you're very blunt.
You're sort of being honest about it, but you're missing that empathy.
So I found that book really useful and interesting as, I guess, not even just as an engineer, but as a...
person working with other people from the the more fun side basically anything by greg egan he's an australian sci-fi author he writes some pretty crazy mind-bending hard hard sci-fi so if you're really into that i'd say read um like diaspora or um charles letter they're the sort of books that actually took a second read to get through and he's he's a mathematician as well so you know he's got a whole bunch of background and mathematics on why a certain certain part of his story goes the way it is.
He wrote an entire story on the premise of what if the speed of light wasn't absolute or something like that.
This one premise and it kind of breaks out into and then this is what happens to energy and therefore molecules work like this and da da da da and as a, you know, I'm a tech nerd, that sort of science stuff really appeals.
Same, same, when sci-fi there's some science involved that's actually, I find it way more fun.
Rob, thanks very much.
Thank you, Gaget.
It's been great.
What an interesting conversation.
I hope you enjoyed having someone like Rob who has been building and thinking about CICD at scale for a decade.
It was such a fun blast from the past story as he talked about how at Skype our team basically did continuous delivery years before most of the industry caught up and how we did it by quietly shipping new builds to New Zealand every week using this as our canary country.
It's a reminder that a lot of modern software practices were already being run in the wild by devs who just want to ship software faster than our change advisory board will allow us to do so.
One other thing I took a note is Rob's take on rollbacks.
Lots of engineering teams talk about rollbacks as if they're a safety net.
But the moment you have a database schema change in the mix, what's safety net?
Rob's advice is to roll forward, not back, and use feature toggles as a way to turn features off or on.
This is also a reminder that investing feature flags is usually really helpful.
But if you have feature flags, be sure to clean up after them, after you've rolled them out.
Otherwise, they become a big mess.
Finally, a part where I learned something new was on GitOps.
I've always assumed that GitOps was about, well, Git.
But as Rob pointed out, none of the four actual pillars of GitOps require Git at all.
The four pillars are number one, declarative, number two, version and immutable, number three, pulled, not pushed, Number four, continuously reconciled.
The name GitOps has caused the whole industry to get a bit dogmatic about putting everything into Git repo, even things like secrets, which absolutely should not be there.
Rob's take is that most teams just want to ship software.
If GitOps helps with that part, great.
But if a more practical process works better, just use that.
Do check out the show notes below for related to Primatic Engineering deep dives on backend technologies and other related topics.
If you've enjoyed this podcast, please do subscribe on your favorite podcast platform and on YouTube.
A special thank you if you also leave a rating on the show.
Thanks and see you in the next one.
