Agile principles have a long history, they don’t begin with the Manifesto. That was just a point in time when a group of smart software engineers aligned on certain principles for managing software projects and handling complexity. Great minds have been grappling with the problem of complexity for hundreds of years. Agile is just a waypoint on that journey. It is neither the beginning nor the end of the story. Software development is a complex endeavour, and Agile is just a collection of ideas to handle that complexity.
Lots of people have their view on what Agile is. For me, Agile is a state of being, to do Agile you need to be Agile. This isn’t something you can learn in a How To Guide, it’s something you practice and become. This might sound pompous or even ridiculous. However, most resistance to Agile doesn’t come from a lack of understanding, lots of people have read the principles. It comes from something innate, a fear, a belief that Agile represents too much risk. It doesn’t participate in the illusion of certainty, and that terrifies some people.
To do Agile you must become comfortable with certain philosophical principles. If you are not you will always struggle to be Agile. In my mind there are two important principles you must accept.
- The World is complicated and chaotic, and you are not in control.
- You don’t know all the answers and never will, accept your ignorance.
The first principle can be deeply troubling. It goes against much of what we are taught as children. That we can make the world our own and achieve whatever we desire. This, for various reasons, simply isn’t true. Many have written on this topic but I was first exposed to this idea more than 20 years ago while studying my history degree. Long before I knew anything about the Manifesto for Agile Software Development. I read John Gray’s popular, but controversial, book Straw Dogs which attacked the cultural and political zeitgeist of the time and highlighted that we are not in control of our lives. The universe happens and we are just along for the ride. Where we end up in life is mostly about luck.
I found John Gray’s ideas hard to accept but I couldn’t escape this nagging doubt that he was right. It triggered a love affair with his work and over the next 20 years I read almost everything he wrote, including an interesting little book on cats. None of this is to say we have no agency, but we must be comfortable with change and a lack of control. The universe will throw random, unexpected things at us that we must handle. When we develop software we should expect the unexpected. To expect anything else is deeply naive given the complexity involved.
The second principle is more widely accepted, but sadly not by all. We are ignorant, and the wisest are those who understand their ignorance. An idea shared by Socrates more than 2,000 years ago. The principle has been developed further by thinkers like Hayek who highlighted the impossibility of collecting all knowledge. It’s even been touched on by Turing when he showed not all problems are computable. Put simply, we cannot always know.
What this means for life, and even software development, is that we always have a lot of learning to do. Particularly when faced with new problem domains. We cannot plan our way through all things, and very often detailed planning won’t help at all. Sometimes we just need to dive in, and begin to explore and learn.
But what does all this philosophy mean in practical terms? There are, in my mind, three day-to-day principles of Agile.
- Default to Action: I sometimes call this Default to Production. Once you have defined a goal, find a way to get some software that is aligned with your goal into production as soon as possible. You don’t need to plan every detail or get the design perfect. It will always be more valuable to get something into production that you can learn from and build on.
- Accept Change: the universe won’t remain static and neither will your software project. Accept new information and requirement changes with open arms. Often it means something new has been learnt that can improve your project.
- Don’t be Sentimental: Nothing will ever be perfect and you won’t always get everything you want. If an idea is not working or you can’t deliver a particular feature in time, drop it. Don’t cling onto an idea like a child’s toy. Move on and get what you can done.
The most Agile project I ever worked on aligned with these three principles. It was 11-12 years ago and was for the Ministry of Justice, a department of the British Government. Not an organisation you’d expect to be Agile, but given how many expensive software project failures they’d experienced they were trying hard to improve. There was no plan, as such, just a goal and a long list of requirements. We worked as a team with the customer to prioritise the requirements and began coding immediately. As we understood the domain, new priorities and requirements appeared, almost daily. There was no sentimentality about changing code or deleting interfaces, we just got on with it and kept moving forward. The team didn’t always get on, there were arguments, but within 6 months the team had delivered the Beta as requested. It was, to this day, the most successful software project I’ve worked on for a big customer.
Once I’d had this experience I knew Agile worked really well, I’d seen it, I’d experienced it. Since then I’ve worked on many more Agile projects, some successful, some less so. Yet, more than a decade later, I still meet people who are deeply uncomfortable with an Agile way of working. They believe in big plans, spreadsheets and risk management. This post doesn’t exist to say those people are wrong. There are plenty of situations and domains where Agile is not appropriate, but in the complex world of software development it helps a great deal.
Importantly, though, it’s not easy to adopt Agile, you have to become Agile. I found it hard, it took me years to wrap my head around it, and I’m still learning every day. So I understand some people are reluctant or find it difficult to become Agile.
Ultimately, to be Agile you must accept a worldview, a philosophy, that may be very different to the one you have today. That is not an easy task, I hope these insights help and I wish you luck.