Daniel Pinho

§ 5 Adequate Skills

Context

Developers use tools in their daily activities, using its available features to build software systems.

Problem

A tool with good usability and proper support for the activities one may want to work on is only sufficient if one has the appropriate know-how to use it best. We are talking about tools with some underlying complexity; while they may provide the proper support for the activities, knowing how to use them is still essential.

How can we best learn how to use a development tool?

Forces

  • Working alone or in a team can shape how we learn, but the presence of others may either accelerate growth through collaboration or slow it down through dependence or conflict.
  • Prior knowledge can give us a running start with new tools, but it can also bias us toward familiar approaches and make it harder to adopt different ones.
  • Resources such as time, budget, and access to information enable skill development, but they are often limited or unevenly distributed, constraining how and when learning happens.

Solution

Engage in a multifaceted skill-building process that includes practice and is supported by guidance from experts and colleagues, written materials, and any other available resources, such as tutorials and community discussions.

Skill building has long been studied across psychology, pedagogy, and software engineering, with each field emphasizing different aspects such as individual practice, team dynamics, or organisational learning. This pattern serves as a high-level guide for skill-building in software development.

A developer should employ a mix of approaches that together provide a more complete learning experience. It is natural that each developer prefers a different combination, but in practice, skill building often involves practice, synchronous guidance from others, and asynchronous learning through written materials and other resources.

Practice, whether this is done in a heavily structured and guided way such as deliberate practice or in a more ad-hoc way such as naïve practice, is essential for skill development. It enables developers to form cognitive connections between concepts, build situational awareness, and strengthen muscle memory. The pattern §13 Practice Makes Perfect expands upon this approach further.

Guided learning takes place when developers learn directly from others in real time. This can happen through structured practices such as pair and mob programming, or more informally when learning by example from a colleague, learning about how they would approach a problem. Mentorship and coaching also provide strong vehicles for sharing expertise, and responsible use of AI-assisted tools can serve as an additional guide when used to explain concepts rather than generate solutions outright. The pattern §14 Learning From A Master expands upon this approach.

Written materials support asynchronous, self-paced learning. Developers often consult documentation, tutorials, books, articles, or community resources such as Stack Overflow when facing unfamiliar problems. These sources complement practice and guidance by offering accessible references that can be revisited at any time. The pattern §15 Written Knowledge develops this further.

A developer’s team can facilitate skill acquisition through knowledge transfer both through explicit and tacit means[1][2]. Collaborating on shared tasks and seeking help directly are key vehicles for tacit knowledge transfer, and themselves act as forms of practice. Naturally, this requires that there is an atmosphere of §8 Team Players. In addition, knowledge transfer in teams can also be done through more explicit and asynchronous means; documentation is the most intuitive way of achieving such results.

However, the team a developer is part of is not the only factor in play, as their background also has an influence. Formal education can offer useful foundations, such as familiarity with core concepts and tools, but it is not a rigid requirement. Many self-taught developers build equivalent skills through independent learning and experience. First-hand engagement with real-world projects is especially effective for consolidating skills and applying them in context[3][4].

Examples

  • Pair programming, along with mob programming, are pair- and team-based development practices where multiple developers work at the same time on the same part of the code, with a driver (the developer writing the code) and at least one navigator steering the driver’s inputs. These approaches enable real-time knowledge sharing within the team, and provide practice time[5][6].
  • Taking time to perform deliberate practice methods (e.g. small experiments, coding katas, practising keyboard shortcuts) is a way developers can practice their skills, in addition to real-work on daily tasks[7].
  • Onboarding processes can combine the three approaches mentioned, providing newcomers to the organisation with documentation and handbooks, mentorship from senior colleagues, workshops, and starter tasks[8].

Consequences

  • The development of pertinent skills bolsters the productivity of a developer, as they are better equipped with the mental tools to carry out their work and have a higher Intrinsic Motivation.
  • Members of well-performing teams can share their skills with each other, and a learned developer can help others who are in a learning process themselves, playing the role of the master in Learning From A Master.
  • Skill building that stems from a developer’s daily tasks, while useful, is not enough, as the workload can be too much and a developer may feel stumped. As such, time dedicated to learning is important.
  • Having access to learning resources, such as reference materials, exercises, and people is important to go beyond naïve practice. Not being able to use these resources will lead to a less efficient skill building process, but it will not eliminate the potential for gaining experience altogether.

§15 Written Knowledge, §14 Learning From A Master, and §13 Practice Makes Perfect are different approaches to consider when developing skills. As for the sources of said knowledge, §8 Team Players, §16 It Takes A Village, and §17 Makers' Guidance are all patterns involved with this topic.


References

  1. N. Flores, A. Aguiar, and H. Sereno, “The concept of "Ba" applied to software knowledge,” 8th International Workshop on Cooperative and Human Aspects of Software Engineering, CHASE 2014 - Proceedings, pp. 95–98, 2014, doi: 10.1145/2593702.2593713.
  2. I. Nonaka, R. Toyama, and N. Konno, SECI, Ba and Leadership: A Unified Model of Dynamic Knowledge Creation,” Long Range Planning, vol. 33, no. 1, pp. 5–34, 2000, doi: 10.1016/S0024-6301(99)00115-6.
  3. W. Groeneveld, J. Vennekens, and K. Aerts, “Software Engineering Education Beyond the Technical: A Systematic Literature Review,” ArXiv, Oct. 2019, Accessed: May 07, 2024. [Online]. Available: https://www.semanticscholar.org/paper/Software-Engineering-Education-Beyond-the-A-Review-Groeneveld-Vennekens/10a4813de31a836c1cebc78df3a99c390b1e9243
  4. J. Liebenberg, M. Huisman, and E. Mentz, “Software: University Courses versus Workplace Practice,” Industry and Higher Education, vol. 29, no. 3, pp. 221–235, June 2015, doi: 10.5367/ihe.2015.0254a.
  5. A. Cockburn and L. Williams, “The Costs and Benefits of Pair Programming,” Feb. 2000.
  6. W. Zuill, “Mob programming: A whole team approach,” in Agile 2014 Conference, Orlando, FL, US, 2016, pp. 1–11.
  7. D. Thomas, “Code kata.” Accessed: Oct. 16, 2025. [Online]. Available: http://codekata.pragprog.com/2007/01/code_kata_backg.html#tp
  8. J. Buchan, S. G. MacDonell, and J. Yang, “Effective team onboarding in Agile software development: Techniques and goals,” in 2019 ACM/IEEE International Symposium on Empirical Software Engineering and Measurement (ESEM), Sept. 2019, pp. 1–11. doi: 10.1109/ESEM.2019.8870189.

Last updated: December 18, 2025