If developing software is all about skills (and it is), then how do we most quickly and effectively learn them? That is not a new tech problem. It is as old as humans. We have been refining this problem since we showed each other how to bang rocks together.
There used to be a model in various crafts where apprentices were trained under the supervision of journeymen and master craftsmen. They spent years building fundamental skills with watchful guidance through hours of on the job practice as apprentices. When they demonstrated their ability to perform at a professional level, they were considered journeymen. Journeymen would work under multiple masters as employees and continue to increase their skills. Some would stay journeymen for life, but some would advance to masters. There are multiple definitions of what it meant to become a master, but the one that I find most useful is the competence to independently build and supervise professional projects.
Generally, people seem to assume that model is dead. Instead, we have classes and universities and they bring something great to the table. They have a systematic approach to providing a comprehensive foundation of knowledge both in and around a domain. It is implied that graduation from such a program means readiness to be a professional in your field.
However, effectively every field recognizes that this is insufficient for creating a practicing professional. Knowledge is not the same thing as skills. Most fields add a large additional step under a variety of names.
The challenge is, developing skills takes practice. Not a few classroom exercises worth of practice either. It takes hours and hours of practice to master a skill (popularly simplified to 10,000 hours). If you dig even deeper into how skills grow, you realize that time and practice are still not enough. It takes excellent assessment and feedback, situated learning, layers of scaffolding that fit each level of growth, and more.
So what do these more established fields add to school to address that challenge? They add apprenticeship to their knowledge foundation. Oh, they often do not call it that. However, before a practitioner can be considered a professional, they must complete their apprenticeship period. Let's look at a few examples in various professions:
Electrician - Explicit 4 year apprenticeship coupled with after hours classwork + examination for licensure
Professional Engineer - Engineering degree + 4-6 years supervised professional practice + exam to achieve licensure
Mental Health Therapist - Master's degree + internship + practicum + 2 years supervised professional practice + exam to achieve licensure
Doctor - Doctorate + residency + licensure exam + fellowship + board evaluation and more testing to be licensed and certified
I could add dozens of examples, but the pattern continues. All that supervised practice is basically an apprenticeship. Licensure is essentially the gate between apprentice and journeyman level practice.
So what is an apprenticeship? Apprenticeship is mentored learning by doing. Apprentice work is closely watched and support is available for when (not if) they make mistakes. They have directed practice on essential skills. They are observed and receive feedback on their progress and guidance for improvement.
In contrast, in software, we have programs that claim to launch a professional programmer in 3-6 months or college grads with zero practice who cannot find work. Where is our 4-6 year apprenticeship period?
For those who found work, the first few years are often just about survival. Maybe they find a mentor but most do not. They survive trial by fire living on stackoverflow. Lacking important skills, there is typically a lot of crises and death marches. In 4-6 years, they have carved a set of skills that survival and determination has taught them. In other fields, they would be just getting tested to see if they are ready to be early professionals. Journeymen, if you will. By this point, we call them senior engineers. Small wonder we have so many spectacular failures in our field in security, reliability, and project failure.
So what would constitute an apprenticeship? We believe that essential elements are:
However, why not bring all the best parts together? We also like to see the strengths of institutional training in the form of:
It also is the realization that we need more than a different training program to start off a career. We need a lifelong trajectory for professional growth that continues well out of the apprenticeship period and all through the journeyman period as programmers advance towards becoming masters of their craft.
Obviously, this kind of career advancement requires the support and investment of the companies where programmers work. So what do the companies get out of this? Why would they want to support this?
The staffing advantages alone are significant. They include:
larger talent pools to recruit from. Apprenticeship companies have a way to support and develop that "eager, high energy" beginning professional.
more diverse talent pools. Underrepresented populations in the field are consistently responding well to models like this
easier recruiting as shops build a reputation in the community as a place where real advancement can occur
reduced turnover as programmers have both a meaningful definition of professional growth and higher loyalty to places that are willing to invest in them
However, we need more than staff, we need software. We need great software delivered fast and consistent. Apprenticeship provides:
better trained teams can perform better, more reliably, more creatively
reduced technical debt that contributes to stalled releases, rolling sprint work, delivered defects, and increased support headaches
better collaboration internally to the development team as well as externally to the rest of the business and customers
improved company culture on development teams focused on better quality, performance, and collaboration
Apprenticeship programs help make better talent, better shops, and a better industry. This is an essential maturing step for our profession.
Whether you would like to explore this more, create your own program, or hire us to help on this path, we believe in this passionately and are happy to help however we can. Shoot us a note and lets talk!
Joe Gee is a master craftsman at the Rocky Mountain Programmers Guild where he mentors programmers and teams to grow their mastery, performance, and delivery. Learn how he can help you or your team at www.rmprogrammers.com.