What Makes a Great Software Engineer?
What Makes a Great Software Engineer?
Excellent developers are the lifeblood of software companies.
Therefore, organizations and HR teams must think hard about the values that make an individual the best fit for their teams.
Different organizations follow different practices and working styles, and have unique preferences regarding a good candidate. However, there are a few qualities that we believe everyone can agree on – qualities that developers should strive to embody as they navigate these roles and attempt to make a difference.
Here’s an outline of the post so you can easily navigate or skip ahead:
- What Makes a Great Software Engineer?
- Quality #1: Experience and Intuition
- Quality #2: Attention to Detail
- {Quality #3} Quick Self-Learning, Flexibility, and Adaptability
- {Quality #4} Productivity, Planning and Time Management
- {Quality #5} Curiosity and Love of Learning
- {Quality #6} Business Sense
- {Quality #7} Social Skills and a Positive Attitude
- {Quality #8} Discipline, Commitment, and Punctuality
- Closing Thoughts
{Quality #1}: Experience and Intuition
Broad Technical Experience
When HR teams evaluate software engineers through their CVs, the industry technical experience section is perhaps the first yardstick of their competence. You could be a topper in grad school, well versed with all major CS subjects, a rank-holder on LeetCode, but there are aspects of real-world development experience that you only learn through experience.
We learn who we are in practice, not in theory. - David Epstein, Range
How long has the individual been into software development? What companies has he/she/they worked for? What roles has the individual been assigned to in the past? What are the projects the individual has worked on? How many programming languages and frameworks is the individual familiar with?
These questions reveal a picture of the individuals who’ve been in the thick of brainstorming product features, common development and deployment issues, meeting deadlines, witnessing how applications are maintained, scaled, or built.
This first-hand experience with the ins and outs of software development speaks about how comfortable the individual is likely to be when filling a new position. Apart from programming and development skills, new talent provides a fresh perspective into existing processes and how to solve or avoid common issues in the first place.
Full-stack Knowledge
The requirements criteria of experience can sometimes vary across different roles, but there’s one constant that will always be valuable to possess. And that is a holistic understanding of full-stack development.
Full-stack here doesn’t refer to being aware of all the workings of your code - in and out. It means knowing all aspects of your application from the front-end code files to the server serving them, from the databases connected to fetch data and the deployment pipeline, along with everything else encompassing the software development lifecycle.
The idea is for engineers to know where their work fits into the scope of the entire application. This overview enables them to make better decisions in their local expertise domain to drive the organization’s growth as a whole.
Intuition
Truly successful decision-making relies on a balance between deliberate and instinctive thinking. - Malcolm Gladwell
A primary virtue of an experienced individual is a developed intuition. This involves having a hunch about where and what might have gone wrong in the application’s infrastructure and ways of making amends. This feeling about things (plans, ideas, code implementations, performance metrics, etc.) sounding or not sounding right based on years of experience can prove extremely valuable to a company when making critical decisions in the face of uncertainty. It isn’t always possible to logically evaluate or foresee the consequences of future decisions and courses of action. Therefore, it becomes imperative for teams to have individuals who can let their sound intuitions call the shots.
Why It’s Important
Broader experience directly translates to a well-rounded understanding of the nature of development lifecycles and a more accurate intuition about potential events. It is significantly beneficial for the following reasons –
- Promotes adherence to best practices, clean code, and documentation
- Flexibility in switching between different tech stacks because of a strong core understanding of how technologies operate
- More insights about prospective issues and optimal solutions thanks to an intuitive understanding of algorithms and technologies
- Faster identification of problems and debugging
- Better decision-making in the face of uncertainty
{Quality #2} Attention to Detail
Attention to detail is a skill that seems to be on the decline these days. Abstractions over abstractions of code make it convenient for developers to write programs. However, it often comes at the cost of missing out on a fine-grained understanding of the system’s internals.
Writing software is complex. So many things have to work just right to get the whole thing to run smoothly. But all it takes is one unhandled (even unimaginable) edge case to bring the entire thing down. Sometimes it will fail for much less than that. Being meticulous and thorough when building software, therefore, becomes a highly valued quality.
In covering software across its breadth (trying to learn more modules, frameworks, technologies, and languages), amateur developers can lose touch with the depths of things. They are likely to get done with whatever work they are assigned cursorily and even declare completion a bit too early. This puts them at a disadvantage when something internal breaks down a little later; for then, they need to dive into it from scratch again. Exceptional software engineers, however, will go deep from the word go, get a better grasp of the internals, and, therefore, are likely to do a more foolproof job the first time itself. And if some issue were to come up with this part in the future, their strong foundational understanding will reduce the amount of time required to fix things.
Here are some of the traits common to outstanding software engineers who are attentive to detail –
- Take notes: The benefits of writing things down over letting your brain hold items in memory are immense. Writing or drawing out your program’s control and data flow on a piece of paper frees out your memory to focus on the specific module you set out to implement or fix.
- Self-review: Review your code after you think you have completed it, just like some other teammate’s. This sense of being a detached reviewer enables you to uncover holes that you would otherwise have missed.
- Test your code: Thoroughly unit testing your code and following test-driven development (TDD) practices also boosts robustness.
- Extensively chalk out edge cases and make accommodations for those.
However, you also wouldn’t want to miss the forest for the trees completely. It’s essential to strike the right balance.
“You’ve (also) got to think about the big things while you’re doing small things so that all the small things go in the right direction. —Alvin Toffler”
Ideally, a balanced mix of attention to detail and big picture thinking — the ability to envision the future and the scope of a feature or the whole project is the mark of a great software engineer.
Why It’s Important
Below are the key advantages of a detail attentive engineer –
- It helps in picking out nuances and minor issues missed by an inexperienced eye.
- Helps in shipping robust, foolproof code.
- Promotes a better grasp on internal implementations and algorithms
- Saves time in troubleshooting and debugging.
- Leads to fewer errors because of extensive exception handling of corner cases
{Quality #3} Quick Self-Learning, Flexibility, and Adaptability
The software industry moves fast. New technologies rise to the top just as quickly as old ones depreciate. Developers need to be on their toes and ready to adapt to whatever technology comes their way. This also enables them to blend in better in different teams with different preferences, practices, and processes.
In any software job, there are times when you need to deep dive into codebases and understand the roots, and then there are times where you just need to learn enough to get the work done within a narrow time frame. This agility in adapting to something outside of their comfort zone is an indispensable quality for an engineer. It requires flexibility and proficiency in self-learning.
Self-learning is the skill of treading uncharted waters and being just as comfortable because of the right set of resources, talking to the relevant groups, persistence, and experience. Experienced engineers consequently can grasp new concepts by quickly processing new information and making connections with their existing mental models.
This quick-wittedness, willingness to learn, adapt, and morph into what’s expected of them stems from a sense of curiosity and a love of learning — another essential quality we’ll touch on later.
Why It’s Important
Knowing and being good at everything is impossible, but what is possible is to master the skills of self-learning, flexibility, and adaptability and work through anything that comes your way. Below are its advantages —
- It helps engineers achieve an increased exposure and range of expertise.
- It keeps the team prepared to tackle unforeseen challenges.
- New hires can get on board with the company's ways faster.
- Allows individuals to fill in for others during emergencies.
{Quality #4} Productivity, Planning and Time Management
Time management and planning are methodical skills that have never been as crucial as they have been in the last year and a half. As people juggled between their work and personal lives, it became even more essential to have systems to ensure that teams are in sync, collaboration is effective, people’s private lives are undisturbed, and operations occur smoothly. This naturally complemented the modi operandi of productive engineers and helped them navigate remote work easily.
Nevertheless, remote work or not, exceptional software engineers will always thrive because they prefer to pick more organized and structured approaches over ad hoc ones. This knack of planning, decomposing big chunks of work into smaller, more manageable and trackable tasks, blocking distinct blocks of time for deep work and relaxation, and being more intelligent about managing their time and energy plays a pivotal role in their success. Here are some of the traits of a productive engineer —
- Planning project timelines with room for unforeseen events
- Being ruthless about one’s own and others’ time (e.g., canceling meetings if they don’t serve any useful purpose)
- Delegating less important, menial work
- Identifying and eliminating processes that waste time
- Taking out time for relaxing and recreation to boost productivity
- Maintain a healthy work-life balance
- Planning deep focused sessions of work interspersed with small breaks to rejuvenate
- Using tools like todos, calendars, checklists, Pomodoro timers, distracting website blockers, planners, weekly reviews and meetings to track progress, and more
- Being aware of tools that can make one’s job easier, e.g. productivity and collaboration tools like Notion and Slack
These traits can often be easy to spot in new hires with easy questions like “What does your daily routine look like?” and “Are you a planner or do you like to go with the flow?”.
Why It’s Important
The benefits of productive work habits compound over time. The following are the reasons–
- It helps in maintaining a healthy work-life balance
- Creates a culture of valuing one’s within the company
- Promotes higher job satisfaction levels
- Avoids burnout yet gets work done on time
- Organized schedules help meet deadlines and keep end-users and stakeholders happy.
{Quality #5} Curiosity and Love of Learning
“Curiosity is the wick in the candle of learning.” - William Arthur Ward
The most successful software engineers are curious to understand how things operate to their very core. This internal drive to observe, investigate, and learn goes a long way in determining an individual’s success.
When you focus on learning the mechanics of any concept, process or implementation, instead of just completing the assigned tasks and getting stuff done, you are automatically in a better position. The depth and breadth of understanding achieved this way is extremely valuable in uncovering insights that can improve the company’s products. Consequently, this also shows in the outputs — decisions and operations are well researched and carefully analyzed, stacking the odds of success in your favor.
A crucial aspect of learning is being open-minded and flexible — not rigidly tied to predated notions of doing things. This is also where humility comes in. A top engineer will always be humble about how much more there is to know about everything and be willing to unlearn out-of-date methods. With this kind of temperament, the path only goes onwards and upwards. You could be the most experienced developer on your team, but if you aren’t willing to explore new technologies and stay up to date, you will not do so well for long.
Why It’s Important
Most other incentives and motivators are external for software engineers, but curiosity is internal, and therefore perhaps most important.
- Internally drives engineers to learn more, explore, and put their best feet forward.
- It helps in discovering deep insights about systems, otherwise missed in cursory passes.
- Motivates the team to learn new technologies, experiment with ideas, question assumptions, and innovate.
{Quality #6} Business Sense
Intending to become the best software engineer there is (i.e. learning the most number of frameworks, programming languages, algorithms, etc.), amateur developers often miss out on their software’s business side. Engineers who are willing to get out of their comfort zones and venture into the financial realms to make more intelligent and informed software decisions are ultimately a boon to any company.
To have a sense of the business dynamics of your company, you don’t need to be a business whiz or require an MBA degree; just a keen mind will do. Engineers with such a propensity towards the business and its finances will focus more on acquiring user feedback, planning and building features, keeping the end-user in mind, scrutinizing business models, and interface with the business teams to keep themselves updated.
The idea is to leverage your technical understanding of the product’s roots (something that the business team might lack) and use that to develop strategies. This fresh perspective can generate insights that can be pretty valuable for the organization.
The more context the engineering teams have about how their software plays out and how it impacts the business, the better decisions they can make on their end. This is why a competent software engineer, while focusing on his expertise, would always have an eye on business strategies and improving financial performance.
Why It’s Important
Business acumen is an excellent bonus quality for the following reasons –
- Helps plan products and features that push business and generate revenue.
- Explores strategies grounded in a technical understanding of the product that optimizes for business growth.
- Pays more attention towards user feedback and therefore is directed towards improving user experience.
- It brings new ideas and a fresh perspective to the table
{Quality #7} Social Skills and a Positive Attitude
In the last year and a half, social interaction among team members has greatly suffered due to the transition to remote workspaces. Several reports have also suggested a decline in collaborative productivity in the work-from-home era. This only highlights the significant role of interpersonal interactions and team bonding in creating an environment of collaboration and getting things done.
It is no surprise that individuals with outstanding interpersonal skills shine in remote setups as well – making the most of the video meetings, putting themselves out there, helping others, being an encouraging influence, taking time outside of meetings to connect with colleagues, and more. These individuals can make work fun, build strong relationships with teammates, elevate team morale, and get things done. Imagine how much good they can do in physical office spaces.
As offices seem to be opening up in most countries worldwide and office dynamics seem to evolve into some hybrid of remote and on-site work, these are the engineers organizations want on their team.
Communication
The Pyramid of Most Useful Social Skills in Teams |
If there were a pyramid diagram of the most valuable social skills in a software company, communication would be the easy choice for a foundation. Whether it be for discussing project requirements, getting ideas across, receiving feedback, assigning responsibilities, or resolving conflicts between colleagues, personable communication skills serve as an indispensable tool for a software engineer.
Moreover, this skill set benefits on two fronts – communication with clients and fellow teammates – including technical and non-technical staff. As far as clients are concerned, more transparency in project requirements, no mismatches between expectations and possibilities, and the harmonious sync from clear communication do a world of good to the end goal.
As for intra-team dynamics, better communication skills facilitate creative expression of ideas, allow everyone to be on the same page about the task at hand, improves the group’s grasp of project challenges and technical concepts, and make room for better problem-solving. It also saves people from digging into lengthy documentation or specification files, thanks to equally useful summaries and help from colleagues.
Moreover, a cogent presentation of ideas can convey information transparently and creates an impact, influences important decisions, and ensures that the best ideas don’t get lost behind long lists of unread emails. This is the kind of impact that successful engineers end up making wherever they go.
Now let’s look at one of the primary advantages of effective communication.
Collaboration
The popular notion of a solo developer building a product from scratch and doing everything all by himself is a gravely inaccurate and unhealthy one. Collaborative efforts towards a project are beneficial for the project itself and equally important (if not more) for the engineers themselves. Developers can't become better in isolation. The kin collectively shines and grows.
The best software engineers foster values like honesty, trust, transparency, humility, reliability, and open-mindedness in the groups that they work with. They cultivate solid bonds and build relationships with their peers that positively influence the quality of work they put out.
The first step towards nurturing such healthy collaborative relationships is to be a team player — to help others when they are stuck, share tips and tricks that have helped you in the past, teach them skills you’re good at, and most importantly, be willing to take the first step and reach out.
Positive Attitude
Software development is not easy. A relatively significant portion of your time goes into troubleshooting, debugging, fixing issues, and putting out fires all over. It’s therefore difficult to keep your chin up all the time. But the silver lining is that usually, there’s always a solution. And that’s what exceptional software engineers focus on — because they believe in the shared goal of the company and the product.
Such an optimistic lookout and positive attitude can be contagious – and can even transmit across a distance of more than 6 feet. It can spread through Zoom meetings, audio calls, and even just regular emails. It motivates other team members, drives them to focus on the bright side of things, and look at the bigger picture.
Why It’s Important
A positive attitude with proficiency in social skills like communication and collaboration has several benefits —
- Transparent communication with clients and within teams
- Direct and quick exchange of thoughts saves time
- Clarity about goals to target and processes to implement
- More accurate timeline estimates due to a better understanding of the requirements
- High-quality output due to effective collaboration
- Leads to higher team morale and a sense of ownership towards the product
{Quality #8} Discipline, Commitment, and Punctuality
“Success is nothing more than a few simple disciplines, practiced every day.” – Jim Rohn
It takes discipline to follow rigorous coding standards laid by the organization for ensuring top-notch code quality. They require you to adhere to established software process models, best practices, programming principles, unit testing, documentation, and more. Amateur developers might not be as meticulous about complying with these standards, but successful software engineers will because they understand what is best for their application and their company. Writing clean code and building performant software is an art. And art requires discipline.
Successful developers are driven by a steadfast commitment to the organization and product. They show up, put in the hard work, take responsibility, and make amends when things go wrong. This attitude of putting the organization’s requirements above one’s own is highly valued in the market today.
It is one thing to commit to something, but a whole other to deliver on it. Ultimately what matters is shipping out quality code on time — being punctual in completing tasks and meeting deadlines. This consistency, regularity, and punctuality in getting things done make a great software engineer stand out from a group of good ones.
Why It’s Important
Discipline, commitment, and punctuality speak volumes of an engineer’s work ethic. They are of crucial importance for the following reasons –
- Creates a conducive culture of commitment towards the goal and work ethic
- Ensures on-time software releases according to a planned schedule
- Allows engineers to take pride and responsibility in the work they put out.
- Results in better quality, more foolproof code
Closing Thoughts
Here’s an exercise for you all. If you are just starting as an engineer yourself, make a note of these, and think about how you could embody them. However, if you are an experienced software engineer, think about how many of these qualities would you give yourself a full score for and where you could do better?
This self-evaluation should present a good picture of the importance these values hold in your view and help you align them accordingly. If you are interested in learning from more such articles around software and web development, subscribe to our newsletter, and check out our blog.
One last thing we forgot to mention about intelligent software engineers is they make sure to use Application Performance Monitoring tools like Scout APM to identify bottlenecks and gain actionable application performance insights.