When I moved to Frankfurt, I started learning German. Learning a new language has always been a journey to me that starts on the hardest level and it gets easier over time. German is not different. Even though 8 months weren’t sufficient yet to get comfortable with, I must say I am less lost than in the beginning. What does that have to do with development? Well, programming languages offer me a similar ride.
Both kinds are structured communication systems that can be used to give orders or instructions. They are based on a grammar that defines what is syntactically correct and they may evolve over time. Slangs and expressions are added to spoken languages like libraries and frameworks to programming ones. And there is always more than one way of expressing something. I started to think about this parallel since I decided also to take on the challenge of learning Kotlin — a completely new programming language for me.
I believe acquiring new skills helps my brain to develop, create new connections and keep it on shape. Like any sports or exercise I do for my body. Ensuring some time for those activities are primordial, and I make sure to include them on my time management process. Since the struggle is quite present those days, and I am still not fluent on both ones, why not record my experiments here. Trying to approach the subject on a structured way. Kind of flattening the curve while setting coherent expectations.
Learning is NOT a linear problem
My lemma on the matter is: Learning is NOT a linear problem. Don’t treat it as if it were. Although we do have milestones on both domains (e.g. talking about things in the past or unit testing your code), they don’t follow any particular order. It’s pure chaos. It’s like diving into a pool of different data that have no sense to you at first. It’s a constant switch between “I think I am understanding what’s going on” to “what the heck?”.
Since it does not follow a linear trend, tackling it from different perspectives is a must. Identify all possible data sources, orthodox or not, and build your own inventory on it. This is very useful when trying to get your head around on concept or another. Seeing it from different perspectives never let me down. Below you can see my inventories so far, with the intersection between both. Yet another parallel between the two worlds — programming and linguistics.
I always find easier to assimilate whenever new concepts can relate to previous ones. Such relationship could be between completely different areas. I will never forget, for example, that “to stumble”, in French, is “trébucher”, because of the Microsoft Word Font — Trebuchet MS — even they are completely different things.
Of course, we can also have closer relationships of the same concept. The mental effort of making the link seems to be less important even. I was gladly surprised to see that Room — the Kotlin abstraction layer for SQL — shares concepts already familiar to me from other experiences, like entity models from Entity Framework and the migrations from Ruby on Rails.
All that to say that this kind of technique gives you new starting points and unblocks you from dead ends. Don’t know where to start? Well, search for concepts from other languages that you would expect to see in the new one. For spoken languages, how do you introduce yourself or order a pizza? For programming languages, how do you iterate over a list or split your code into files? All those are examples that you relate from other known languages. Now, let’s say you get stuck, you can’t make your head around a concept or a specific word. Think on the few first things it comes to your mind, perhaps create a storyline around them. This is usually enough to unblock me.
Bonus: Specially for spoken languages, if you don’t know Anki yet, you should definitely check it out.
Another approach that I have been using a lot is to base my learning plan on questions and open points. As said before, we are not talking about a linear process and it often does not follow a sequence. We could very well move on without really having a good grip on a concept and return later, when you have other parts of the puzzle. Keeping, though, a list of those skipped items.
It may sound super stupid or simple, but tackling a problem from a structured way does not mean that you need a complex solution. Very often is doing, in a mindful way, what you unconsciously do. I don’t stop reading a text just because I don’t know the meaning of a single word. I would note it down (or highlight on the text) to search for it later. The same way, I would mark with a TODO a piece of code I am not very sure it’s well written.
When answering a question, you apply the knowledge you have acquired. Not only your own questions, but also from others that, like me, embarked on this quest. Of course, any developer would immediately think about StackOverflow for programming but, do you know you have the same for languages? There is, for example, the German Language StackExchange. What I like on this approach is that you can even turn into a game by earning reputation points. Last month I challenged myself to reach the 1k reputation for Typescript under 30 days and I learned quite a bit during the process.
I strongly believe that there are no right or wrong way of learning. This varies from person to person, concept to concept. But when you find your own way and start to follow it, with the right mindset, you most probably won’t stop anymore. Just start it!