As bootcamp-esque educational programs train more people on the baseline skills to contribute to a software project, companies are learning how (and how not) to integrate these lower-cost, less experienced developers with their teams. Frequently, these companies hire these less-experienced, single-skilled individuals as "Junior Developers" and throw them at a project. While this has some level of success, savvy companies are turning to apprenticeship.
What Is Apprenticeship?
Apprenticeship is a powerful concept. They take people with a growth mindset, can-do attitude, an aptitude for development skills and a baseline of competence and turn them into productive team members. A good apprenticeship program takes into account all the skills necessary to ship software at a given company and provides educational resources that bring a novice developer's principles and practices in line with those of the team. Apprentices are provided hands-on time with dedicated mentors who give them specific, actionable and kind feedback on their work; building their judgement and experience while minimizing the risk that the software calcifies.
What Is a Junior Developer?
Junior developers are also incredibly useful. Junior developers are generally capable of delivering software independently or on a team, provided they're given enough guidance on what to build. They are frequently left to learn things on their own, with the only feedback they're given as part of the code-review or project demo. In the worst cases, this lack of feedback and guidance results in short-term productivity gains followed by a 'calcification' of the software. Features that would have taken a few hours a month or two ago now take days and have multiple regressions. This is not the fault of the junior developer, as they lack the experience necessary to have good judgement about how to build software that can be adapted as we understand users needs.
When To Hire Junior Developers
Junior developers work great when there is already a cultural imperative of clean code and learning. Once junior developers are integrated directly into the practices you have established to maintain a high level of quality in your software they can make changes and add features without much risk of software calcification.
Generally junior developers work best in a problem domain where it's possible to come up to speed in a few months and doesn't require deep technical knowledge of a particular branch of programming, such as machine learning or high availability.
When To Hire Apprentices
If your company doesn't currently have a culture of learning, practices in place to ensure a a high level of quality in your software, or if your company has a very specialized or complex problem domain apprentices really shine.
Because apprenticeships explicitely set an expectation of learning during the first few weeks and months it creates an opportunity for a novice developer to pick up the expertise, principles, and practices required to contribute effectively.
Apprentices or Junior Developers: Why Not Both?
If you're in a company that is "senior heavy" you are missing out on quite a few competent developers who only need a bit of training and direction to make them effective. My ideal teams are composed of:
- 1~2 developers with 5+ years experience.
- 1~2 developers with 2+ years experience.
- 2~4 developers with 0+ years experience.
This mix helps ensure that despite judgement mistakes being made by junior developers there's enough people with more experience that can provide feedback and guide refactorings to prevent calcification without getting stuck in a "too many cooks" situation.
It's up to you to decide whether apprentices or junior developers fit your team best, and I personally prefer using apprenticeship as a way to bring people on as junior developers who otherwise would have had to be passed over because they lack the experience necessary to contribute effectively on the team.
Is your team or company interested in hiring junior team members or building an apprenticeship program? I'd be happy to hear your questions and help out!
Disagree with something I've said? Tell me what I could do better.