Tag: agile processes

The role of an Agile architect

“Architecture is about the important stuff. Whatever that is.”

That’s what Martin Fowler told us way back in 2003. If you’re interested in the field of software architecture, it’s probably a quote you’re already familiar with. It’s often repeated, but it doesn’t really help explain what architecture is – or why it’s important. If we continue reading the same article, Fowler goes on to highlight a quote that goes a little further, from Ralph Johnson:

“Architecture is the decisions that you wish you could get right early in a project, but that you are not necessarily more likely to get them right than any other.”

Software development would be oh-so-easy if there was a reliable way to create a completely fit for purpose and efficient design up-front. Agile emerged partly from a realisation that our understanding of what we need will always change over the course of our development efforts. That could just mean adding more detail to our understanding or changing it substantially – that’s why we actively strive to respond to change in the way we work.

Even if we’re in an unlikely situation where we have a complete understanding of what we want now, there is very little chance we’ll know exactly how to solve all the problems we’re going to face getting there. We could spend lots of time up-front, acknowledging that there are risks with a completely predictive approach – or we could spend very little (or no) time in up-front design, reacting to any problems as they become known. Many Agile projects choose the latter and as a result produce less than elegant solutions – and are rightly criticised for it as a result…

How much forethought is enough?

We can’t accurately predict the future, so it seems a little unwise to rely on our precision in that area. Likewise, an entirely reactive approach is probably not going to be very efficient either – especially if we’re forced to rework large areas of our solution on a regular basis. So, we’re faced with a choice about how much time (and to what level of detail) we should invest in the architecture of our solution up-front. Talking about Agile Modelling, Scott Ambler described his “just barely good enough” approach:

I like to say they are just barely good enough (JBGE). I make the following critical points about a model or document (an artifact) being just barely good enough:

  • It is actually the most effective possible
  • It is situational
  • It does not imply low quality
  • It changes over time
  • It comes sooner than you think

All fairly self-explanatory, but in relation to his last point, he expands his explanation to include a very astute observation:

“Traditionalists seem to assume that significant investment in modeling, and corresponding specification, will continue to add value over time.”

This is a common assumption I’ve encountered many times myself. Funnily enough, in situations where the delivery of a project is delayed (or even derailed) by poor architectural decisions emerging after new information surfaces part-way through the delivery process, the response is often: “Go back, spend more time up-front and this time do it right!

If the previous activity exposed the only show-stopper your design will encounter, there’s a chance you’ll now be equipped with the information required to address the problem. The problem with this attitude is that in complex systems (and many simpler ones) there’s likely to be a whole host of potential show-stoppers – many in competition with each other. So what is the answer?

My advice echoes Scott’s – do just enough. What that looks like is highly situational, it doesn’t mean you can accept low quality and it may have to change over time. The traditionalist assumption was that prolonged investment will continue to add value – it kinda does, but the return is ever diminishing. There’s a sweet-spot, where after a certain point you’re spending more time than the value you’re adding – that’s the time to stop!

The Agile architect

In the same article from Martin Fowler we cited at the start of this one, he goes on to define two types of architect. The first is described as:

The person who makes all the important decisions. The architect does this because a single mind is needed to ensure a system’s conceptual integrity, and perhaps because the architect doesn’t think that the team members are sufficiently skilled to make those decisions. Often, such decisions must be made early on so that everyone else has a plan to follow.

Fowler’s first description is often associated (though sometimes unfairly) with the traditional architect job titles, who sit above lowly developers, dictating their every move from their ivory towers. That doesn’t sound very Agile to me… In contrast, the second type is described as:

This kind of architect must be very aware of what’s going on in the project, looking out for important issues and tackling them before they become a serious problem. When I see an architect like this, the most noticeable part of the work is the intense collaboration. In the morning, the architect programs with a developer, trying to harvest some common locking code. In the afternoon, the architect participates in a requirements session, helping explain the technical consequences of some of their ideas in nontechnical terms – such as development costs.

This time, we have someone actively collaborating with the other members of their team. They have an awareness of the overall project and spend time working on high and low-level problems. They get their hands dirty when required, but are also able to communicate with anyone less technical. This person sounds like someone useful to have around – and could fit in to an Agile environment very well.

If you have someone producing a design in a silo, who does not spend time with the people who are building or requesting that change, then you have an ivory tower architect. In a nutshell, collaboration is the mark of an agile architect.

Pulling it together

  • Start with a simple design, because at the beginning, you won’t have enough of a design to support all the software.
  • Have a more and more robust design as the project goes on, because you can’t make progress with insufficient design.
  • Wind up with a fully robust design, capable of supporting the whole project and its future needs.

Source: http://ronjeffries.com/xprog/blog/context-my-foot/

From the point you embark upon your mission to deliver the Product Owner’s vision in an Agile way, you should be collaboratively refining your understanding about what is required. You then agree on their relative priority and begin thinking about the ways to implement those ideas. Early on, your team should have some idea about what the minimum viable product (MVP) might look like. From there, you need to start articulating how you are going to start building it.

