Grab Your Chisel and Start PoundingÂ
a guest blog post by Volkan Ăzçelik https://geekli.st/volkan - technical lead, Cisco, Samurai of the Javascript
âWell, youâre obviously being totally naĂŻve of course, said the girlâ, âWhen youâve been in marketing as long as I have, youâll know that before any new product can be developed it has to be properly researched. Weâve got to find out what people want from fire, how they relate to it, what sort of image it has for them.âÂ
âStick it up your nose,â he said.
âWhich is precisely the sort of thing we need to know,â insisted the girl, âDo people want fire that can be fitted nasally?âÂ
âAnd the wheel,â said the Captain, âWhat about this wheel thingy? It sounds a terribly interesting project.âÂ
â Douglas Adams, The Hitchhikerâs Guide to the Galaxy, Chapter 32
Everyone discourages us from reinventing the wheel.
And itâs not just the people around: All the software architecture books we read are against reinvention, too.
The problem you are trying to solve has already been solved by others. Instead of doing it yourself, you should learn from othersâ sufferings because itâs the most effective way to occupy your time.
Thatâs the conventional wisdom. And conventional wisdom, like common sense, is an oxymoron.
Can you see the circular problem with the line of thought that deems reinventing a futile effort? â If everyone denies to solve any problem unless an existing solution exists, then there wonât be any solutions to begin with.
Nothing new will ever get written under such an approach;
And nothing existing will ever be polished, either.
To break the cliché even further you might be surprised that the wheel has been the most re-invented tool ever.
Reinvent to Make It Better
Letâs talk about software:
Any software that is older than a couple of years will be full of workarounds for features that fall short, and patches that just donât fit.
Have you just inherited a ten-year-old legacy code from a frustrated developer? Well⊠I feel for you buddy. â You have every right to wonder how an earth so much crap can cripple its way into a codebase.
Seriously though, if youâve ever wondered why so much code is crap; the reason is simple:
There is crap because we compromise â we have to:
Itâs often considered quicker and faster to live with the current flaws. And we have deadlines to meet, you know.
There is always something out there that can be made better.
This is not only true for software, but also true for anything you can imagine.
Anything can be made better, faster, stronger; our work is never over (Daft Punk, anyone?).
Mapping, Reduction, Filtering, and Transformation: Anything you imagine will fall into one of these categories.
(that means life, as we know it, is purely functional; and thatâs the point of another article).
You can express any concept as a mapping, filtering, or transformation. Invention is one of these concepts:
Invention is transformation:
You take a bunch of crazy $#!% and transform them into even crazier $#!%.
I donât know you, and I wholeheartedly believe that transformation is not a waste of time.
We need to be more creative, and less dull. Thatâs the only way to transform.
You know what? Nothing is a simple as it seems. Nothing fits right for the first time:
The hard truth is that we carve out the edges of square pegs to fit them into round holes, and call this âcode re-useâ.
Since nothing is simple, it logically follows that there are no dumb questions either.
Now, to be clear; I am also against the ânot invented here syndromeâ. Yet, I see, in our community, an increased aptitude to blindly use tools without questioning their internals. This is one of the many adverse-effects of the âdonât reinvent the wheelâ culture.
Itâs ok to be outrageous. Itâs the acts of insanity that often lead the simplest of solutions. Try new things and have fun!
Every now and then step outside your comfort zone. Do something different. By doing things differently you will start to see things differently.
What I see in the majority of the developer ecosystem is quite the opposite:
We like to stick with certain tools/patterns/libraries. â It is not because we support code re-use; per contra, it is because we are too lazy to leave our comfort zones.
And dull is the polar opposite of creative.
It is not something that you would aspire to be.
Reinventing the wheel gives you the insight about the wheel.
If you donât know a concept well enough to reinvent it; how can you understand it enough to build something more complicated on top of it?!Â
You know what? Occasionally you will come up with a better wheel, too.
Thatâs not the purpose, though.
The purpose is to go through a transformation.
The world needs its crazy-makers, and the world needs lots of them.
What I cannot create, I do not understand.
Those were Richard Feynmanâs last words on his blackboard at the time of his death.
Why do children break their toys? Because the best way to learn about something is to tear it into pieces and then bring those pieces together.
Understanding is what makes you grow. Without an understanding of your environment, you wonât have the power. And to survive in any ecosystem, knowing the system helps a lot.
I have a huge pile of âstuffâ (pieces of code, images, assets, snippets, documents) that are diverse, and interesting to me. And I tinker to figure out ways to make those things fit together.
I am sure, there are a better solutions at github, or npm that address what that I am trying to achieve.
The thing is: Sustaining a habit to combine and mentally fit seemingly-unrelated pieces together turns out be extremely helpful. It is especially useful when you find yourself in a situation where you have to come up with a solution to a really hard problem ASAP.
The best way to learn how to use tools is to learn to be a tool-maker.
I donât also believe that you need to create something that others would use. Donât limit yourself to othersâ requirements because no matter what you come up with you will learn a lot:
You will gain confidence in a given area of expertise. That expertise will help you come up with actual productive work better, and faster than anyone else.
Donât fear being a crazy maker.
Donât get your hands dirty all of a sudden, thinking that nobody has solved a similar problem before you. Before starting anything, examine what others have done:
While reinventing your wheel yo will see the size of the giants on whose shoulders you are standing.
Also donât shy away from some of those people. When you ask smart questions they are, indeed, quite receptive and welcoming.
Letâs talk about genetics:
Without variation, a population cannot evolve in response to changing environmental variables. As a result, it may face an increased risk of extinction.
Thatâs what the theory of evolution tells us.
That is true for anything: economics, politics, finance, programming, open source, ideasâŠ
Without variety, you cannot be fruitful, let alone multiply.
As a corollary to that: Without reinvention, diversity is impossible.
So if you plan to create yet another JavaScript charting library, you are actually doing good to the community.
Having different things that try to solve a problem is not bad, it is good, actually it is really damn good.
The flawed mentality of ânever reinventing the wheelâ, might lead to stagnation, and can hinder the evolution of better outcomes.
Beware of the Frankenware
Frankeware is any software product that consists of a mashup of various reusable code pieces. â The problem is, those reusable pieces do not quite fit into the product; and they also do not play well with each other. â The result is a working, yet buggy and unstable code base that can blow up with even the simplest feature modification.
If you are old enough to remember the times when DHTML was the coolest new thing, and Netscape Navigator 4 was a decent browser, you know exactly what I mean.
One problem with reusing the wheel is the same as with a lot of things: hidden assumptions.
The person who invented the wheel designed it with her preconceived notions, and her sets of requirements. You should find yourself lucky if any of these are documented at all.
Any time you attempt to reuse the wheel, it is quite possible that one or more of these assumptions wonât hold.
Reusing the wheel can be inefficient at best, and just plain wrong at worst.
I am not saying to reinvent all the things â that would be counter-productive.
Itâs just that you should analyze the reusable pieces that you plan to use very well:
Donât just read the public documents; dive into developer communities, read the source code, check the open bugs and issues, see what common pitfalls they have avoided along their wayâŠ
Donât buy into anything because it is the coolest newest kid on the block.
Know what you are doing, and be wise in your decisions.
Reinvent and Be Responsible
If your job title is not âChief Executive Crazy-Makerâ then you are expected to get things done, as soon as possible, as cost-effective as possible, with the best quality as possible.
That goes without saying, and Iâll say anyway.
I am by no means advocating towards inefficient use of company time.
Unless you have a solid reason that your reinvention is necessary (because it will be simpler, easier to integrate, more lightweight, easy-to-maintain, you name itâŠ), then suck your ego up, and use a battle-tested solution that everyone trusts.
And if you do want to come up with your solution anyway, then do it in your personal time. â Thatâs what nightlife is for, Neo!
Reinvent for a Competitive Edge
Assume you are one of the rare individuals wanting to create something that has never been done before. The type who wants to disrupt the status quo, you know. â If you are aware of the alternatives, and you are purposefully reinventing, it is actually an advantage.
Hereâs how Joel Spolsky states that:
For example, if youâre writing a cool 3D shoot-em-up game (like Quake, around the same time period) and your key number one differentiator is to have the coolest 3D graphics, you do not use whatever 3D library you can find. â You write your own because itâs fundamental to what you do.
This is far more than a pedagogical benefit:
Reinventing the wheel actually takes you ahead of the competition because you can fine-tune your wheel exactly to your needs. Thus, you will opt in to differentiate, and perform better, possibly compromising clarity and reusability.
Thatâs a difficult tradeoff that you have to make.
 Beware of The Cost of Reinvention
