Soft skills for software developers
Developers are usually most comfortable when problem-solving on well-defined technical tasks, but struggle with softer skills involved in problem definition, or with ambiguous or more people-centric tasks. These skills are essential as you grow more senior, but are important at every stage of your career.
Teams lacking these skills will often end up communicating poorly with non-developers, struggle with prioritisation, and frequently end up feeling overwhelmed and somewhat directionless. Frequently the feeling is that everyone is individually very good at their job, but the team as a whole is not quite working right, in a way that prevents people from working at their full effectiveness.
I offer short classes for companies who want to help their developers level up in these skills. These are a mix of hands-on practical advice from my career as a software developer and consultant, theory that is useful for reasoning about the problems you encounter, and discussion of the emotional and social dynamics of putting these skills into practice.
After a class, attendees will have a better way to think about the problems they face, and practical tools that they can deploy to immediately improve at them. The result is more effective and happier teams that are better able to take advantage of their existing strengths.
Each of these is 90 minutes long, and is run for a group of up to ten people. I usually run them remotely over Zoom, but am open to running them in person for companies in or near London.
If you would like me to run any of these classes at your company, please email me at david@drmaciver.com or book a consulting intro video call to discuss it.
Current Classes
I currently offer the following classes.
Introduction to coaching
Learning outcome: Your peers can come to you for good advice.
This is a classes on basic coaching skills, with the goal of helping a company set up a peer coaching practice.
Students will get a short introduction to coaching, why it’s useful, and how to do it, followed by an opportunity to practice these skills with each other. We conclude with a discussion of how to integrate peer coaching into your company, in order to help put these skills into practice.
This is of necessity not designed to be a full coaching course, and is certainly not a substitute for training with an official coaching body. It’s instead designed to help people get to the point where having them coach you is more useful than doing nothing, so they can learn from practice. It’s based off material from my How to give good advice article, which has the core premise of “Be more useful than a rubber duck” (i.e. explaining something to you should be at least as helpful as explaining it to an inanimate object).
This is a very useful skill to have even if you never set up formal peer coaching at work, but it really shines as the start of a peer coaching system.
Communicating technical concepts
Learning outcome: You can explain complicated technical concepts to anyone with the patience to listen.
This is a class on basic communication skills, with a focus on explaining technical concepts to people in a one-on-one setting. This is far from the only communication skill people need, but it is the foundation of all others - if you can’t do this one, you will probably struggle with other communication skills - and is particularly important for developers, who often have to explain things to their coworkers.
This class is a mix of short lectures about useful principles and tools. It is very loosely based on my piece How to explain anything to anyone, which describes the basic model of explanation as:
- Decide what you want to explain.
- Find out what the listener already knows.
- Express the first in terms of the second.
Although this seems simple, people very regularly get each of these steps wrong. This class will give people a basic sense of how to diagnose problems with your explanations and improve them.
Faster decision-making
Learning outcome: You will make decisions faster and with less stress.
This is a class on how to make decisions quickly, and when it’s appropriate to do so. Software development includes many such decisions - should we build it this way or that way, which library should we use, etc. It’s very easy to get hung up on making the right decision, and end up putting far more effort than is actually useful.
In this class we’ll cover some basics of decision making, what types of decisions can and can’t be made quickly, and the underlying emotional and social dynamics that makes this hard to implement. The material is based on a mix of There’s no single error rate and How to make easy decisions.
In particular we will discuss how to identify decisions where:
- There is an obviously correct answer and you should just do that.
- There probably isn’t that much in it and you should just try something and see if it works.
This won’t cover every decision you have to make, but it covers a surprisingly large number of them.
Effective estimation
Learning outcome: You will be able to make estimates easily and confidently. You will know when you need to spend more time to refine an estimate. You will know when estimation is not the right tool, and be able to do something better.
“How large a task is this?” is an extremely common question for software developers, and is equally commonly dreaded.
The core problem is that nobody has ever really told you what an estimate is, or how to think about estimation. As a result, this question makes as much sense as “Can you florble the grobnab for me?”, and you do your best to emulate what you’ve seen other people do without ever knowing what a grobnab is and why one might want to florble it.
This class is designed to bridge that gap, by covering some underlying theory of what an estimate actually is, and showing how you can use that theory to produce better and more useful estimates, but also to help you break out of the estimation mindset and ask “What is it you actually want to know?” when you realise you’re in situations where estimates are not actually that helpful.
Custom classes
These classes are really just the tip of the iceberg. I have an extensive collection of topics I regularly talk to people about for improving at work. If you have a problem that you don’t see covered here, but would like a class on, drop me an email or book a consulting intro video call to discuss it. I’m always looking for new class topics to run.
Why this will work
Depending on how well you know me it can be anywhere between completely obvious or deeply implausible that I can help you with this sort of thing. If it’s the former, you can skip this section. If it’s the latter, let me try to convince you.
These classes are based on over a decade of my experience as a software developer. First, in increasingly senior roles at a series of startups, then at Google, and finally running an open-source project (Hypothesis) which redefined the state of the art in software testing, and is used by many major open source Python libraries and numerous companies.
Since then I have worked as a writer, coach, and consultant. These classes are based on problems I’ve seen crop up over and over again, and that I’ve helped people better understand and improve.
Perhaps most importantly, these courses work because they are very precisely targeted interventions. They are based on the idea that people would naturally improve at these skills through practice, except that at some point they get stuck. The reason a short 90 minute class can make a large impact is because they give people the tools and skills that they need to get themselves unstuck and progress to the next level.
This means that these are not just 90 minute classes and then the learning is done. They are instead an intervention that will allow many previously stuck people to continue learning constantly throughout their career.
If you are still unsure whether these classes are a good fit for your company, I’d be delighted to talk to you more about it. Just book a free intro video call and we can chat about your needs and whether I can help you with them.