Have you ever asked yourself, “what makes a good software engineer?” You’re probably thinking, “how good is the guy’s code?” or “how good are his problem-solving skill?” Okay, so he’s great at both coding and problem-solving complex issues… but why? What are the specific characteristics of an engineer that underpin these qualities that developers value?
Software engineering is a broad field with people who come from many different backgrounds, educations, and countries. Regardless of all of these perceived differences, successful software engineers encompass similar characteristics, strengths, and qualities that help them work well in a multitude of projects within a fast-changing landscape. Let’s dive into these developer strengths to see what qualities underpin loose terms like ‘problem-solving’ and ‘teamwork’. I’m also going to mention common weaknesses and shortcomings because it’s important to have this comparison to round out our conversation.
RELATED: The Ultimate Software Engineer Career Path Guide for 2023
What are the characteristics of a software engineer?
In this section, I’ll be focusing on the soft and interpersonal characteristics that make a good software engineer. Essentially, how you are interacting with others, receive ideas, and your overall perception of work. Here are the top personality traits of an engineer:
1. Curious and open-minded
Software development is a huge field with many technologies and approaches to solving problems. Great engineers are curious to seek these differences out and understand them, but most importantly, they are open-minded enough to allow their own strongly held beliefs to change and evolve when new information is presented. On a team level, open-mindedness is an incredibly important engineering trait to have productive and motivating discussions about problems that don’t fit into a standard approach.
2. Self-motivated and proactive
Being self-motivated and proactive is about finding solutions. Inevitably there will be something about a system you are working on that might bottleneck or be designed in a way that could cause larger problems down the track. Instead of letting these problems grow over time, a good engineer will be proactive enough to identify the issue and find a solution before it becomes a critical problem for the team. It’s very easy to let laziness creep in and to delay and ignore issues because they are “not your problem.” Don’t be that guy (or gal)!
3. Ability to work well under pressure
In most situations, the software development process is clearly defined, you work on the task at hand, provide status updates, and communicate with your team about future priorities. There’s not much pressure there. However, outages happen, things go wrong, and tickets need immediate attention. Being able to calmly assess and handle the problem no matter the circumstances is an important skill to have.
4. Good at prioritising tasks
There is a famous saying, “If everything is a priority, nothing is a priority” and that can’t be stated enough in the software world. Some things will need to be delayed in favour of other more pressing matters. Learning how to discern these differences and even quantify them is a great skill to have.
5. Empathetic and strong interpersonal skills
There is an old proverb that goes, “if you want to go fast go alone but if you want to go far go together.” Working within a team means being able to communicate your thoughts and feelings in a constructive way but also being cognisant of other people's thoughts and feelings. An engineer with the ability to empathise and communicate with their team will be a strong asset that encourages the team forward through obstacles in a healthy measured way.
6. Humble and willing to learn from others
“You’re able to learn something from anyone regardless of their background.” That’s a saying that I think about often, it becomes more and more true the older I get. Humility in software development is important because no one knows everything and there becomes a point where it's better to put aside your ego and ask for help instead of wasting time trying yourself. A team is built for a reason and when the team can support each other’s weaknesses they can function better and faster.
7. Strong sense of responsibility and ownership
Engineers spend countless hours working on a codebase so, at the end of the day, they are the people who understand it best and are responsible for it. They will see the problems, they will see how the system progresses, and ultimately they will be a strong influence on user experience. If problems occur, it’s on the engineer to take responsibility and deliver that news to stakeholders. Even if these are tomorrow’s problems for some other engineer down the line.
Strengths of a software engineer
When I talk about the strengths of a software engineer, I’m referring to organisational, logical, and process-driven qualities. These qualities have the potential to take you from a good software engineer to a great engineer. I don’t care if you’re the best coder out there, if you don’t understand the bigger picture or can’t prioritise, you’re becoming less of an asset to the team and more of a liability. Focus on these top strengths:
1. Analytical and critical thinking abilities
All too often engineers are tasked with working in a system they don’t understand, sometimes with little to no support, and often without documentation. Regardless, they are expected to work on the system, and having the ability to break the system down in a way where you can observe its operations and inputs is crucial to becoming knowledgeable in the true operations of the system.
2. Understand software architecture
In most instances, software systems are a flow of information from one end to another. Being able to track the flow of information and how it changes, quite literally step by step, is a great first step to understanding how a system works and understanding ways to make it more resilient. Additionally, understanding the different ways to accomplish the same problem is crucial in creating good architecture so you can accurately understand the pros and cons of each step to pick the proper path.
3. Strong knowledge of software development tools and alternative technologies
There are many different approaches to problems in software development, all with their own benefits and drawbacks. If you don’t know what tools are out there or what alternative technologies exist, you’re going to be stumbling around in the dark and most likely not putting your best foot forward. Not all of this knowledge comes with experience, in most cases, you need to go out there and find it. That goes back to my point on curiosity. If you’re not asking yourself, “is this the best way to do it?” or “is this the best tool out there?” you are going to be disadvantaged in the long run.
4. Ability to handle multiple projects and prioritise tasks
As an engineer grows in their ability and effectiveness so does their list of responsibilities. An engineer may be asked to work on a few projects on top of their day-to-day responsibilities. Yes, this can be overwhelming if you don’t have processes in place. Not only do you need to be able to prioritise but you need to be on top of what’s expected of you so that you can be prepared for what’s unexpected. Crucial bug fixes and production outages will inevitably appear, so incorporate that into your plans. If you have the right processes and systems in place, it really doesn’t matter if things go wrong or if work piles up.
5. Good at testing and debugging code
Most software teams work on existing projects rather than new ones. Learning how to debug code is a crucial skill to know to be effective no matter the project you encounter. Furthermore, holistically testing your work is important not only to make sure you’ve completed your task but also that you can prevent those 2 am production outages.
6. Good documentation skills
Documentation is truly an underrated skill in software engineering. No one wants to do it, but everyone loves it when the docs are good. Being able to document the work you’re doing in a system will inevitably help someone down the line. However, staying on top of the changing system and the documentation needing updates is just as important to keep it relevant. After all, the only thing more frustrating than no documentation is inaccurate documentation. I know it’s annoying but do it anyway.
Weaknesses of a software engineer
We all have weaknesses. There are small weaknesses that are minimal and at most irritating to people to work with. Then there are frustrating aspects of a colleague's personality like stubbornness or unresponsiveness. But the worst weaknesses are those we are not aware of. It’s hurting our career, growth, and work relationships but we have no way to improve because we don’t even know we are doing something wrong. To cultivate a bit of self-awareness, let’s go through some of the common weaknesses and what they look like.
1. Difficulty in adapting to new technologies
Every part of software engineering evolves over time. New technologies can provide opportunities to improve systems and make better solutions for customers. It’s easy to become complacent and avoid learning new technologies but if you don’t you might no longer have relevant skills in the software market. If you over-rely on what you do know and avoid what you don’t know, you might find it difficult to find employment in 3 years time.
2. Over reliance on familiar tools and techniques
It’s easy to become blind to solutions other than what you’ve successfully used in the past. Those solutions may still work, but in engineering sometimes problems can have unique considerations that people will overlook because they blindly apply approaches they’ve used in the past. The English proverb “when all you have is a hammer, everything looks like a nail” fits well here. Expand your toolset and techniques so that you can have a larger dataset for a better-rounded perspective.
3. Poor time management and prioritisation skills
Projects have deadlines and dependencies within an organisation, they are not to be procrastinated on. Ultimately, every project fears the “unknown unknowns” of a project, because these are the things that can derail a project. Without proper time management and prioritisation skills, staying on top of the known parts of the project becomes a challenge and can lead to a state where a few unknown unknowns can inevitably halt an entire project.
4. Difficulty in collaborating with others
As mentioned above, software engineering is a highly project-based field. Projects have multiple teams and stakeholders, each with their own responsibilities and valid opinions about how things should be done. As an engineer, you are responsible for understanding the technical ask of designers and business peers, and accurately verbalising the possibilities. Sometimes there will be lots of back and forth as needs are worked out, and sometimes things will need to be scrapped. The process can be frustrating but collaboration and communication with team members are incredibly important to make sure everything works well. Simply put, no one wants to work with a difficult team member especially when the job is complex.
5. Lack of attention to detail
Code can be incredibly powerful, even a single line change can drastically affect how a system operates. Attention to detail becomes crucial to an engineer because even those little changes can affect a system, so digging into the tiniest of details on a problem is important. Thinking through the details of how something should be solved is crucial to ensuring things are done the best way from the beginning. It’s often harder to undo a change than it is to make a change.
6. Resistance to change and improvement
Let's face it, software engineering is fast-paced and constantly changing, even more so in the frontend world. To truly be a great engineer, you need to have an insatiable curiosity for learning and the openness to do so. Inevitably, an engineer who lacks this ability will make themselves obsolete and become difficult to work with over time.
7. Overconfidence in abilities and lack of humility
Confidence is important and good for people to have, however, misplaced confidence leads to poor execution and overestimations. If you’re overconfident, you will be caught in a bad situation sooner or later. Humility teaches us that we are never perfect and can always improve. It also teaches us to underestimate and overdeliver. When an engineer practices humility, they’ll help themselves out of challenging situations.
Do you have these qualities?
This is not an exhaustive list and ultimately may vary from person to person. However, being great at anything requires consistent effort and focus over a long period of time, and software engineering is no different. No one is perfect, myself included, and we can only continue improving each day. Hopefully, this list of characteristics helps you understand what types of things to strive for if you want to be a more effective engineer.