editione1.0.1
Updated August 7, 2023As programmers, weβre expected to know a wide array of things in order to do our jobs. On top of fundamental skills like writing code that compiles without errors, we also need to know how to design our programs to be future proof, how to write automated tests so we can be sure the code works as expected, and how to deliver results consistently and efficiently.
Itβs easy to feel overwhelmed with the amount of knowledge required in order to complete our day-to-day tasks, in addition to answering questions from project stakeholders, defending our technical decisions during code reviews, and planning for the future.
There will be plenty of times throughout your career where you wonβt know the answer to a question or wonβt know what someone else on your team is talking about. It happens to software engineers of all levels, not just junior engineers. The thing that makes good engineers stand out from the rest is that they are humble and aware that they donβt know everything, and they use that knowledge to learn and grow.
βexampleβSituations that might bring on impostor feelings include:
Your boss might ask you a question in front of your team that you donβt know the answer to.
A senior engineer might ask if you considered an obvious edge case when fixing a bug.
A senior product manager might ask you to estimate how long it would take to build a new feature in a part of the codebase youβre not familiar with.
Your boss might ask you to clarify how something you built six months ago works, and you might not remember all the details about it.
Itβs okay to admit that you donβt know something, or that you hadnβt considered some obvious edge case. In fact, admitting that you donβt know something is a sign of maturity. If you want to be successful in your career, you need to put your ego aside and accept the fact that you wonβt know everything. Itβs nearly impossible to know everything there is about programming. Itβs such a broad industry that is still evolving each and every day, and itβs simply not possible to be an expert on every topic.
Additionally, thereβs even more to learn about the process of delivering software, because writing code is only one part of the equation when it comes to doing our jobs. There are planning, analysis, design, implementation, testing and integration, and maintenance phases in a modern software development life cycle, and each phase comes with its own nuances and best practices. While you may not be great at all of those phases, a senior engineer must understand the entire process. Itβs normal to feel like an impostor if you donβt have a lot of knowledge in one or more of these areas, but that doesnβt mean youβre not a good engineer.
Letβs look at what you can do to minimize those impostor feelings and leverage them to become a better software engineer.
You have gaps in your knowledge. We all do. Itβs natural, so donβt worry about it too much. Whatβs more important is that you seek out and acknowledge these shortcomings so that you can take steps to close the gaps. Accepting your limitations allows you to put your ego aside and open your mind to new ideas and opportunities to grow.
Too often we fall into the misconception that we know more than we really do, which leads us to be stubborn and closed-minded when weβre presented with new information. Believing you know more than you do can have a negative effect on your ability to learn, and in some cases, it can stagnate your career growth. It can also make it easy to get defensive when your ideas are challenged. How you react in those situations can lead to conflicts with your coworkers or hinder your ability to make impartial decisions, which is why itβs important to be honest with yourself about the limitations of your knowledge and your skills.
When you accept that you donβt know what you donβt know, it opens the door to opportunities to improve the situation:
When youβre honest with yourself about what you donβt know, you naturally identify areas where you need to seek more information and learn more.
When you accept you donβt know something about a topic, it takes the pressure off when you need to ask for help. It gives you confidence to reach out to someone else who may be an expert in that topic and can help you, or they may be able to point you to someone who can.
Knowing what you donβt know helps prevent you from making an uninformed or biased decision.
So, how do you identify what you donβt know? A good first step is to write down in your notes things you already know that you donβt know. This could be things like topics, phrases, or acronyms that youβve heard before but donβt know what they are. Write down as many things as you can think of.
βimportantβ Use your favorite note-taking app or even a physical notebook: something that youβll be able to access at any time and be able to reference later on.
Itβs important to be honest with yourself during this step. Donβt be embarrassed if the list is long or you think itβs full of basic topicsβyou donβt need to share it with anyone. And these donβt necessarily have to be technical topics either. They can be related to business in general, some unique aspect of your company, or something industry-specific. And finally, while itβs important to write down things you donβt know or understand, itβs also important to write down what you donβt understand about it too. This will give you some indication on what you should focus on when itβs time to learn.
I donβt understand how containers are different from VMs. It sounds like they do the same thing.
I donβt understand dependency injection or why I would need it.
I donβt understand our companyβs sales process. Where do our customers come from and why do they want our product?
I donβt understand React hooks. When would I even use them?
I donβt fully understand the difference between an abstract class and an interface, and when to use one over the other.
I donβt understand the difference between stack vs. heap memory.
I donβt understand the economics of our industry. How do we determine the price point to sell our product competitively?
The next step is to observe. Take note of any new terms, phrases, acronyms, or concepts that pop up during conversations, video calls, chats, or comments from your coworkers or things you come across online. Anytime you come across an idea that youβre not familiar with, add it to your list. And every time you hear someone mention a topic thatβs already on your list, add a checkmark or a +1 next to it.
What is ARR? And why is the leadership team interested in tracking that metric?
My boss keeps mentioning the need for static code analysis. What is it and why is it so important?
I keep seeing people mention Kubernetes. I know it has to do with containers but why is it so popular?
Before you know it, youβll have a long list of topics of things to learn about. Whenever you have some time to spare, you can use this list as a starting point for things to research.
Once youβve compiled a list of topics that you know you donβt know, you can begin to work towards learning and closing those knowledge gaps. At this point, youβve essentially compiled a roadmap for expanding your knowledge. Now, you can begin to chip away at this list and start to close those gaps in your knowledge.
You can start with any topic, whether itβs something youβre really interested in or something you think will help you during your career. Another option is to rank the topics by what you think is the most important or what will have the highest impact in your day-to-day work.
An important thing to remember during this step is that you shouldnβt try to learn everything at once. Your list may be long, but thatβs okay! Focus on learning one topic at a time so you can give it your full attention. Try to learn as much about it as possible before moving on to the next topic. If you try to learn too many things at once, you wonβt be able to give each topic the attention it deserves, and you may not remember each thing youβre trying to learn.
You may be able to learn about some topics in a day, while others may take days or weeks to fully comprehend. Feel free to dive as deep into a topic as you see fit, but always try to learn more than just surface-level details about something.
Letβs look at the ARR acronym from the previous example.
βexampleβThrough your research, you learn that βARRβ stands for annual recurring revenue. Great! Now youβll know what the executive team means whenever they say βwe need to focus on growing ARR.β But donβt stop thereβtry to dig further and understand why focusing on growing ARR is so important.
Why is ARR an important metric for a SaaS company?
How is ARR calculated? (knowing this will help you understand how to increase it)
What does it mean if ARR is growing? What about declining?
How does my work fit into the companyβs goal of growing ARR?
Spending time to do your own research and teaching yourself a topic is invaluable. Try to learn the foundational concepts behind each topic, and what makes them important. Once you start to learn about a topic beyond just the basics, you may come up with more questions and want to dig deeper. Use this as a good opportunity to reach out to others and ask some questions. Try to identify coworkers or people in your network that are familiar with the topic and let them know youβd like to learn more.
βconfusionβ Sometimes, the hardest part is in determining exactly what you should ask, who you should ask, or how you should frame your questions. Asking questions is harder than it sounds, so weβll cover that topic in greater detail in How to Ask Better Questions.
Identifying and closing your knowledge gaps is just one thing you can do in order to counteract negative thoughts when youβre feeling like an impostor. Itβs a great way to build confidence, expand your knowledge, and learn new skills and ideas that could help you throughout your career. Next time youβre feeling like an impostor, try writing down things you donβt know or want to learn, and start chipping away at them to learn something new.
Weβve all been criticized at some point in our careers, and itβs safe to say that itβs never a great feeling. It can be difficult to receive criticism, even if itβs intended to be constructive. Criticism can be a hit to your ego and sometimes leave you feeling lost and confused, especially when you feel so confident in your work.
Whether you like it or not, criticism is sometimes necessary in order to foster a healthy engineering organization and to maintain an organized codebase that can grow and evolve over time. As a developer, youβll receive feedback throughout your career in many different areas, such as:
Code reviews. Other engineers may find issues with the syntax, logic, or readability of the code you submit for review.