The headline might sound pretentious, but what is the most important skill for a developer besides actually writing code? Communication.
What do you typically do when you communicate as a developer with someone else?
You explain problems, you describe solutions, you talk to non-programmers about what you’re doing. You could also say that you’re teaching others about what you’re doing. Heck, when you’re writing code, you need to comment it and that is also a form of teaching – teaching someone what your thought process was when writing this code.
Being a good communicator is often completely overlooked. Sure, you might see a job placement ad wants someone who has “good communication skills”, but what does that even mean?
Let’s take a step back and think about why it’s really important for a developer to be a good communicator, and then we can come back to how you can become a better developer by teaching – but don’t worry, this process will only require a small amount of effort, although if you enjoy it, you can absolutely spend more time on it too, and reap bigger rewards!
First, let’s figure out what it means to communicate well with other developers. Of course, this includes things such as discussing problems and solutions, explaining your reasoning behind the choices you made when building out some systems, and things like that.
But what is the core skill that you need to be able to do all of the above things? The ability to truly understand all the moving parts in your code – to be able to have a mental image of how it’s structured and how all the pieces fit together to form the whole of the application.
Without this understanding, you can’t explain it to someone else. Sure, you could show them your code, but that’s not really explaining it – you’re just letting them figure it out on their own, maybe pointing at a few functions to push them in the direction you want.
This is why understanding the code and being able to communicate well go hand in hand. Beginning developers will often think about algorithms in a much lower level… “I need a for loop here, and if clause there”… but experienced developers think on a higher level “When a condition is true I need to iterate through these”. Notice how there is no mention of the actual programming language level constructs. When you gain this sort of understanding, you immediately become better at communicating how the systems you’re creating work.
The good thing is that when talking to other developers, you can show them the code even if you’re having difficulties explaining all the things. However, what if you have to explain it to someone less technical? If you’re working in a team, you could probably let someone else deal with it, but if we actually want to become better developers, then this is something we would need to try to do.
People who aren’t developers will not understand all the technical details. You need to be able to take the nitty gritty details of your code and move it into a more abstract level of thinking. Perhaps you can use analogies with something the other person is familiar with to explain things, but again in order to be able to do this well, we need to have deep understanding of the code first.
You might think how does this relate to me? I just like to write code and do cool stuff. I sometimes felt like that as well, but wouldn’t it be really nice to be able to write code and do cool stuff AND get paid for it? The stereotypical case that you might be thinking of here is of course some big corporation because everyone knows they’re full of people who don’t understand anything and blah blah. That is the wrong assumption however.
Some people enjoy big corporates, but for many of us, the dream is to work at a cool startup, or maybe at Google. What is the common thing about these sorts of dream jobs? They get a lot of applicants for all their openings. There are many good coders who get interviewed, but which ones are the ones who stand out? The ones who can also communicate well. A job interview is one of the situations where you generally need to listen, ask good questions, and explain your decision process and choices well.
This exposes another facet of communication: Listening. It may sound really obvious, but listening can actually be difficult. For example, if you explain a program’s flow to some very experienced developer, they can probably picture it in their heads at least partially, even if you don’t explain it perfectly. Explain it to someone less experienced, and even if they listen, they may not really get the full picture.
And now, we can finally come back to the part about teaching. How does teaching relate to all of this?
Teaching requires all of the skills above. You need to listen well to understand the questions. You need to be able to formulate a clear solution, and then explain it in a way the other person can understand.
Now, I’m not saying you have to go to a school and teach programming there. Of course not. What I’m talking about is just helping other people with their questions, even if you’re not an expert. I’ve spent a large amount of time doing this, and it’s one of the reasons why I know about a very wide range of topics.
Helping people with their problems, even when you might not be an expert, will improve more aspects of your skillset than just communication. You might have to do a Google search to help with some topic you’re not completely familiar with, so you learn something new. Maybe the question just gives you a new way to think about some problem.
This is important especially if you aspire to become a team lead, CTO, software architect, or some other similar role. In roles like these, it’s very helpful to have a wide range of knowledge, even if you’re only passingly familiar with it. People in these roles will often need to mentor other developers, figure out solutions to new problems nobody else is familiar with, discuss business requirements, and all sorts of things where knowing that something exists and could help can be very important even if you’re not 100% familiar with its inner workings.
As with all aspects of programming, the best way to improve communication and your ability to reason about code on a higher level is practice. Thanks to the internet, all you have to do is go to Stack Overflow and answer a question. You can answer one question a week and get some practice like that, or you can answer one question a day if you like it… This is what makes teaching a very accessible method of getting practice for communication, and it only requires as much effort as you want to put into it.
So just go out there. Go to Stack Overflow, answer questions. Go to Reddit, answer questions. Talk to people on IRC or forums. Write a blog post. It’s interesting and fun, so why not?