This post aims to answer the question: How do we prioritize which software concepts to learn?
Deciding which goals to prioritize is a strategic decision. We often feel happier investing time into higher-priority goals than lower-priority goals because the outcome is more useful and fulfilling. Many libraries of self-help books and videos are dedicated to prioritization and here are my $0.02.
Prioritizing which software concepts to learn is similar to prioritizing any other subject to learn, such as prioritizing which cooking recipes or martial arts moves to learn, because they all require predicting the short-term and long-term benefits. (Using OOP, we can imagine that “prioritizing which software concepts to learn” is a subclass of “How to prioritize what to learn”).
Short-term/long-term benefits
Short-term benefits improve your life in the near future. Examples include brushing up on algorithms before attending an interview in a week and cramming for an exam (cough cough). You sow soon after you reap.
Long-term benefits improve your life over a longer period of time. Examples include studying in university and improving physical fitness. Frequently, these benefits are not immediately obvious and take more time to achieve. You sow long after you reap.
We can compare short-term benefits to tactics – the immediate response. How to increase market value this quarter? How to fork our opponent’s rook and queen? – and long-term benefits to strategy – the master plan and guideline. How to create more value for customers over the next decade? How to dominate the left side of the chess board? And sometimes, a benefit is both short-term and long-term, such as forking our opponent’s rook and queen in order to dominate the left side of the chess board.
A plan built entirely upon tactics (day-to-day activity) with no strategy (vision, long-term plan) is like a house of cards that can break at the slightest disturbance and lack stability. A plan built entirely on strategy with no tactics often lead to the same fate because it’s impossible to win a war by losing every battle. However, a plan that synergizes tactics with strategy often thrives and succeeds.
Most short-term benefits in software development are language/library/framework-dependent and most long-term benefits are architectural/paradigms/how to write good software. Before learning a concept, it’s helpful to first know if the learning outcome is short-term or long-term and whether they increase personal fulfillment.
If your daytime work requires programming with Node and you have yet to learn JavaScript, then a short-term benefit of learning JavaScript is you can get more work done. Let’s say that you decide to learn Lisp not because you’re interested in it but to show off to friends. In this case, the short-term benefit is wowing several friends for a couple minutes and possibly building a reputation as “the hacker guy”.
Let’s say you’re learning a new paradigm, eg, functional programming, but you program frequently with OOP. There might not be any short-term benefits but a long-term benefit is developing a greater understanding of software design, which may be helpful in the future.
Since sowing short-term and long-term benefits take time, it is in our best interest to invest time wisely. This is related to the concept of “opportunity cost”, which Investopedia defines as “the benefit that a person could have received, but gave up, to take another course of action.” Example: the opportunity cost for studying Windows Powershell for a month is not familiarizing with Linux for a month. Since we put in the same amount of time but can get out different results, it is in our best interest to put time into the activities that lead to the highest results, in terms of short-term and long-term benefits.