Mastering a Programming Language
As software engineers, a great portion of what we're doing is getting things to work. This problem-solving oftentimes involves working with a plethora of different technologies. Obviously, you can't know all of them by heart and in-depth. Finding the least sufficient amount of information to get the job done is oftentimes motivated not by laziness but by efficiency thinking. I might even say it is a sign of professional work.
When it comes to writing code in a specific programming language, knowing the least sufficient amount about it is not quite the deal. With the manifestation of AI in the daily workflow, this is more true than ever. Maybe you can relate to one of these situations:
You're writing code in a language and you know that you're not on your home turf. It feels like an unfamiliar territory to you, even after months or years of working in a particular language.
You know there might be better approaches, but the lack of knowledge of standard concepts, functions, and types makes it hard for you. It feels the standard library stuff is covered in a vague mist.
But what is actually bad about not knowing the programming language by heart and in-depth, apart from feeling not professional? There is an obvious answer: what you don't know, you won't use. An example: Knowing how to write in a programming language is comparable to the skill of moving the hands accordingly on a guitar (and playing it). In both scenarios, it's a means of expression of thoughts. Less knowledge means less expression, which means less pleasing results (maybe even bad ones). In the worst case, the bi-directional connection of thoughts and means of expression may even restrict your thinking process. This is definitely not what we want. So how to do better?
To properly understand a language, it's not only time and practice keeping you away from the goal of mastering a language – not at all. Even "learning-by-doing" as well as "learning-by-reading-your-AI-generated-code" isn't going to level you up effectively (it will of course in a way, no doubt, but not effectively). It's because quickly skimming language documentation and using their concepts only on necessary occasions is slow and leaves huge knowledge gaps. It's no fun either.
What's needed is a structured approach.
The Structured Path
I divided the path into two sections, which I think are logical units respectively: The Essentials and The Advanced. The former is covering all the foundations and basics while the latter focus on working with the language more creatively.
Almost naturally, the essentials for mastering a programming language are hierarchical, so following them linearly is the best way to go about it. In contrast, the advanced steps are not hierarchical. I also want to stress that it absolutely won't do you any harm to let your passion/curiosity/motivation take over and mix the essentials with the advanced steps to keep things fun. Eventually, this approach should help you, not limit you.
Oh, and consider switching off copilot while working through the basics :)
The Essentials
The Basics
Learn about the basics of the programming language, meaning variables, control flows, data types etc. Try to work through them in-depth. I feel it's uncommon, but even take notes to digest all the topics.
Practice using isolated and integrated examples. This means you can write code solely focusing on one of the basics or you combine them into a little example. It does not have to be practical, it should just use the concepts. I call these pure examples.
The Standard Library
Learn about the standard library, its structure etc. What modules are there? What are the most important elements of each module? I use ChatGPT for this step, as it generates nicer outlines and makes learning the standard library faster.
Try to always get your hands dirty by writing pure examples.
The Ecosystem
Learn about the most important dependencies/packages in the ecosystem of the language. Try to use some of them, again in pure examples, meaning just use one package at a time.
Besides, you can explore the ecosystem further by answering some of the following questions:Are there popular and well-supported IDEs, code editors, and debuggers available for the language? Are there extensions or plugins available for popular editors?
Is there a rich collection of libraries and frameworks available for common use cases? Are they actively maintained and well-documented? Are there popular frameworks that provide a structured way of building applications?
Is there an active and supportive community of developers using the language? Are there online forums, discussion boards, or social media groups where developers can seek help and share knowledge?
Are there tools and frameworks available for automated testing, unit testing, and debugging? Are there code profiling tools to analyze and optimize performance?
Does the language have good support for integrating with other technologies, databases, APIs, or systems?
Are there tools and services available for deploying applications built with the language? Is there support for containerization or cloud deployment? Are there hosting providers or cloud platforms that support the language?Build practical projects
Once you have a good understanding of the basics, the standard library and the ecosystem, it's time to apply your knowledge to practical projects. Try to integrate a good amount of the concepts and technologies you've learned about.
I always felt the urge at this step to come up with revolutionary, market-disrupting products. However, that's not the case. It's even better to build something that's already there, so you can compare and learn from it.
The Advanced
Contribute to open-source projects
Contributing to open-source projects is an excellent way to master a programming language. It allows you to collaborate with experienced developers, learn best practices, and gain exposure to real-world scenarios. Look for open-source projects related to your chosen programming language and start contributing. This will not only enhance your skills but also showcase your expertise to the community.
Engage with additional content
You can join online communities and forums. You can read blog posts, articles, and case studies. Interacting with additional content will expose you to different perspectives, best practices, and valuable insights.
What's really insightful as well is exploring the official documentation of the programming language to understand its nuances, advanced features, and recommended practices.
Continuous practice and experimentation
Mastery comes with consistent practice and experimentation. Keep coding regularly, even if it's just for a few minutes every day. Solve coding challenges, work on side projects, and experiment with different features and concepts of the programming language. Push yourself to explore new areas, try different approaches, and deepen your understanding.
Stay updated with the language ecosystem
Programming languages evolve over time, with new versions, features, and tools being released regularly. Follow official blogs, release notes, and social media accounts of the language to stay informed.
Bonus: Attend conferences, webinars, and workshops dedicated to the language to network with fellow developers and learn from industry experts.Teach others
One of the most effective ways to solidify your knowledge is by teaching others. Share your knowledge through blog posts, tutorials, or by mentoring aspiring programmers. Teaching forces you to articulate your understanding, identify knowledge gaps, and reinforce your learning. It also helps you gain a deeper perspective on the language as you encounter different questions and challenges from learners.
Subscribe to my newsletter
Read articles from Nico Teufel directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by