Closing the Gap between Business and IT

November 17, 2009

From almost the dawn of the age of software more than 50 years ago, there has been a communication gap between business and IT. For almost as long we have sought solutions, but they always seem to elude us.  Meanwhile, the gap has grown into a chasm that now needs a fairly substantial bridge.

From the business you may hear that ”we have no confidence in IT’s ability to deliver useful solutions”, or “we have limited visibility of progress, risks and problems”, and “we don’t know how we should measure the value of our investments in IT.”

From IT you may hear that ”they (the business) don’t fund the projects adequately”, or “they don’t know what they need”, or “they don’t know what is possible to develop”.  Each side feels the other is responsible for the problem.  And, you know, they both are right.

Over the years there have been many strategies to close the gap, sometimes going from the one extreme to the other.  Some have viewed the gap as a soft problem only:  if only business and IT could collaborate better and learn from one another the problem would be solved. Improvements in communication and sensitivity were tried, but still the gap remained.

At the other extreme people have tried to apply software technologies to describe the business process in the form of models. The result was usually a very detailed business models which could not be understood by anyone other than their creators, who were typically software people.  In reality not even these people really understood them because they usually had a flawed understanding of the business process itself.

The solution lies somewhere in between:

  • We need a common, but simple, language.  Spoken languages such as English would seem simple but they are too ambiguous and nuanced to help us with what needs to be done.  Nor should we become excited about any of the many modeling languages which are understood by only a small subset of IT people.  In my experience, just 10-20% of these languages is more that enough to describe business processes.  Moreover, we should focus on describing the essentials, usually less than 10% of all the details.  The rest the IT people can take care of on their own.  This is smart!
  • Of course, we need to work together but not just to learn to know one another, but to do something we can stand for together, e.g. executable code.  The era is over when one side prepares a document to an illusionary “final” status and then throws it over the wall to be implemented. We have ample proof that this does not produce good results.
  • We need to deliver results often and with high quality, on frequent intervals.  IT will have to accept that the business will change its mind about what it wants.  This is a natural part of seeing results more frequently, and the feedback obtained is valuable and important. Frequent demonstrations of progress creates confidence and increases productivity, quality and it gives quick results.

Thus we require a strengthening of the competencies on the part of the business. The people that work with IT people need to understand how software is built in many steps based on a farsighted map.  They must be able to contribute by defining the essentials of business processes and must be able to transform these essentials into requirements in the form of use cases, etc. There is just no way around this.  It is naïve to believe that the business can avoid these capabilities.  This does not mean that they need to be experts in writing requirements, but they need to know enough to actively participate in their definition.

Of course it is equally important that the IT people understand business goals, strategies and business processes.  Software has the ability to change and improve the business processes and find more efficient ways to perform this process, but an understanding of the process is the essential starting point.

This is smart!  However, it is just the beginning, please read my next blog.


There are practices and then there are Practices

November 10, 2009

The software development community has been talking about practices in an informal way for a very long time – more than 50 years. In the way the community talks, a “practice” is just something that people do, a habit they have that may be good, or perhaps not good. Talking about practices in this way makes for good conversation, but it is hard to figure out how to combine good practices into something meaningful.

I like to talk about practices in a more precise way, so I will refer to these as Practices (with a capital ‘P’). With a more precise definition we can do some interesting things: we can combine them (or compose them) in interesting ways, and we can separate them to allow us to replace a practice with a better one.

In earlier blogs I have discussed Practices. Practices are, in effect, the use cases of software development: they describe an independent set of actions that a team takes that delivers meaningful value in the software development process.

Practices rely upon a process kernel that describes the fundamental invariants that all methods always have, such as activities for specifying, architecting, designing, coding and testing software and artifacts (documented or undocumented) for requirements, architecture, code and test. The kernel helps us to normalize the descriptions of Practices by giving them a common foundation. It provides the basic vocabulary and concepts underlying all Practices. Practices that are described as extensions to this kernel can be combined and composed in simple and understandable ways.

Practices remove the need to have one single monolithic, all-encompassing method or process. In the Practice world a method is just a set of separate but complementary Practices. This reduces the complexity of improving processes – it can be improved a Practice at a time.

You also don’t need to force every team in your company to use the same method or process. Practices can be chosen and composed based on the needs of the project and the skills of the team. Your company can set up an internal community of practices to allow people to share experiences, to learn about practices and to build a practice library.

Precise Practices are practical, because they are much easier to learn and adopt than learning and adopting a method or process. They ”are as simple as possible but not simpler” to quote Einstein.

Very few people read process books, and the ones who do usually seem to misunderstand the point. This is why we have described our Practices on index cards. A single practice is described on ten to twenty such cards, forcing the Practice to focus on the essentials – the most important information you need to know about it. If you learn the essentials you can figure out the rest by yourself with a little help from someone more experienced.

The idea of Practices has started to catch on, and it is being adopted by many people and in many organizations. Even companies like IBM and Microsoft are coming around. That is a good start, but we need to make sure that the Practice is really good – something useful to a team – something that simplifies software development and makes it clearer how to work. That is smart!


A Day of Honor

October 30, 2009

