This is my first post in this new year and I was thinking about a topic to write on. Lately, I have been working on various things that flex the brain muscles and things which I haven't done before. So a lot of learning and some unlearning this new year. One of the big issues which most people face is learning to learn!
So, today, I will share my experience of how I go about learning a technology, a skill or anything I want. The first and foremost thing is the motivation. This thing is very personal and varies from person to person. But whatever your preferred way, get motivated to learn something new.
As for me, "Necessity is the mother of motivation". If I need something badly, I need to be motivated to do things to achieve the end goals. And the way I may find motivation may differ from the way you find it. So, don't bother, find your motivation and stick to it. Make it a habit. It will be a bit painful, but will pay in the long term. (How long, that needs to be fixed by you, as you are the master of your own destiny :)).
Since most of the target audience will be developers, both fresh and experienced, I will outline my take on the subjects which are an absolute must for future proof learning.
Here's a list of what every software developer, project leader, architect, system support person should know.
- Understanding basic operating system, memory management, I/O, etc.
- Through understanding of Disk IO
- TCP/IP, HTTP protocol and how it works
- Good understanding of database
- How programming language works? Build your own toy language in your favorite language if possible. This may not be production quality, but will involve a lot of learning points.
- Thorough understanding of object oriented programming, functional programming
- Client side scripting foundation
- Data structures
- Design patterns
- Foundational math (not advanced math)
- Basic physics (most useful for game programmers and interaction designers)
- Economics (will be useful if you need to startup your own venture and understand the demand/supply in the market)
The above list is always taken for granted. The above items are always ignored by almost 95% of computer science graduates and almost always never revisited by about 99% of developers.
Why? Because things work, projects get done, even without knowing all these details. But the problem lies in the solutions you provide without knowing these foundational skills.
These foundational skills are the differentiating factor between you and the next programmer in your cubicle. These skills provides you with vistas of opportunities to think outside the box and provide efficient solutions.
This is what differentiates between a true programmer and a copy-paste scripter. So, spend some time learning this. Get your hands dirty. Set up your own server, your own webserver, your own proxy server, etc. You will learn a lot and will build up a solid foundation to tackle anything that comes your way. It could be WCF, it could be AJAX, it could be a NOSQL, jQuery, etc..
You will have enough knowledge to know how things work under the hood. Once you have this knowledge, you can contribute back to the community. Build something that doesn't work in your favorite library. Blog it. Sharing is caring and also enriching.
Many of you may think, what is the use of this. In day to day programming, you are never required to know this. This is what I think is ignorant thinking. Unless you don't know how things work under the hood, how can you improve it? How can you extend it? Think about it for a moment. Once you realize this, it will be kind of an a-ha moment.
There is some effort involved in learning the basics. It's not easy. It may sound easy theoretically, but when you try to apply it, you may face issues arising from all corners of the world. That's when you learn the most. So, don't give up and stick to your learning schedule.
What can you do once you have these basic foundational skills?
- You can build your own DSL for your area of application.
- You can build your own client side library extending the one you love.
- Your knowledge of WCF will extend the mere configuration and binding. You may able to diagnose the issue from the root.
- You can build a truly RIA once you know how things work under the hood, and then work with your favorite library.
I was trying this approach for the past 4 months in my free time and am very happy with the end result though I still have a long way to go to master all the things required.
For example, in the past couple of months, I have built up the following things:
- A custom lightweight MVC framework for PHP
- A mini Activerecord pattern for PHP
- A jQuery grid widget
- A custom parser for configuration file
- A two way model binding in JS (similar to knockoutjs) and much more...
- A small library to inject code in to assemblies using Cecil....
One thing to observe here is, most of the above things are developed in my secondary skill set, i.e., PHP, jquery, etc. and not my primary skills, i.e., C#, ASP.NET MVC, etc.
I think you got the point. Once you are on your way to master the basics, then languages, frameworks don't matter. You can spin your own tools using the language best suited for your environment.
I will be publishing some of the projects as open source, once they reach a feature stable point.
I wish all the very best to all the readers in their journey to learn new things!!