What makes a great software engineer (and how we can all be better at our jobs)
As software engineers, our job is to write great software. We aspire to be the best at what we do. So we focus most of our time practicing our skills and broadening our technical knowledge. Then we display said technical skills and impart our new found knowledge in order to be judged as a better engineer. Yet there’s always more skills to acquire and more knowledge to gain. When will it ever end? Well, maybe we’re doing it wrong!
I recently attended a LSCC Meetup and heard a rather thought provoking lighting talk from Mani on the subject of ‘the real essential skills for a developer’. The talk only lasted 5 minutes and left me questioning how we, as software engineers, judge each other. I think the point the speaker was trying to get across to us was really important and worth more than the five minutes allotted. So I decided to spend some more time thinking and writing about this. Bear with me if it gets a little philosophical.
I’ve read a bunch of these ‘how to be a good developer’ blog posts before - there’s loads of them around. And I know that they all say pretty much the same thing, but wanted to prove it. As it is apparently good to be lazy sometimes and I don’t have the time to read them all again, I decided to think outside the box, use the tools at my disposal and Google the answers. As I said, I didn't have time, so I copy-pasted the first 10 pages into a word cloud generator to get the general idea and find the patterns of recurring topics. Oh and I made the words fit into a cloud shape because, well… Salesforce :)
The results are what we’d all expect. Apparently to be a great engineer you need to be pragmatic, a perfectionist, technically strong, a polyglot, experienced, business minded, knowledgeable, know every design pattern, some kind of genius, have a masters in mathematics, and time... You need lots of time.
Each of the blog posts and discussions I found gave the same message. To be a good developer you need to develop strong technical and cognitive skills. You need to spend years honing these skills and then compliment them with soft skills when in the office. Things like being a good communicator, being disciplined and having patience.
Apparently the ultimate master of these skills is the ‘rock-star developer’ (shudders). Someone who seems to know everything, does all of the tasks they‘re asked to and usually works a 16 hour shift. To anyone who regards themselves as (or is aspiring to be) a ‘rock-star developer’ please stop now. There’s a reason so many rock stars are alcoholics and die at a young age!
I’ve been writing software for over 15 years and while I agree that the technical and soft skills are important, Mani’s lightening talk reminded me that there is never enough time to master everything. If all that we are aspiring to strengthen is our technical ability as programmers, then we’ll never reach our goals. Plus, we’ll probably burn out many times along the way. Mani suggested that the real essential skills are deeper inside us.
The analogy he used to illustrate his point was the Earth’s structure; with the crust being technical skills, the middle being our soft skills and the core being that something else inside — which really determines how well we operate.
The point being that there are other valuable skills which we’re far less aware of, spend much less time trying to master and yet fundamentally affect our ability to achieve our goals, regardless of our profession. It’s thought provoking stuff but the crowd was left a little disappointed that, while Mani suggested a few possibilities, he couldn’t tell them what the most important inner skills were, instead telling us to spend the time ourselves to focus on what is in our core.
Being developers, we are used to getting proper answers, and given we were at a coding meetup, it would have been easy to disregard this as a little bit ‘tree hugger’. But it stuck with me and I’ve found myself starting to contemplate what that ‘core’ really is, and what those hidden skills could be.
Trying to identify these fundamental, undocumented skills is a far greater challenge. Just take a moment now to ask yourself, what non technical, non social skills make you good at your job? Its difficult right? After a few days thinking about this I realised that I needed to look at this from another angle. I could actually use something I practice every day to help identify these things. So, I changed the question — what non technical, non social skills may hold us back, and how can we fix them?
Instead of searching for the hidden skills which are helping us to be great developers, I soon identified some of the bits I think we sometimes struggle with. I believe these may be just a few of the hidden skills that help form our ‘core’, but identifying them is also one of those skills and something we all need to reflect on. Here’s a few to get you started…
Disconnecting
Ever solved a problem in your sleep? How is that even possible?
When developers are overworked we are not reaching our full potential. In some cases, we’ll reach burnout and become somewhat useless. The notion that that working too much is actually limiting us may sound counter intuitive at first. But learning to disconnect from our work — be it for a few minutes during the day, an evening or a weekend — is fundamental in order to maintain a healthy mindset, have clarity of thought and, most importantly, to achieve the next skill :
Focus and Self Awareness
Remember how time was mentioned again and again by every blog post you have ever read about how to become a great developer? You probably cant remember the list of skills you need to learn though — its too long! Sure time is fundamental in order to acquire these skills, but how we use that time is something we probably don’t think about enough.
Its far too easy to get caught up in the whirlwind of work we have to do and overwhelmed by the skills we have to use. But usually stepping back, re-assessing and refocusing our attention onto the few things that are really valuable can help us to work more efficiently, learn the most valuable skills and maintain a healthy state of mind. It can help us identify what really matters to us and where our passions lie.
Some of these blog posts may mention how the ability to maintain lots of information and models in our head at any one time is valuable, but surely its better if we don’t have to?
When our ability to focus is out of our control we may need to use our ‘soft skills’ to communicate this to the team and find a solution that allows us to remain focused. It may be harder than it sounds but invaluable if you can manage this.
Rational Thinking and Emotional Intelligence
As developers, we are used to thinking through problems logically, but we’re also humans and sometimes our brains like to use emotion when we’re not coding. When we cannot focus it becomes harder to rationalise and emotion takes control, which in turn makes it harder to focus.
Our jobs can be stressful at times and working closely with colleagues, all of whom have different skill-sets and experience, leaves us susceptible to emotional reactions.
Soft skills that promote good teamwork such as communication and patience only work when we can think through things with clarity and process conversations without allowing our passions to boil over. If we can master the arts of rational thinking and emotional intelligence we have a greater chance of making the best decisions, avoiding unnecessary distress and and learning more from our colleagues.
Enablement and Outward Focus
A good developer creates great software. Great developers help create other great developers.
Once you have managed to focus internally and self reflect on what matters to you as a developer, you may realise that support from your team is valuable. Try directing your focus to others. If you can identify ways to help colleagues learn and grow — whether its by imparting your knowledge, helping them to obtain focus, or allowing them to discover things for themselves — then you will be rewarded with more time, as they share responsibilities and grow with you, and the facility to focus on your own passions even more.
In conclusion — while we shouldn't stop striving to improve technically, we need to spend more of our time reflecting on what matters, focusing on what is valuable, and most importantly, spend time not being a developer.
Our skills which are on display may be the consequence of being a good developer rather than the cause. And the path to being the best we can may well be through our ‘core’— the real challenge is identifying what those hidden skills are and learning how to master them.