The world is drownling in redundant code. Developers are reinventing the wheel every day. There are thousands new enticing problems that need solving.
Welcome to the Global Wheel Reinventors Convention.
We have all the different types of wheels you might need. Made in
Rubber, Iron, Concrete, Plastic, Origami
You name it! Think of any product and material possible. Yes, someone
has already made a wheel in it.
A feather wheel? We have it!
Dhildo Wheel? Sure, we’ve got it!
A wheel that does not work as a wheel? Yes, we have it too!
A wheel that simulates a wheel but doesn’t do anything fancy yes.
Even a car with wheels that forces you to buy a new car if a wheel
breaks down since we dont' support wheel 1.0 anymore at version 3.0.
There are already 1000-2000 programming languages.
There are tens of frameworks that all do the same thing in the top 100
language.
There are billions of lines of code that probably do the same things.
Why can’t they just work on the same project making it better instead of creating hunderds of frameworks and splitting it in millions of codes of lines?
One of the things Joe Armstrong, the inventor of Erlang, said was that
there is too much repetition in software.
I agree, there is much to much repetition. He even thought about a
system to find out the best function.
There is also another problem with programming time. Each project uses
around 50% of the time for administrative tasks like trying to figure
what a customer really wants.
And trying to explain what they should need. Note, wants vs needs is a
very complex topic in Project management.
Time is also spent finetuning certain system aspects Including but not
limited to trying to solve obscure problems, writing experimental code
to test some hypothises
Why not create a global repository for all functions that do something
so we can chose the best one out of them.
This way we won’t lose time in creating modules that where already
invented. Reusable libraries (that’s right, I said libraries NOT
frameworks) should be the norm.
Understand that reinventing the wheel is not the same as refactoring the code. They’re opposite things.
Please bear this in mind whenever you want to reinvent the wheel. Don’t
do it if there is something already out there.
Why try to reinvent the wheel based on something already existing?
The only valid reasons might be that the codebase of actual libraries
are hard to maintain and the code needs a total refactoring.
Or you might do the research and come to the conclusion that you need
something that is NOT provided so you start writing entirely new code
not based on anything out there.
This is Research and Development not copying!
If you can’t fight them, join them!
If you can’t join them, build something different!
The main problem with code repetition is the thousands of frameworks and
similar libraries built all the time.
The programmer might start with a novel idea of implementing something
different but usually ends up reinventing the wheel.
I know because I’ve been there done that.
Let’s take a look at the android marketplace, you can find the same
application 20 to 30 times. (iOS is the same)
The same thing, done again and again. I mean, other than for profit why
the heck would I reinvent it AGAIN?
What’s the idea? If a newbie or junior wants to learn how to develop
something, then sure, let him do it. But don’t add an API and
documentation and release it to the public unless you’re sure it solves
a real world problem.
Most programmers LOVE to reinvent the wheel. Others love to use Brand
new wheels reinvented specially for them.
Sometimes we like a project so much we think we can do it better and we
start reinventing the wheel.
I have also reinvented the wheel
Yes my dear Reader, I was on the path to finding out and developing the
"Perfect Wheel System".
I’ve used to reinvent many C libraries so I could learn how things
work.
First I developed a blog system with Yii 1.0 back in 2012.
Then between 2014 and 2016 I’ve reinvented the wheel and created a full
web framework!
It had a CMS/Blog system in it too. Now in 2018 I’ve again "reinvented"
the wheel by creating a simple CMS/Blog system in Phoenix/Elixir.
The main reason for the last rewrite was to be able to tap into the
immense powers of Elixir.
Now I try to NOT reinvent the wheel and I try to figure out new ways to
solve existing issues. I’ve been struck with the idea of rewriting
certain libraries that exist in Python for Machine Learning and Deep
Learning. But I soon realized that it’s better to use the existing code
in Python since it’s been specially written and to use Elixir/Erlang
Ports to communicate with my apps.
This means that I will benefit from bugfixing and added features instead
of doing it myself.
Creativity and mental power is drained by each "new" project, framework, library , programming language or "shiny software"
This is certainly a catch-22 issue.
Building software from scratch means that a programmer or company
certainly can show of their powerful engineering and innovation.
Although extending existing software may prove to be even more
challenging.
There are so many beautiful problems in this world that await to be
solved.
There are even things out there we don’t know are a problem and await
discovery and solutions!
Our creativity and mental power is limited only by our time.
Why reinvent something if it already works?
Reinventing something is NOT the same as refactoring code.
"But my project works better than x". "Y is so bad,I can do better!"
Well I’m sorry but most programming languages look and feel like C, they
don’t look novel to me (C++, C#, Java, JavaScript) even though they
diverged long ago from the original point.
I mean, take a look at all the frameworks that have been developed for
various programming languages.
They all "look" so different yet do the same thing. It takes a lot of
time to get through the intricaties of each one.
Reinventing the wheel ads TCO costs and programming debt that will never fade away. I recommend reading Joe Armstrong’s post about this. Alternative link here.
Each new libary, framework, project, programming language or package ads extreme overhead:
Overhead to the programmers trying to work
Compare programming jobs form 30 years ago to programming jobs
nowadays.
You now need to know 10 programming languages, 20 different
libraries/frameworks and know how to work with 100 different software
packages.
And to top it off. All of the above change constantly. Meaning that in 2
years your code will be deprecated.
I always loved Tcl since it keeps everything intact. Code from 8.4
(2002) can still work in version 8.6 (2012) and even today in 2018!
And let’s not talk about the massive changes that occured in 8.5 and 8.6 that changed the way things worked internally. Like the new bytecode engine.
Does your favourite language/framework/library have a functions 10 year
lifecycle support?
I still have to see another language other than C that has such a long
lifecycle and is backward compatible. Come on, Angular 1, 2, 3? HAHAHA
I know it’s a framework, but that’s not an excuse for bad design
patterns.
Overhead to the final user
The final user not only has to deal with slow software but with security
issues.
Not to mention updating the software every few days because some manager
thinks a new framework/library is the hype.
The end user can never even start to learn programming because of the
complexity of everything.
20-30 years ago a normal user might have learned a basic scripting language. But today he can’t find himself out of the documentation of a basic program.
Overhead to the whole world
New pc’s for new software, new software for new hardware.. It’s a catch 22 thing.
No updates for older mobile phones/tablets. I’ve already talked about the mobile and tablet vaporware landscape.
Waste, Waste Waste.
Are you creating waste by reinventing the wheel or building something
novel? The world is drowning in redundant code, be novel!
What can we do about it?
We can first make collaborate on existing projects by unifing the code
bases.
Making everything modular.
Elixir and Tcl do a great job at this.
There are thousands of real world problems that need solving and the
energy spent "rewriting" the same functinalities might be better spent
solving real world problems.
Complexity means distracted effort. Simplicity means focused effort. Edward de Bono
I will release a second blog post talking about programming language hypes, frameworks, libraries and mega abstractions to address some of the problems that wheren’t mentioned here.
Cover image is Creative Commons and can be found here.