What Is an Agile Framework, Anyway?
“Agile Framework” must be one the most overused but poorly understood terms in the Agile universe. Most of the time, it’s just dropped into a conversation or training course with an assumption that everyone will already know what it means. After seeing so many people struggle with this term over and over again, I started asking just what is an Agile Framework anyway?
Searching for an Industry Definition
The first obvious thing to do is to search online. Doing so yields these gems:
Agile is an umbrella term for several iterative and incremental software development approaches, with each of those variations being its own Agile framework.
An agile framework can be defined as a specific software-development approach based on the agile philosophy articulated in the Agile Manifesto. You can refer to any of these frameworks as methodologies or even processes. Though, as you may recall that one of the manifesto’s four values states the philosophy prioritizes “Individuals and interactions over processes and tools.”
Definition of agile framework: when we talk about agile in software development terms, we refer to a variety of different approaches based on the agile values and principles set out in the Agile Manifesto. Each of these different ways of doing things represents its own Agile Framework.
Well that was confusing! My take on this is that:
- Agile Framework is an umbrella term covering a variety of methods, each of which is its own Agile Framework!
- An Agile Framework is a methodology or process, even though the Agile Manifesto deprioritizes processes!
In my view, that was pretty useless.
Searching for Something Simpler
Ok, how about we search for something simpler? How about we search for “what is a framework” instead:
In computer programming, a software framework is an abstraction in which software providing generic functionality can be selectively changed by additional user-written code, thus providing application-specific software. It provides a standard way to build and deploy applications and is a universal, reusable software environment that provides particular functionality as part of a larger software platform
Right… so a software framework is something that provides a generic capability but can be made more specific by adding user-written code. I guess it’s like a bland MySpace page that you used to be able to bling up like this or this or this. You get the generic page by default, but you can inject your own personality. Who wouldn’t want to do that? It worked for MySpace! For a while anyway! We’ll come back to the software definition shortly…
What Does the Dictionary Say?
Let’s go back to basics. What does a dictionary say that “framework” means:
1. A framework is a particular set of rules, ideas, or beliefs which you use in order to deal with problems or to decide what to do. e.g. within the framework of federal regulations.
2. A framework is a structure that forms a support or frame for something. e.g. wooden shelves on a steel framework.
— Collins Dictionary
1a. basic conceptional structure (as of ideas). e.g. these influences threaten the very framework of our society.
1b. a skeletal, openwork, or structural frame. e.g. an iron framework surrounds the sculpture.
— Merriam Webster
Right, we’re making some progress now. So a framework is:
- A structural set of ideas or rules, in which we can tackle specific problems.
- A physical structure of some description, such as a steel structure which holds up the rest of a building.
The key word that I want to draw your attention to is structure. It’s a recurring theme that we will explore further.
A Programming Example
I find that one of the best examples to understand what “framework” means is the Spring Framework. Don’t worry if you’ve never used Spring: for the purposes of our discussion it’s just a programming toolkit to make developers lives easier when building a Java based web application. It provides a bunch of standard services that you glue together with custom callbacks that you supply. That explanation is key, as I will explain…
Normally, when your code calls a function in a standard library, you execute the call to the library and you wait for the function to return a result to you. Let me repeat that: you call the library. Now, let’s reverse the situation. Let’s say that the library function calls your code, the simplest example of which is a callback function that you write. For example, if the library is a web server and knows how to receive and respond to web requests, it still needs to know how you want to handle each specific request. What data do you want to send back to the client? You need to specify this for the framework.
If you’re not a programmer, I’ll explain a little more about how a web server works. When a person types a URL into their web browser, that request finds its way through the Internet to your server, and expects your server to respond to it. As a programmer, you don’t want to build a whole web server from scratch, that would be way too much work! Instead you use a ready made solution. So you set up an off-the-shelf web server and load your application (i.e. your web pages) into it. The web server knows how to receive a URL from a browser and how to send to some data back to it, in other words how to handle all the “plumbing”. The only problem is that it doesn’t know what specific content to send back — you the programmer need to supply that — and that’s your application. The important thing to note is that your application is loaded into the web server, and not the other way around. The web server controls the overall process of fulfilling the URL request, and just calls your application when it needs to fill in a specific answer.
And that’s essentially what Spring is, it’s a machine that knows how to deal with many generic situations such as handling web requests or connecting to a database. The main thing it doesn’t know is what to do in those situations from a business-specific context, for which you provide a small section of code to fill in the gap. Thus the normal situation of calling a library function is inverted:
In a programming framework, the framework is the machine that calls your code, rather than the other way around.
That is, the framework is a structure that surrounds and calls your own application-specific code snippets. When you write Spring application code, this relationship is obvious. It’s clear what structures Spring is providing for you, and it’s clear that your section of code is something that you’re supplying to Spring, so that Spring can control the overall job. In other words, you work within the bounds provided to you by Spring — that’s what the framework is.
A Physical Example
To go even simpler, let’s consider a bookshelf in a library, such as the one in the image below. The bookshelf is used for holding books; it’s a structure into which books are inserted. But more than that, the bookshelf also serves to organize the books that it holds, making it easy to locate a book that you’re interested in. So the bookshelf is a framework for holding and making available books in an organized and easily findable fashion. Without the books, the bookshelf itself is meaningless. And equally, the placement of the book only makes sense within the bounds of the bookshelf framework.
So What is an Agile Framework Then?
Hopefully from our discussion thus far, it should become clear that:
An Agile framework is a structure into which different Agile development practices are inserted.
Without the practices to insert, your framework remains an empty shell.
Some frameworks such as Extreme Programming explicitly state the list of practices required. Others like Scrum leave the choices up to the team to decide. This latter case, whilst more flexible, also makes it more likely that the team may choose poorly when inserting each practice, or indeed that they may not insert any practice at all! This comes from not understanding that they need to step in and fill in the gaps, which is especially a risk for a novice Agile team. The difference between an under-specified programming framework and an under-specified Agile framework is that the former crashes very obviously, while the latter fails slowly in subtle and insidious ways which prompts critics to respond to you with “you’re not doing it right!”
Injecting your Personality into the Framework
The programming framework needs you to inject some business logic at certain points. For example, “when I (the framework) receive a web request at this particular URL, how do you want me to respond to it? Please write the code that gives me the situation-specific handling instructions.”
Similarly, an Agile framework needs you to inject some process that is specific to your business. For example, “when I (the Agile framework) dictate that we have reached an iteration planning meeting, how do you want to select the work? Please insert a process to choose the work that I will carry into the next iteration for you.”
If you imagine that your Agile framework is in a conversation with you, asking “what do you want me to do at this point?”, it will make more sense. Then you can give your informed opinion as to how to handle each situation rather than blindly following a practice simply because everyone else does it that way.
Despite the dearth of information available, an Agile Framework is not a big mystery. It is simply a structure into which we insert Agile development practices that are specific to our situation. If you don’t reflect upon, choose, and then optimize the specific practices that best reflect your needs, then you are risk of practicing “cargo-cult Agile” or “flaccid Scrum”. And I know that’s not you 😉.