This is not to discourage you. I just want to lay out the facts as straight as I can:
During the course of your reinvention, you will start with a simple and obvious solution to your problem.
That simple and obvious solution will, 99% of the time, be inadequate:
You will have to reiterate your solution over and over again. And thatâs a good thing.
Sometimes you will think that you have taken a reasonable path, only to find that things are getting more and more difficult as you try to improve your solution.
Then you will discover a different path that looks promising. Then you erase and rewind to the beginning.
Your implementation will âprobablyâ stink, and people will discourage you a lot.
Thatâs the innovatorâs dilemma, and sometimes it is right to listen to others, and then continue doing what you believe to be the right thing.
Donât try to reinvent everything at once. â It will put you into a paralysis of analysis mode and you will end up gaining nothing.
Choose Something that Adds Value to You
âI know why youâre here, Neo. I know what youâve been doing⊠why you hardly sleep, why you live alone, and why night after night, you sit by your computer⊠Itâs the question that drives us, Neo. Itâs the question that brought you here. You know the question.â â The Matrix (1999)
As long as reinventing is your intention, and it does not stem from your lack of knowledge of other options, itâs perfectly fine to do so. â Having said that, I am pretty much sure I can live without programming another linked list in my lifetime.
So the question is not whether to reinvent.
âIs the opportunity cost of the time you spend reinventing worth your efforts?â
âIs there a more productive way to occupy your time?â
Answering this question â and other similar questions â is personal, and has never been easy, and it has to be made.
That answer will change you in an irreversible way.
âEvery child is an artist, the problem is staying an artist when you grow upâ â Pablo Picasso
My friends consider me as a hacker, and â as such â I have been different throughout my entire life.
Iâve been saying for the longest time, that reinventing isnât necessarily a waste:
At the very least, it helps you to gain more knowledge to choose the right tool for the job; and at a more existential perspective, it transforms you into a totally different being.
And very few believed me.
With this article I just wanted to reach out to those who felt the same way somewhere along their journeys.
Screw the naysayers, and do reinvent things.
Donât think you are a smart ass who does not need to learn from the existing wheels and wheel makers; as that approach would be selfish, and galactically stupid.
We are geeks for a reason:
We love to tinker; we love to solve problems.
And who cares if the problem has already been solved a bazillion times. â If you havenât solved it, then it is yours to solve.
The beauty is in the path you walk, not the destination.
Instead of seeing a problem and solving it; it is much better to see a solution and find what the problem with it is.
Assuming there is no true answer, and constantly asking questions is better than sticking to a presumed answer.
Some will think that you are not getting results; however, not getting results is different than resulting in nothing.
Those who are only looking forward, cannot see the leap you are actually making.