I read an interesting blog entry today about defects as they relate to a shaken can of soda. The short version is, don't pass defects onto the next unsuspecting person. Either deal with it yourself (preferable) or document it so the next guy knows what to expect.
That's it. You can stop reading. The rest is just my mental diarrhea raging out of control.
I think that sounds great down here at ground level. Unfortunately, I've chosen to work at places that tend to not do things that way. I've been on many teams that were encouraged to fib about how feature complete and bug free they were. This was done so we could call the product "code complete." Then, we spend half the schedule in the QA phase. QA finds and reports all of the defects (many of which we already knew about), we fix them, rinse and repeat. While this flies in the face of the notion that it is cheaper to fix (or at least identify) your defects early, it has often been what management wanted. I've never been entirely sure of why that is. It somehow fit together with their notion of how software is made. It seems to most often occur in combination with a waterfall methodology.
In the last few months, the place I work has transitioned to a more agile methodology. I have to say that on the whole, I'm much happier with it. It beats the hell out of working on an outdated spec with no feedback only to find out (6 months later) that that isn't what they wanted (even if it is what they said). I like the nice, short cycle of requirements, implementation, demo, feedback. It's amazing how peoples' requirements and priorities change when they get more timely delivery of what they've asked for.
That's the upside. The downside has been trying to squeeze architectural ramp-up and infrastructure tasks into two week chunks. Especially when there is an unwavering emphasis on demonstrable features at the end of every iteration–you watching my build script run isn't going be "much better than 'Cats'". Also, there are usually inefficiencies in breaking things up into smaller pieces. That bothers me on some level, but I think it ranks right below "why do they put white rice in salt shakers?" I can live with it. The part that has been harder to deal with is that agile, in combination with weak product management and strong sales people (and pushy customers, I guess) has made it easier to get customer specific features into the product.
These features are of course worthless steaming piles of functionality. No one else wants it and it doesn't make any sense–but someone is willing to pay for it, so let's get their money. After the smoke clears, we've got to maintain it. Then, some "normal" customer finds it and tries to use it. Usually, they don't know how to use it (because the feature doesn't make any sense) or it's not what they think it should do. So, they call support. This just adds to the cost of having that crap-ass "customer of one" feature.
I'm not fond of this way of doing business. I don't want your customization in my code base. I'd rather do the open API/SOA/whatever thing and let you worry about how your custom workflow integrates with our product. Hire some other programmer to customize the hell out of all of your third party products. Hell, you can even hire someone from the company I work for. If your idea kicks ass, sell it as an add-on suite to our product. If it really kicks ass, maybe we'll buy it and integrate it into the next release (ironic, isn't it). But more than likely, if you have to pay for it, you'll come to your senses and realize your idea / requirement is stupid. Either way, I don't particularly care. As for the lost revenue, I don't know…Sell developer level support or some shit. Or open up a side business customizing your own goddamn software. Just stop putting this crap in the core product.
Despite the hype, I think this is the direction everything is heading. Call it open API, SOA, REST-ful, web services, or whatever. Stop thinking that you're going to lose your competitive advantage by opening up your data and your product. Stop thinking that by having one decent product in one area you can "end to end" (if you know what I mean) your customers into buying all your other shitty offerings. Everything you make better be able to integrate easily and stand on its own two feet. Open up and say, "ah." That's an API type of joke, son…It's totally win-win. I get to stop working on and maintaining worthless, disparate features. The customers get to have access to their data and the glue that links all of these third party products together into their quaint little workflow.
And scene…That's the end of the promised diarrhea. From appetizer to dessert (and everything in between).