Quality can come at no price

May 25th, 2007

“Quality, Features, Time, pick two” is something you hear many times in teams on development projects. I am more a proponent of discussing only Time and Features with clients; but that’s only because I believe Quality can be achieved with a very low effort, following a few simple principles.

You might find that they sound like common sense sometimes but, by (recent) experience, I know there are many places where there is room for improvement!

Test, test, test and test!

OK, we’ve heard it many times from the Agile crowd, but however you do, test has to be done. Not one time, not two times, but all along the development. This is very documented and it really makes a difference:

  • screen usability tests[1]: even if you use just the hallway usability test, it will help making sure you are not going in the completely wrong direction with the UI; 80% of usability blunders can be picked-up in a day’s worth of usability testing and fixed on the fly.
  • automated code tests (unit tests and business cases)[2]: you really have to convince your developers that they can’t release code for which they don’t have automated tests. If it can be tested, it is better designed; if you have a test for a bug, the bug will never appear again (or at least you’ll know it).
  • user acceptance tests[3]: the customers have to be educated to come up with testable requirements; they will do the testing themselves!
  • load tests: if performance is likely to be an issue, test at least at the worst-case expected load level. It is better if the tests are automated.

All in all, it seems like a lot to do, but quick usability tests will avoid complete redesigns (1 day), automated code tests will keep you going free of regression bugs (cost of developing the tests balanced by the gains on regression bugs), UATs will make sure “everyone” understands the requirements (costs included in the requirements specification) and load tests uncover nasty surprises early on (a few days at worst, but gains on redesign at best)!

Choose good working environments

This looks like a pretty standard thought at first but if you try and assess what software people use in your organisation, you will certainly find out that many use programs that don’t fit their needs. And when I say needs, I mean features as well as usability. People will go to unbelievable lengths to have their program (most probably installed by default) do what they want them to.

For instance this doesn’t look good when your testers save emails and paste screen shots in Word documents in order to keep a track of bugs and tests. Have them use a bloody testing database and bug tracker!

Now imagine what you are going to impose to your developers when you chose a development platform. You have to have a pretty damn good reason to choose to have your logic coded at the database level (think PL/SQL) when you know for sure that it is probably the worst development environment possible (except maybe for APL :).

Tooling matters a great deal. It can make the difference between solving a bug in half a day and spending one week with fear gripping your bowels.

Choose your project’s tooling according to your staff skills and not according to some dubious trend. And if that involves implementing a good skills management strategy in your organisation, well, isn’t that what you should be doing anyway?

Check upon your experts

You can be confident about the quality of your software when you are confident in the experts. Those are the one you take your advice from and those you entrust with the development of your system.

Advice can be checked quite easily. You probably can get a good idea of an issue with a bit of googling… but you certainly can find someone in your network who has already gone through the same questions.

Work can be checked too. But it requires a bit more tact. However, if your DBA (OK I have something against databases today, but the point could be made with any one professional… think plumbers) consistently spends more time to do things properly than your good sense is telling you that he should, you might want to know if you can rely on him!

Do those checks regularly. Peer reviewing is probably the approach that yields the most effective results in terms of actually getting the answer you’re looking for, but it implies you have peers at hand that can be diverted from their actual jobs once and again. Also, your team might feel, rightly, that they are under scrutiny… and they might not like it.

The best way to do your checks is to have each member of your team explain what they are doing to the other members of the team. Have them show their code, their database configuration, their UI… peer review will occur naturally. And better, knowledge will trickle down through your team!

Surround yourself with good people

It’s a corollary to the previous one but also a summary for all of this article. If the people you are working with are dedicated to do their best at coding, optimising their environment, not talking BS, testing and developing their knowledge, there is a great chance they will produce good quality software!

Now all you have to do is actually build the system your customer wants!

[1]Register to Jakob Nielsen’s Alertbox and read one or two of his books for a first approach. Most web usability principles can be adapted with good results to rich client UIs.
[2]See JUnit or TestNG for Java, NUnit for .Net, but these principles can be adapted (and indeed found online) for any language.
[3]As a starter, read this article for customer-driven development and testing

Sphere: Related Content

EssUp: Ivar Jacobson wants to get at your wallet…

May 17th, 2007