With any complex problem, there is very rarely ever just one “right way” to solve it – and those solutions aren’t going to be perfect. There’s always going to be some form of trade-off, that cannot be avoided. A good architect should have enough experience to highlight where some of these trade-offs may occur (and what the potential impact could be). Armed with that information, what you should be doing is finding a solution that could work, then quickly proving whether or not it is going to be (just barely) good enough. Importantly, that means good enough for what your product needs to do now – not what it may need to do later.

To give you a related example, I once attended a talk given by George Berkowski about his book “How to Build a Billion Dollar App”. He described how a team had spent months of long hours and late nights to get an app finished and ready for its launch. After a huge push they got it finished and it launched – then no one downloaded it! At the time, he reflected that they could have just created a single page website instead, to see if anyone ever actually clicked the download link. If as it turned out, no one did, they could have saved a huge amount of time and money. This example was originally given to illustrate the need to prove a market demand for an idea, rather than any technical design concerns, but it transcends the business lesson.

If you identify that your application component really has to handle 1000 concurrent requests from day one, that will impact the architecture of your application. Just letting your team blindly hack away without any discussion is unlikely to be effective – but don’t be tempted to try to predict every bottleneck and point of contention either.

Instead, formulate a plan to prove your proposed initial design can handle those 1000 requests in an identified test scenario. Then, continue working together with the (embedded or prescriptive) developer, test and other roles – leveraging their expertise to bring that idea to life. If one way doesn’t work, fine – move on to the next solution candidate and continue working until you’ve satisfied your minimum acceptance criteria.

Remember that meeting the business acceptance criteria doesn’t necessarily mean the solution is good enough (as the focus is very often solely at the functional level). Your team may still be faced with some refactoring required to clean the code up to a maintainable state – or you might have some edge-cases or other functionality to implement. The important thing is the team has proven a solution for the current situation.

A huge benefit of this approach is that you’ll probably learn about several pinch-points and possible limitations along the way. Often this is information you would not have predicted in advance, but you are now left in a very good position – where you are better able to explain the consequences of any change introduced later. For example, if the Product Owner subsequently wanted to add more functionality to a key user journey, where the change may affect performance, you will have detailed knowledge of many of the likely bottlenecks.This knowledge is based on empirical evidence (from your work in that area), not a crystal ball. You can help the Product Owner accurately assess whether the value added from any changes are going to be worth the cost to develop going forward. That level of understanding is a great place for any product team to get to.

Agile team communication

Agile team communication

Encouraging good communication within a team is one of Agile’s key areas of success. From daily stand-ups to pair programming, refinement and retrospective meetings, working in an open and collaborative way is a core tenet of Agile, whichever framework or methodology you subscribe to.

No hierarchy?

Many Agile approaches attempt to instigate flat organisational structures, where everyone on a team is (theoretically) on equal terms. You’ll also encounter evangelists using somewhat counter-productive phrases, such as “no more managers” or “remove all hierarchy” or similar calls promoting the abolition of traditional reporting structures.

In reality, you’ll find that the world (and by extension, all our work) is inherently hierarchical. Even a typical Scrum team has an implicit hierarchy in the form of the Product Owner. Sure, they don’t manage the team in the traditional sense – and in more mature Agile teams, they won’t be dictating what is included in each sprint – but they do have some authority. They get to choose this feature over that, set work priorities, time-box development activity and more – they’re just not micro-managing the technical development.

Scrum of Scrums

When there is more than one team, one approach to coordinate their efforts is the Scrum of Scrums:

With this approach, each Scrum team proceeds as normal, but each team identifies one person who attends the Scrum of Scrums meeting to coordinate the work of multiple Scrum teams. These meetings are analogous to the daily Scrum meeting, but do not necessarily happen every day.

The team member from each team attending the Scrum of Scrums is generally known as the team’s “ambassador”. Interestingly, the role that attends this meeting is not fixed (it could be the Scrum Master, Product Owner or one of the technical contributors). This leaves three important issues:

  1. What is the agenda and knowledge of the attendee – business and technical roles often have conflicting priorities (and an Agile coach / Scrum Master may not understand either).
  2. When there is inevitably some conflict between teams (priority, dependencies, solution architecture etc.), who is ultimately responsible for making those decisions?
  3. Whose responsibility is it to maintain an overall product direction for the teams? What controls are in place to ensure the Scrum of Scrums team is able to reach a (consistent) consensus?

Network approach to communication

In Setchu, instead of using the Scrum of Scrums technique, it uses a predefined two-tier hierarchy. Multiple Agile feature teams are accountable to a single control team (made up of a Product Owner and Product Architect on equal standing):

Agile Programme
Network based communication.

Teams (and any member thereof) are strongly encouraged to communicate informally and often, in a network manner, between each other to resolve minor issues and dependencies. There’s no hierarchy between the feature teams, but they are expected to try to reach decisions both sides are comfortable with, for most day-to-day interactions. Whenever that’s not possible or when a discussion highlights a wider concern, the issue is bubbled up to their (mutual) control team:

bubbles

