What makes a great software engineer?
The following observations and institutional learnings are based on years of working in and with software teams of different sizes, across a number of industries, technologies and architectural complexities. They are in no particular order because in reality, priorities for each of these will shift based on context. What is important though, is that these are all positive traits, and engineers who display these, would almost certainly be productive and most likely to accelerate through their career.
Attitude over aptitude: A great attitude can take decades of personal development but becoming technically competent takes a fraction of that time. A competent team will have the resources to rapidly teach, mentor and develop a junior engineer who doesn’t necessarily start out with the sharpest technical skills. A negative attitude will invariably prevent or hinder learning. Building competencies for people with tertiary-level education is usually far less onerous than changing their attitude.
An ability to relate on a personal level to colleagues and clients is crucial, so to be a great engineer, you need to be the engineer whom everyone wants to work with. Being a technical guru is insufficient if nobody wants to work with you. Great software engineers avoid condescension, narcissism and an inflated ego. In communications, this means they are able to listen attentively, be assertive and concise. Great engineers also able to present themselves without aggression.
Awareness and analytical nature: Some engineers struggle with ‘tunnel vision’ into the solution space, where they focus too much on the solution without properly evaluating the problem. Great software engineers are astute, able to place requirements in context and maintain awareness of the problem-space while working through the solution.
This awareness should pervade all aspects of their work, especially the ability to be aware of what already exists in a given solution, and how it can be reused to solve requirements more efficiently or in ways that weren’t directly suggested. One of the hallmarks of great software engineers is a shrewd talent for solving problems on their feet in meetings, workshops and pair-programming scenarios.
Maturity in approach: Great software engineers apply their mind to all aspects of the engineering process in a considered and non-selfish way. Here are a few examples of what this means in practice:
- Seeking constructive criticism – great engineers ask what they could be missing in a design, how would it not work and whether it is understandable to the users and the rest of the team
- Asking for the background of a requirement to see how it fits into things and seeing the ‘big picture’ – great engineers look to stabilise requirements before rushing ahead with development. For example, similar work items should be checked to see if there is an overlap, offering an opportunity to combine or reuse
- Taking initiative – when working on a specific requirement, great engineers will explore ways to improve the solution beyond the exact provided requirement
- Communicating regularly – status reports, stand-up meetings and involvement in the broader software and client context are all easy ways to be noticed though excellent service.
Career-path intuition: A career in software engineering is vibrant and varied so it is difficult to have a template for growth that can be applied to junior engineers in a blanket fashion. Being senior is less about how many years you have worked and more about your maturity, competence and value you can provide to a team. The best software engineers see this for what it is – an opportunity. Furthering a career in the field is about understanding the context and demonstrating an insight into what makes a software engineer a ‘senior’ or a ‘lead’ within that organisation. Armed with that knowledge, great software engineers can tailor their skills and initiative to push themselves further.
Ultimately, what separates great engineers from good engineers is a natural maturity in approach, personality and attitude that goes beyond the expected competence in the technical aspects of the software craft. This might seem counterintuitive given the implied technical depth in the job and to be fair, in many positions, an expert level technical competency is an absolute minimum. However, the point is that often, technical strength will only get you through the door, where these ‘softer’ aspects then take over.