This is my first post in this new year and was thinking about a topic to write on. Lately I have been working on varied things that flexes 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 with person to person. But whatever your preferred way, get motivate 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. 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 absolutely must for future proof learning.
What every software developer, project leaders, architects, system support people 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 are 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, project gets done, even without knowing all these details. But the 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 providers you with vistas of opportunities to think outside the box and provide efficient solutions.
This is what differentiate 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 any thing 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 a-ha moment.
There are some pain in learning the basics. Its not easy. It may sound easy
theoretically, but when you try to apply it , you may face issues falling 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 skill?
- 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 still I 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 doesn't matter. You can spin your own tools using the language best suited for your environment.
Some of the projects I will be publishing as open source, once it reaches a feature stable point.
I wish all the very best to all the readers in their journey to learn new things!!