I just listened today to the episode #2 (MP3, 16mns) of the excellent podcast from parlezuml.com’s Jason Gorman, and I couldn’t resist the temptation to criticise Jacobson’s markeking approach to introducing EssUp (for Essential Unified process).

As much as I respect Jacobson (after all, he had been a near-god to me a few years back), especially for giving us Use Cases and for his tremendous work on the Unified Process, I still believe there’s something fishy with EssUp.

Best of the best practices

The intent of EssUp is to merge 3 major streams of process engineering: CMMi, RUP and Agile. From what you can hear in the podcast, Jacobson suggests that this new process takes the best from all three processes; from CMMi its focus on process improvement throughout the organisation, from RUP the clear separation of roles and activities in the project and the UML-base artifacts (think Use Cases), and from “Agile” its lean and mean attitude (well, really, it would take whatever would make the customer satisfied).

According to Jacobson, the need of a new process emerged from the realisation that UP (Unified Process) and its most known implementation RUP (Rational UP, from IBM) were too heavy to be applied fully and way too complex to be adapted… oh, and may I add that they weren’t too pleased that they didn’t contain the word “agile”?

Aggregation of practices

Every element of each of the aforementioned development processes is included or generalised in the EssUp process in what they call practices. They first draw an action plan tailored for your organisation, and they then choose which practices are best suited to your project and they make them work for you. I suspect that they would mostly respond to what you want to hear in terms of project organisation, but maybe that’s just me.

Clearly, what Jacobson and his team of highly competent consultants are selling is consultancy on every detail of a Software Development Process (SDP); no discussion about the fact that they are highly competent, I mean, if they all are of the same calibre as Jacobson, this must be a hell of party!

All in all, you know who they are and you know that they are knowledgeable about SDPs, and what you buy is their skills at setting up a working up something for you. However is this process mix-up like saying “We have got absolutely nothing, but we’ll make you pay us for helping anyway.”?

Groundbreaking?

I used to work with RUP on a project in the defence sector, back in 2001; at the time, I was much younger (indeed) and UP appeared to me as the best solution to SPD issues. It promised to take a hit at “the mythical man-month” by offering a set of roles, activities and artifacts that, if used cleverly, would guarantee a better outcome to your project. And to support that, they could show countless examples of how it worked for others… and I have to say, it actually worked quite well for us, although I would like to find a way to measure how much this was due to us using RUP?

- Now when I am looking at EssUp’s work packages (and their subsequent details) which are presented on Jacobson’s website from a high-level point of view, I can’t help remembering the probably overpriced RUP application that we used to try and follow good practices on the project. -

What I think is lacking in Essup, as well as in any other process, is actual research and evidence to demonstrate that using one practice is going to improve dramatically the chances of good outcome of your project. Moreover, there is no supporting analysis of how well practices perform when they are combined to each other; maybe two practices that independently improve a project’s viability would jeopardise it if combined? - I am not aiming at XP people that tell you that you have to use all XP for it to work, but can’t really tell what is the impact of dropping one of its practices -

Granted, there is no silver bullet (yet?) to software development process and having people like Jacobson foster new processes is certainly a very good thing; but you can bet that Essup is no silver bullet neither… so why present it as if it was one? And why not be honest about the fact that they actually want to sell good consultancy on highly engineered processes?

Sphere: Related Content

The agile enterprise at its best

April 4th, 2007

I am just coming back from Rome where I spent the past week walking through town as a tourist. No doubt the city is wonderful and its people are very kind, but that’s not the subject…

Should you walk in the streets of Rome, you would be amazed by the number of illicit street vendors that offer every possible brand of fake bags (even some with the logo that didn’t match the copy), fake watches (how many 10€ Rolex have I seen?), fake silver bracelets and other piles of rubbish that every young visitor is keen to bargain for!

An event happened that made me think: when it rains, their business changes; they all suddenly sell umbrellas!

At the first drop of water from the skies, they all pack their bags and jewellery in a very efficient manner developed for running away from police (just grab the four ends of the sheet your stuff lies on, and stand up), and they rush in the streets with handfuls of umbrellas, quickly offering them to office workers, students and tourists altogether.

They may have only 5 minutes of rain, but they always sell loads of umbrellas! Although I don’t know at which price they’re selling them, I am sure they make good profits each time.

