How to Become a Great Software Developer
This is a question that I get asked a lot by students or by people just starting out in their software development career. However, let’s first get some things straight.
1. “Great” is a relative term. Being a “great” software developer could mean many different things to many different people. I will define “great” as someone that can competently be the lead software engineer on a team, someone comfortable handling any aspect of any part of the development life-cycle, and is the go-to person if something goes wrong or something crazy happens.
2. This is a guideline to point you in the right direction when you are deciding how to advance your career. However, there are many paths to success, and you, of course, do not have to follow this guideline to be great.
Okay with that out of the way, let’s get into the meat of it!
To start off, there is no magic formula for success. However, what I am going to lay out is the path that I have taken and the path that my mentors and other developers that I respect have been through, to become, what I consider, great developers. My intention of this article is to help other developers who feel the same way as I did when I was starting out and weren’t sure how to get to the next level.
I remember when I graduated college and got into the workforce, there was always something some other developer would talk about that I would not be familiar with. This always annoyed me. I just graduated! I thought that I was supposed to be prepared and have the tools I needed to succeed “in the real world”. I started to think that maybe I just didn’t get a good education.
I soon came to the realization that many developers feel this way. Well, I’ll be the first to tell you that it is likely not your lack of education that is the problem. Actually, there is no problem at all! You know what you should know (hopefully) and aren’t expected to know everything out of school (no matter how great that school might be). A lot of the knowledge that the great software developers possess only came to them through years of experience (one of the reasons experience is often a requirement to have before moving to a senior position in any career).
That being said…
There are still many effective ways to speed up the process and paths to take that many great developers have used to accelerate their growth to be in the position they are now. Below is step by step process I consider to have been the most beneficial for me.
Please remember that this is a just a guideline that is meant to help point you in the right direction on your journey to greatness!
Step 1: Pick one language, learn the basics
Before we can run, we have to learn to walk.
Too many beginning programmers try and jump into everything all at once and don’t have the patience to learn a single programming language before moving forward.
Don’t be one of those people.
Pick a single programming language that you are interested in and could see yourself programming in for the next few years. You want to pick something that will have some lasting value. If getting a job is important to you, you might want to pick a language that is currently popular and is most likely going to stay popular for at least the time you will be learning and using it.
Once you’ve picked the programming language you are going to try and learn, try and find some books or tutorials that isolate that programming language. What I mean by this is that you don’t want to find learning materials that will teach you too much all at once. You want to find beginner materials that focus on just the language, not a full technology stack.
Step 2: Build something small
Now that you have a basic understanding of a single programming language, it’s time to put that knowledge to work and find out where your gaps are. The best way to do this is to try and build something.
Don’t get too ambitious at this point–but also don’t be too timid. Pick an idea for an application that is simple enough that you can do it with some effort, but nothing that will take months to complete. Try to confine it to just the programming language as much as possible. Don’t try to do something full stack (meaning, using all the technologies from user interfaces all the way to databases)–although you’ll probably need to utilize some existing framework or APIs.
For your first real project, you might want to consider copying something simple that already exists. Look for a simple application, like a To-Do list app and straight out try to copy it. Don’t let your design skills stand in the way of learning to code.
Be prepared to run into things that “just won’t work”. Don’t let that frustrate you. Learning to become a good problem solver is requires learning how to work through difficult problems and never let failure slow you down. You haven’t failed. You have just found one way that wouldn’t work for this problem. Look for another solution. There are multiple ways to handle a problem, and your way might be an answer to a different question.
As always, remember that Google is your friend 🙂
Step 3: Learn a framework
Now it’s time to focus on learning a framework. You’re familiar with your programming language, and you’ve built a small application so know you to understand how you can build bigger and better applications and develop them faster.
Frameworks can help you in both of these areas. A framework is a set of code libraries that have been written for you by other developers (typically people involved in creating the language but not always). These libraries implement the functionality to perform many usually trivial or common tasks that programmers deal with. They also typically implement a bunch of common data structures so that you don’t have to do this yourself.
Surprisingly, I’ve seen this step skipped or overlooked by many developers, and it has only come back to bite them. Frameworks are there to help you do your job better. You may know how to implement a Hash Table or Linked List data structure in your language, but many times this is just a waste of time and effort. There is an excellent chance it has already been implemented for you in by the framework that is used with your programming language.
Take time and learn the framework inside and out. It will allow you to develop much faster and not to repeat logic that is already there for you. The library functions are also usually tested thoughtfully by their provided, so you can feel confident in using the “prepackaged” code.
Step 4: Learn a database technology
Most software developers will need to know some database technology as most series applications have a back-end database. So, make sure you do not neglect to invest in this area.
It used to be that if you just learned SQL (Structured Query Language) you were on you way in this area but nowadays, there are MANY different types of database technologies and querying languages floating around and being used.
These are all things you want to dive into so that you can understand how to “get at” and how to analyze your persistent data!
Step 5: Get a job supporting an existing system
Okay, now you have enough skills and knowledge to get a basic job as a software developer. If you could show me that you understand the basics of a programming language, can work with a framework, understand databases and have built your own application, I would certainly want to hire you–as would many employers.
Now, of course, this job might not be your dream job and heck it might even be a bit boring. It’s not nearly as exciting as creating something new, but the purpose of this job is not to have fun or to make money, it is to learn and gain experience.
Working on an existing application, with a team of developers, will help you to expand your skills and see how large software systems are structured. You might be fixing bugs and adding small features, but you’ll be learning and putting your skills into action.
Pour your heart into this job. Learn everything you can. Do the best work possible. Don’t think about money, raises and playing political games–all that comes later–for now, just focus on getting as much meaningful productive work done as possible and expanding your skills.
Step 6: Learn structural best practices
You’re getting there! You know a lot and now even have some experience under your belt. Congrats! Now, what you want to concern yourself with is how to write good, clean, maintainable, testable, readable, and loveable (okay, I just threw that last one in there) code.
Beef up your library with the following books:
Working Effectively With Legacy Code
Programming Pearls – (do the exercises)
Language specific structural books like:
Don’t worry too much about design and design patterns just yet. At this point, you want to focus your learning on the structural process of writing good code and working with existing systems. You should strive to be able to efficiently implement an algorithm in your programming language of choice and to do it in a way that is easy to read and understand.
Step 7: Learn a second language
Now you are rolling along. At this point, you will likely grow the most by learning a second programming language well. You will no doubt, at this point, have been exposed to more than one programming language, but now you will want to focus on a new language–ideally one that is significantly different than the one you know.
When you know only one programming language very well, it is difficult to understand what concepts in software development are unique to your programming language and which ones transcend a particular language or technology.
When you pick up a new technology and learn it inside and out, you begin to see problems in a different way. It allows you to have different perspectives about certain programming problems that you may not have even considered before in your first language. This has no doubt been one of the most helpful learning hacks for me to quickly accelerate my developing abilities. Don’t skip this step!
As the saying goes “When all you have is a hammer, everything looks like a nail”. This is precisely the situation you can find yourself in if you never venture outside and learn another language as in depth as your first one.
Step 8: Build something substantial
This is where the fun is. It’s time for you to wield your developer wizardry power that you have and create something big. Something new. Something that is going to push yourself to what you thought you could do.
Pick a project that will use the full stack of your skills. Make sure you incorporate database, framework and everything else you need to build a complete application. This project should be something that will take you more than a week and require some serious thinking. Try to make it something you can charge money for so that you take it seriously and have some incentive to keep working on it.
Pick a project you would be proud to show you friends and family that you made, top to bottom, from scratch. This will give you the confidence you need to know that you can hang in there with the best developers and get the job done as well as be a great portfolio for you to show a future employer in a job interview.
Step 9: Get a job creating a new system
Okay, now it’s time to go job hunting again. By this point, you should have pretty much maxed out the benefit you can get from your current job–especially if it still involves only doing maintenance.
It’s time to look for a job that will challenge you. Ideally, you want to find a job where you’ll get the opportunity to work on a team building something new.
You might not be the architect of the application, but being involved in the creation of an application will help you expand your skills and challenge you in different ways than just maintaining an existing code base.
Step 10: Learn design best practices
Now it’s time to go from junior developer to senior developer. Junior developers maintain systems, senior developers build and design them. (This is a generalization, obviously. Some senior developers maintain systems.)
You should be ready to build systems by now, but now you need to learn how to design them.
You should focus your studies on design best practices and some advanced topics like:
- Design patterns
- Inversion of Control (IOC)
- Test Driven Development (TDD)
- Behavior Driven Development (BDD)
- Software development methodologies like: Agile, SCRUM, etc
- Message buses and integration patterns
This list could go on for quite some time–you’ll never be done learning and improving your skills in these areas. Just make sure you start with the most important things first–which will be highly dependent on what interests you and where you would like to take your career.
Your goal here is to be able not just to build a system that someone else has designed, but to form your own opinions about how software should be designed and what kinds of architectures make sense for what types of problems.
Done! Your life is complete!
Just kidding. You are never really done learning, and that’s what’s fun about being a developer–there is always more stuff to learn and always new ideas and technology being created.
There are a few things that you should be doing along the way as you are following this 10 step process. It would be difficult to list them in every step, so I’ll list them all briefly here:
Teach – The whole time you are learning things, you should be teaching them as well. It doesn’t matter if you are a beginner or expert, you have something valuable to teach, and besides, teaching is one of the best ways to learn. Document your process and journey, help others along the way.
Read – Never stop learning. Never stop reading. Always be working your way through a book. Always be improving yourself. Your learning journey is never done. You can’t ever know it all. If you continually learn during your career, you’ll consistently surpass your peers.
Do – Every stop along the way, don’t just learn but do. Put everything you are learning into action. Set aside time to practice your skills and to write code and build things. You can read all the books on golfing that you want, but you’ll never be Tiger Woods if you don’t swing a golf club.
By Jason Roell: Software Engineer Consultant