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.