Is Agile agile? Is SAFe safe?
In a discussion with a senior exec once, we got onto the topic of agile process. He at some point told me (rough paraphrase from memory!) “Agile is about knowing what your destination is and getting there faster”. I used a little personal discretion and let it pass, but I was an agile advocate (OK, maybe zealot!) at the time, and this helped me cement in my head what was different about agile methods vs. others.
First some base principles. There are of course a bunch of program management processes and lifecycles out there, and they’ve evolved over time. They all do some similar things: define the scope and requirements of a project, break down the required work into manageable chunks, provide a way to estimate resources and timelines, and tools for tracking progress as you go through execution.
Where agile (as well as earlier variants like spiral lifecycles, etc.) starts to differ isn’t just “scrum” – it’s in the assumptions when you make when you are in the early stages. There is of course a ton written on this (a good starting point is of course the agile manifesto), but in most approaches, the assumption that we do know, or need to know, the key answers up front. Who is the customer? What is their problem? What are our requirements? What is our architecture? What work is required? What (and when) are the milestones? In most processes I’ve seen, the model is that we need to have substantially complete answers to these questions early: either before you start, or the first phase of the program is to define them. This makes sense: predictability is generally a good thing, so knowing your scope/schedule/resources upfront makes the projects easier to budget and manage.
The problem agile addresses, though, is that it presumes that you don’t know many of these answers upfront, and in fact that you can’t know. We often do a lot of work to get confidence in program definition early, but as I look at projects I’ve been involved in that didn’t go as planned, it was rarely due to pure execution problems. It’s not that the plan was correct and we just didn’t execute – it’s that things came up that we didn’t anticipate. The customer’s problem wasn’t what we thought it was … we missed a key requirement … a piece of tech didn’t work like we expected (or new tech showed up that was better) … integration wasn’t as smooth as we’d hoped … a competitor did something to change our plan, etc. For many programs, these disruptions were seen as problems (or “thrash”) – changes to plan that upset our predictions, and could impact schedule and/or cost in bad ways.
Where agile differs philosophically is that these disruptions aren’t seen as problems – they are learning what is core to the process and critical for program success. Agile sets the mindset that we don’t know the answers up front, and in fact can’t know: thinking we know is dangerous self delusion. The emphasis shifts to developing a plan (there still is one!) for how we can validate the key, expensive assumptions as quickly as possible, with the fewest resources possible. If this sounds to you like the Lean process – yep, it is! As lean processes came on the scene, it always struck me that it was effectively the same as what agile was supposed to be.
Now for control freaks (myself often included) and finance departments, this sounds scary: we’re suggesting starting a project without having firm commitment to scope/schedule/resources – and we are right. The belief driving this, though, is that most of the time that we think we know up front, we really don’t. In traditional methods, we typically lock into a plan, with the assumption hope that it’s right. Thinking agile, though, requires us to step in assuming that we don’t know all the answers yet. With this assumption baked in, we can get to the real correct scope/schedule/resources faster, as we are testing them early and adjusting when it’s cheaper to adjust – not at the end, when it’s extremely expensive.
Practical Agile Process
So what does this mean for our actual process? The core of most agile processes is typically “scrum”. We have small teams, led by a Product Owner, that break work up into dev/test cycles called sprints. In many ways, this is similar to most product development approaches … but the key distinction here is not just the frequency (i.e., how short are your cycles), but that the test results of each sprint causes a planned reset of the scope/schedule/resources before the next sprint. For a lot of agile organizations, though, we’re really in waterscrumfall: we are using scrum as a way to break up and schedule work, but the feedback cycle that changes our plan doesn’t exist, if not be seen as a problem. If we’re getting agile right, feedback-induced change is not a problem – it’s the process by which we get to the right answer the fastest at the lowest cost.
Sprint length is often seen as a key metric for how agile teams are – i.e., the shorter your sprints, the more agile you are. This isn’t totally wrong, but I’d suggest it’s not our development cycle frequency that defines our sprint length – but rather, it should be the test/feedback/change cycle. If we are doing weekly dev sprints, but only test and adjust plan once a month, our real sprint length is a month, not a week.
If this sounds like I’m saying testing matters more than dev, I kind of am! We of course have to do development to have something to test, but if we’re really getting the core principles right here, our schedules would be built around testing, not development. A key aspect of this is what testing is. For waterscrumfall programs, per-sprint testing early in the program is often only technical: i.e., unit tests to validate expected behavior, etc.. Other testing – integration, security, privacy, much less customer feedback – happens only at the end of the program when most development is complete. For agile, this is backward … we want to get to full system test and customer feedback as early as possible, well before we’ve done much of the development. We then add to these tests progressively as we add more functionality, but we’re getting full system feedback the entire time, not just at the end. This can require some creativity in how we do testing, but it’s well worth it.
This may all sound like advocating that we don’t do any planning or architecture up front. We definitely should, but I think our mindset around this is different in agile. We do need a plan, and we do need to develop (initial) architecture. The distinction is that we think of this initial plan and architecture as a starting hypothesis – call it v0.1. It’s the starting plan and architecture, with a set of assumptions that we use to model our business success. This plan then defines the first sprint(s) work to validate these hypotheses, and progressively advance the plan and architecture as we learn. These changes to the plan and architecture aren’t thrash – they are the key outputs of the first few sprints.
Whither SAFe?
A lot of what I’ve talked about so far has been in the context of individual scrum teams, which of course limits the scope to what a single team can accomplish. For a lot of larger enterprise programs, though, the scope is well beyond what an individual team (at least a 2 pizza team) can accomplish. SAFe is the hip approach to this for a lot of organizations these days, and at a high level, it’s great stuff: it gives us methods to apply the agile principles and approaches discussed above. It does, though, apply a lot of extra process and constraints on individual teams, and often brings it’s own flavor of waterscrumfall. Sometimes this is justified or required – but I’ve often seen it applied a lot broader than it needs to be. In most cases, before jumping into SAFe (or applying it across all teams), we should be looking at our organizational and technical architectures. Do all of our teams really need to be synchronized, or is this a flaw in our organizational or technical architectures? The more we can keep teams decoupled so they can develop, test, and deliver independently, the more efficient and less process bound we can be.
A Caution
Agile isn’t an excuse for bad decision making. It should not be an enabler for late, chaotic changes (though it can handle them better). The trick is for change to be based on real customer feedback/signals/data. Data drives decisions, decisions don’t choose their data (now that’s a novel thought these days!). We shouldn’t avoid decisions, or change requirements based on whim – but rather, frames decisions as hypotheses declared up front. We then test to validate (or change) them based on real customer feedback and data. Managers that use “being agile” as a way to make late, non-data based decisions aren’t really being agile – they’re working outside the process, not inside it.
My idealized flavor of agile may not be the answer for every project, and there are certainly projects where it’s just not possible (or safe!) to do “in the wild” testing of some products early in their lifecycles. That said, we should have a little self-introspection on our “agile” programs: are we really getting what we think we should be from them, or are we unconsciously harboring some cognitive dissonance with agile methods and terminology inside processes that are really not agile at all?