How I Learn New Technologies
If a developer has plenty of time, then the best way to learn a technology is to read a book about it, solve the tasks the book presents, and then to do some very basic work just to get some real-world experience. When this is done, one might want to watch some tutorial videos, consult with people who are either also learning, or, even better, are experienced in the given technology.
When someone gets comfortable with a dev stack, the person might be inclined to prefer to work only in his or her comfort zone. In consulting, this is feasible in the majority of cases. But what if someone gets a new project in a different software stack? Is it a big problem? In my opinion, it’s not a problem, if we are able to determine the minimal knowledge we need to get started. So how can a developer quickly grasp the essence of the problem space? Where are answers to the most frequent questions reachable?
In 2008 I graduated from the university and was looking for a job. In the middle of the world economic crisis new programmers had limited chances at getting a job. So I began accepting very small projects from varied clients, all using vastly different technologies. To be successful at this, I realized I had to revise my method of learning technologies.
My methodology is to put the appropriate questions needed to be answered into a list. By looking at the answer of each question, I can acquire the core knowledge which allows me to work with the given technology. Of course, working with a technology one has no previous experience with takes more time in comparison with working with a technology one has years of experience with, because even the most trivial tasks might need some research, but if the core knowledge is already acquired, then 90% of the answers to the question one may have while working are easily answered.
New Programming Language
- What justifies the existence of the language? What is the purpose the language aims to fulfill?
- Where can I find the original documentation and how do I search and navigate there?
- Is the syntax similar to a language I already know? How are commands separated, what are the keywords one will frequently use?
- What type of things will I work with using the language? With CSS I define rules which specify the looks of a web page. With query languages I work with databases, relations/tables, records, and columns. With HTML or XML I define a node hierarchy. With C I write functions. With Java I define classes and objects.
- What types of tasks can I expect from the projects I can work with?
- Can I watch a tutorial video? Watching an introductory video takes hours. Reading a book can take weeks.
- What operating system should I use?
- What IDE should I use?
- Is there an online possibility to write experimental code to try my hand in this new language?
- Do I need to register in community forums?
- Do I have questions I can’t answer yet? I should be able to find an answer on community forums or general purpose programming Q&A sites.
- Have I written a simple Hello World in the language?
- What will I have to watch out for?
- What are the best practices for coding in the given language?
New Operating System
- Do I have two systems I can use, one where I can search the internet for help, and the other where I can begin experimenting on the new operating system?
- How to operate with files and folders?
- How to install/run an application?
- What is the minimal knowledge I need in order to be able to work on my programming tasks?
New Libraries and Tools
- Why do I need this?
- What are the features and use-cases I will be using?
- What are the names of functions/methods I will be working with frequently?
- What do I need to do to use this?
- Is it documented?
- Does it have a forum?
- What is the aim of the project?
- Are there technologies in use that I do have experience with?
- What are the technologies in use which I do not have experience with? Is it urgent to learn them?
- What are the main features of the project?
- What will I have to interact with first in the project?
- Can I play around with the project and do some experiments without being in danger of doing any harm to it?
- Is it documented?
- How am I going to work with it, what do I need to download/install, and what networks am I going to access?
- How is the personality of the client affecting the working relationship? Am I going to have an easy time or not in my first days?
- Where are the vital points of the project and can I take a look at the code there to have a vague understanding of what is being done?
- What is the definition of the concept?
- Is it related to something I already know?
- Does it have subconcepts?
- Do I need to understand something complex? If so, can I find/draw some illustrative diagrams?
- Can I make a fairly accurate allegory, using elements I am aware of?
In general, if something is not understandable at all for me, or has so many elements that it will be difficult to remember them all, I construct an allegory, using concepts I am already aware of. This way, if I forget anything from my newly acquired knowledge, then I think about my allegory, which serves as a mental decryption method.
For instance, when I learned about object oriented concepts, I used the allegory of set theory to understand the concepts.
I viewed classes as active sets, that is, sets which might have executable methods.
I viewed objects as items in a set, which, on their own have their capability to perform actions.
I viewed inheritance as a subset relation.
To make the allegory more or less full, I had trouble integrating abstract classes and interfaces into the allegory, but after thinking about them, I came up with a solution. I considered abstract classes as partial definitions of a set and interfaces as declarations of the sets. Since neither had a complete definition, I needed a nonabstract subset to find items to these sets.
Method overloading was easily understood for me as doing something using different domains. a * b is different if both a and b are real numbers and different if they are complex, basically we do the same operations, but with different variables. I added method overriding into my allegory as an evolution of methods, or as a specialization.
The allegory is not necessarily 100% analogous with the concepts to be grasped, but if its accuracy is fairly high, then it’s a good starting point. In many cases this is enough by itself, but when it’s not enough, the allegory helped me to formulate intelligent questions, which I could transform to keywords which are searchable by a search engine.
I am sure I am not the only human being with bad sectors in his/her brain. Have you ever had the experience of totally understanding something and then repeatedly forgetting an important detail, but only that detail? Luckily, we are not in a classroom where we need to reproduce accurately all the verses of a long poem. We can write notes. If I observe that I regularly forget something important, then I make notes.
The methods I described in this article work well for me. We are all different and what works for me does not necessarily work for you and vice versa. However, I think that this approach can be personalized. If you feel that you need to do things differently in comparison to what I described here, then you are probably right, as you have a different brain and it probably does not work in the exact same way as mine.
For me, when I learn, frequent short breaks are helpful, as my subconscious is working out without any effort some details which are more difficult for my conscious thinking. After I read an article, if I take a walk and breath fresh air, I tend to have deeper knowledge when I return than when I started to walk.
It is possible that you need to learn in a totally different way. My words here are not carved into stone. My advice, in general is to not be afraid of new challenges and technologies. It is awesome if you add learning into your comfort zone!