Lima, Perú, October 21, 2009

This time I have something to tell you about my visit to Peru. I had been nominated to receive an honorary Doctorate degree from the University of San Martin de Porres (USMP) in Lima Perú. USMP is one of the most prestigious universities in South America. Thus, when I got the offer from USMP and saw people who previously had been awarded honorary degrees, I felt I was in great company. James Martin (the father of case tools and much more) and Nick Negroponte (the founder of MIT’s Media Lab and the “One Laptop per Child” Initiative) received the honorary degrees in 1997 and 2007 respectively.

October 21 2009 was the day of the award ceremony. It started with a press conference at 4 pm with simultaneous interpretation. The questions were very generic. For example, I was asked “What do you think we need to do in Peru to become an IT nation?” I said that I got this question ten years ago when I met some ministers from the Peru government.  My answer today is the same as it was then, and unfortunately you may not like it.  The standard language for publishing in the software field is English. Most people here at the universities are not fluent in English so you can’t absorb the latest information until they have been translated. That is a time lapse of a couple of years. In contrast, the employees in Indian companies are all very fluent in English, so they pick up new trends as soon as they have been formulated.

After the press conference, I met 12 members of the faculty who interviewed me for an hour. I got some very interesting questions, for example, questions related to outsourcing.

At 6:45pm the ceremony started. I had gotten a purple doctorate hood and a purple gown, the same kind as the other seven or so dignitaries from the university. This was the party of the year. The dignitaries walked into the big auditorium one after the other, very solemnly. They were introduced to the audience of 1300 people, most of whom were graduates and students. I was told that 30% of them came from industry in Peru. Sweden has no ambassador in Peru so they invited the Swedish Consul, who attended the ceremony.

The ceremony started by singing Swedish national anthem. Amazingly, the choir was singing in Swedish. Then it was time for the Peruvian national anthem. It all was very solemn. Then three speeches were given by the chancellor and two other prominent people. They emphasized from different perspectives why I was given the highest recognition by the university. A lot of applauses and cheers. My family was sitting in the front row and I guess they were surprised at all the nice things they heard.

Finally, it was time for the award. The chancellor asked me to come up and stand in front of him while he was reading a brief motivation for the award.  He then gave me a medal in Inka shape and a doctorate diploma. A trumpet played a tune to finish the process. Now I had become an honorary doctor, and also a professor at the university.Slide1

Next, it was time for my speech.  First, I thanked them for the award and told them I was very humbled by having been awarded it from this university.  Then I addressed the new graduates providing them with some advice:

1)   Be passionate
2)   Be persevering
3)   Believe in yourself
4)   Be positive
5)   Embrace new ideas with an open mind

After these introductory words, I gave my talk “What they don’t teach you about software at school – Be Smart”. People enjoyed the talk so much even though it was simultaneously translated. My joke was laughed at as usual. The dignitaries dared to smile and laugh as well. Afterwards, I was a bit worried that I had broken some unwritten law, but thankfully, the chancellor assured me that everything was fine.

After the ceremony, drinks and snacks were served and we watched traditional Peruvian dances. I was actually asked to dance with a short pretty lady!  But just one dance :-) .  I think we definitely need more dancing in life.

After a couple of hours, I had to run to the airport to take a 1:40 am flight to Los Angeles and en route to Beijing via Tokyo, for a total of more than 30 hours, in economy class.  I believe that is being smart. :-)


Taking the temperature of UML

June 30, 2009

More than twelve years have passed since UML, the Unified Modeling Language, became a standard. During these years the perception of UML has ranged from the heights of the heavens to the depths of the earth.

At the beginning of the 1990s there were 26 published methods on object-orientation, most methods with its own notation. It was to address at least the notation problem that UML was conceived. As most of you probably know, Grady Booch, Jim Rumbaugh and I initiated the design of what became UML, but very quickly many other great people joined the effort and OMG undertook to launch the result. UML quickly made most other notations superfluous. Along with the notations many methods also fell by the wayside, leaving the Unified Process, which had embraced UML, as a de-facto standard along with UML. UML’s adoption spread like wildfire.

In retrospect, such outstanding initial success was sure to spark a backlash, as the initial hype was not realized. Everyone expected magical things to happen but, after all, UML was only a notation, not a silver bullet. Compounding this was a lack of good UML tools, some of which were very advanced, but hard to use. All of the tools were oversold. Many users were understandably disappointed that just drawing diagrams with UML did not magically improve their results. Over time, the spread of UML slowed.

UML also found a number of detractors. It was criticized by the academic world. The great David Parnas called UML the “Undefined Modeling Language”, a strongly exaggerated but not unfounded criticism. The criticism stung.
The original leaders of the agile movement were also strongly against modeling. For them it was the “Unnecessary Modeling Language” – they said “no modeling – just code”. Microsoft, reticent to do anything that might strengthen the competition, also did not initially support UML. Instead they were moving in a different direction based on domain-specific languages. The interest for UML waned dramatically, especially in the years following 2003. The momentum was clearly moving away from UML.

