I feel stuck: How do I improve as a software developer?
Why common internet advice often misses this topic. An insightful discussion.
Almost a year ago, a coworker asked for advice on how to improve as a software developer. The question naturally arises when we feel comfortable with our programming skills and knowledge and seek to take the next step towards seniority.
The question looks simple, so what does Google say about that? A quick search reveals tons of suggestions like “Consume more software development content” “Engage with open-source projects” or “Watch recorded conference talks”, to name a few.
These suggestions lack context and don't offer a well-informed answer, especially for junior developers. In reality, every developer needs a personalized learning path.
In this article, we will learn what the most important points are that define excellent software developers. You will understand your strengths and weaknesses so that you can build your own most appropriate learning journey.
What makes a developer successful?
The job of a software developer consists of figuring out solutions to problems. The developer then writes instructions for computers to perform a series of tasks that, together, bring this solution to life.
So, a successful developer has strong problem-solving skills, a broad knowledge of software to implement quality solutions (also known as hard skills), and communicates efficiently with others to bridge the gap between a non-technical audience and the technical implementation of the solution (also known as soft skills).
Problem-solving skills help you identify an issue and find a successful solution. Developers must define issues, analyze them, use facts and data to design potential solutions, evaluate alternatives, select the most appropriate solution, plan an implementation, implement the solution, and measure the results.
A broad knowledge of software helps you turn the solution design into a specific program. It also provides you with valuable experience to design solutions. First, it involves being proficient in one or more programming languages. Second, it involves an understanding of many technical fields, depending on your area of development. Examples of such fields are database management, network administration, cybersecurity, web development, system architecture, cloud infrastructure, etc.
Efficient communication opens doors to collaborative working. It helps you convey your thoughts effectively to developers around you and learn from others. Developers have advanced technical conversations about implementations with coworkers, explain solutions to non-technical audiences, and teach software to less experienced developers. Among many other things, it’s also about you—how you manage your time and how you find comfort and happiness in doing what you love most.
These three topics are closely related to each other. Proficiency in hard skills gives you the experience to design successful solutions for more complex issues. Positive soft skills open doors to collaborative programming, leading to more robust solutions and implementations.
If you’ve reached this far, congratulations! We’ve achieved an outstanding milestone. The original question how do I improve as a software developer was broad and complex to answer. Now, we’ve narrowed it down to just do I need to improve my problem-solving skills, hard skills, or soft skills? And how do I do it?
Find your own path
Before we begin our journey, it's important to understand that all developers start with no knowledge of problem-solving skills, hard skills, or soft skills. Developers learn about these topics from various sources like training, courses and work experience. The good news is that you can learn them too, just like everyone else.
It's really hard to be proficient in all three areas. In fact, being a successful developer doesn't mean you have to excel in all of them. Being a successful developer is just about having the right skills to succeed in your tasks. For this reason, it doesn’t make sense to compare your skills to others. Instead, focus on what motivates you, work on the areas you feel need improvement, and find the right balance between the time you need to invest in your training and other aspects of your life.
Where do I start?
Take a moment to think about the main picture. Ask yourself about the areas where you feel you lack knowledge, training, or skills.
Do you find it difficult to understand the context of problems? Do you struggle to solve problems with only pen and paper?
Do you struggle to implement the solutions? Are you satisfied with the quality of your technical implementations?
Do you ask for help? Can you communicate your thoughts clearly, or do people find it difficult to understand your explanations?
Let’s explore how we can improve in these three areas. It's time to revisit those suggestions from Google.
Train your problem solving skills
Problem solving is about understanding the context of a problem and using all your knowledge to find the right solution. There are many ways to train your problem-solving skills; let's discuss a few of them.
University degrees offer excellent training for that purpose. Technological degrees (mathematics, computer science, and engineering in general) provide the knowledge to deeply understand difficult topics and the resilience to not give up at the first sign of trouble. Post-graduate training, master's degrees, and summer schools are also excellent ways to enhance your problem-solving skills.
Vocational training and developer bootcamps are also good starting points for a developer career. They are typically shorter, introductory, and focused on the subjects you truly enjoy.
An 8-hour-a-day job is also a valuable daily training session. Learning from senior developers and coworkers while programming for 8 hours each day is a highly valuable investment of your time.
Finally, learning hard skills and soft skills also contribute in problem solving strategies.
If you're just beginning your coding journey, there are exciting websites like CodinGame that offer many coding exercises and problems. The best part is that you can submit your solutions, and they will be evaluated and tested. Many university students use jutge.org for learning, but I'm not sure if it offers quality content for the general public.
A classic way to test your skills with short, fun exercises is Advent of Code. There are many past years available for practice, like 2023, 2022, and more!
Train your hard skills
If you are relatively new to programming, I strongly recommend enrolling in an attendance-based coding academy, course, or bootcamp. The curriculum of these courses is well-structured, providing you with a solid foundation in programming basics.
The programming language is your most valuable tool, and the more you understand it, the better you'll perform. If you already have some experience, focus on gaining a deep understanding of a programming language. Read the official tutorials from start to finish. For example, if you're interested in Python, read the Python tutorial. The same goes for Go, Rust (for advanced programmers), etc.
Learn classic algorithms. Understanding and implementing examples of recursion, sorting algorithms, brute-force or exact algorithms, divide and conquer, search and enumerations, and backtracking will expand your skill set significantly. Additionally, learning some complexity analysis will help you determine which implementations are more efficient and whether a problem can be solved by computers in a reasonable amount of time.
Learn design patterns. Design patterns are proven, efficient, organized, and easy-to-maintain solutions for many common problems. They truly make a big difference. A couple of great resources are refactoring.guru (free) and the book Game Programming Patterns by Robert Nystrom.
Understand the operating system you are using, whether it's Windows, Linux, or iOS, and learn the essential software every developer needs. Start using command line interpreters from the beginning and gradually master them. For example, Linux users often use bash. A great resource for learning is Bash Mastery: The Complete Guide to Bash Shell Scripting by Ziyad Yehia. Also, learn Vim (Vim Masterclass by Json Cannon), as many command line utilities and software with Terminal User Interface use the same keyboard commands as Vim. Additionally, learning Git (the official book is excellent) and Docker is essential.
Learn in-depth about at least one relational database (such as PostgreSQL, SQLite, MariaDB, MySQL, etc.) and at least one non-relational database (such as MongoDB). Databases are essential for developers and are another game changer in your career.
Discover websites with excellent tutorials and newsletters, even if they aren't focused on your main programming language. For example, for Python, PyMOTW-3 and Real Python are great resources for both junior and senior developers. Some great newsletters include Real Python, PyCoders Weekly, Python Weekly, Golang Weekly, Postgres Weekly, and This Week in Rust (for advanced programmers).
Learn frameworks. Frameworks are software created and maintained by developer communities that can be used immediately, so you don't have to start from scratch. Thanks to frameworks, nearly all companies and developers can deploy complex solutions quickly, skipping boilerplate.
Learn other programming languages. Everything you have learned so far can be applied to all programming languages. Additionally, each language offers unique methods that can expand your critical thinking.
Enroll in courses on topics outside your comfort zone. Try Game Development with Unity (I really enjoyed the Udemy courses Complete C# Unity Game Developer 2D and 3D), Desktop App Development with Visual C# or QT, Android App Development (using Android Studio and Java or Kotlin), iOS App Development (with Swift), and Frontend Development with HTML, CSS, and JavaScript (I really liked javascript.info), and many more.
Phew! That's a lot to cover, and we haven't even talked about Cloud Providers, Kubernetes, AI, and all the trendy, popular topics yet!
The point is that there are many things to learn and master besides the cloud. There's no need to hurry to learn about these topics just yet.
The Cloud, and especially Kubernetes, require additional knowledge in areas like Containerization, Systems Administration, and Networking. The Linux Foundation Training and Udemy provide quality, affordable courses to help you learn about these topics.
Personally, I learned Kubernetes through the Linux Foundation Training courses: Introduction to Kubernetes (LFS158) and Kubernetes Fundamentals (LFS258). After taking these courses, I felt confident enough to read the K8s documentation whenever necessary.
Train your soft skills
Watch and listen to conferences. Hearing top developers from around the world share their insights is truly inspiring. They cover everything from technical programming details and software delivery to its impact on the developer experience and the future of your career and programming languages. As a bonus, you also gain hard skills. Overall, it expands your perspective as a developer.
Check out the YouTube videos of PyCon (Python), GopherCon events, and RustConf if you're interested in these programming languages. Personally, I find Raymond Hettinger's talks and sessions to be pure pleasure.
Read the book The Manager's Path: A Guide for Tech Leaders Navigating Growth and Change by Camille Fournier, whether you want to be a manager or not. This book is essential for helping you understand important soft skills at work, such as what to expect from your coworkers and managers, and what managers look for in their team to enhance both well-being and productivity.
If you're feeling adventurous, also read "Who: Solve Your #1 Problem" by Geoff Smart and Randy Street. The book introduces a framework for hiring people and delves into which soft skills are important for a job position.
At the end of the day, soft skills should be evident in your programming style and code. Code should communicate clearly, and documentation should be tailored to the right audiences. We provided some examples in previous articles: What should I pay attention to when reviewing a Pull Request?, From Zero to Hero: Game-Changing Documentation Tips.
Conclusion
In conclusion, becoming a successful software developer is a journey that involves continuous learning and self-improvement. By focusing on learning problem-solving skills, hard skills, and soft skills, you can advance your software developer career toward seniority.
Bear in mind that success doesn't require mastery in all areas but rather having the right skills to excel in your specific tasks. Embrace the learning process, seek out resources that align with your interests, and maintain a balance between professional development and personal well-being.
With dedication and the right approach, all the efforts will eventually pay off.