The control team is able to offer guidance and make decisions that are in the best interests of the overall product. As this team is a split between business and technical concerns, it is able to provide balanced solutions (and assess the wider impact) to their feature teams.

In this model, each team has clear ownership of its responsibility (and authority). When there is any ambiguity, there is a well-defined, central authority present to resolve the conflict – who are also ultimately accountable for the success of the product.

What is Agile?

Since the original Agile Manifesto was published back in 2001, “Agile” has become an increasingly fashionable buzzword, championed by young, trendy development teams in start-ups, emerging technology companies and small autonomous teams within bigger businesses. So what is it?

What does Agile provide?

For those of you who are unfamiliar with it (or as a reference for those who already are), the Agile Manifesto promotes four key values:

“Individuals and interactions over processes and tools

Working software over comprehensive documentation

Customer collaboration over contract negotiation

Responding to change over following a plan”

Source: http://www.agilemanifesto.org/

That’s fine in the abstract, but what is “Agile” in a more concrete and tangible form – how might a team or business change in its ways of working in order to become (more) Agile? Essentially we have two fundamental areas to sample and build from; Agile process methodologies and associated Agile practices.

Agile Practices

Starting with practices in mind, there are dozens out there (and more emerging all the time). Just by lifting a selection of some of the more self-descriptive examples from the list on Wikipedia (purely for brevity) we have:

  • Backlogs (Product and Sprint)
  • Behavior-driven development (BDD)
  • Continuous integration (CI)
  • Information radiators (Scrum and Kanban boards, Burndown charts)
  • Pair programming
  • Refactoring
  • Scrum meetings (daily stand-ups, iteration / Sprint planning, reviews and retrospectives)
  • Test-driven development (TDD)
  • Use cases
  • User stories
  • Throughput / velocity tracking

Source: http://en.wikipedia.org/wiki/Agile_software_development

I won’t go into the details or respective merits of the practices that I’ve called out here, as that would distract from the focus of this post and after all, they are all topics easily explained by making good use of your preferred search engine. The important thing is that all these practices scale organically, regardless of the size of your project or team(s)* because they’re either distinct activities (like pair programming, refactoring or CI), the automation of otherwise manual techniques or are purely informational. None of them necessitate change to your wider processes. Think of them as plug-ins you can insert that compliment your chosen process methodology, rather than anything mutually exclusive to it.

* Admittedly, pair programming is somewhat challenging if you only have one solitary developer in your team, but other than that please just trust me. After all “I’m an expert!”. Source: https://www.youtube.com/watch?v=BKorP55Aqvg

Agile Processes

Whilst adopting related practices may be synonymous with Agile development, you aren’t truly Agile unless you’re practising (at least an evolution of) an authentically Agile process methodology. So, let’s see some of the more popular Agile methodologies:

  • Scrum
  • Kanban
  • Extreme Programming (XP)
  • Lean software development

To limit the scope and length of this document, we’ll initially consider how a Scrum based process might scale. You’ll often find that organisations proclaiming to be practicing Agile actually mean they’re incorporating aspects of the Agile Scrum methodology (in a similar way to how “Linux” is misused to refer to a GNU/Linux based distribution). In Scrum’s purest form, requirements move from a “product backlog” (a prioritised list of requirements) to a “sprint backlog” (after a planning meeting) which becomes the list of work due to be completed in the next “sprint”. A sprint will typically last around two weeks, where each day a short “daily scrum” meeting is held where each team member reports their progress from the previous day, their objective for the day and whether they have any impediments or blockers that may restrict their progress. Obviously the method has more depth and substance, but we only need a high-level understanding of the process at this stage:

scrum

Source: https://upload.wikimedia.org/wikipedia/commons/5/58/Scrum_process.svg

Agile Teams

Scrum advocates three roles to facilitate this method. A Product Owner, Scrum Master and Team Members. The Product Owner should be a key stakeholder, with a strong vision of the product hope to deliver. They get to prioritise the work in the product backlog, but don’t get to dictate how much goes into each sprint. The Scrum Master’s responsibility is essentially to run interference – removing any impediments in a servant-leader role that facilitates rather than dictates (other than ensuring that the agreed process and the rules of Scrum are adhered to). That leaves us with the team members who deliver our product:

“In Scrum, an ideal team would include seven members, plus or minus two. Usually, teams are comprised of cross-functional members, including software engineers, architects, programmers, analysts, QA experts, testers, UI designers, etc. It is recommended all team members be located in the same room, called the team room.”

Source: http://scrummethodology.com/the-scrum-team-role/

If we imagine seven team members including an architect, analyst, two testers and one UI designer (like the examples provided in the above excerpt) in addition to the Scrum Master and Product Owner we’re left with two development roles – four if progressing to the recommended maximum. We’re also free to shape the team for the size and complexity of the product we’re going to deliver. This could mean we remove the UI designer and one of the testers from the team and add another developer and a DBA. The makeup of the team can easily evolve as you discover the balance of work. This is ideal for many small teams and businesses, when everyone fits into the proposed Scrum organisational model and as we have a singular Agile squad, work iterates quickly in a serial manner. But does it scale…