Now we find the pendulum swinging back. There are a number of good and easy to use tools. The criticism from the academic community has quieted. Agility has been embraced by large companies who see value in both “smart” modeling combined with an agile approach. People use UML though skepticism about the tools remains; many people work with sketches on white boards and use tools sparingly. Microsoft found that domain-specific languages did not replace the role for UML and that customers actually wanted to use UML. Today Microsoft is a strong supporter of UML.

Today the world looks upon UML with a more balanced perspective. UML is not the ”silver bullet” it was sold as ten years ago. Nor is it as bad as academicians, agilistas and competitors claimed five years ago. Used appropriately it is a practical tool for raising the level of abstraction on software from the level of code to the level of the overall system. And its use increases again, as it should, but now with more common sense.

Still, UML has become complex and clumsy. For 80% of all software only 20% of UML is needed. However, it is not easy to find the subset of UML which we would call the “Essential” UML. We must make UML smarter to use.


In need of a theory for software engineering

May 29, 2009

To an external observer it would appear that the consensus about the way software should be developed changes dramatically every second or third year, more frequently than the whims of fashion. Trends seem to come and go with no rhyme or reason, and it seems that the label you adopt is more important than the results that you get or the things that you actually do.

Are we working in engineering or in a fashion industry?

Have you ever taken the time to investigate a new method or practice only to find that it is just the re-branding and re-gurgitation of ideas that you have seen many times before?

Have you ever got frustrated that every new idea about software development that comes along seems to be at the expense and in aggressive competition with everything that has gone before?

Does it seem to you that following that latest software development fashion has become more important than producing great software?

In their hurry to become fashionable people seem to throw away the good with the bad. Instead of learning from their own experience and building on top of the good things that they do, they heedlessly throw everything away and start with something they believe is fundamentally new. It is as though they have no solid knowledge to stand upon. Thus they swing easily to a new trend without being able to preserve what they have learnt and experienced.

Big companies around the world carelessly discard expensive process and tool investments, almost before they have even tried them. Every project adopts a new method which new team members must first learn and master before they can begin to work.  Every time someone changes their job they have to learn a new approach before they can get on with the real task at hand.  This is not effective; we cannot learn from experience as we are forever starting over.

Nothing new ever really becomes established. Everything is marketed to the trend setters and early adopters, those who most desire to be seen as different and fashionable. People who have moved on even before the new ideas have truly established themselves or shown their real worth. We cannot get anything to stick.

In reality very little seems to change.  As in the fashion world, there is much ado about next to nothing. In something as trivial as clothing this may be acceptable, but with the size of our investment in software this is wasteful, expensive and absurd.

We are all deadly tired of all the buzz that we suffer from.

What about agile?

The latest fashion to sweep the industry is “being agile”.  Now let’s be quite clear here, the “agile” movement has made a very positive contribution to the software industry. It has reminded us that people matter first and foremost when developing software.  This is not really new but it is important, and it did seem to have been neglected by the previous, more technically oriented, fashions such as object orientation, and programming in java. By presenting a set of values the agile manifesto created something robust and resilient that can withstand the waves of change that will be bought on by the next fashion.

It’s a shame that the same cannot be said for the many agile methods that have promoted themselves as supporting the agile philosophy. For a movement that values people over process and tools it has certainly given us a lot of “new” processes and tools. The majority of these have been effective in promoting agile values by putting the team back at the heart of what is done to develop software but in bringing these things back into focus, much has been lost or obscured as new terms are introduced for old things, creating the illusion of something completely new.

The end result of this constant re-packaging and re-branding of old ideas is a constant churn in the way that software development teams work. Rather than re-focusing of peoples’ efforts away from wasted work onto the production of quality software all that seems to happen is an arbitrary renaming of the things they do and produce.

Even with something as correct and beneficial as the agile philosophy it can start to get lost in the churn and hype. Already we are starting to see a backlash against agile and our fear is that the benefits will be lost as early adopters move onto the next bandwagon and the late majority re-assert their right not to change to something that has obviously gone out of fashion.

Your current way-of-working – It’s a soup of ideas with no clear ingredients

Regardless of whether you are using a commercially developed or bespoke software development process, regardless of how it is documented or communicated, regardless of whether you use the latest buzzwords or the language of twenty years ago I am sure that it is really just a combination of bits and pieces found in other published processes with a little bit of local knowledge related to your specific domain or business.

Each new method may be presented as completely new, but in reality they are all (even mine) just re-combinations of old ideas with the occasional new in-sight thrown in for good measure.

This results in a lot of wasted effort as old truths are rediscovered but cloaked in apparently new clothing. New clothing that can prove hard to resist. Younger and less experienced coworkers promote new trends, following new gurus, supported by the hype of a media always hungry for “news”.  Managers who have lost touch with actual development find themselves in a hopeless situation: resist the newest fashion and they brand themselves as out of touch. Pilot projects are run to force proof of merit for the new approach, but motivated developers can make anything work on a small scale.  As a result the new approach overtakes the old, and all that was working with the old approach is thrown out along with the parts that were not.  Only too late do they discover that the new approach itself has parts that don’t work along with the parts that do. It is not survival of the fittest but survival of the most fashionable.