And then when the rain stops, they’re back to the pavement. Now that I am writing this, it dawns on me that they probably switch to selling fresh bottles of water in the hottest days of the year…

If that’s not agile, what is?

Sphere: Related Content

Unchecked warnings and type erasure with Java Generics

March 14th, 2007

I am currently cleaning a whole code base from all its warnings and I kept stumbling upon a few warnings related to the use of generics. And all I can find on Google is people telling each other to use @SuppressWarnings(”unchecked”)…

For a start, I am not a big fan of annotation (I will probably post some day on that), but this is more like sidestepping the problem and acquiring bad practices for dealing with warnings.

2 different warnings

Consider the following example encountered while using Apache Log4J:

Enumeration<Appender> e = log.getAllAppenders();

This will generate the following warning: “Type safety: The expression of type Enumeration needs unchecked conversion to conform to Enumeration”

OK, fine! so let’s cast it to the proper type:

Enumeration<Appender> e = (Enumeration<Appender>)log.getAllAppenders();

Well, the result is not quite what we expected in that it’s still generating a warning: “Type safety: The cast from Enumeration to Enumeration is actually checking against the erased type Enumeration”.

Even though we are pretty sure this should never generate any ClassCastException, these warnings are just plain annoying for code quality…

More on erased types

The implementation of Generics in Java 1.5 came with a nice advantage: you could code in fancy spanking-new 1.5 generics and still generate classes that were compatible with previous versions of Java!

They did that by enforcing the type safety with generics only at compilation time, but otherwise generate code compatible with Java 1.2+ by removing any parameterised type from the compiled class.

In effect, using generics it is now easier to code type-safe classes, but the checking is not done at runtime. If you find a way to feed your application with instances that do not comply with the intended generics behaviour (in our example, having an Enumeration of, say, String instead of Appender), this will certainly result in a nice ClassCastException!

And that’s the way it is implemented in Java, full stop! No discussion possible (until they decide to cut with previous versions of Java). So why have a warning at all?

The solution

Actually, there is a very simple answer to this (apart from the fact that future versions might not provide backward compatibility)…

It is obvious we are trying to get an Enumeration of Appender instances in order to apply some process on each of them; …but wait!

Appender is an interface… (that’s what got me on the tracks for the solution!)

What you are actually getting is an Enumeration on implementations of Appender; that is, any implementation possible!!!

So really, the code logically needs to be written as follows:

Enumeration<? extends Appender> e = (Enumeration<? extends Appender>)log.getAllAppenders();

That’s right! we want to be able to deal generically with any subtype of Appender… seems soooo easy now with hindsight, isn’t it?

Sphere: Related Content

mod_rewrite and url parameters

March 12th, 2007

Apache’s mod_rewrite module is very potent for manipulating urls on the server-side; it allows you to:

  • hide the technology used to dynamically generate the pages
  • hide the construction of the URL, rendering it more difficult to modify some parameters in order to get the application in an non-desired state, thus limiting the risk of an exploit to be discovered by a hacker or a script-kiddie
  • improve human legibility of URLs
  • improve search engines crawl and indexation

The problem, though, is that you have to understand what is happenning under the hood to be able to produce effective rewriting that will not be worse than the original URL scheme!
A problem I have been looking to resolve for quite some time, is how to pass on the parameters from the exposed URL to the rewritten one…

For instance, if I have the URL myserver/book_15645854.html, I can simply rewrite it to call the myserver/book_details.php?bookid=15645854 url by using the following rule with a regular expression:

RewriteRule ^book_([0-9]+)\.html$ book_details.php?bookid=$1

But now, what if I want to rewrite the following URL

myserver/contact_form.html?email=eg@example.com

so that it populates the source email field by default with the email passed as a parameter to the dynamic contact page like myserver/contact.php?email=eg@example.com ?

Bad news is that you can’t use a regular expression in the RewriteRule. It just won’t work! And you can’t seem to find anything in the documentation that tells you why…

Good news is, it’s actually quite simple but, coming back to what I said about looking under the hood, you have to understand that the rule you define in the RewriteRule clause is working on the resource part of your URL and not on the overall request URL with all it’s parameter!

The actual parameters are contained in a variable called QUERY_STRING that you can use as follows:

RewriteRule ^contact_form\.html$ contact.php?%{QUERY_STRING}

