Software is complicated. You just won’t believe how vastly, hugely, mind-bogglingly complicated it is. Software is probably one of the most challenging and complex things our fair species has ever created. Unsurprisingly, this makes software difficult to produce at all, and incredibly hard to do well.
The process of making software — which we, lovingly, call software engineering — is mostly about managing that complexity. This is done so that humans can cope with it, harness it and do awesome things using it. One of the techniques used to contain complexity is abstraction. Software resembles a Russian doll of abstractions. Each layer brings us an increasingly human viewpoint that gets us closer to the problem domain. If the abstractions are good ones, we can write code in the terms our users can understand. If they are bad, then the Russian doll will resemble a scene from a Cronenberg film.
As an agile architect, my main role on projects is a steering and advisory one. I help guide the software towards good abstractions that contain the complexity. This allows us to deliver high quality code reliably and efficiently. Unlike a traditional software architect, I don't develop huge upfront designs that quickly become dangerously out of date. Instead, I work day-to-day as part of the team; keeping the big picture of the project’s in mind so our talented developers can focus on the functionality they're currently building. This high-level view allows me to step in when needed and offer guidance on how to solve particular problems. It also makes sure our solutions are cohesive, maintainable and flexible.
A lot of what I do is connecting from the business to the technical worlds, taking stories and fitting them into our solution’s jigsaw by translating complex requirements into tangible technical tasks. Working together, our developers and I ensure that the solution we’re developing is the right solution.
I'm usually involved right from the start of a project, building up a deep understanding of what the customer wants to achieve and the constraints they have. I will produce an initial high-level architecture that provides a scaffold from which the system will grow. That initial picture is likely to change as the software develops, but it helps our teams focus their thoughts on developing a great solution user story by user story by protecting them from much of the complexity.
I also have oversight responsibilities across our projects. I encourage our engineers to follow best practices, both technically and procedurally, and assist with organisational learning. I am responsible for validating solutions to keep technical risks to a minimum and with spotting useful patterns in what we develop.
The role of agile architect is an exciting and challenging one that keeps me learning. Every day, I am presented with new puzzles to solve, and the work is incredibly varied. One day the task at hand could be designing a distributed task system and the next I could be working on a line-of-business tablet application with a clever backend. This job gives me the rare privilege of working on some of the most cutting-edge aspects of cloud computing whilst getting to help some of the biggest brands in the UK solve their business problems.