If we can separate the ingredients from the soup we can empower people to build the way-of-working that they need and to be able to adapt the method to cope with a changing industry and incorporate new ideas that complement and build on their own hard won experience.

Addressing the challenge

We need to stop forever chasing after fads and easy answers that forever disappoint without discouraging innovation and new ideas.  We need to stop constantly re-packaging and re-branding old ideas just for the sake of it. We need to help people understand how to build great software.  But how?  This is a problem I have thought about for at the least ten years and of course I have a concrete idea on how we can get there.

At the root of our problems is a deep misunderstanding of the nature of software development.  Researchers have tried to attack this problem with new theories like formalism to prove correctness of programs, or through formal languages which never have been adopted outside the academic world.  Industry efforts have spent years standardizing swollen meta-models that defy easy understanding.

There are many ways for people to learn software engineering but the only way to get good at it is through practice and experience.  Universities, technical institutes and commercial training courses teach us a particular way of working, such as UP, XP, Scrum (or whatever happens to be popular at the time) but they give us very little practical experience. When we later meet the challenges of the real world we find that the way-of-working has changed again and we have no solid knowledge to stand upon.  Thus we swing easily to a new trend without being able to preserve what we have learnt and experienced.  This is not effective; we cannot learn from experience as we are forever starting over.   Thus we need a theory.

In myopinion, this theory is right in front of us – we just need to grab it. We can start with all these methods, processes, and practices out there and find the “truth” of software engineering.

The solution looks somewhat like this:

1.   Find the Kernel – the Mother of all Methods

All methods have a lot in common.  After all, they are all used to develop software, and they all acknowledge that there are certain things that we always need to do when we develop software.  For instance, we always write code, we always test it (in one way or the other), we always think about requirements (documented or undocumented), we always have a backlog (explicit or implicit), and we always have a plan on a paper or in our heads. To borrow an overused metaphor, we want to find the DNA for software development.

We need to find the “essential core” or “kernel” of software development, that which cannot be made simpler.

By studying about 50 methods, including XP and Scrum, my team has identified a kernel with some 20+ elements, things we always do or always produce. On the surface, there may appear to be large differences in these studied methods and the ways we work with them. As an example, you can capture requirements with features or with use cases.  But there is a common basis for the many methods, which we capture in our kernel elements.

2.  Understand the nature of methods or processes

An important insight is that every method is a soup of practices, whether or not the practices are explicitly called-out.  For example, RUP consists of many integrated practices, while Scrum essentially consists of only one practice, project management, and a few agile work patterns.

3.  Describe each interesting method using the kernel.

With the kernel in place all methods can be described in a uniform way, as specializations or extensions to this kernel.  We can harvest the implicit practices from all widely used and proven methods or processes, such as architecture, components, iterations, etc.  Some practices will overlap, e.g. risk driven iterations from RUP and backlog driven sprints from Scrum.  Some practices will complement one another, e.g. use cases and project management.

The kernel clears away the cosmetic differences between methods, such as the same thing being called by different names in different methods.  For example RUP talks about iterations whereas Scrum talks about sprints, but they really mean pretty much the same thing. By doing this we can clearly see the real differences between different methods.

This is not just a theory but something that my team has already started to work on. Today around 15 such practices have been developed using our initial, prototype kernel. Since the kernel is agnostic in relation to any specific practice, we can simply find out what is the actual difference between different practices, not just on the surface but in depth. This decreases the element of religion in which every method is embedded.

It would be excellent if our technical institutes or universities would educate students in the basics of software engineering, followed up by training the students in a set of good practices using that base. Education will become more logical since it focuses on individual ideas instead of the particular soup of ideas that forms every method, process, or methodology. I believe students will love it. There is also space for a lot of relevant research here.

Remember Kurt Lewin’s words: “there is nothing as practical as a good theory.” A good theory makes it easy to learn and develop your knowledge without going overly religious.  That would be smart.

The first step is to build on the experience of our initial kernel and build a new kernel. It is clear that we in my team made a few mistakes during our initial work but the end result is that we know that this is not an abstract theory but a pragmatic approach that is proven to work. Now we need to build an improved kernel together. One that is more accessible, more intuitive, and more generally applicable. To do this we need your help. To find out more about how you can get involved see further down in this paper.

Realizing the Benefits

This isn’t just something that affects methodologists, process geeks and academics; it is something that will benefit everybody involved in software development.

What is in it for the industry?

Most large companies have their own home-grown method or process, one which is a soup of standard ideas complemented by some of their own more business specific ideas.  Usually these processes are described in a thick book or a website, and lots of money has been invested to document them. Sometimes people are trained on the process, sometimes they are just pointed toward it.

In reality the process is often ignored; the only parts that are actually used are the parts that form the “oral tradition” of the organization.  This is explained by the re-discovered law of nature: people don’t read process books.  New ideas are introduced into the organization, and the old processes fall out of fashion and their books become shelf-ware.

In these large companies there may even be more than one process.  For example the big system integrators may have ten to twenty different processes.  Sometimes they are quite similar, but the similarities are hidden behind all the cosmetic differences.

