Resources to level up as a developer

19 November 2019
Tags: learning

This post is related to the one I wrote here On selecting relevant learning content, but is going to advise some reources which have been useful to me. Like I said in the other post, a problem I see this day is that many developers favor articles or tutorials over resources with more substance as they provide a quick and handy explanation which can be immediately applied. Books are most often not read. The post [1] from famous development blog Coding Horror reveals that one book is more than most programmers read each year. Even though the post is more than years old now and the reference even older, I believe it is still relevant to this day, if not even worse. The pace at which new technology (language, framework, whatever) is churned out is faster nowadays and countless of resources promising the shortest path to learn something are available online (more on this in my post However, I believe that reading books is fundamental. The reason for this, is that books can teach you concepts; they may not give you the information to get you up and running with a working solution for the scenario at hand, but give you the mental foundations for tackling problems.

Books are not the only relevant resources out there though, some excellent online courses have been created. I particularly like Coursera and edX since most of their courses are backed by Universities. Having graduated from University myself I recognize the added value which learning theory and concepts provide you. And being the instructors usually professors themselves, they are professionals in teaching and crafting valuable learning material.

Here follow some of my recommendations on two main areas, namely software engineering and programming languages.

Software Engineering

I find that books are fundamental for learning the best practices of software engineering, which is more a practice than a science. Some books are considered essential readings for the practicioner software developer as they distill in some pages the lessons and teachings learned through countless struggles and trials. Some are also quite encyclopedic in scope as they report some conclusions from studies and surveys conducted by researchers of the field. Authoritative sources of knowledge can be easily found with a query in the Internet. Some of these books include for example [2] [3] [4] [5]. Note that these books are heavily skewed towards object-oriented programming, which was the de-facto industry standard at the time of their writing, as it is still today. One thing I can advise is to consult these books as they provide valuable lessons, but to always weigh them on the basis of your personal judgements. After all, they consist of opinions, not holy truths. I think in particular with [6] there may be many points which provide room for disagreement with the author as (grumpy) Uncle Bob is at times very inflexible.

Like I said, the aforementioned books focus on the object-oriented paradigm and the imperative approach. If you limit to these books only, you would only get a partial picture. I think it is fundamental that developers get acquainted with different paradigms and approaches as they provide different perspectives to solve problems. The resource I advise so warmly that I have dedicated a series of posts on it (SICP Series Intro) is Structure and Interpretation of Computer Programs [7]. Additional excellent material is also available here [8]. I am not going to spend much time on it here because I have been talking more profusely in other articles, but I just think it is probably the most essential reading for a software developer to really understand and appreciate the craft. It also exposes the reader to the functional paradigm.

Programming Languages

On the topic of programming languages, I have found two online MOOCs to be particularly useful. The online series Programming Lanauges from Prof. Dan Grossman available on Coursera here [9] [10] [11] do an amazing job in exposing the fundamental concepts of programming languages. The courses cover both the functional and object-oriented paradigms and also deal with the distinction between statically-typed languages and dynamically-typed languages. What I find valuable the most is the comparison the instructor makes among languages implementing different approaches and type rules, as there is no better language or better approach, while each has it s own strengths and weaknesses, similarities and differencies. Another online course I found useful is the Functional Programming course on edX [12]. This course exposes you to the main concepts of the functional paradigm by focusing on a purely functional language, Haskell. This is a great choice as with other non pure functional language you would have to deal also with the non-functional or imperative parts. What makes this course valuable is the academic approach the stuff have chosen to adopt (the main instructor is a big shot in the field of programming languages research), which help providing a more solid theoretical foundation, which is highly beneficial for functional programming. The course is also enriched by a good number of theoretical exercises which makes you use your head instead of just typing on the keyboard.

Take-home

Overall, I think that it is fundamental to get familiar with the fundamental underlying concepts in programming languages, since it provides the theoretical framework to the devloper to quickly switch from one language to the other and understanding the similarities and differences. Coupled with a SOLID (pun intended) understanding of the best practices and heuristics in software engineering will certainly make you a better developer. This is my belief.