I hate software that works. Deeply. From the bottom of my heart and soul. Let me try to explain why.
I have worked a lot with databases, and I have long been amazed at the ability Oracle has had to consistently ship software that works. Sure, they have their share of bugs, but who hasn’t? When you use their software, you can expect it to work. And nothing more. You can never expect consistency, nor OS integration, nor anything that could ease the pain of actually making it work. On the field of consistency for instance, I, for one, think that the procedures
GET_STORAGE_LIMIT (in the
DBMS_LOB package) are inconsistently named. But it works. RTFM. Have you ever tried to change the name of a computer with Oracle installed (Express Edition on Windows XP for instance)? Well, good luck if you want to see your database again.
In the world of software that works, there is no such incongruity as refactoring. Think of it as the activity of changing code that works into code that does the same thing, but in a different way. In other words, it is one of the most stupid things to do, the mother of all evils. One software I have had the opportunity to work on had at one time been ported from DOS (16 bit) to Windows NT (32 bit) (the source code was in C). Compiling it the first time resulted in hundreds of warnings (
ints would not fit in
shorts). My coworkers confirmed it was normal behavior, and that nothing could be done while the software worked. And certainly not refactoring. As a result, the compiler ceased to be my friend.
After a few years in the field, I have learn to develop a strong allergy to “software that works”.
First of all, I regard the expression itself as pure nonsense. Yes, of course, software should work. And boats should float too. How would you call a boat that does not float? Software that does not work is no software. Call it an attempt, a bunch of source code, junk, whatever. Software works.
But what does it do exactly? Simple as this: software should do what it is supposed to do. This may sound a lot like “software should work”, except that this expression subtly introduces the concepts of software requirements and of quality attributes. What is your software supposed to do? How efficient, usable or available is it supposed to be? I realize now that almost none of the projects I have worked on in the past had a central repository (like a simple document) to gather answers to these simple questions. To be honest, nobody realized that these questions existed and could be asked. Unfortunately, and as far as I can tell, this is still the state of the art for the software industry.
When you have requirements and attributes, you know what you can do with your code. If your software is a prototype, then it may not be worth refactoring it. If you design APIs, you might want to be consistent while naming them. The
ASCIIEncoding class in the .NET framework does not follow the capitalization conventions set by Microsoft itself. The difference with Oracle here is that there is a rule, and that exceptions are few (and can be seen as mistakes). Try to guess in which environment developers get more productive, more quickly?
When you don’t have requirements or attributes, your only sensible goal is to build software that works. Which means you don’t really have a goal.
I love software development. It is a world where I can express a lot of creativity in trying to imagine solutions that fit into a set of requirements. Sometimes, I can even come dangerously close to the quixotic dreams of perfection I made as a teenager. I guess I have to be thankful that “software that works” regularly kicks in to bring me back to reality.