If your company was to adopt the practice idea, you wouldn’t need to throw out your entire way of working because something new and sexy is becoming popular.  Instead you would improve your existing way of working one practice at a time.  You could even adopt practices used by other companies without throwing out those existing practices that seem to be working well.

To get started you would look at your existing way of working as a set of practices. Then you would look for your pain points and complement your existing way of working by removing any practices that are not working and replacing them with practices that address the weaknesses.  This is easy to do once you have understood the kernel and its usage.

In a large organization with many different ways of working, you can use this approach to successively improve each way of working without forcing everyone to use the same method or process.

This approach will make it easier to adopt new practices without having to change the other practices you have.  Imagine that you have already introduced the kernel and described your practices a couple of years ago.  Then you would be able to introduce Scrum easily by replacing your existing practice for project management by Scrum without having to make any major modifications to your other practices.  Looking into the future, Scrum will most likely be replaced by a new practice, and you will be able to do that easily, too.

What’s in it for the academic and educational community?

Most university professors have made an academic career and have never really had a chance to practice software development on a large scale.  Still they have to teach software engineering which of course is not easy or stimulating.  They just do it because it is in the curriculum and not because they have something to contribute.  They have no theory to teach, just a set of ideas or one specific approach.  When challenged, one professor, who is successful in computer science and who teaches software engineering, said: “Amazingly, the students like to bathe in the mess we ship to them”.  I realize this was not serious, but for sure this teacher was not proud of what he was doing.

A theory will fundamentally change this situation.  Students will learn the basics of software.  They will get a language to communicate about software process, practices, patterns, etc.  I can imagine that they will get a language with a grammar that represents the kernel and language constructs to describe the practices being constituents of the process.  The language needs to be executable so that the practices can come alive.  By this I mean that practices are not just specifications but also executables.  When running a project, the practices will start to run and instances of activities, work products, roles with competencies will be created and populated by real things.  Aspects seem to fit well to model practices.  There are very interesting semantic rules that need to be identified and defined.  There is whole new world that opens up to the students to understand the fundamentals of software engineering.  Not to mention the whole new world for practically and theoretically interested researchers.

What’s in it for the methodologists?

Thinking back on my own career from 1987, I was asked by many people to write a book on the methodology I created.  At that time Objectory had a number of new ideas such as use cases, use case driven development which is a kind of test-driven design, collaborations, sequence diagrams, components and component based development.  Most of the rest was not special.  Implementation, unit testing, system test, performance test, configurations, planning was quite conventional.  Of course, I had experience from the whole lifecycle, but I was not a world-class expert on everything.  However, to write a book I had to cover the whole lifecycle, even if much of it was not my expertise.

With the new theory we are looking for, there will be no need to describe anything else than what is new.  You won’t need to write a book to publish your new ideas and put them in the context of all the other things a software development team needs to do.  You will just describe your new practice or your new pattern and it will be available to the whole world the next day.  Anybody in the whole world with great ideas can contribute and become successful.

What’s in it for the teams developing the software?

Finally we will all be able to escape from endless churn caused by slavishly following fashions and become proper software engineering teams. Teams that build and extend their knowledge by practicing good software development based on a solid foundation, one that is not constantly changing and forcing you to learn the same things over and over again. One that lets you demonstrates your expertise by the results you’ve achieved rather than the courses you’ve attended. One that lets you bring in new ideas and new team mates easily and seamlessly without performance dips or wasted effort.

Final Words

Our understanding of software engineering lacks a basic theory.  As a result, we keep reinventing old approaches with slightly different words, obscuring the real innovations and making it harder to use the good parts of the new while discarding the bad parts of the old.  The theory will help us to substantially improve our education in software engineering.  It will help us to be less naïve in how we react to new ideas popping up around us.  Finally, it will also help us to adopt new ideas faster than we can today.

At its core the theory relies on practices.  Now there are good and bad practice concepts.  The idea of practices has been around for fifty years, but these practices are loosely defined.  We need a practice concept that is more precise.

  1. Our practices need to be designed for the developers and not as we described process historically, for the process engineers.
  2. We need to be able to keep the practices separate, so we can compose them and in that way create our own way of working (our process).
  3. Practices need to be accessible and extensible – providing lightweight practical advice that is easily put into practice rather than comprehensive academic texts. Practices should focus on the essentials – the minimal path rather than the maximal path.
  4. Finally, we need practices that can come alive and be executable. Practices must be more than descriptions.

The real beneficiary of this theory will be the software industry, as has already been proven in many companies.  We will be able to easily educate our people, get them up to speed, improve the way we work with our products, reengineer (a stronger word than refactoring) our products systematically, and continually improve the way we work.

The result will be better software, significantly faster and at dramatically reduced costs. As mentioned above this is something we need to work on together. To find out more about how you can get involved visit www.ivarblog.com and give your feedback to my blog “In need of a theory for software engineering” or e-mail us at a_theory@ivarjacobson.com.


Scaling Agile Teams

May 20, 2009

Traditionally many large software organizations have one group to write requirements, other groups design and code, and still others to test, etc. Thus, every group has some form of specialist competency.  This is a kind of “siloed” organization. Project work is moved from group to group, with hand-offs between groups that result in  delay and inefficiency due to loss of time and important information at each hand-off.   This is not agile.

