Let me talk a matter I have been pondering more than once. (How unusal, eh?... ;-) )
The latest incident, which prompted me to write this article, was at a (somewhat bizarre) presentation of Protonet. (Which is essentially a WLAN meshing appliance.) There was argument about whether the Protonet guys should have used existing Freifunk stuff, instead of creating their own infrastructure. While most of the geeks present were arguing that it was stupid and pointless and evil overall to reinvent the wheel, I was pleading Protonet's case... (I'm not associated with either Protonet nor Freifunk, BTW.)
So, why did I do that? Just for the sake of trolling, of cource... Err wait, did I really say that aloud? That's obviously not what I mean! :-)
The truth is that sometimes reinventing the wheel -- or rather, inventing a new variation on the wheel theme from scratch -- is indeed a good thing. Reinventing the wheel is not always just ignorance or Not Invented Here syndrome (no, really!) -- there are various totally valid reasons for doing so.
There are -- surprisingly -- technical ones: while it certainly seems a terrible waste to create something new, when more or less the same functionality has already been implemented elsewhere, this is a very superficial view. Often it's not really a waste, because implementing the core functionality from scratch can actually be less effort than working with an existing framework!
An existing framework, that has matured over years, tends to have all kinds of features and quirks, to handle all possible aspects of the problem; to cover all possible use cases. (And usually, some impossible ones as well -- after all, we want to be really complete, dont' we?... ;-) )
Now of course you think that this is a good thing, and precisely the reason for using an existing framework. (See, I can read your mind! ;-) )
However, when I want to create something new, the completeness is not helpful. When I want to create something new, I want to focus on my new hotness, not trying to cover all freaky obscure use cases. ("Freaky obscure use cases" obviously being anything I don't need myself ;-) )
I actually want to ignore most aspects: "ignorance is bliss". I want it to be incomplete on purpose. I don't want to waste my energy on learning all the mundane aspects of the existing framework, and trying to figure out how to fit my new ideas into it, without breaking existing functionality -- the functionality that someone, somewhere, has learned to adore, and will fight for it tooth and claw... Being the egotist that I am, I want to spend my energy on my new ideas instead.
Your next objection surely is that this is shortsighted, and will come back and bite me in the arse: because -- if I want my new stuff to be generally useful -- I will ultimately have to cover all of these aspects anyways. (This is your next objection, isn't it? How predictable you are! ;-) )
And -- prepare for a surprise here -- you are totally right. Didn't expect that, eh? :-)
It is true that I can't really avoid dealing with all the aspects the existing framework covers. All I can do is postpone; but sooner or later I will have to deal with them. And then it's time to look at the existing framework, and see how my ideas can be integrated there. Only then my ideas are already tried and tested; only then I know exactly how things should work; only then I know which aspects are really important, and which can be traded. Only then I can show my ideas, instead of just trying to explain them; only then I can prove that they work; only then others can try them out, and see for themselfs that they are useful; only then I can point to existing hitmen^H^H^H^H^H^Husers, who like the new ideas, and want to see them implemented in the existing framework; only then I can expect help from others with this daunting task.
Yeah, sometimes being shortsighted is useful.
Of course this means that most likely I will have to throw away part of my code; perhaps even all of it. So? Luckily, I didn't spent too much effort on it in the first place... Call it a prototype, proof of concept, whatever. Surely you won't question prototyping being a good thing?
The code doesn't count much. It's the ideas that count; having inspired a group of minions^H^H^H^H^H^H^Hfollowers sharing my vision; having gained enough momentum to overcome technical and social obstacles...
And here we are already happily in the midst of the second catergory of (valid) reasons for reinventing the wheel: the social aspects. (Ha! I know you like these, like we all do!)
These are often even more important than the technical ones. Working with an existing framework means working with an existing community -- a community that has it's own priorities, goals, conventions, deities... Not a good environment for creating something new: you spend your energy on dealing with conflicts (religious and other), instead of actually creating stuff.
Let's take a look at the worst case. It's not even uncommon -- I've seen it happen. You have a group of people, having an interesting idea. They all have a common goal, a shared vision. They are very enthusiastic, and want to make it happen. Ideas are thrown around, people start setting things up and working on stuff... In other words, pure awesomeness, life is good etc.
And then, people from a somewhat related, established project come around, and start discussing. (Yeah, discussing -- it's every bit as bad as it sounds! ;-) )
First they will say, "See, what you are trying to do here is interesting; but it's essentially the same as what we are doing. Why don't you join our ranks and we can work together?" "Indeed, why not?" you will think, naive as you are. So you stop the stuff that was already going on, and instead talk to this established group about what needs to be done.
But now you discover, the hard way, that they aren't really that much interested in your ideas after all. Although they are doing something similar, it's not quite the same. They have their own ideas, their own priorities, their own goals, their own deities... They tell you how you should do things differently from what you intended; more like they want them to be -- arguing that it's The Better Approach (TM). They will tell you to focus on different aspects; to work on different things. In short, they will patiently explain to you that what you really want to work on, is evidently not what you thought that you wanted, but rather what they consider right.
They drown you out. They are an established religion, with firm dogmatas; while you struggle to articulate your fresh heretic vision, and to hold your own little group together. Some of you will hold firm to your original beliefs, spending all your energy vainly trying to convince the other group of their value; finally giving up exhausted and dismayed. Others will seemingly convert to the established religion, agreeing to work on other stuff; but inwardly feeling that it's not really what they set out to do; consequently lacking enthusiasm, and ultimately just dropping off as well. (So the other project doesn't gain anything from it either -- their hope of annexing your group to work on their stuff is frustrated too. They only loose time and energy as well -- serves them right, bastards!)
The result is total disaster -- your enthusiasm lost, your vision in shatters, your people dispersed; leaving nothing behind but a universal feeling of disappointment...
You might try to avoid interaction with the established religion by forking. However -- aside from the fact that without interacting with the developers, building on an existing framework is even more problematic technically -- this doesn't help much either: some people, when seeing your dissenting, will come over and whine, why are you forking instead of "cooperating"? They will go on a crusade, actively trying to harass your group. Not exactly helpful for productivity...
In other words, if you are trying to create something new, you initially need to isolate from other similar projects as much as possible. Only once you have working code, a community of followers, enough momentum to hold your ground -- only then you can talk to established projects on an equal footing.
So, let's happily invent new wheels. Mine is pentagonal -- how about yours? ;-)