Introduction
Being able to code dozens of features quickly doesn’t make you a good software engineer.
A good coder, sure!
Being a good software engineer is more than just coding.
Let’s dive into a couple of things that make a good software engineer.
Pragmatism
Good software engineers understand there is a difference between real and ideal reality.
You can’t look at things with a narrow perspective.
You need to understand the broader context, both product and business.
Sometimes the best solution isn’t the right solution for the moment, e.g. if the best approach would require cleaning up tech debt that would result in much more work than anticipated and block other teammates, then maybe it’s better to go with a solution that’s simpler in the current moment.
Strive for the simplest solution.
Focus on now. Stick to YAGNI (You Are Not Gonna Need It). Don’t write code you’re not gonna need.
Critical thinking
Critical thinking is arguably one of the traits that make a software engineer shine. They relentlessly seek to understand the “why” before diving into the “how”.
Being a critical thinker means:
Question Assumptions: Not all given information or existing processes are the best. Question them, understand the basis, and ensure they fit the context.
Evaluate Information Sources: Where did your information come from? Is it reliable? Fresh and relevant?
Analyze Patterns and Dependencies: In coding and system design, understanding patterns and interdependencies helps in foreseeing potential pitfalls or optimization areas.
Reflect on Decisions: After making decisions, especially critical ones, review them. Were they effective? What could have been done differently? Was the decision the right one at the current moment?
Seek Different Perspectives: Engage with peers, understand their viewpoints. This broadens your horizon and sometimes offers solutions you might not have thought of.
In general, questions you could ask based on critical thinking:
How do we know we're solving the right problem?
How do we know we're solving the problem in the right way?
If we don't know the sources of our problem, how can we determine the root cause?
How can we break the key question down into smaller questions that we can analyze further?
Once we have one or more hypotheses, how do we structure work to evaluate them?
How do we know when we are done?
How do I communicate the solution clearly and logically to all stakeholders?
Communication
Communication sounds vague.
The term is generalized. But the truth is, communication happens at every level of software engineering. Both orally and written.
Good communication skills are required to be a good software engineer:
Know your audience
Use the domain language
Be clear and concise
Understand not everyone has the same context as you
This also includes being able to explain to people with zero context
Give regular updates when leading a project
Good listener
Make sure to understand a question before answering it
Empathy and understanding that we all have different perspectives
Problem solving
Good software engineers don’t know every solution. But the solution to a problem starts by breaking the problem down.
The ability to solve problems efficiently. You don’t rush to conclusions.
You make sure to test your understanding of a problem before assuming you’ve understood it:
Write it down as if you’re explaining it to someone with zero context.
Rubber-duck: Explain to an actual toy the problem you’re facing.
On many occasions, a problem can be broken down into smaller problems.
That lets you focus on solving the entire problem step by step with minimal distractions.
Product-minded
Outstanding software engineers are product-minded.
They don’t look at their work from a technical perspective.
They see themselves working on the entire product and keep the customers in mind:
Ask questions on the “why“ behind product decisions.
Never work on something you don’t know the “why“ behind.
Come up with suggestions when you believe something could be improved for the customers.
Think from the users’ perspective.
They take ownership of their work, pay attention to detail and care about what the customers get in their hands.
They embrace the product-first mindset instead of the code-first one, always looking to deliver value for the end customers. ✨
is there any book you recommend to get better in problem solving and critical thinking? I am a junior web dev and I am lacking in these two areas