Consider, if you will, a company that has an engineer whom they consider a “rock star.” He is constantly asked to put in extra time, which he does without question. He fixes every bug that comes his way, even when he considers it a requirements problem instead of a bug. Invisibly to the business, he does behind the scenes technical refactoring so that he does not cause an impact to the constant stream of incoming functionality requirements. He pays for any mistakes he makes with his own sweat equity because there is no room in the schedule for non-functional work. He does what he is told; he doesn’t discuss business assumptions, he just makes stuff work. Other engineers have come and gone, but they did not seem to understand the code that this fellow produced. He is clearly a cut above. Obviously a rock star. Right?
Well, he might be a rock star by that company’s standards. But this company fairly obviously has little respect for software or engineering as a craft. So, the time may quickly come when he is no longer an “A” player: perhaps he wants to learn a new technical skill, stop giving away his weekends, or when he has kids and can no longer do eighty-hour weeks. Then, the company will find a more subservient replacement. He might as well be shoveling rocks into wheelbarrows for a living.
Shoveling rocks into wheelbarrows? That’s not a rock star in my definition.
Different people have their opinions. For example, Jeff Weiner of LinkedIn fame posted his now-famous Venn diagram, “The Three Qualities Of People I Most Enjoy Working With” here. It obviously resonated.
So, without further fanfare, here is my own inherently biased definition of what makes a rock star software engineer! It is based on a few key attributes of the really amazing people whose paths I have crossed in my own software life.
1. Enjoyment In Creating
Any engineer with a degree of longevity in the software space usually has some degree of real enjoyment of the craft of building something. This manifests itself in a variety of ways: open source projects, voracious learning, experimenting with topics outside of one’s domain, and so forth. Pushing oneself brings perspective, opens the mind, and invokes the possibility of more creative solutions that might not have come to the fore with a limited viewpoint.
An engineer with this attribute will naturally continue to grow his or her own skills over time, which hopefully translates to deeper enjoyment and fascination with the art and science of engineering. That means they are probably very good coders, regardless of the language or technology that they use.
Interestingly, those having this attribute may find it difficult to survive in environments that do not have the same respect for the craft. I think this is simply because there will be little time allocated for researching new ideas and limited support for approaches that are too complex for decision makers to grasp.
2. Adjustable Perspective
What I mean by “adjustable perspective,” is the ability to change one’s own perspective via self-directed means. True rock star software engineers recognize when they get locked into a specific way of thinking, and they have ways to push, pull, or prod themselves to look beyond that. I consider this to be the most difficult skill to master. It seems to be easy in some instances, and very difficult in others.
Engineers with this mindset do not easily fall into the abyss. They are not above getting help from others that have expertise that they do not possess, even if the topic is less than pleasant.
Engineers sometimes have trouble balancing the purity of the craft against real-world delivery. The ability to be a good craftsperson must sometimes become a tradeoff. As difficult as this can be, it is sometimes even more difficult simply to recognize when the trade-off must be made. With a pragmatic perspective, this recognition is within reach.
This perspective can and should drive the engineer to try to understand the business domain, and to try to frame his or her viewpoint in order to drive the business forward. It might mean becoming an evangelist in a topic that was not previously an area of expertise. It might mean leading some unpleasant projects before there can be pleasant projects. In this aspect, it is a very rare and difficult skill to master.
I have seen engineers who seem completely and totally incapable of adjusting their own perspective. There is nothing “wrong” with this, but it does tend to be self-limiting. I don’t how or if this skill can be taught, but the top software engineers seem be able to do it under a variety of conditions.
3. People Skills
You knew that this one would be on the list, right? Yeah, and it is another very tough skill to master, particularly with engineers: the thorny topic of people skills.
This is a broad topic and books have been written about it, so I will distill it down to what has served myself and my colleagues the most:
- The ability to listen
- Empathy for the position of others
- The ability to know when to talk and when to stay silent (definitely not easy!)
- The skill to adapt to an audience
- Patience in dealing with people (also far from easy)
- The ability to trust and to be worthy of the trust of others
I’m not sure anyone has all these things nailed to perfection! That said, the most amazing engineers I know have several of them mastered.
In this context, integrity means several things. It means following up on your work. It means the ability to avoid throwing others under the bus, even if they do that to you. It means doing what you say, and saying what you do. It means giving honest feedback in a constructive manner, and taking feedback in the same manner.
This is a skill that I have worked on to a large degree for myself, and I think it shows in my daily exchanges with my colleagues. But one must still have personal bounds where integrity is concerned. Having integrity does not mean falling on swords for others or for your company. It means operating with a certain code of personal and professional standards, regardless of whatever is flying at you on the job. It may require some disagreement and some resetting of expectations at one time or another.
5. Coping Skills
The ability to calm down and relax is not discussed much these days, but nervous-fueled anxiety is not something I usually see in the most rocking of rock star software engineers. Granted, there is often high stress, but there is usually the ability to cope with that stress without breaking down.
Quite often, a sense of humor is part of the coping skill set, meaning the engineer does not take things so seriously that it becomes personal, negative, or unhealthy. When work is serious, and pressure is on, there is still an element of humor possible in any situation. The trick is to use humor as a tool when needed. This helps to keep things positive, motivate the team, and stay on point. There is ample humor fodder in meeting effectiveness if you care to look!
Another coping skill is simply the ability to draw a boundary on work-life balance. Nobody can work at 100% intensity all the time while still doing quality work. The best people realize this and attempt to find other creative outlets, or simply take a break when they need it. This is one of the things I have struggled with myself.
While there are more attributes we could observe in top engineers, these are the ones that I think are the most significant and also the most difficult to build. Not coincidentally, I think they are also among the most rewarding.