Once upon a time, a recruiter and a hiring manager had a conversation. The recruiter wanted a commission, and the hiring manager wanted a software engineer (the best, of course). The hiring manager produced a long list of technologies (apparently every technology that had ever been used at his organization). The recruiter put these in a job description, and posted it on LinkedIn. After weeks of searching, the recruiter found the one candidate in town who had apparently worked on every technology known to the human race.
While the hiring manager had some reservations, it was hard to argue with the resume. The skills and experience seemed like a perfect match. So a deal was made, another transaction consummated. The recruiter was happy, the hiring manager was happy, and the candidate was happy. However, time has a way of exposing faulty business processes. In this case, it was the extreme focus on skills with a complete disregard to competencies.
It became apparent within a few weeks, that while the newly hired developer had an academic knowledge of every technology ever created, he wasn't able to use that knowledge to produce working code. He was able to hold in-depth conversations about why a particular bug existed, but yet was unable to fix them. Conversations about what he had specifically done to come to a solution were met with long-winded explanations of nothingness.
Luckily (if you want to call it that), the hiring manager had made enough bad hires in the past, that he only did contract-to-hire. So he let his new developer's contract expire after six months, and then met with the recruiter again. But this time he decided he'd do it different. He'd also add a requirement for the knowledge of a new technology that hadn't yet been implemented in his organization. Because developers who knew cutting edge had to be good!
A common problem when hiring software engineers is the tendency to focus on the things that are the most tangible and easiest to measure. These tend to be areas like knowledge ( frameworks / technologies / tools ), education, and experience. While these areas are important, they don't come close to providing a complete assessment. The set of essential software engineering competencies are a much better predictor of engineering success and productivity.
Exercising sound judgment consists of the ability to incorporate past experiences, stakeholder needs, priorities, facts, and constraints to arrive at a decision that is going to be the most beneficial for the organization. It requires the ability to deal with situations in a realistic and sensible way, even if theoretical wisdom would advise taking a differing solution. It involves dealing with ambiguities to help figure out which items are truly important.
See the following article for ideas on how to identify engineers with great judgment and decision-making skills.
The ability to communicate both in verbal and written form is critical as a software engineer. Software engineers may create design documentation or try to convince those within their organization why they should adopt some new technology. Either way, the ability to clearly express one's thoughts is necessary. Modern software engineering is extremely collaborative, and the ability to communicate well is required to influence, explain, collaborate, and inform.
For every software task completed, there is a customer waiting on the result. The customer may be internal or external. Regardless, an engineer's work is ultimately consumed by some customer at some point. Does an engineer attempt to think like the customer? Do they try to anticipate the features and functionality that might be requested before the request is actually made? Their ability to anticipate change before it happens will make their customers extremely satisfied, and will help brand them as a visionary.
How well does a software engineer work within a team? Do they work collaboratively with team members to help achieve common group goals and objectives? Do they enable their team to work more efficiently by providing value beyond completion of their daily tasks?
Engineering positions that do not require teamwork skills are rare. Most development roles include extensive (and sometimes intense) collaboration within the team, and between teams and groups. The inability to work well with others significantly limits the scope, influence, and effectiveness of today's software engineer.
The ability to coach and mentor allows engineers to leverage their skills in ways that help others grow and develop. Some developers have incorrectly thought that they have more leverage when they keep their knowledge secret (they wouldn't dare fire me because I'm the only one who knows this stuff). However, the ability to help others grow is immensely more valuable than being the sole owner of a key piece of technology information. Technologies become obsolete, but the ability to mentor is a lasting skill that can be used forever.
Mentoring can be done formally or informally. This may involve showing others on your team how to navigate new functionality,giving a presentation on a relevant technology topic, creating a useful knowledge base, etc. The best developers are continually aware of and leveraging coaching opportunities. Additionally, coaching and mentoring also helps these engineers reinforce their knowledge, and brands them as the authority in a particular area.
Self-awareness is critically important for software engineers. The ability to grow and improve stems largely from maintaining an awareness of both strengths and weaknesses. Great engineers are continually improving their weaknesses (until they've reached a point of diminishing return). More importantly, they have a keen understanding of their strengths, and are always looking for ways to leverage them.
They actively seek out feedback from managers and peers. They use this feedback as a roadmap for self-improvement. They take deliberate measure to improve in specific relevant areas of growth and development, resulting in improved performance, efficiency, and value for both themselves and for their organizations.
See the following article for ideas on how to identify engineers with great self-awareness.
The ability to organize work appropriately may not be the first noticed characteristic of elite developers. However, there tends to be a high level of correlation. These engineers are continually evaluting tasks in the context of priority and impact. The work they finish often has a lasting impact beyond the completion of the task. These tasks involve work that leverages time. Maybe it's automating repeatable tasks, improving business processes, or improving quality. They have a logical process for managing work load, and set goals that will benefits both them and their organization. Their ability to prioritize tasks and goals helps them remain productive and calm even in chaotic situations.
Political savvy and influence is an area of weakness for many engineers. They are often not interested in navigating organizational politics to get work done. While this competency is important for engineers in any size organization, it is especially important in large organizations. Often in small organizations, change can be implemented on the merit of an idea, or the credibility of the developer proposing it. While credibility is important in any size organization, it is much easier to gain it in organizations that are small enough where every developer's contributions are highly visible.
In large organizations, where individual contributions can easily be buried under layers of beauracracy, it is especially important for developers to leverage their ability to influence. The change process often involves multiple teams and groups within the organization. Developers pushing change who haven't built up organizational credibility will continually be frustrated by organizational inertia and inability to get traction for good ideas.
The elite software engineers recognize this inertia as a cost of doing business, and they work hard to build up credibility within the organization. They present relevant information to differing groups of people in both formal and informal settings. They know and understand who can help push their agenda, and they find ways to engage these key individuals. They are relentless in pursuing good ideas, and resourceful in finding ways to get others involved and engaged in the change process.
See the following article for ideas on how to identify engineers who have the ability to influence others.
Exceptional developers have ability to deal with problems in a holistic way that goes beyond tactical measures to achieve a comprehensive solution. They are able to distinguish between strategic and tactical measures. They continually prioritize tasks to make sure they are aligned with the organizational goals and objectives. They tend to focus on the total cost of ownership, and are not generally inclined to a 'quick fix' if there is a more permanent solution to a problem.
See the following article for ideas on how to identify engineers who employ strategic thinking.
Creativity and resourcefulness are not necessarily the first competencies that comes to mind when attempting to identify the best software engineers. However, the act of writing software is often a highly creative activity in which resource constraints are numerous and frequent. There are times when seemingly-impossible objectives are not the result of complicated problems, but rather the result of an extremely constrained environment. Often the constraints of the problem make a conventional solution impossible. These cases require an engineer's creativity, resourcefulness, and outside-the-box thinking to produce a novel and innovative solution to a tightly constrained problem.
See the following article for ideas on how to identify creative and resourceful software engineers.
Have you ever noticed a problem, and then fixed it without being asked? Or observed an opportunity, and then capitalized on it? This is common behavior for the most productive software developers. They are continually improving things when they notice ways to make them better. They don't wait for instructions, they are just natural "fixers." While often the effect of a single fix may not be terribly significant, the accumulative effect over time makes these contributions extremely valuable.
See the following article for ideas on how to identify software engineers who take initiative.
Technology changes incredibly fast. Competitors are continually bringing new products to market. The technical landscape changes monthly. The best developers are continually evolving their skills. They learn knew technologies, they embrace new development processes, and they don't become too emotionally invested in any particular process or technology. They are passionate about continually evolving whenever it presents an opportunity to become more efficient.
What is an engineer's ability to learn new things? Do they have the capacity for logic and abstract thought? Do they possess the ability to think through a problem and come to a logical solution? Are they able to draw meaningful conclusions by analyzing data? These are all critical skills for engineering excellence.
To maintain a high level of performance as a software engineer, one needs to be highly motivated. The relevant technologies are constantly changing, and it requires signicant effort to stay up-to-date. Some of the most successful engineers are the ones who are intrinsically motivated by the challenges of solving difficult software problems. This challenge is often the impetus to learn about new technologies that may provide solutions to existing problems.
See the following article for ideas on how to identify motivated engineers.
Do you love your job? Are you excited by the prospect of a new challenge? Are you energized by problems that you encounter in your daily work? How does your passion and energy affect your productivity?
Just like any profession, software engineers who love their job have a tendency to be more productive at it. While it is not always the work (it may be the organization or the manager), a lack of passion may be a signal that it is time for a professional change.
See the following article for ideas on how to identify passionate and energetic software engineers.
Skills are important, but competencies are more so. When hiring software engineers, remember that skills and experience provide a snapshot of productivity, but competencies are going to be a better indicator of career trajectory and potential.
Thanks for reading (this sentance)! This is the section where I ask you to do things that will have no apparent benefit to you (like sharing this article). However, if you thought it was a good article (I was going to say 'great article', but figured that I would probably be setting the bar too high), sharing it will make you look smart amoung your friends. If you thought it was terrible, you could still share it (and ask your friends if they think it's as terrible as you do). In either case, you will continue to impress your friends with your ability to discern a good article from a bad one. And as a side benefit to me, it might increase (if only for the briefest moment), the incredibly meager visitor traffic and rather terrible SEO ranking that is currently possessed by this site.
However, if asking you to share a bad article (or even just an 'OK' one) would cause too much damage to your stellar reputation, you can still help more anonymously. If you found the slightest thread of value in this post, you could read one more article from this site. This would help my bounce rate, which is hovering just under 100% (if you're not familiar with the metric, that's a pretty poor number). Of course, if you found this article totally worthless, I would suggest not coming back. While the quality of the articles may improve as I get more practice, I really doubt if they'll improve enough to change your mind.