Sports generally have some fundamental skills that athletes drill endlessly. These fundamentals are the foundation for good execution. They must be committed to muscle memory if the athlete wants to focus on higher-level skills and strategy. In fencing, footwork is fundamental. What is the equivalent for software?
This idea was prompted by Dare to Lead, which uses the sports analogy to consider fundamental skills for leadership. Great book.
I can’t speak for developers at large, let alone other roles, but here are some of the skills I’ve invested long-term intentional practice into. I think they underpin most everything I do.
- Small and complete increments of work
- Small and complete commits
- Considering a few alternatives before coding
- Trying to externally communicate ideas early and often (maybe just to a text doc, maybe collaborative processes)
- Always starting with and constantly tying back to motivations of the work being done
- hypothesis-test cycles
- Test-Driven Development or a similar test-code loop. Can also take many forms before coding even starts (like duck docs)
- Good naming & readability
Several seasoned developers I respect write about intentionally practicing small increments of work. Some examples are
- Mark Seemann’s diamond kata or roman numeral kata,
- Robert Martin’s terrain generation
- Martin Fowler’s Refactoring
I’ve also found it worthwhile to be very familiar with my editor, but I don’t explicitly practice it regularly. Features like regex-based find and replace, multi-line editing, move line up/down, hot keys for various test run selections, and go to symbol are worth committing to muscle memory. These actions are so common that the time savings add up and they reduce breaks in flow.
Overall, I really like the fundamental, muscle-memory ingrained, skill analogy. Intentional practice is critical to forming expertise. Identifying and normalizing practice routines for software skills could be rocket fuel for team maturity. I know kata are somewhat meant for this, but many kata I’ve encountered are geared only toward algorithms or language syntax.
I’d be interested to hear what skills other people practice.