Symbian Partner Event: Innovation in Action – Free Developers Event

Learn more about transforming people, process and culture with the Real Agility Program

Here is a free course…

For the first time the Symbian Partner Event (SPE) opens its doors not only to Symbian partners, but also to mobile developers, handset manufacturers, network operators, the Open Source Community and members of the press. Whether you are new to mobile or an experienced Symbian developer, SPE has something for everyone.

SPE is a free, full-day event that will immerse you in the Symbian community. With an agenda featuring keynotes, seminars and panels from the leading minds in the global mobile industry, and an exhibition hall packed with the latest and greatest Symbian solutions, SPE is ‘dressed to impress´.

Not only do you get all the above, but you can also apply for exhibition space and to participate in our renowned Fast Pitch session – all free of charge.  Curious about Fast Pitch? This is an amazing opportunity for 15 companies to get face-to-face with handset manufacturers and network operators and present a 5-minute pitch of their solutions.

Remember this is your chance to meet and network with movers-and-shakers of the global mobile industry. Space is limited so register now to guarantee your spot!

Symbian Partner Event – December 4, 2008
Palace Hotel, San Francisco, California
2 New Montgomery Street
San Francisco, California, 94105


Please share!

The Decline and Fall of Agile and How Scrum Makes it Hurt More

Learn more about transforming people, process and culture with the Real Agility Program

James Shore wrote a great post about the problems he is seeing with agile adoptions that start with Scrum called the Decline and Fall of Agile.  Please please please (pretty please) read it before you read what I am about to write here!  I agree with what James is saying 100%.

Now, let’s hear the truth:

Scrum is really really hard!  Doing Scrum well is like quitting a heavy, long addiction (I think).  Don’t ever make the mistake that because Scrum is simple (lack of complexity) that it is somehow therefore easy (lack of effort).

Doing Scrum properly takes:

sacrifice – sacrifice of our ways of thinking, our habits, our comfort

wisdom – wisdom to see the small improvements while struggling with the humongeous ones

and most importantly,

truthfulness – honesty to see and say the truth, integrity to act on the truth, detachment to avoid believing in what you want instead of what is real, courage to continue even when things aren’t perfect or easy

Scrum depends heavily on commitment both at the small scale of an individual committing to a small piece of work, and at the large scale of an organization committing to real deep cultural change.  Without that entire spectrum of commitment, it is unlikely that adopting Scrum will be anything but the latest fad imposed by management or done stealthily by staff.

But Scrum isn’t the only “agile” method.  As James points out, the engineering practices of Extreme Programming such as pair programming, test driven development, continuous integration, evolutionary design and refactoring are all critical.  Do they have to be done and perfected first?  No.  But eventually, if you are using Scrum to build software (not everyone is), they do have to be done.

As a Certified Scrum Trainer, I have always emphasized how Scrum is hard, and how being a ScrumMaster is very very very hard.  This is why my training class is three days instead of two.  This is why I don’t encourage anyone to come to it, only people who will be ScrumMasters.  This is why after the first day of my course, most students are actually feeling quite discouraged!!!  It takes three days minimum for people to understand and process the incredible shift in mental model.  And of course, even after three days, it is oh so easy to revert back to our normal thinking habits.

So what should people do?  Do Scrum by the book.  Yes that means putting a whole team in a single room.  Yes it means that you have to really remove obstacles, and fast!  Yes that means that your teams actually have to be cross functional (and not just in the weak sense of multi-skilled developers).  Yes that means that it – will – take – a – long – time – to – get – it – right!!!!

And please, it is so worth getting help beyond just the training!  If you think that I’m just trying to promote my own coaching services, please go check out:

They all have great coaches and I would absolutely way rather see you succeed than believe that I am just trying to promote my own business.

Please share!

Yet another misunderstanding of TDD, testing, and code coverage

Learn more about transforming people, process and culture with the Real Agility Program

I was vaguely annoyed to see this blog article featured in JavaLobby’s recent mailout. Not because Kevin Pang doesn’t make some good points about the limits of code coverage, but because his title is needlessly controversial. And, because JavaLobby is engaging in some agile-baiting by publishing it without some editorial restraint.

In asking the question, “Is code coverage all that useful,” he asserts at the beginning of his article that Test Driven Development (TDD) proponents “often tend to push code coverage as a useful metric for gauging how well tested an application is.” This statement is true, but the remainder of the blog post takes apart code coverage as a valid “one true metric,” a claim that TDD proponents don’t make, except in Kevin’s interpretation.