Agile teams tend to be smaller, for instance seven participants, who have broad yet deep skills that cross the traditional “silos”.  Just as every good soccer team has all the necessary competencies to win, agile teams have all the competencies to build good software. In these teams everyone can understand everything and most members can work with everything.  At the very least the testers can make sure that the requirements are testable, the analysts can design and at the least they can understand the code.

Every agile team delivers working code every two to six weeks.  These periods of work are called iterations or sprints.  Usually an agile team starts from one or more scenarios (a user story, a use case scenario) or features and does all the work to implement and test this user requirement.  For the sake of subsequent discussion, let’s call these teams feature teams.

This works very well in a small organization, where all the team members are located together, where the product is relatively small and where teams work on one single project. In a larger organization (for instance a telecom vendor or a bank) or on larger projects we still want to keep the agile teams, but since we may build whole product lines or complete enterprise systems with many parallel projects, we also need more.

To effectively scale the work of many agile teams across many iterations require an organization with two very different, but complementary kinds of units – feature teams and competency groups.  To understand their roles and how they interplay is very important to a large organization.

  • A feature team is an agile team and the fundamental engine of software development, developing software that gives direct value to its users, such as features or use cases.  To build a large software product often requires many feature teams to work in parallel across a number of iterations in a coordinated way. The number of required feature teams and iterations depend on the size of the product.
  • A competency group is a self-managed group responsible for a functional area on the business analysis of the product (loan processing for example), a larger component, such as a subsystem, a function area for test, or any other kind of expertise.  Just as an example, there will be as many competency groups as there are larger subsystems/components in the architecture of the system.  Competency groups are accountable to the same executive as the projects.

Thus, groups and teams are entirely different kinds of organizational units.

For larger systems the feature teams must not only include the basic competencies (analysis, development, test, etc.), but it must also have expertise from the different functional areas of the existing system, such as billing.  Without such expertise, changes to the system cannot be made with confidence.  Some team members are recruited from the subsystem groups, while others come from similar expert groups within analysis and test.

Just as the members of a soccer team return to their own homes after playing, the specialists return to their competency groups when the project is over. In addition to participating on feature teams, the members of a competency group maintain sets of reusable components, for example a large subsystem that usually includes many minor components. Competency group members are experienced in working in ways that achieve a high level of reuse.  In order to achieve substantial reuse, the development of subsystems or components needs to be funded separately from projects.  Thus the funding of the competency groups comes from the top of the development organization, whereas the funding of the feature teams and their associated projects comes from the endeavor (eventually the customer).

As with soccer where the players stay for many matches and for several seasons even, the members of a feature team work together over many iterations (matches) and over many projects (seasons). This encourages effective team collaboration.

People should either work fulltime on a feature team or work fulltime in a competency group – you want them to focus working on one or the other.  Sometimes, the choice is not black or white, but we have to find solutions that give a good balance.  There are many ways to find this balance such as time-boxed responsibility (working for a team 100% during a well-defined period shorter than the rest of the team members), split responsibility with a colleague within a competency group (basically planned rotation), etc.

The interplay between the feature teams and the competency groups is crucial to get good software, quickly and at low cost.  I have used this approach since my time at Ericsson and although this has been challenged many times, it is now a widely used approach for the organization of large software companies.  See for example the presentation by Dave Thomas, Lean and Agile In The Large: Best Practices Beyond Agile Development Teams, JAOO Sydney and Brisbane, 2009.  There is no shortcut!

Although feature teams and competency groups are at the core of scaling agile, we need at the least two other supporting units: the project and the architecture board:

  • A project does all the work that is required for the next release of the product (for a single customer or for the market).  Most of the work for a release is performed by the feature teams, but the project itself synchs up the teams and provides direction to the teams about what they should do during an iteration; it makes sure that the teams don’t overlap, that they work towards an agreed upon architecture roadmap, and it integrates the results from all the feature teams to a deliverable product.  Thus, the project has a coordinating function. A feature team is usually accountable to one project.

Projects are accountable to the beneficiary of its result is set by standards coordinated by an executive.

  • Finally we have an independent architecture board which is small and consist of the technical leaders for the most important subsystems.  The responsibility of the architecture board is to guarantee the integrity of the system and to make decisions on proposed changes to the architecture.  Project managers may be invited when concerned by a decision.    Decisions affecting only a component are made within the competency group itself.

The architecture board meetings, are an important means for spreading knowledge about the system and the significant technical decisions that affect it.  They should occur regularly — weekly or biweekly — and usually last a couple of hours; they are not stand-up meetings to ensure the flow of information and effective decisions.  The board is accountable to the same executive as the projects and the competency groups.

Of course, we can scale agile to larger organizations.  The agile teams are still there but there is much more.  Competency groups are needed to own components and to maintain critical knowledge needed by many feature teams. The agile teams now called feature teams recruit its members from the competency groups.  Feature teams work in parallel with other feature teams to form projects.  Technical governance is the responsibility of an architecture board.  All this obeys the Albert Einstein observation: “Make it as simple as possible – but not simpler”.  This is smart!


