Software development today is quite demanding and delivering successful software projects requires a broad set of skills.
We've recognized three essential skill categories which are essential in software crafts.
- Human: People skills, social skills, personal career attributes, etc.
- Strategic: Bigger picture, techniques and methodologies how to work effectively.
- Tactical: Typically, technical traits such as programming languages.
Mentioning human skills might sound strange, but it is quite essential. We're not writing code alone. We write it with the team and customer. Interacting with the team and customers requires some human skills and empathy. This is not to say that one must be a "people person" or an "expert in communication". It's more of a reminder that we need to interact, communicate, negotiate, etc. in order to be effective.
At the beginning of one's journey to mastery these might not be that relevant but the further you path takes you the more important these become.
For example, we need to constantly learn new things to stay sharp and improve our craft; take responsibility for our actions; have the courage to rise and discuss difficult issues; and teach others by sharing our knowledge.
Communication is essential in our work in many ways. For example, the code we write should be readable even for new novice programmers once they are familiar with the domain.
Clear and effective communication is one of the key factors for successful software projects. Poor communication is the primary contributor to project failures.
Compassion helps us to look at things from another person's perspective and to adjust our communication accordingly.
In addition to traditional non-verbal, verbal and written communication skills there are many other useful skills. Visual communication is one of those - "A picture is worth a thousand words".
There are a vast amount of communication related topics to learn from such as organizations, individuals, teams, etc.
Improving communication skills is essential. It can be as simple as learning about emphatic code reviews or blameless postmortems.
Strategic skills are powerful high level traits, tools, techniques and knowledge for software development.
These could be characterized as wisdom of how software can be written effectively. Ironically, it requires some wisdom to choose what to apply and when.
Test-driven development (TDD) is powerful since we have to think before we start coding, it forces us to look at things from a consumer perspective.
Domain-driven design (DDD) helps to think in business terms and to foster ubiquitous language within the project.
Extreme programming (XP) lays some of the core foundations for agile software development and software craft movement. It reminds us what is important (values and principles) and provides a set of useful practices.
TDD, DDD and XP are perhaps the most important for us. But there are plenty more, such as knowing different software architectures, error handling techniques, how to scale things, etc.
Tactical skills are the "bread and butter" of software development. They are typically technical and low-level know-how. It is advisable to expose oneself to a broad spectrum of these.
These include things like programming and scripting languages; frameworks and libraries; build and deployment tools.
Becoming an expert in some specific technical solution or area can be quite satisfying and beneficial for career-wise.
However, highly advanced technical skills can lead to solutions with a steep learning curve. Therefore, one should try to keep things simple, clear and accessible for all team members. That is, don't become a tactical tornado.
We identified three essential skill categories: human, strategic and tactical. Tactical being low-level tech skills such as programming languages. Powerful strategic skills on how to build software, such as TDD. And finally, a broad set of human skills to help us succeed in our work.
Improving all skill areas is important. There is no single skill that will lead to success. Balanced skill set with some specific focus areas might yield the best outcome.
Next part will focus on value.