What Should I Focus on Learning to be a Successful Software Engineer?
Time is our most precious resource. When you are young and have just started your software engineering career you might not value your time much. But believe me as years pass, you might start feeling that you don’t have enough time to catch up on the most recent thing.
We are software engineers and our industry develops fast. The technologies that were in use just a couple of years ago are considered obsolete now. If we don’t pay attention to this development, we reduce our chances to find a good job or to keep the current one. There are certain areas where the situation is better or worse. Just look at the incredible pace with which the frontend technologies develop. That is why it is important to focus on the right things. Saying the right things, I mean what helps you remain a good engineer and achieve your career goals.
I know a lot of people who moved away from software engineering because they couldn’t keep up with this pace or just didn’t like that they always had to spend a lot of their own time learning new technologies.
Focus on the Right Things
Based on my observations that I’ve made during my career, I’ve come up with a list of things that I try to focus on learning. So, in my opinion the following is worth investing time:
- Algorithms & Data structures. Depending on the area of software engineering, you might need them a lot, a little bit or not at all in your daily routine. But, you always need to be sharp with algorithms when time comes to change jobs. And it can come unexpected in the form of a lay-off, a new interesting opportunity, etc. It is always good to be in shape, and practice your program solving ability. The algorithms and data structures don’t change. You need to learn them once and then recap or relearn if you start forgetting them. If you are not actively looking for a job you can practice them a couple of times every week. One recommendation that I have is that you should be active and participate in your current employer interview process. Then, you will get some practice at your work time while interviewing candidates. But of course it doesn’t mean that you should not practice on your own.
- Communication skills. Even if you are the best engineer in your team, it might happen that you are not the one who gets promotions or raises. If your manager doesn’t know what a great solution you have applied and how it has improved the system, how would she decide that you should be rewarded for it? Moreover, software engineering is a team sport, and you should be able to effectively communicate with your team, Product and other people in your organization. There are tons of resources on the web about it. I also include the language skills in this category. So, if you are not a native speaker of the language that is used in the company, you have to put effort into bringing it to the level when people can easily understand your ideas, suggestions, and opinions.
Without the two above points, your chances to get a job in a good tech company are extremely low. And usually you cannot work on them during your working hours. So, if you have only so much time, I would recommend to focus on the above two points and try to pick up the rest during your work time.
- Programming languages, frameworks, libraries that are used in your current project and company or relevant for your position. If your company uses Java, you have to know Java and keep an eye on its ecosystem and how it develops. Same for other things. The good news about this point is that it is what you work with, so you learn it as you continue working with these technologies. However, I’ve met so many people who work somehow with technologies that they understand very badly. The way they can work is just through googling, using stack overflow snippets, and spending tons of time struggling with simple things. It is much wiser to invest some time to read official documentation/books/take a couple of courses about the technology you use anyway and effectively solve tasks that arise in your work instead of using the method of trials and errors. This way, you will be considered a good engineer who delivers. Your manager will be happy and your team will respect you.
- Other fundamentals. Another thing that I try to learn or just keep my level is other fundamentals related to my current positions. Because they are fundamentals (same as Algorithms and Data Structures) they don’t change much (or change very slowly in the course of decades). They might be different depending on what type of a software engineer you are. For example, I work as a backend software engineer, for me these fundamentals are Computer Networks, Operating Systems and Storage Systems.
What to Avoid
As I mentioned before you have to be focused and careful about your time. Personally, I avoid learning the following:
- New shiny Framework X or library Y. I used to do it often. There are a few problems with that. First the popularity of Framework X can go away in the short future, and it could turn out that it would have been better if you had learned Framework Y instead. Even if a shiny Framework X really becomes a new tool in your ecosystem, it might still happen that you will never use it in any projects of your company or of yours. A significant amount of time can pass between the time when you learned it initially and the moment when your company decides to adopt it. It could change drastically in between and you would need to relearn it from scratch. Of course, it makes sense to be attentive to what is happening in your tech stack and language community. ???? To do so, it is much more time efficient to read a short summary or to watch a short talk from people who have already tried the technology instead of spending your time learning it yourself.
- New shiny Language X. It depends on a language and a library, but I think that it usually requires even more time to learn a new language than to learn a new library or a framework. It is impractical to learn a new language in isolation anyway. To use it, you have to learn its build system, standard library, probably some additional stuff. The time investments can be high. I would not recommend learning a new language just for fun unless you are considering switching to its stack or to really use it in your daily work or for your projects.
Of course, if you have the urge to learn something and enjoy the process, do it. I meant this post for people who have come to the point when they have become pragmatic and agnostic towards languages and frameworks, and they just want to choose among a few alternatives. I personally still learn a lot of stuff that goes nowhere that I never use later. It is extremely hard to predict what will be in demand tomorrow, what will stay and what will go away. But definitely I make more wise decisions compared with what I did say 5 years ago. I wish the same for you, value your time and make wise decisions.