What I cannot create, I do not understand. — Richard’s last words on his blackboard at the time of his death.
Last Words of Richard Fenyman |
I have a great appreciation for that statement. It’s how I’ve always approached learning.
Richard Feynman always advocated reinventing the wheel.
Consider the learning mindset.
By using existing code, you will learn how to make quick use of the shoulders of giants, though it may not give you deep insight of the internal working(or probably theoretical understanding at most).
But by rewriting from scratch one is able to develop solutions to problems(though already solved in some framework) with deeper understanding of system/framework/tool.
Both are encouraged when learning, regardless of how the learning is done.
So what should be my goal ?
I believe we should learn something every day and improve our skills all the time (though not possible but do it at the expense of company dime :D).
When you need to learn something try and build with it right away, even if it doesn't result in a bug free software. It doesn’t matter.
When you are forced to build something with a technology/tool/programming language which you don’t fully understand, you tend to dig deeper and tend to quickly figure things out.
What does that have to do with technology?
Everything.
Reinvent is a powerful construct since it helps to expand horizons of your thinking. Though many refer it as Superhero Syndrome, or Not-Invented-Here Syndrome but actually it is not.
People say don’t reinvent the wheel because it’s a waste of time. Those people don’t understand wheels very well.
Building From Scratch
When you build from scratch you will learn incredible things that are hugely valuable. You will learn nitty-gritties of the system, popular java-script frameworks are best examples (jQuery, Angular, Rails, React and so on), else these would not have existed if people didn’t build from scratch.
All of those tools are reinventions of the wheel.
All Of Them.
Why is Re-Invention discouraged?
Firstly, it’s slow , time-consuming and rigorous effort is required. That’s not just development time, it’s all the hours previously put into developing, testing, and stabilizing existing technologies.
Secondly, If you’re doing so on your own time, for your own benefit, nobody cares. The problem is when you either want to “get a deeper understanding” on the company dime when there’s working code already available.
Companies won’t encourage this practice after all you are paid to get work done not paid to learn.
Create Your Own Tools
The people who created those tools are much more valuable to the world than the users of those tools.
Who speaks at conferences? Who gets paid the most? Who seems to be the smartest?
You don’t get to the top by just being someone who uses everyone else’s tools. At some point you have to be able to build tools yourself.
The best way to learn to do that is to practice. You get practice by building things from scratch.
There is tremendous value in this approach.
For instance, I have learnt Radix trees in my graduation degree course, even after working a decade as a software engineer, I never got the chance to implement one in real world scenario. Out of many possible approaches when I needed to build a Lookup service, I chose tree approach to get deeper understanding of trees (performance and latency were an important factor to consider tree approach as well).
More about it can be read below.
Please Note : The views in this blog are my own and represent my approach and learning ideology.