In 2008, Alex Iskold published a very popular blog on the topic of what it takes to be a great software engineer. He made some good points, but left out a number of very crucial traits. Additionally, a number of his points have become less true over the past three years. This article takes a more detailed approach in trying to fully cover the ultimate 10 traits that every modern engineer should embody.
1. Great Software Engineers Understand of Themselves
Every professional must understand what career path is best for them. To choose a career path, a person must have a good understanding of what they want out of their career and maybe out of life in general. Only when these larger goals are well-understood can the person have a greater sense of which projects are right for them.
The right project is out there for everyone. A “right” project is one that utilizes the programmer’s strengths and helps improve on their weaknesses. The right project also offers learning, intellectual challenges and direction towards achieving ultimate career and life goals that the person has set out for themselves.
Choosing the right projects can mean higher motivation and passion levels, which are ultimately strong factors in the engineer’s and the overall project’s success.
If the engineer does not understand fully what they want and what kind of projects get the best out of them, they are more prone to choosing just any project or job, which more often than not leads to mediocre results all around.
2. Great Software Engineers Understand Product Design and Business
Engineers cannot be drones that simply carry out instructions handed out by their bosses. They must be proactive thinkers. When developers are designing and writing code, they must understand why this code is necessary in the first place. Furthermore, it is very important that the engineers be able to fully think thorough how the users will use the software or site. Having that understanding gives a greater sense and insight into the best ways to architect that software.
If the developers don’t have a good sense of at least the general intentions of how the users will be using the software and what will make it unique and ultimately provide value to its users, how can the engineers possibly know what the important parts of the design of this software will be?
3. Great Software Engineers Understand Computer Science, Data Structures, Algorithms and DB Design
The perfect blend of software design is one where the business or project goals and needs are accounted for in an elegant, efficient and robust design of the software. That is almost the panacea of software. When the engineer who understands the greater non-software goals of the project can translate those goals into working software, birds begin to sing and flutes begin to play.
Successful projects either start out large or become large by being successful. They must ultimately be designed with the right fundamentals, algorithms and data structures to be able to grow nicely without being hampered by bad design. A good engineer must be able to balance high-quality product design and high-quality software design.
In nearly all cases, to design software that handles high loads, this can be done only with proper and often deep knowledge of computer science, algorithms, database design and data structures, as well as the ability to use the right ones at the right times. Otherwise, without having great fundamental building blocks, the software will collapse under increased load.
4. Great Software Engineers Pay Attention to Code Quality
Quality of code is a tremendously broad subject. This article cannot cover all the possible ways in which software can be of high quality, but here are a number of points that are at the top of the list when it comes to quality, in no particular order:
- Write maintainable code.
- Document the code.
- Write secure code.
- Continuously revise, refactor and improve the existing code.
- Write automated tests for the existing for the code.
- Write code that actually works!
- When possible aim for simple and proven solutions.
5. Great Software Engineers Are Accountable and Ethical
Great dependability and an aspiration to a high level of ethics are purely professional and human values, not just engineering ones. How can people work with an engineer who is not dependable and trustworthy? This does not mean that the engineer must always meet all deadlines. Not meeting particular deadlines is something that often happens in the engineering world. And it can often be the result of the deadline being overly aggressive rather than
the engineer’s fault.
To be dependable, accountable and trustworthy, the programmer must strive to be accountable for the deadlines he agrees to, and honest about the mistakes he makes. More often than not, it is OK to make mistakes. Making errors is just part of being human. The important issue here is handling the making of the mistakes in a proper, constructive, and ethical way that helps to limit damage within the project.
Additionally, in general, a good engineer is one who you can give a task to, and more or less expect that it will be done in 90% of the cases unless some large obstacle stands in the way. Quite often, the engineer must be able to solve problems independently and come back with solid solutions to given problems. That builds trust and accountability.
6. Great Software Engineers Are Easy to Work With
No matter how talented the engineer might be, he or she almost never works alone. The engineering efforts are often just a part of a larger business or research effort. Therefore, it is extremely important that engineers be kind to others on their teams and organizations. They must be willing to extend a helping hand when necessary, and do their best to help make everyone on the team better.
Good engineers can communicate effectively with members of their team and members of other teams within the company. They must be able to express complex ideas in simple ways so that their co-workers can learn and come up to speed quickly.
An engineer who is very smart, but does not communicate or interact well with others, reduces not only their own effectiveness and value, but sometimes causes damage to company culture and morale.
7. Great Software Engineers Understand the Current and Future States of Software Engineering
In the past, common engineering wisdom maintained that a good engineer could program in a number of different programming languages. This point is easy to criticize because to be a true expert in one language the engineer must spend most of his time programming in that language.
If the programmer jumps between a number of different programming languages, he or she will be able to program somewhat well in all of those, but likely will not become an expert in any of the languages.
What seems to be more of a priority for engineers moving forward is to be able to tell which languages and technologies will be right for the programmer moving forward in the types of projects he or she wants to participate in. After the engineer develops a sense of the future of their field, he or she will be better able to choose which languages or technologies to learn and grow their expertise.
8. Great Software Engineers Are Flexible and Creative
In addition to being open to switching languages and adopting new technologies as they evolve, to be a truly good engineer, it is important to have a sense of creativity in how the new technologies may be used. New technologies and languages often open up new software use cases that may not have been available before.
If the engineer is creative in adopting the new technologies, it increases their potential for possibly uncovering a great new product or a winning feature that may be crucial in helping propel their company forward.
9. Great Software Engineers Can Switch from Back-end to Front-end
It is true that many software engineering jobs today will never require the developer to program any front-end features. You still hear the occasional engineer plead that they will “do anything except front end coding,” but it is becoming an increasingly valuable trait in a software engineer to be able to smoothly transition from front end to back end development.
10. Great Software Engineers Can Multitask
Modern software engineering at big and small companies is increasingly lean and agile. That means that deadlines are getting shorter and workloads are getting larger. Chances are that no matter what kind of project you are working on, you are getting an ever-increasing list of tasks that must be accomplished using an increasingly wider amount of third-party APIs and technologies. The entire scope of technologies is very difficult to know well.
The ability to quickly learn new technologies and put them into action has always been valued highly in the software engineering world, and it is increasingly so these days. Being able to bounce around between and quickly adapt to the different technologies, APIs, and programming languages is something that software engineers will find very useful moving forward.
Did I Miss Any?
If I failed to include an engineering trait that you feel is valuable, let me know in the comments and get the feedback of other engineers as well.