This is page three of the online book "How to Become a Good Software Engineer: Advice from Programmers from Facebook, Amazon, Microsoft and more".
Table of Contents:
- What makes a good software engineer?
- How to become a good software engineer
- Tools of software engineers
- How to develop problem-solving skills
“Do what you love, love what you do” - common sense
Work in the field of information technology (IT) is a constant race for knowledge.
The systems that we as programmers most often work on tend to become more complex, with growing layers of abstraction over abstractions, and the integration of everything with everything else. Solving problems in such an industry always requires more knowledge than you had yesterday. You are constantly learning something new.
“In IT, the one who does not run is far behind” – Artur Badretdinov, Lead Android Developer at Squire
There are two main paths that you can take; to either grow into a skillful individual contributor, or an engineering manager. Between these two there are Technical and Team Lead roles, which lean more toward technical or managerial experience, but still combine responsibilities from both areas.
If you want to become a skillful individual contributor then apply the advice below which relates to code - such as by working on pet projects
If you are more interested in becoming a skillful engineering manager, participate in communities, organize and speak at events such as meetups and conferences, write articles, become a mentor or teacher at school, recommends Arthur, who taught computer science during his student days and loves to speak at conferences.
[DS: Some of the advice below will be contradictory, and that’s okay. There are many career paths available to programmers. It's important to choose the one that you will enjoy and which will align with your goals.]
Searching for imposter syndrome
“If you’re the smartest person in the room, you’re in the wrong room” – Confucius
Try to work at the best company you can find. When you find yourself in an environment that challenges your skills, it motivates you to rise to the level of the environment.
“Seek to work with people who know more than you in any area, watch how they work and learn.” - Dmitry Fedorenko
[DS: for me it is a feeling that you are not good enough to be here. This is often associated with the term “imposter syndrome”.]
The path to becoming a good programmer is through encountering challenging tasks, with the backing of supportive and experienced colleagues.
Look for projects and challenges that get you out of your comfort zone. If you feel you are doing routine tasks most of the time and cannot find challenging enough tasks - change your project, or change your team. Changing jobs would be another way to get into a place of growth.
[DS: Don’t expect every task to be interesting and challenging. But it is within your power to make a routine task more interesting. For example you can hone your skills like an athlete to get your routines faster and produce better results; or automate a routine task and learn something from it.]
Feedback is a need for personal growth. It’s harder to grow without feedback. If you don’t receive feedback, ask for it.
[DS: 1:1 Meetings are an indispensable tool for sharing feedback in both directions, between leadership and developers. They are an essential part of a strong company culture.]
Avoid teams and companies with a toxic atmosphere. It’s hard to learn and grow in such environments.
[DS: In a toxic team people are busy with internecine conflicts and they have no time for growth. They are less interested in the success of their team and less interested in their teammates.]
Choosing a company is difficult. Getting a job in a “top” company is a lottery. You can end up in the wrong project, or with the wrong leader, or a weak team.[DS: choosing a company with a good culture and experienced engineering team is easier in smaller companies. Use glassdoor.com and teamblind.com/company to find reviews from employees. You can also reach out to current employees on linkedin.com and communicate in an informal setting to find out if the company has what you are looking for.]
Follow your interests. Choose a company where working on the product will be interesting for you and focus more on the industry or domain, and less on the technologies.
[DS: It is tempting to follow the money and join the company that pays the highest compensation now. But think how one to three years in a new place will affect your career path. Does it lead to where you want to be? This is a hard question because you need to know where you want to be in three years. In the long run, an interesting job may have a better effect on your career than a pay rise now.]
When you find your perfect next gig, getting there requires interviewing skills, which is a separate set of skills. Concentrate your efforts on improving in the specific hard skills required by your chosen company. It’s often the case that “top” companies are looking for a deep knowledge of computer science fundamentals, programming language and platforms; whereas small startups value the ability to be productive with a specific technology stack right from the start.
If you can’t get into a company with a strong engineering team and culture, work hard on the fundamental concepts — computer science theory, data structures, algorithms, and problem-solving. There are many resources these days such as online courses, YouTube to learn fundamentals. Use leetcode.com to practice learned ideas. Working on open-source projects is a great practice as well. [More about self-development in the next section.]
“Without great teammates, it is difficult to engage in self-development” - Ruslan Torobaev
Open-source projects are the most accessible way of engaging with the very best programmers. You can learn a lot by reading their code, you can learn their tricks, see how they design software and get feedback on your code.
Activities that make you a better software engineer include: reading code, submitting issues, responding to issues, fixing bugs, submitting new features, and reviewing others' code. But reading the source code remains the cheapest and most accessible activity around.
If you have any questions about the library you are using, or you do not understand why the code behaves a certain way, look into the source code and you will find much more than just the answer to your question.
By reading the source-code of libraries that you are using, you will better understand how to write idiomatic code that uses them. Take a look inside the libraries you use, figure out how they are written and use this knowledge to write better code.
[DS: Reading code is great but you need to complement it with watching how people code and understanding their thought processes. For the former, watch live coding videos and screencasts online. For the latter, find engineers whom you can ask questions of — and see how they think while they answer you!]
Anton Kireev explains why you need to complement code reading with another source of learning using the analogy of learning to play guitar:
“You can watch tabs [tablature - chord notation for guitarists] of other people’s cool songs, like the code of cool programmers, and extract patterns by repeating them in your work. But by repeating “songs” of other performers you will not learn to play [well] a Spanish piece. To play something like that, you need someone to teach you how to sit, the correct position of the hands, the correct clamp. Why is it important? Because with the right technique, you will get a better sound and fatigue less.”
Every morning, Alex Khismatulin spends 15 minutes going over the articles in his Feedly feed. In that time he can view up to 25 articles; less than a minute per article. The trick is to catch the keywords. This activity will help to expand your knowledge of your chosen domain.
Vlad Popov thinks that he has been helped by the habit of trying all experimental technologies as soon as they appear.
Keeping up with the features of new technologies gives you the opportunity to find solutions for problems that previous generations of technologies have. As a side-effect you can become an experienced specialist in a successful technology.
[DS: Vlad was one of those who evangelized Node.JS even before the first version, and used Vue.js in production in 2014 when the framework was not yet popular. Now he is an expert in both.]
But Denis Bazhenov believes that it is necessary to keep the size of your stack small. Don’t chase every popular technology of the day. Instead, use the time to study your current stack in depth.
Courses are a good way to start learning new technology, shares Artur Badretdinov. No matter how much overall experience you have, taking an online course or watching YouTube videos about new technology is a great way to learn it. But when you reach a good enough level of understanding in a topic it is hard to become significantly better at it by watching another video. As your knowledge grows, the amount of new things you can learn from each of these videos will decrease — in effect, the ratio of time spent to new skills acquired will decrease.
Ruslan Torobaev agrees that self-development is possible, but believes that a university will be a better choice. Programming requires a good foundation: higher mathematics, combinatorics, algebra, operating systems, networks, and knowledge of hardware. It is easier to learn these fundamentals in a university. Although it won’t stop you creating websites, this lack of knowledge will be a limiting factor.
Here is general list of resources for self-development:
- Watching conference talks
- Attending regular local and online meetups
- Participating in user groups for languages, libraries, frameworks, platform, and concepts such as Domain-Driven Design
- Completing online courses
- Reading tech books
- Studying academic articles
And specific recommendations:
- Anton Kireev recommends the books of Andrew Tanenbaum for development deep into the technological stack.
- For Java developers, Ruslan Torobaev advises an excellent resource: shipilev.net.
- Denis Bazhenov recommends a good resource of DevOps knowledge, the Linux Performance blog by Netflix Senior Performance Architect Brendan Gregg.
- leetcode.com is the most recommended resource to get better at the fundamentals of computer science.
If you are interested in programming and you are ready to spend spare time at the weekend and in the evenings on it, doing something for fun or coding for free, then most likely you will turn out to be a good programmer. And vice versa — rarely do those who sit at work from 9 to 5 and don’t practice outside of that as a hobby become top, or even average, specialists.
“It is difficult to be successful in IT if you come there for money and hype. It must be a calling.” - Dmitry Fedorenko
[DS: as always, I recommend engaging in activities that bring joy]
Artur Badretdinov noticed that those developers whom he thinks are skillful do not just code at work; they also have side projects; they participate in communities.
Such projects can be either a playground where you learn by doing, or a project that solves a problem.
The first type of project is done and forgotten. You can try some ideas, show them, get feedback, and forget them. Artur did the Earthquake project as a code example for his Clean Architecture conference talk. For Artur such projects take one or two days.
The pet projects that solve a problem are a good way to practice product-oriented skills: you aim to build a product that solves other people's problems whilst having the opportunity to play with other technologies. Artur made a chat bot to remind users about IT events, in order to have a play with Telegram and Python. This was his first experience with dynamic languages after years of working with statically typed languages. Projects like this also force you to learn DevOps skills as you will need to host your product somewhere.
It is better to work with someone on pet projects rather than alone. You will inevitably get bored at some point, and your enthusiasm may fizzle out. This happens less often when working in a team, even if it is a team of two.
Vlad Popov undertook any proposal he was offered to work on projects. He never said no to a work opportunity, and was involved in many projects for no money at all, just for experience, interest, references and contacts.
“I constantly had a bunch of projects at the same time. I was hungry for them.” - Vlad Popov
[DS: Four years ago we worked together on a project and he was looking for a library to solve a problem. “Dima, look” he said, “well written… that is clever… it’s cool too… hmm here I would write differently, but fine… I wonder who the author is?” He opens the project’s config file and sees that he is the author. He is such a prolific developer that he can forget that he built a library.]
Working on various projects helped Vlad to master his tech stack. Start 25 projects from scratch, and you will make this process seamless.
Vadim Tsesko, a developer from ok.ru, advises that you write — just for fun — your own implementation of various layers of the technological stack: boot file, kernel, network, data structures, library and framework. This will give you a better understanding of the entire stack that programmers rely on every day.
Alexander Efremenkov, Senior Android Engineer at Bolt, enjoyed making mods and patches for Android before he became an Android developer. This made his transition from Java backend to Android development easy and the only thing that he needed to learn was the Android API.
Now, Alexander’s hobby is Internet of Things (IoT) and he equips his home with sensors and microcontrollers.
An idea for a pet project is to work on related areas of software development. For example if you are an Android developer, build a backend API. Here are Efremenkov’s words about how working on related areas helps him with his craft:
“By playing with different platforms, languages, and tools, you adopt the best practices from different areas of development, which leads to erudition, which helps to cope with problems you’ve never encountered before and build your know-how” – Alexander Efremenkov
At work, where our goal is to move the business forward, we must take the most pragmatic and reliable solutions. This leaves no room for experimentation and broadening your knowledge. This makes your pet projects an important part of self-development.
“When the student is ready the teacher will appear. When the student is truly ready… the teacher will disappear.” – Tao Te Ching
A mentor can turn years of study into weeks, or months into days.
Vlad Popov didn’t get the knowledge he wanted at a university. Instead, he went to study with a person who knew the technology he was interested in better than anyone else in his country. Denis Muraviev conducted an intensive course “Advanced Flash Programming”, where after a few days, people without previous programming experience were able to write ActionScript code, a relative of ECMAScript.
The mentor need not know that they are your mentor. By following their GitHub account, reading their blogs and tweets, listening to podcasts and watching videos on YouTube, you can learn a lot from the best in the field. Follow the coolest developers and the core developers in your stack. Their examples of how to write good code will inspire you to keep growing and find extra time for your hobbies, to keep you moving forward.
Denis Bazhenov himself is a mentor for young teammates. He shared what to look for when choosing a mentor:
- Make a preference for highly specialized individuals who have been specializing in their topic for a long time
- Avoid people who are critical in their thinking
- Choose someone who can talk not just about the pros but also the cons of the technology you want to learn
How can you be a good student for a mentor:
- Don’t be indifferent — you should display an interest
- Do at least something outside the 9-5; open source, a pet project, or a blog
- Work on being more open to other people’s ideas
It is important for growth to be open to criticism, considers one Facebook programmer.
[DS: The hardest part of the previous tip is to really pay attention to how you feel when you receive criticism, and make sure that your wounded pride does not cause you to shut yourself off from criticism. At this moment, the brain does not work rationally and you are playing defense. Learning to catch such moments and take advice is another important soft skill. One of my tools for introspection is to write a “day review” in my diary just before bed. I’ve picked up this tool from Stoic, philosopher, and Roman statesman Lucius Seneca.]
What if I’m just starting programming?
Alex Khismatulin helped a number of his friends to become frontend developers. His process included four steps:
- Learn the fundamentals: statement, expressions, conditions, loops, other basics of your language of choice.
- Complete some fictional projects [build what you are interested in] or step-by-step tutorials from the internet. [Build your skills by putting your knowledge into practice.]
- Increase the complexity of your projects.
- After six months find an internship position [keeping in mind advice about the best company to start from in the “Searching for imposter syndrome” section].
A good place to start a programmer career path is a position as a developer in an outsourcing — aka offshore consulting — company with many projects from a range of clients. This is often а place where hard work is required. But these companies take inexperienced developers with basic skills and teach them valuable technical and soft skills including the habit of finishing their tasks within estimated time.
If you are not in a big tech hub such as Silicon Valley, New York, London, Berlin, or your country’s capital, it can be hard to find a good software “product” company (a startup or a company that builds a product they own). You are unlikely to find a successful product — and as a consequence a strong engineering team — outside the biggest cities. Products that have no clients and revenue are like a swamp in which nothing happens and there is no growth. That is why a position in a consulting services company is a good place to start.
Novice programmers should get hands-on programming as much as possible. You should be able to follow the leader: the goal is to be as useful as possible without asking constant questions, and to be able to solve a well-posed problem on your own.
The next step is to broaden your horizons:
- Be helpful in the code review process
- Master git
- Learn how to debug
- Improve your DevOps skills
- Become better at problem-solving (read about problem-solving below)
Developing these domains will allow novice programmers to become self-sufficient.
What can help a beginner programmer to realize their potential?
- Doing internships in teams with challenging tasks and experienced colleagues
- Being driven toward software engineering
- Having their own ideas
- Being open to criticism
- Allowing themselves to be led
Internship programs at the “top” tech companies in your country can catapult your career. The earlier you get access to technically complex tasks and experienced colleagues, the better.
How to find time for all this?
The complexity of modern development is such that now the developer’s toolkit is huge and it continues to grow and become more complex. There is a lot to know.
“The volume of knowledge in the industry is growing, but people have the same time available, and this is not their fault” - Denis Bazhenov
Most of this ebook advice requires time. Our lives are busy and many have families and children. How do we find time for at least some of the above?
“Devote all your free time to self-development” - Vadim Tsesko
The answer is simple: nobody cancels the hard work. A lot of time will have to be spent on training, and if you don’t enjoy the process it will feel like really hard work.
“Simple question — will you program if you won’t get paid for it? If not, then my path [of hard work] is not for you” - Dmitry Fedorenko
The main secret is an intrinsic desire. Do what you love, love what you do. You will always find time for something that brings you joy.
How do you find time for all this?
“I don’t know — it just happens!” - Anton Kireev