Taking the Temp on Agile

April 20, 2009

A couple of weeks ago Kent Beck delivered the keynote at a conference in Gothenburg, Sweden.  He began by saying that, in the US, agile already starts to get old.  Programmers are tired of all these daily meetings where they have to be social.  They want to code – they don’t want to talk. This being said by the father of XP and the individual who is probably most associated with triggering the whole agile movement – a fantastic accomplishment that has my greatest respect.

We also have had many indications that, at least in the US, people are getting tired of talking about agile.  A CIO of a large company with whom we work won’t use the term “agile”.  A CTO from another very large company with thousands of developers where we have been rolling out practices, says he doesn’t care about approaches – agile, RUP or whatever – only the result count.  He has distanced himself off from agile since it creates religious zealots in his organization and this zealotry only gets in the way of achieving results.

This is inevitable – we have seen it before as ardor for the latest trend begins to cool. The real question is “should we throw out everything we have done to become agile?” And, for those people who have not yet started to become agile, should they skip to whatever is next? No, not at all! There are many good things in agile that will continue to be useful.

We work with many large companies around the world to scale agile from the small project to the large program to the enterprise.  We sometimes find resistance to agile in larger companies, partly because of the opinionated zealotry of some agile proponents doesn’t sound serious to experienced developers, managers and executives.  Statements like ”No architecture, no modeling, just code and refactor later” don’t sound credible to anyone who have seen problems with lack of architecture before.  And poorly explained concepts such as ”No requirements – the tests are your requirements” and “pair programming” don’t help matters.

Fortunately agile has grown up a bit – and the zealots have mostly been replaced by more reasonable proponents who know that there are many good things in agile approaches, but they need to be blended with other things to really be successful.

It is now quite silent about these individuals.  They start to become passé, if I should allow myself to be harsh.  They are not anymore the obvious speakers at large conferences, not even at agile conferences.  They are not engaged as consultants as much as before.  They sound a bit tired.

What about Scrum? Scrum is having serious problems around the world.  It is starting to suffer a backlash.  This is not really because of Scrum itself, but because of the tail of Scrum (all the people that want to profit on Scrum without real competence).  All hypes will sooner or later suffer from this problem.  And by making everyone a Scrum master who pays $2,000 and who sits in a class for two days with 50 other students, you really ask for trouble. Scrum is still popular but if you blow up a balloon without a break, it will sooner or later burst.

Nevertheless there are some good ideas in Scrum.

Instead, now the evolution of agile is lead by those of us with a strong anchor in successful delivery of many different kinds of projects and programs in many different organizations, large and small. We understand that “agile” is not just a patch that you paste onto what you already do. Instead, agile changes your attitude about everything you do, with a focus on achieving good business results.  Agile has different meaning to CXOs (good software, quickly at low cost) than it does for software developers (Scrum, TDD, continuous integration).

I would like to see an end to the cycle of boom and bust and see us learn from and preserve the many good practices that the agile movement has bought into focus and not throw them all away in our quest for the next big thing.

My advice is that you should take the good practices from agile and combine them with other good practices, as we did when creating the Essential Unified Process from the core concepts in RUP. Most important you should not throw away the things that are working in your quest for improvements.  Be smart!


Someday we must become professionals!

March 7, 2009

We software people run after the latest fashion.  Five years ago we ran after RUP, now we run after Scrum, and in five years we will run after something else.  At each transition we start over, failing to learn anything; we fail to keep what is working and improve what is not.   In my two latest blogs I have talked about how we can diminish the tiresome element of religion and fashion when it comes to methods and processes.  This is a precondition if we are to ever become software professionals.

The solution looks somewhat like this:  all methods have quite a lot in common.  After all, they are all used to develop software, and there are certain things that always need to be done when you develop software.  Let’s call this the “kernel”, a kind of elementary process which is the mother of all methods.  With this kernel as a base all methods can be described in a uniform way, as extensions to this base.

An important insight is that every method is a soup of practices, whether or not the practices are explicitly called-out.  For example, RUP consists of many integrated practices, while Scrum essentially consists of only one practice.  Scrum is about project management, so for simplicity we call this practice Scrum.  Both RUP and Scrum also contain a number of important patterns, such as Scrum’s agile work patterns.  However, for simplicity we will leave these patterns for another day.

The kernel is used to describe the practices of each method you care about.  The kernel clears away the cosmetic differences such as the same thing being called by different names in different methods.  For example RUP talks about iterations whereas Scrum talks about sprints, but they really mean pretty much the same thing. By doing this we can clearly see the real differences between different methods.

In the long term, doing this for the most well-known methods around the world, we would as a result have practices harvested from these methods in a practice library.  We would have practices that overlap, e.g. iterations from RUP and Scrum.  We would also have practices that complement one another, e.g. use cases and Scrum.

What is the benefit of this?

