Codurance has developed the concept of an Academy as a means of training software engineers to help them along the road to expertise and mastery. Mashooq Badar, Software Craftsman and Co-Founder of Codurance, emphasises that trainees must learn how to learn, that learning itself is a skill. Motivation is not enough. An open minded attitude is required as are practices tailored to what you want to learn. He expands on ideas developed by Robert Green in his book Mastery emphasising the importance for the learner of feeding their curiosity and forming good learning habits. Learners should be encouraged to avoid simply working to a target but to find intrinsic motivation doing the job well for its own sake.
At Codurance Academy, developers recruited with, usually a minimum of, two or three years experience are put through a rigorous training program, focusing on concentrated coding practice, wider business and web development skills and self-reliant project development. Apprentices build a business software product to be used by Codurance. In the past, these in-house software products have included an application for organising Codurance’s Open Space events, an application for mentoring and a retrospective application for assessing the positive and negative aspects of the team’s work over the previous week. If you are looking to adopt such a training model then feel free to contact us for advice on how it may be tailored to your needs.
The Codurance Academy’s program is wide-ranging. The program touches not only on coding and code design but a holistic set of skills to build software well. Codurance trainees practice solving selected coding problems (katas) in pairs and then learning from each others’ work. Kata is a term derived from martial arts meaning a specific detailed choreographed pattern of movement made to be practised alone, and also within groups when training. Some of the assigned coding katas are concerned with common patterns involving sorting, data structures and the application of simple algorithms. The ultimate goal, however, is to practice Test Driven Development and good software design skills.
The trainees embark on mini-projects designed to bring out an awareness of patterns and structure of a good software development project. They are also introduced to bad code which needs refactoring. Working in pairs, they explore ideas of Test Driven Development with an emphasis on continuous improvement. They widen their knowledge to incorporate event-driven architecture and Domain Driven Design. They gain an understanding of the organization of code in order to represent the business domain. Trainees also explore the broader skills of web development including database design, networks, agile process management, site reliability engineering, and testing. They also take a project from inception to completion.
As Andy Hunt says:
"Software… is imagined and created in our heads."
Hunt, A. Pragmatic Thinking and Learning
It follows that programmers need to be able to communicate, to think and to learn. Agile methods emphasise deeper communication between team members and between the software developers and the end-user. Instituting an Academy at your organization would allow the business to clearly set expectations for developer excellence and allow junior team members to gain a clear understanding of how to achieve their goals of success within the profession. Through a focused in-house Academy program good working principles can be learnt in a safe (non-production) business environment to help developers along the road from novice to expert.
In the past, business users might have expected to use off the shelf programs such as word processors, spreadsheets and databases. Nowadays, though, many institutions need bespoke software that is continuously under review and can be adapted to their changing needs. The fast pace of change can remain bewildering for mid-level developers and an Academy can form an ideal means by which to refresh developer morale and communicate best practices.
Where once there was a limited range of languages such as C, C++, Pascal, Fortran and Cobol, a host of different languages have since been written in order to resolve an ever-growing range of social, business, commercial and scientific problems. This profusion is reflected in the output of technical literature - manuals, explanatory texts and ‘how to’ books. In the upper reaches of this forest, veteran programmers attempt to distil a philosophy of software development. An Academy at your business will allow new employees to engage with the wider issues of software development and address common business problems with a well thought out heuristic.
Mammoth companies like Amazon, Google and Microsoft now provide cloud platforms for computing, storing and networking at different levels of abstraction. These services can host websites, run enterprise applications and mine tremendous amounts of data on a pay-per-use basis. Fast changing requirements and increased sophistication of programs and services call for a workforce capable of keeping pace. Projects completed on the Academy can allow employees to engage with DevOps in safe contextualised business learning opportunities.
Pooled knowledge, delivery and shared responsibility are three pillars of an Academy’s ethos. This is where an Academy system and its software ethos can make a real difference. Inevitably, partial and ad-hoc systems are often to be found even in the best run companies. The Academy model brings with it a systematic method of dealing with the multitude of problems confronting the average Chief Technology Officer.
Pooled knowledge has many facets in a programming environment. Team-work needs to be structured. The lone ranger software developer who races ahead despite his or her colleagues is merely storing up problems. Even apparently elementary production ready software systems may well contain hidden complexity. Adapting and transforming such software is fraught with danger because these hidden aspects may suddenly become manifest. This is a particularly difficult problem where the software is providing a continuous service.
In order to respond to these challenges, the Codurance Academy places a high premium on effective communication both within the software development team and between the team and the customers. One of our basic techniques is pair-programming. Pair programming embodies the idea that two heads are better than one, encouraging developers to put their ideas into words and engage in conversation with a partner. Teams need to be able to organise themselves freely to make use of members’ skill sets and to liaise with the end user. The emphasis is placed on the social aspect of work and learning. As the craftsmanship manifesto puts it:
As aspiring Software Craftsmen we are raising the bar of professional software development by practicing it and helping others learn the craft. Through this work we have come to value the following:
- Not only working software, but also well-crafted software
- Not only responding to change, but also steadily adding value
- Not only individuals and interactions, but also a community of professionals
- Not only customer collaboration, but also productive partnerships
That is in pursuit of the items on the left we have found the items on the right to be indispensable.
The emphasis here is on a community of professionals who share values and skills freely. This has an intensely practical side. When modifying legacy code every step by an individual coder must be tested and recorded so that all can see it. The emphasis is on awareness of the need for openness and listening on the part of the craftsperson and the team for shared learning, development and cooperation. Ability to rollback is an important safeguard but depends on continuous testing, meticulous record keeping and a shared attitude of honesty about the contributions of team members. These are the building blocks of a functioning community of craftspeople who are able to understand problems and work to overcome them. At the Academy, knowledge is shared through regular code reviews, retrospectives and continuous feedback. Nonetheless, communication is not an end in itself but a means to push forward the work of the team and the individuals within it.
An Academy can also ensure that common values regarding testing and software quality are extended throughout the business. The essence of test driven development is that the tests are written before the code. Testing is no longer about just keeping defects from the users rather it is about helping the team to understand what features the end users need and to deliver them reliably and predictably. With this aim in mind apprentices are trained to use e2e testing, and behaviour driven testing. Here, the development process starts from the user so that work is completed efficiently and effectively.
The aim of modern software development is continuous improvement and facilitating change. This requires a number of very important safeguards in combination with empowerment of teams and individual coders. Deploying changes incrementally, when they have been incrementally tested, is better than deploying a whole number of changes all at once. Traditional release strategies have tended to involve developers “throwing their work over the fence”, effectively passing responsibility on to the deployment teams. When each refinement and change can immediately be deployed subject to safeguards by the individual or team who is making it, it is easier to pinpoint errors and if necessary rollback. It is important to avoid a culture of blame because this will inhibit the developers’ work and undermine the productivity of the team. Software increments are bound to fail from time to time so they should be introduced in a safe environment where it is ok to fail. Automation of deployment is important and each deployment should be tested in a production-like environment. An Academy makes it easier to create a safe environment in which it is ok to fail. Academy attendees can access a playground AWS account which allows them to test deployments in a safe environment. In this Academy environment play is a vital part of the learning process. As Andy Hunt puts it:
Build to learn, not learn to build. Fail efficiently with better feedback. Groove your neural pathways for success.
Hunt, A. Pragmatic Thinking and Learning
Play involves non-goal directed exploration. It contrasts with the idea that learning consists in filling your head with information and then hoping to use it later. Here, the emphasis is on learning through doing. Group projects and focus on continuous delivery of mini-projects allows apprentices at Codurance to develop responsibility for a software change from start to finish. This shared responsibility brings a sense of pride and ownership over their work. Apprentices are encouraged to build a walking skeleton representing a most basic version of the production environment to which they deploy their starter code. Even their initial efforts can be tested and deployed on production thus making for a richer learning experience.
A company’s Academy could be viewed as a mathematical function taking in advanced beginners and outputting craftsperson practitioners to take their place in the software development team. Curious enthusiastic practitioners would be a benefit to any company. Hunt tells us:
Always consider the context
Hunt, A. Pragmatic Thinking and Learning
At the very least the Academy is a focused period of study on the broader issues of web development. At its best, it is a community for the instilling of effective problem solving skills. As Professor Ian Stewart puts it in his forward to Polya’s How to Solve it:
Problem solving ability doesn’t develop in a vacuum. It needs a rich background of knowledge and intuition before it can operate effectively. Polya places a great deal of emphasis on the consideration of related problems whose solution is already known and reasoning by analogy. Analogy can be a powerful weapon, but it takes broad experience to draw the right analogy.
Stewart, I. xviii Forward, How To Solve It, Polya, G. (2nd Edition)
Good problem solvers are conscious of the broader context within which they work. They are able to draw connections between solved problems and those that they face and through this intuition to build the capacity for good design. At Codurance this active attitude to learning is reinforced through a process called extreme learning where students are given limited time to research topics relevant to their wider work and present their findings to a deadline.
An Academy is also an excellent opportunity for apprentices to learn soft skills and leadership so that developers are able to understand what to expect from a manager and what it takes to be a good mentor and tech lead so that they are able to help foster talent within the company. The Academy can be a good means of teaching apprentices how to manage themselves and help work with others to create and curate a unifying culture in teams.
Sandro Mancuso in his book The Software Craftsman says:
No change can be made effectively if the people involved are not motivated or don’t really care about their jobs.
But a management efficiency drive intended to improve matters can in fact make them worse. New and imposed ways of working are incorporated into people’s objectives and bonuses. Mancuso says:
When it comes to software development this approach can lead to disastrous consequences… We should create a culture of learning where people can find their own motivation to make things better. Instead of having managers trying to impose how, when and what developers should learn, companies should empower developers to create their own culture of learning.
Mancuso suggests starting a book club, having technical discussions over lunch, organised group discussions, switching projects among the teams, group coding reviews, hands on coding sessions and internal communities of practice. The Academy should, therefore, be the core of a movement to extend a beginner’s mindset across the firm.
Businesses need software developers who are able to manage stress effectively and incrementally improve their productivity for project completion. Many of the issues companies face with software development reflect the company’s own communication structure. The effectiveness of an Academy program should be measured against its ability to improve soft skills and mindset, technical skills and broader understanding of web development.
The most effective metrics for efficiency will come from measurements derived from agile development practices. Burndowns will show how many development tasks are completed over time. Another very important metric for team agility is Mean time to repair (MTTR). The best metrics to measure the productivity of the software development team are those that we use to measure business results. Developers with adequate training should be able to communicate about and deliver high quality software that is useful for the end user. Regular check-ins with clients can provide crucial metrics for the team and will further enable developer progress. At Codurance, craftspeople and team members work hard to develop a positive feedback loop through regular bi-weekly demo sessions. An emphasis on presentation and improved communication can enable learning to be incorporated into the development process and in the best examples clients are able to provide live feedback to work for realignment and continuous improvement.
Alongside wider team improvements each newly qualified craftsperson should show a series of competencies that will bring value to the team. Each craftsperson should be able to clearly present content and be competent in their chosen language and its ecosystem. Craftspeople should naturally apply XP and Agile processes and continually work incrementally to provide business value. Developers should know tech design representations to clearly communicate technical context and be able to set up a CI pipeline. These skills should be used by craftspeople to describe the values and message of the business and enable wider business success.
Practice is essential for developer improvement but of course it can be difficult to incorporate an Academy with wider business goals. As Sandro Mancuso puts it:
Clients pay professionals with the expectation of receiving a good service. They don’t pay professionals to solve their problems in the best way possible. Clients don’t pay professionals to learn. Clients pay professionals for their knowledge and skills. Professionals are expected to provide solutions, viable alternatives, and ideas to their clients. Professionals are expected to help their clients to achieve whatever they want to achieve in the best way possible, and that is how they build their reputation.
Mancuso, S. The Software Craftsman, p. 43
Team members should recognise that if they want to be treated and respected as software professionals they need to start behaving like professionals. That means that they should use their own time and money to get better at what they do.
Teaching delivery for an Academy will generally be conducted by in-house staff for new, less experienced recruits. A comprehensive full-time course would normally take three months with ideally up to six student attendees. These apprentices will be paid a full early stage salary (around £30, 000 - £35, 000). This assists the commitment and responsibility taken by the recruits for their learning. They feel a full part of the enterprise and wish to integrate themselves further. Another feature of the Codurance teaching philosophy is that teaching is the best way to learn and so the initial teaching of the Academy course is conducted by recently graduated Academicians. Of course, help is on-hand on a pluralistic basis from more experienced masters. An online library of useful books and journal articles should be made available and a well curated wiki of lesson plans. At the time of writing, recent Academies have been held online with students working off-site, usually at home. In periods of normalcy students will need space and equipment in-house. Students are encouraged to build their own library from their own salaries. Another reason why student salaries need to be based on realistic living costs. During the Academy, students are expected to provide their own laptops but on graduation they are provided with their own laptop.
Software developers need to be involved and contribute to the business, providing options and solutions and offering the best service when it comes to implementation, technologies and production quality. Creating a culture of learning is the most efficient way of injecting passion into a company. An interesting theme of transformational leadership is that of self-sacrificing charisma. Here, a contrast is made between two forms of leadership, transactional and transformational leadership. In this reading the vision of leaders becomes appealing when it is in alignment with the values and ideas of the followers. According to this argument, small sacrifices by the employer for employee advancement can pay large dividends in employee performance. It is the role of the CTO or organisation leader to calculate the appropriate amount of investment required for employee improvement but apparent lost investment can have counterintuitive results as long as it is accompanied by a real and lasting change in culture.
Software is our passion.
We are software craftspeople. We build well-crafted software for our clients, we help developers to get better at their craft through training, coaching and mentoring, and we help companies get better at delivering software.