It takes more than hard skills to build great software
I am shaping the skills of the future! Okay, that sounds incredibly grandiose, but I recently took part in a session run by Mercer the previous week to help the Singapore government update the map of skills and career paths for the ICT sector.
We focused on the career paths portion for the Software and Applications track. My contribution mostly consisted on clarifying the roles and simplifying the structure into front-end, back-end, and infrastructure engineers. This led to a whole lot more discussion on granularity, where Infrastructure sits & what in the world do we do with DevOps Engineers.
We did not discuss skills for these roles, otherwise we would still be in that conference room. Skills mapping is an incredibly difficult exercise. I attempted this over a decade ago with a startup I launched in the workforce analytics space that mapped corporate goals to skills. We spent months figuring out the how skills comprised various domains and roles.
Besides the ability to program in a language, what else would be considered the key skills any competent developer needs? There are thousands of blog posts on this topic with various perspectives. When you unravel the opinions though, three themes emerge:
- Problem solving & critical thinking over programming languages
- Software development is more than just writing the code
- Soft skills are even more important for project and career success
What is more important than the semantics of the language is how one applies code to tackling a problem. Knowing all the syntax of a language is pointless if you do not have a solid basis in algorithms, mathematics, statistics, and problem solving. The code is simply a proxy for using more fundamental skills to translate your thinking into something a computer understands.
Beyond thinking about the problem and the code at hand is the process of getting code to production. When I began my career as a developer, I checked my code into SCCS. That was it. I wrote zero tests, did no QA, and was oblivious to what happened in production, unless there was a bug in my code.
While there are software teams that still operate in this manner, many organizations have nudged closer to the DevOps view of software delivery. The need for shorter deployment cycles and faster turnaround means developers are owning more responsibility for writing production ready code. The modern developer needs to be conversant therefore with the entire code delivery chain and how the various parts operate.
The knowledge needed by developers now extends well beyond the deployment of code. The nature of technology is such that while certain things have becoming easier through API’s and abstractions, other areas of computing have taken on more complexity. There are multiple cloud providers, voluminous digital channels, a variety of containerization strategies, the rise of serverless, and the intersection of AI, ML, and Data Science. The amount of technology being employed, and the code underneath it, is staggering.
Things like languages, engineering principles, architecture, and even thinking skills to some extent are all categorized as “hard skills”. They are hard because they are learned skills that can be tested for both knowledge and proficiency. They make good resume filler.
This is in contrast to soft skills, as defined by Wikipedia.
“People skills, social skills, communication skills, character or personality traits, attitudes, career attributes, social intelligence and emotional intelligence quotients”
The nature of these skills makes them harder to quantify. There are plenty of assessment tests that purport to measure and analyze these skills, but they generally fall into the realm of squishy personality profiling or rubrics based more on biases and whims than science.
Yet it has never been as important as now for developers to develop soft skills. In my work with engineering teams, the most effective and productive teams are not the ones that have developers with the deepest technical skills. The most successful teams have a well-balanced set of skills and a strong foundation built on soft skills. This enables the team to communicate, collaborate, and problem solve more effectively, and creates a culture of openness that results in better quality code produced faster.
A significant factor in a well-functioning engineering team is a supportive engineering culture. Joel Spolsky shared his views on a great culture in his famous Joel Test. In more recent years, Pamela Fox wrote an updated take on developer culture. The reason they harp on culture is that when you have a good culture, it attracts the type of developers that often work well in a team-based, collaborative environment to support good engineering practices. This creates a cyclical effect of helping bolster the team culture.
Given how important these skills are, it seems strange to label them “soft skills”. Perhaps it is better to call these “relational skills” and to refer to hard skills as. “technical skills”. The ability to relate to the world, to the vision of your organization, to your team and most importantly to other humans is what helps us best navigate our work to create the best outcomes. It is impossible to write great software in total isolation. Case in point is the open source community that has clearly demonstrated the case for collaboration.
What skills should developers be most in tune with and develop? There is a great article that talks about ten “relational skills” every developer needs, but focusing on these three below will make the most immediate impact to the success trajectory of a developer:
- The ability to communicate clearly — I once met an engineering manager who told me that he asks job candidates if they ever wrote a question that got accepted on Stack Overflow. It is a clever tactic as asking a good question is actually really difficult. Beyond just question asking, a developer should be able to clearly explain her code and ideas to others both verbally and in written form. This extends to team situations when one may need to advocate and influence certain decisions which could impact the work, the team, or the project.
- The ability to solve problems — This should be an innate skill for anyone that is coming into the engineering field. Often in solving problems, we only think about the tactical considerations before us, but that can lead to catastrophic flaws. The best developers think about the second and third level effects of the problem and any solution they apply. The ability to think more expansively and creatively helps produce better solutions.
- The ability to consider others — Empathy is not often associated with software. We should be placing a greater emphasis on it however given how unconscious biases creeps into code. This means actively cultivating a perspective that is outside of ourselves and puts us into the mind of others. Something as simple as actively listening and not interrupting others can have a huge affect in the impact of your communications and ability to influence others.
What would you consider the most important skills for developers? How are you evaluating these skills in your hiring and career development processes?
How to manage a developer who has poor communication skills?
Some good perspective on thinking outside of the just the individual…
We help IT leaders in enterprises solve the cultural challenges involved in digital transformation and move towards a community based culture that delivers innovation and customer value faster. Learn more about our work here.