More on Lean Software Engineering 

To me, "lean" software engineering means the following:

Managing Integrity 

Recently I was talking to the VP of Engineering of a 5-yr old "start-up" where nothing seems to go well. Even relatively simple projects have failed, and the prdictability is at all time low. After understanding the overall picture, I came to the conclusion that it all had to do with the integrity - integrity of the whole system that he is managing or trying to manage.

First, there is product integrity. This includes both technical integrity of the product as well as functional integrity. The product is very poorly designed, reusability is low, and has too many critical design flaws to enumerate. If complexity to functionality is a metric for software, this product would rank at the bottom 10%. In software, a design flaw could mean 50% more work just to circumvent it. Imagine driving a car where you hear parts rattling, wheels don't cleanly align with the road, and the steering is shaky.

Second, there is process integrity. The development process itself depends on the product being developed. Throw in a badly designed product and a bad architecture to work with, the process will be much more complex than is usually necessary. Make the process complex, and the managing that process becomes a huge overhead. As a result of increased complexity, the likelihood of process failure increases. All of a sudden, it turns into a situation where no one knows what to do next, they blame one another, and eventually leads to complete failure of the project.

Third, there is organizational integrity. In this specific case, managers weren't well aligned to the same organizational goals, which created conflict, and the engineers working for them couldn't work together. The organization had very good talent, but the talent was underutilized by inappropriate assignment of roles and responsibilities. In my view, a well designed organization is probably more important than everything else.

There is nothing new here, but losing integrity is completely antithetical to lean thinking. If you want to remain lean (and profitable), never lose sight of managing integrity, even if that means short-term pain.

Lean Software Development 

This book on lean software spells out the exact mode of software development I prefer. I cannot emphasize enough on the basic principles of lean thinking proposed in this book.
  1. Iterating towards excellence: software development as an exercise in discovery
  2. Managing uncertainty: "decide as late as possible" by building change into the system.
  3. Compressing the value stream: rapid development, feedback, and improvement
  4. Empowering teams and individuals without compromising coordination
  5. Software with integrity: promoting coherence, usability, fitness, maintainability, and adaptability
  6. How to "see the whole"— even when your developers are scattered across multiple locations and contractors
Many managers have problems with rapid development-feedback-improvement iterations and delayed decision making to manage uncertainty. With respect to empowering teams and individuals, I have witnessed managers turning extraordinary engineers into average engineers by simply enforcing fat software engineering processes that completely weaken them.

Overuse of XML 

XML has become ubiquitous, and it has become so for many good reasons. But, we can all find many cases of XML overdose as well. I have seen two modules in the same Java application exchanging data by passing complex XML documents, which are then translated into application objects, after going through DOM trees. And, if the developers are any more tool-lovers, they would use JAXB, Castor, and any other technology that's available to move data between XML and Java and vice versa. This all makes the application overly complex for no good reason.

Looking at a piece of raw BPEL code in XML syntax makes me cringe (especially the dataflow aspects). Some claim that, with BPEL, we can write applications without "coding" - we certainly don't need to code in Java when we can do that in XML. :-)

Right model for the right purpose 

A colleague questioned my sanity after reading my rather insensitive comments on UML. How can I not like "models" and "model-driven architectures"? I spent a good part of my life building models for quite complex things, so I certainly don't dislike 'models' - they saved me more than once.

It is not that I dislike UML either. Any attempt to bring in some structure to software design / development process is a worthwhile attempt. I think UML offers a good diagramming tool for conveying one's design, and when it is used for that purpose, it serves well. However, a diagramming tool is different from a 'modeling' tool. In my opinion, trying to model a piece of software as very-detailed UML diagrams is a waste of time, because those models don't serve much purpose (law of diminishing returns). View them as diagrams for shared understanding between humans, if at all, and not between human and computer. Spend just as much time necessary for that purpose, not a second more.

Remember, when it comes to building a software application, a quick prototype is worth a million UML diagrams. A prototype is indeed a rough model of the final software.

This page is powered by Blogger. Isn't yours?