Use of Agile in Enterprise Architecture
At this risk of sounding like a management, motivational speaker there is one consistent piece of advice that I give to IT organizations over and over and over again when undertaking large initiatives: start small and build in incremental steps. This is particularly true for Enterprise Architecture groups. It is in this spirit that I recommend the adoption of agile methods within the Enterprise Architecture groups, even if agile is not used within the application development groups of the organization.
Agile methods can be successfully applied to all sorts of Enterprise Architecture activities, but to illustrate its applicability let’s look at how agile applies to the development of a standard technology platform for application development. What I mean by a technology platform is a set of standard technology components and reference architectures that can be used by application development projects within the organization, such as a platform for e-commerce applications, or a platform for Java-based, web development, etc.
While we’re on the subject of using agile development, I’ll also cover what considerations one might take into account while defining a technology platform to maximize the benefits of agile methods in application development.
First let me level-set with quick a definition of agile.
If you are familiar with agile, feel free to skip forward. If you’d like to read a more thorough explanation of agile I suggest reading “Extreme Programming Explained: Embrace Change” by Kent Beck. Even though it’s about one specific agile method, XP, it’s a great one-evening-read that covers the core of agile.
The definition I use is made up of eight simple ideas:
- Small release and rapid feedback cycle – By moving stuff into production use as quickly as possible you start to realize benefits quicker and you get feedback sooner. Most importantly you don’t wait until months have passed to realize the project is failing.
- Don’t be afraid to change the requirements – As you put releases out and get feedback, you’ll refine your understanding of what the customer wants and the customer will refine their understanding of what is required. This can be a good thing, embrace it.
- Continuous customer interaction – By keeping the customer involved you allow for that rapid feedback.
- Define releases based on a functionally complete set of features - Each release should demonstrate a function of the complete system from the perspective of the customer. I.e. the customer should be able to look at the release and test it against their expectations without someone explaining why this or that doesn’t work yet. This goes against a lot of old school engineering practices that say build your entire infrastructure first and then build the functionality. The reality is sometimes we build infrastructure that we never use. A corollary to this is that before we start building we should know how to test, so when the customer defines the requirement we need to also define a test case.
- Don’t be afraid to refactor – One of the reasons we tend to build out infrastructure before functionality is because we like to write a piece if code, test it, call it done, lock it away in a source control system and don’t change it again. This works fine if you follow the approach of build all the infrastructure first and then the functionality and you don’t change any of the requirements mid-stream. Since we’ve already accepted the fact that requirements will change and we’re not building out infrastructure until we need it we have to be flexible and allow for the refactoring of code that was already released.
- Automate testing as much as possible – The main reason we fear refactoring is we’re afraid we might break something by mistake. The solution: automated regression testing. If it’s easy to test if broke something you’ll be more confident in your refactoring.
- Continuous integration – Since most projects have multiple developers and we’re allowing them to refactor code as required we need to synchronize as often as possible. Practically this means a shared environment with all the automated build and test capabilities. Ideally the integration build and test process should be push button.
- Keep it simple – Underlying everything in agile is the basic belief that the simplest solution is the best. Don’t implement a general purpose spreadsheet if all you need is the ability to sum a column of numbers. Don’t build out infrastructure if you don’t need it. Don’t design complete abstractions when a simple abstraction will do. Don’t write hooks for 15 features you haven’t thought of yet into something. Etc.
So let’s look at how each of these ideas can be applied to defining a platform:
Small releases and rapid feedback – I always recommend to organizations starting to defined standards to start slow. Don’t define more standards than the organization needs, has the ability to absorb or has the ability to support.
- If you have only one application that uses a rules engine in your entire portfolio, there’s no sense defining a standard around rules engines and certainly no sense is holding up the development of a reference architecture until you’ve figured out how to incorporate the rules engine into it.
- Organizations absorb standards by writing new applications that use them, if there aren’t any applications in the pipe for development to use a standard it won’t get used and by the time it does it might be out of date.
- If you tell someone they have to use AJAX you also need to tell them how to use AJAX. If you don’t have the bandwidth to provide the support to a standard think twice about defining it.
As you put out standards see how they are used and get feedback from actual application developers. If they are also using agile methods you shouldn’t have to wait long for feedback.
Changing Requirements – Platforms change whether we want them to or not: technology evolves, vendors update their software, and new applications have new requirements. No matter what methodology you use for platform development you have to plan for change. This is often called the “technology adoption lifecycle” every company that is serious about managing standards has some version of it.
Continuous customer interaction – This should be even easier for platform development than application development since the customers are members of IT who speak the same language as the platform developers. There’s little reason why platform development should not be getting constant input from the application development community.
Functionally complete feature sets – A platform is essentially infrastructure so defining a functionally complete feature set is probably something a platform developer will have an easier time of than an application developer. A platform should address specific needs of the application development, maintenance and operations. Some thought should be put into what those needs are and what the minimum feature set required to develop those releases are. One complication for platforms is that often times they are build on vendor products which have lots of features you don’t really need. Part of defining a platform is setting the rules around which features of a vendors product should be encouraged, which ones allowed and which ones discouraged or even banned. This is something that is often missed in platform development; the results are applications that are irrevocably tied to a specific vendor’s product.
Refactoring – Not that I want to discourage the use of refactoring, but a word of caution here is prudent. Good platforms are designed to be modular with well defined interfaces between the modules and most important clean Application Programmer Interfaces (API) exposed for the developer using the platform. When refactoring within a platform it is ok to change the interfaces between modules in the platform, but be very judicious when changing the externally exposed APIs.
Automated testing – This is just good practice, I don’t care what you’re developing. And the infrastructure guys will love you if you develop an automated test for validating a deployed platform.
Continuous integration – Another good practice, and again the infrastructure guys will take whatever assistance they can get in automating the deployment of a platform.
Keep it simple – There’s an old saying about the US Supreme Court that says the court can withstand anything except ridicule. Basically it means that if the court makes decisions and nobody follows them, they become meaningless. As a result the court tends to look for the simplest way to resolve any issue figuring that it will also be the most readily accepted by all parties. The same is true of platform developers. If no one uses the platform it becomes meaningless, thus a good platform is both modular and minimalist, thus allowing for piecemeal adoption as an alternative to wholesale rejection.
As promised, while we’re on the subject let’s look at how a standardized technology platform can support agile application development.
Small releases and rapid feedback – Part of a platform definition should include the release mechanism. If releasing a new application onto a platform is a four week task, then the idea of small, rapid releases will not be very efficient. The platform should be designed to allow for releases as quickly and effortlessly as possible.
Changing Requirements – One of the most contentious parts of any application development project is defining non-functional requirements (NFR). Project shouldn’t be focusing on NFRs that much in the first place; most NFR should already be defined at the enterprise-level (i.e. availability, security, monitoring, etc.). By building enterprise-level NFR compliance into the platform, the application development team can focus on functional requirements.
Continuous customer interaction – The platform needs to support development. The development group shouldn’t have to figure out how to make a “beta” version of the application available to the customer, the platform should have that mechanism already.
Functionally complete feature sets – This is one of the fundamental reasons why we build platforms. A lot of the infrastructure issues will be common across applications and to the extent that the platform is complete out of the box the application developers can jump straight into functionality development knowing all the basic infrastructure is there already.
Refactoring – If the platform is modular it will support refactoring the application in smaller increments. Often times the scope of a given increment will be influenced by the scope of the modules within the underlying platform.
Automated testing – The platform can do a lot to support automated testing; this should be included as a requirement in the platform development. Also, there should be a simple way to validate a platform has not been corrupted as well as mechanisms to support the regression testing of an application when the underlying platform changes. How many times do we defer taking vendor updates because we’re afraid it’ll break something?
Continuous integration – Again the platform can do a lot to support continuous integration. Most immediately if the platform can easily be virtualized that solves a host of resource issues. Also, the easier it is to deploy the platform the easier it is to refresh our environment if we’re afraid we corrupted something during testing.
Keep it simple – Developers are assumed to have a certain base knowledge set, but they’ll need to learn a few things about the platform if it’s the first time they use it or if it’s been updated. The platform developer should try to minimize this learning curve. It’s just good practice.
A final word about the adoption of agile for Enterprise Architecture work, this one’s for the finance guys. One complaint about agile application development is that it doesn’t fit well within generally accepted practices for deciding when it is acceptable to capitalize application development and when to treat it as an expense. To make matter worse the general practice is: when in doubt treat it as an expense. Unfortunately this has the result that when comparing agile to waterfall, agile looks less attractive from a financial perspective. Fortunately since Enterprise Architecture work is treated an expense in most cases anyway, this isn’t really a problem. In fact, agile’s focus on small releases, put into production quickly will allow your EA effort to deliver return on investment more quickly; that’s always a good thing.