You won’t need to throw out what you have but you improve your existing way of working one practice at a time.  You would start by looking at your existing way of working as a set of practices. Then you look for your pain points and complement your existing way of working by removing your practices that are not working and replacing them with practices that you think will remove the weaknesses.  Once you have understood the kernel and its usage, this is usually all done in less than two days with an experienced consultant.  In a large organization with many different ways of working, you can use this approach to successively improve each way of working without forcing everyone to use the same method or process.

This approach will make it easy to adopt new practices without having to change the other practices you have.  Imagine that you already introduced the kernel and described your practices a couple of years ago.  Then you would be able to introduce Scrum easily by replacing your existing practice for project management by Scrum without having to make any major modifications to your other practices.  Looking into the future, Scrum will most likely be replaced by a new practice, and you will be able to do that easily, too.  That is very smart.


Let’s fix the problem: Understanding the nature of software engineering

March 5, 2009

In my last blog I described our immaturity when it comes to software development. Companies follow the latest fashion and jump from method to method without standing on what they already have adopted and that is working.  This is expensive and it results in bad software.  When I am upset I say that it is stupid and ridiculous.  How do we change this?

We need a basic theory describing what software development actually is. In my opinion, this theory is right in front of us – we just need to grab it. We can start with all these methods, processes, and practices and find the “truth” of software development. We have already done this in my company and the result has been used by hundreds of companies around the world.

First we started with that core of things that we always do when we build software. For instance, we always write code, we always test it, we always think about requirements (documented or undocumented), we always have a backlog (explicit or implicit), and we always have a plan on a paper or in our heads. It is the “essential core” or kernel of software development, that which cannot be made simpler. To borrow an overused metaphor, this is the DNA for software development.

With my colleagues, I have identified some 20+ such elements by studying about 50 methods, including XP and Scrum. On the surface, there may appear to be large differences in these methods and the ways we work with them. As an example, you can capture requirements with features or with use cases.  But there is a common basis for the two methods, which we capture in our kernel elements.

Then we draw on these kernel elements to describe widely used and proven methods and practices: architecture, Scrum, components, iterations, etc. Today around 15 such practices have been developed. Since the kernel is agnostic in relation to any specific practice, we can simply find out what is the actual difference between different practices, not just on the surface but in depth. This decreases the element of religion in which every method is embedded. Education will become more logical since it focuses on individual ideas instead of the particular soup of ideas that forms every method, process, or methodology. I believe students will love it.

It would be excellent if our technical institutes or universities would educate students in the basics of software engineering, followed up by training the students in a set of good practices using that base. There is also space for a lot of relevant research here.

Remember Kurt Lewin’s words: “there is nothing as practical as a good theory.” A good theory makes it easy to learn and develop your knowledge without going overly religious.  That would be smart.


A problem to fix: We don’t understand the nature of software engineering

February 26, 2009

I am deadly tired of all the buzz that we are suffering from.  Our view on how software should be developed seems to change dramatically every second or third year, more frequently than the whims of fashion.  Big companies around the world carelessly discard expensive process and tool investments, almost before they have even tried them.  Instead of learning from experience they heedlessly start with something they believe is fundamentally new.  In reality very little has changed.  As in the fashion world, there is much ado about next to nothing. In something as trivial as clothing this may be acceptable, but with the size of our investment in software this is wasteful, expensive and absurd.

The latest trend is “being agile” (as exemplified by Scrum).  The “agile” movement has reminded us that people matter first and foremost when developing software.  This is not really new – this theme resurfaces every decade or so as naive managers try to mechanize and commoditize what is basically an exercise in creative problem solving.  It is important that we not lose track of how to work as a team, how to collaborate, how to document what we do, and how to plan our work on daily, weekly, and monthly timescales, etc. But in bringing these things back to focus, much is lost or obscured by new terms for old things, creating the illusion of something completely new.   

The result of this is a lot of wasted effort as old truths are rediscovered but cloaked in apparent new clothing. Younger and less experienced coworkers promote new trends, following new gurus, supported by the hype of a media always hungry for “news”.  Managers who have lost touch with actual development find themselves in a hopeless situation: resist the newest fashion and they brand themselves as out of touch. Pilot projects are run to force proof of merit for the new approach, but motivated developers can make anything work on a small scale.  As a result the new approach overtakes the old, and all that was working with the old approach is thrown out along with the parts that were not.  Only too late do they discover that the new approach itself has parts that don’t work along with the parts that do. 

At the root of this problem is a deep misunderstanding of the nature of software development.  Researchers have tried to attack this problem with new theories like formalism to prove correctness of programs, or through formal languages which never have been adopted outside the academic world.  Industry efforts have spent years standardizing swollen meta-models that defy easy understanding. 

Universities and technical institutes teach us a particular way of working.  Every project adopts a special method which we must first learn and master before we can begin to work.  Every time we change jobs we have to learn a new approach before we can get on with the real task at hand.  This is not effective; we cannot learn from experience as we are forever starting over.   

We need to stop forever chasing after fads and easy answers that forever disappoint.   But how?  This is a problem I have thought about for at the least ten years and of course I have a concrete idea on how we can get there.  However, I will have to wait to tell you that until my next blog.  Let me however say this much:  We need to start small and simple and keep it small and simple.  We did so with SDL and UML.  We can do it again.

That would be smart!