He further asserts that “100% code coverage has long been the ultimate goal of testing fanatics.” This isn’t true. High code coverage is a desired attribute of a well tested system, but the goal is to have a fully and sufficiently tested system. Code coverage is indicative, but not proof, of a well-tested system. How do I mean that? Any system whose authors have taken the time to sufficiently test it such that it gets > 95% code coverage is likely (in my experience) thinking through how to test their system in order to fully express its happy paths, edge cases, etc. However, the code coverage here is a symptom, not a cause, of a well-tested system. And the metric can be gamed. Actually, when imposed as a management quality criterion, it usually is gamed. Good metrics should confirm a result obtained by other means, or provide leading indicators. Few numeric measurements are subtle enough to really drive system development.

Having said that, I have used code-coverage in this way, but in context, as I’ll mention later in this post.

Kevin provides example code similar to the following:

String foo(boolean condition) {
    if (condition)
        return "true";
        return "false";

… and talks about how if the unit tests are only testing the true path, then this is only working on 50% coverage. Good so far. But then he goes on to express that “code coverage only tells us what was executed by our unit tests, not what executed correctly.” He is carefully telling us that a unit test executing a line doesn’t guarantee that the line is working as intended. Um… that’s obvious. And if the tests didn’t pass correctly, then the line should not be considered covered. It seems there are some unclear assumptions on how testing needs to work, so let me get some assertions out of the way…

  1. Code coverage is only meaningful in the context of well-written tests. It doesn’t save you from crappy tests.
  2. Code coverage should only be measured on a line/branch if the covering tests are passing.
  3. Code coverage suggests insufficiency, but doesn’t guarantee sufficiency.
  4. Test-driven code will likely have the symptom of nearly perfect coverage.
  5. Test-driven code will be sufficiently tested, because the author wrote all the tests that form, in full, the requirements/spec of that code.
  6. Perfectly covered code will not necessarily be sufficiently tested.

What I’m driving at is that Kevin is arguing against something entirely different than that which TDD proponents argue. He’s arguing against a common misunderstanding of how TDD works. On point 1 he and I are in agreement. Many of his commentators mention #3 (and he states it in various ways himself). His description of what code coverage doesn’t give you is absurd when you take #2 into account (we assume that a line of covered code is only covered if the covering test is passing). But most importantly – “TDD proponents” would, in my experience, find this whole line of explanation rather irrelevant, as it is an argument against code-coverage as a single metric for code quality, and they would attempt to achieve code quality through thoroughness of testing by driving the development through tests. TDD is a design methodology, not a testing methodology. You just get tests as side-effect artifacts of the approach. Useful in their own right? Sure, but it’s only sort of the point. It isn’t just writing the tests-first.

In other words – TDD implies high or perfect coverage. But the inverse is not necessarily true.

How do you achieve thoroughness by driving your development with tests? You imagine the functionality you need next (your next increment of useful change), and you write or modify your tests to “require” the new piece of functionality. They you write it, then you go green. Code coverage doesn’t enter into it, because you should have near perfect coverage at all times by implication, because every new piece of functionality you develop is preceded by tests which test its main paths and error states, upper and lower bounds, etc. Code coverage in this model is a great way to notice that you screwed up and missed something, but nothing else.

So, is code-coverage useful? Heck yeah! I’ve used coverage to discover lots of waste in my system. I’ve removed whole sets of APIs that were “just in case I need them” APIs, because they become rote (lots of accessors/mutators that are not called in normal operations). Is code coverage the only way I would find them? No. If I’m dealing with a system that wasn’t driven with tests, or was poorly tested in general, I may use coverage as a quick health meter, but probably not. Going from zero to 90% on legacy code is likely to be less valuable than just re-writing whole subsystems using TDD… and often more expensive.

Regardless, while Kevin is formally asking “is code coverage useful?” he’s really asking (rhetorically) is it reasonable to worship code coverage as the primary metric. But if no one’s asserting the positive, why is he questioning it? He may be dealing with a lot of people with misunderstandings of how TDD works. He could be dealing with metrics bigots. He could be dealing with management-imposed-metrics initiatives which often fail. It might be a pet peeve or he’s annoyed with TDD and this is a great way to do some agile-baiting of his own. I don’t know him, so I can’t say. His comments seem reasonable, so I assume no ill intent. But the answer to his rhetorical question is “yes, but in context.” Not surprising, since most rhetorically asked questions are answerable in this fashion. Hopefully it’s a bit clearer where it’s useful (and where/how) it’s not.

(This article is a cross-post from “Geek in a Suit”)

Please share!