Are you practicing an agile process in your team? Do you still find your team working through the night? Do you still find your software to be rigid, fragile and immobile? Do you still find changes of requirements to be nightmares to the developers? How do you suppose those situations are possible with an Agile process?
Unfortunately, this is the situation in almost all Agile practicing and Agile preaching companies we have around in Sri Lanka. I’ve crossed my paths with quite a few developers from these companies and they all have the same story to tell; agile for them, is the same old cycle, without the documentation and without a designing phase - which makes their development life worse. Non-technical project managers are still around, being called by other names, and to add to the misery, now the customers bring the pressure directly to the developer - because it’s “Agile”.
Is Agile a bad idea? What’s going wrong? Why can’t we make it work? Have you seen the list of names in the Agile manifesto at http://agilemanifesto.org/? Do you think those are the kind of people who would invest on a failing process? Besides, they’ve been practicing and teaching it for over a decade now. So if there’s anything wrong with Agile, it’s more likely in the way we practice it.
Management elements such as deadlines, budgets and sucking up to customers’ aside, we developers too need to change some fundamental ideologies towards development in order to make Agile, well Agile. It is not to say that the operational model doesn’t matter, indeed, that’s what makes Agile possible. Someone should be available to the team to represent the customer, acceptance tests should be automated and made available to the developers when feature requests / changes are made; team should be responding to changes than follow a plan; team should be able focus on getting a working product out instead of documenting etc. etc. which all agile gurus will tell you; but the part they don’t speak about; the part the folks came up with agile manifesto took for granted; the part that is responsible for more than half the agile failures in Sri Lanka is with the developers.
One misconception most developers in Sri Lanka have about Agile development is, it is coding without design or documentation. The other misconception is to think getting software to “work” means getting the functionality out one way or another. The Agile philosophy has very different interpretations for these and is defined with the implied expectation of strong object oriented concepts and design principles of the developers.
By the term “a working product” what’s meant is a functional, testable and maintainable product. Not just functional. If a piece of code provides the functionality required, but only the developer himself could read and understand how it does that, it is not a working product by Agile definitions. Developers are to get the code to work and then refactor till it’s readable, not duplicating code and as simple as it could be but not simpler.
Refactoring to make code readable, non-duplicative, simple and free of unused design complexities and code is a constant practice that developers are expected to follow whenever they code something.
The design focus of Agile is much more implied than explicit. In each iteration, Agile focus on getting a working product to the customer. The team narrows their focus only on the features that are planned for that iteration making it as simple and expressive as possible; yet not losing the overall picture - or at least what exist of it at the time. This practice makes sure that the design never gets complicated than necessary and serves to the problem at hand than expected (but volatile) problems of the future. One of the problems in designing the whole application at once is that the architect is force to foresee requirements of the future; with requirements ever changing and little understanding of them to begin with; this is not a task someone could get 100% right. That’s why Agile promotes this simplistic approach which could accommodate changes more easily.
Unit Tests for agile developers are a design practice than a verification step. Writing the non-compiling unit test is defining the contract for a component. Developer should do due diligence and consider who are the consumers and think how the consumers would want to use a class. Note that the tests are written for the public interface of the class, the tests care only about the functionality exposed through that. Once the developer get the unit tests to pass, he can then go on refactoring his code to be simple, readable and non-duplicative - one step at a time - without worrying about breaking the functionality unknowingly; because the tests are there to guard against that.
The next aspect of design developers ignore in Agile is how exactly the changes are accommodated. Remember that agile designs are as simple as possible meaning that when code is first written, it is not accommodating flexibility for “potential” change. But when the first change comes, the developers should follow the object oriented design principles and separate the changing elements of code from the non-changing elements of code, evolving the design in that part, so that a second change in the same area would be easier and simpler than the first. This practice prevents the code becoming stale over repeated changes, still keeping the code as simple as possible.
As always, developers should keep themselves up to date not only with the new technologies but of the time proven concepts; and the organizations who wish to harness the benefits of any methodology should invest on getting their developers in par with that methodology.
References
Agile Principles, Patterns, and Practices in C# By Robert C. Martin, Micah Martin
Agile Software Development: The Cooperative Game, Second Edition By Alistair Cockburn
Test-Driven Development By Example By Kent Beck
"agile designs are as simple as possible meaning that when code is first written, it is not accommodating flexibility for “potential” change."
ReplyDeleteDoes this mean that it's actually ok for the design of the initial release to have an inherent smell of "rigidity" as opposed to having a "needless complexity" smell?
Yes!
ReplyDeleteIt is stated over and over again in those books in reference, with examples, not to make the first design flexible if the feature you are currently working on doesn't need that.
It is at the time of first actual requirement that the code is refactored using the design principles and patters to make it open for such changes but closed for modification.
The idea is, you can't predict correctly if flexibility / openness is actually required or not; even if at the time of writing there are requirements in the pending features for that component to be open for extension, due to the very nature of the requirements (that is to change frequently) that need may never occur. So it could end up being overly complex code and wasted effort.
On the other hand, if a change happens once, it is more likely to happen again in the same place. Therefore, the first change is the perfect time to invest on refactoring that piece of code to accommodate such changes without compromising the design and code quality. i.e apply OCP.
Agile is a process for managing software development. If you have a great team of smart people who communicate well and trust each other, they can use agile techniques to release lots of small iterations on a software project very quickly. This pattern of software release is often useful for startups. None of this is in dispute.
ReplyDeleteThe problem is that with its rise in popularity, it has been both misunderstood and over-applied. If you have a good software team you can use agile, but if you use agile you will not automatically get a great team. If your team members communicate well and trust each other they can use agile, but if they communicate well and trust each other they could use any other methodology up to and including no fixed process whatsoever, and be equally successful. Agile changes your release pattern, not your people.
Bottom line: great teams produce great software. Great teams using agile release software every two weeks. Bad teams will produce shitty software. Bad teams using agile will release shitty software every two weeks.
True Merill, team is the key; the first value of Agile is "Individuals and interactions over processes and tools";
ReplyDeleteThe difference I see; coming from a company that used a RUP based process; and the difference promoted by the Agile community, is the flexibility to support ever changing requirements.
We used to create huge requirement documents, which almost always got out dated. Detailed Design Documents too, much often followed the same fate.
On top of that; we used to create unnecessary complexities because we were trying to make the application flexible - when that level of flexibility was never required - and often some developers did not understand them and created even worse code than they normally would. And Requirement changes were always frowned upon - even when we knew they were to come anyways.
I see; three winning philosophies in Agile; which I haven't seen in other development processes.
1.) Focus on end product
2.) Focus on accommodating requirement changes throughout the life cycle
3.) Focus on simplicity
Of cause; a good team would have done it anyways, so in that sense, Agile is like a design pattern for process;
And it suffers the same ill-fate as patterns - it's been abused and misinterpreted.