
One day, my bike tire broke miles from home and I found a way to fix it. That’s what I learned: Even if you don’t have all the tools, you can improvise. – Tony Ferguson
Last time we discussed developing hard skills. This requires disciplined, consistent practice. Focusing on the fundamentals. This time we look at developing soft skills, which takes a much different approach. Soft skills require curiosity, exploration, and improvisation.
Think of how a comedian practices. Yes, there are some fundamentals that have to be mastered: language, timing, delivery, body movement, etc. But the difference between the new guy at the local comedy club, and Jerry Seinfeld is a lot of practice in front of audiences. Most great comedic talents practice in front of live audiences so they can keep their skills at peak levels. This is because a live audience is unpredictable. The comedian has to deal with hecklers, recovering from jokes that bombed, and any number of distractions that could throw him off his game. But all of this “dancing” is what creates the magic of an amazing performance.
So what does that look like in software development? There are some developers who have the amazing ability to write code quickly that just works. And it works well. And they seem to have at their beck and call any number of clever approaches to solving a problem. How do they do this? Well, for one thing, they write a LOT of code! But more than that, they vastly expand the variety of programming experiences they are exposed to. For instance, they generally know multiple programming languages, can work on any operating system, can easily swap between functional and imperative programming, and they have dozens of tools at their beck and call that they use in creative and powerful ways.
How do they do all that? First, they master the basics. They learn a variety of programming languages – not necessarily useful ones. But the exposure to different languages gives them insight into what syntax is similar and what is different between languages. And why. Knowing F# doesn’t help with Java, until you start to put together a lambda expression. Then you can see how it would be specified in other languages, and it all makes more sense.
What other basics do you need to know? Tools, like Git, Bash, PowerShell, VSCode, etc. Knowing how these and other tools work – in depth – is like having Batman’s tool belt. Other basics like design patterns, code smells and refactoring techniques, TDD, BDD, and many others all need to be second nature. You learn these hard skills through practice.
But you develop those amazing soft skills by taking those hard skills and using them in unique ways. Ways that are unpredictable and are just at the edge of your comfort zone – if not slightly outside. Coding challenge web sites can be a big help with this. You can work a coding challenge with an unfamiliar language to GET familiar with it. Or limit yourself to not using “if” statements.
Pairing with another developer on a kata can be a tremendous way to develop these skills. One becomes an intelligent keyboard and the other works at solving the problem. Then you switch seats every five minutes.
A bigger challenge might be to implement a deliverable application by the end of the weekend. Say your tennis club needs a court-scheduling program for tournaments. See if you can solve that problem over the weekend. Challenges like these keep your hard skills honed, and force you to be more creative in how to solve problems.
Rise to the challenge. Master the skills. Practice true mastery. Then software development will never be boring again!