…now I will try to find how to collect only one of the parameters - ideas welcome!

Finally, you might to have a look at this more complete article: Mod_rewrite Introduction and Cheat Sheet, it has everything you want to forget about mod_rewrite!

Sphere: Related Content

The ultimate developer

January 25th, 2007

Seen here: How IT recruitment works. Someone’s looking for a developer with the following specification…

“…urgent requirement for a developer who
specialises in the following:

ASP.NET 2.0
C#
SQL Server 2005
Java
Oracle
SharePoint
Flash/ActionScript 2.0
Web Services
XML
DHTML
AJAX
UML
COM+
VB 6.0
C++/ATL
MS Excel/VBA

Ideally French-speaking, but not essential.”

I’m in! But I charge £4000 a day and I need to be able to do 80% of the work from home…

hey guys… down there we call that a team !

Sphere: Related Content

SCCS Documentation anyone?

January 16th, 2007

For those of you who wonder where you can find a decent documentation, I would recommend either

For the story, noone seems to be using SCCS anyway… please drop me a line if you do, because when you type SCCS Documentation in google , the 3rd result is some guy asking for documentation… back in 1995!!!

Sphere: Related Content

IE soon to be dead?

January 3rd, 2007

This is the third post of a series analysing the trends in browsers uses on a website I am managing (previous posts were Is Firefox losing ground? and Standards compliant browsers neck and neck ).

I couldn’t post over the end of 2006 while I spent of the festive period back in France (which by the way reminds me of wishing you a happy new year), but here we are, back again with a lot of good resolutions.

I had a look this morning at the statistics of the Who’s Who in France browser access, and I could have shown yet another graph of Internet Explorer 7 taking ground over other versions of I… but it would have been a repeat of last post’s graph showing that IE7 use (nearly 17%) just has gone over Firefox (just 12%) and other browers (about 12%).

Instead I chose to draw a graph of the use of Internet Explorer (any version) over the past two years:

Internet Explorer statistics over 2005 and 2006

Internet Explorer has lost about 14% market share over the course of 2005 and 2006; and it looks like a pretty steady curve. If the trend is continued and Internet Explorer 7 doesn’t catch up (it doesn’t look like Vista is going to catch up soon neither), we could see something like Internet Explorer being taken over by another browser (Firefox 3?) in the next 2 to 3 years period.

It looks like people are starting to get used to something else than Microsoft’s browsing software… anyone in the run to create a brand new browser?

Sphere: Related Content

Standards-compliant browsers, neck and neck

December 8th, 2006

This article is a follow-up of the article Is Firefox losing ground?.

It seems that in the past eight days IE7 has grown to get approximatively the same market share as Firefox…
Browser stats for 07/06 to 12/06 showing IE7, FF and others being neck-and-neck

although this trend tends to have stagnated in the past week:

IE7 stats for 30/11 to 08/12 2006

The coming weeks are going to be really interesting!

Sphere: Related Content

Is Firefox losing ground?

December 1st, 2006

I am currently running a small experiment on the “spreading” of Firefox.

I am managing a public website (Who’s Who In France), mostly for fun and because I like the people behind this business, and we recently completely reworked the design so that it matches more closely to web standards; I am very close to the holy grail of XHTML validation, still have to figure out why when I am fixing the following validation errors, this valid page breaks…

Anyway, I have been looking at the logs in the past week and decided to draw a graph of the different shares of browsers access on the website, especially because I wanted to know how IE7 was doing.

The following graph is the result of my investigation of the statistics in the past 2 years (Internet Explorer in versions preceding IE7 have been omitted for improved legibility of the graph):

Browser statistics 2005-2006

2 interesting facts that I can see on this graph:

  • Internet Explorer 7 is gaining ground on previous versions; that was predictable as it is downloaded as part of Windows Update… myself included on the company laptop (for those who are interested, you can install previous versions of Internet Explorer for compatibility testing)
  • In 2006, other browsers have taken the high ground on Firefox; not everyone is happy with Firefox and the market for alternative browsers is very wide.

This makes me think that this experiment is far from being finished. I believe IE7 will ultimately gain ground on the alternative browsers. Not that I would like to, but I tested it and couldn’t really find anything that I disliked (so far).

Follow-ups in the coming weeks…

Sphere: Related Content