
With the rapid proliferation of new technologies a common question I find myself asking is what to learn. Its not just that there are thousands of programming languages and even more thousands of libraries, extensions and frameworks but also that very often these tools and frameworks are used in different combinations with each other. Today at work for example I found myself troubleshooting a docker file for a python application before moving to address a different issue in our node Azure functions. Only a day earlier I was researching a separate issue regarding a separate Node instance that was hosted on docker. In these case there multiple technologies (Node, docker, azure functions and python) but used in different combinations. After hours of troubleshooting I asked myself would it have been better if I had known one of these technologies in greater depth or would it have been better to have a known them all slightly better. In short what is better to learn wide or to learn deep. The answer I came to is that the business needs both and so a balance of both is needed to be successful as a software engineer.
The temptation to focus solely on diving deep into one language or framework is understandable. It is normal for a new programmer for example to dive deep into a single programming language in order to learn computer science concepts and to gain hours of practice. The technologies themselves often lend themselves to this kind of approach. Learning Python, for example, becomes more interesting the further you go as you as you get to make your code more efficient (pythonic) and you become able to do more advance tasks such as web scrapping or creating a machine learning implementation. Finally I have learned that I often think of my professional self in terms of the technologies I know best – I am a Python programming or a .Net coder and therefore tend to devote more energy to learning those technologies at the expense of others. The problem though is that the biggest problems that software can solve require more than any of these tools can provide.
The need to use multiple tools and frameworks steams from the reality that the world is complex. For as much fun as it is to build console applications in Python or C# the technical problems worth solving almost always require more than a that. Web sites for example require network connections, to save user information requires a datastore, to have save secure passwords usually requires a specialized library, to scrub a document requires another package. All these capabilities requires that learning outside of the vanilla version of a language or framework. Even libraries, which are often just prewritten code, often will have their own documentation associated with them. To be an effective programmer is to be able to use a wide range of technologies to solve a real world problem. Therefore both depth and breath of knowledge are important.
The temptation to learn only a limited set of tool in depth needs to be balanced against the reality that complex problems often require many different tools to solve. Likewise the temptation to only learn new tools needs to be balanced by the reality that many advanced features are available to those who have invested significantly in learning that particular technology. So ultimately both breath and depth are important and need to be held in a health balance against each other.