within organizations populated by many actors, influenced by the methods,
practices and behaviors that coexist with them. Most of all, they have the capability
to learn and adapt to each new entrant into their world. It is for this reason that, we
tend to avoid recommending ‘best practices’ that all software teams can follow for
success, let alone ‘agility’.
There are practices that when employed together can promote beneficial behaviors
or expose harmful ones in the surrounding environment. For example, the use of
continuous integration can on a basic level expose unintended defects in the
boundary points of two pieces of software. At a more significant level, this practice
can be used to influence the behavior of software developers to increase perceived
ownership of the solution and to reduce tolerance for less-disciplined colleagues
working within the code base.
Continuous integration is but one part of a more effective system of activities,
practices and behaviors that many describe as continuous deployment. In this
system, software is designed, developed, tested and deployed rapidly and regularly,
often daily, if not multiple times a day. What makes this so complex is that it
involves a change in mindset across many roles on the team. In order to deploy
continuously, teams must conceive of the smallest possible features and implement
them without gold-plating. Breaking this approach down further, it deals with
keeping batches of work small enough that defects are easier to find and fix, and
process issues can also be sorted out quickly. The philosophies powering this
approach are drawn from lean manufacturing; the overarching pursuit being the
elimination of Muda, or waste – wasted features, wasted software, and wasted
money.
At the core of both of these approaches is testing. Arguably, testing is the single
most important activity for development teams to undertake. There are successful
teams that employ very sophisticated arrays of automated tests, and some that are
successful doing it manually. The degree of automation necessary is typically
correlated to the scale of the system being developed. What is more important is
how closely the testing activities reflect the expectations of the customers and end-
users of the software. It is from this, that so many other ‘best practices’ are derived.
At ThoughtWorks, we have defined our ideal state as being one of
continuous delivery: one in which the customers and users of software have
maximum ownership and influence of the development process. This system
involves discipline by all actors in the system, from the leadership that provides the
trust and guidance to software teams, to the teams that regularly fulfill the changing
needs of their customers. There is no recipe for teams to follow to meet this goal,
but there is the willingness to observe, adapt and respond to the change that meets
them.