RailsConf 2018

The Practical Guide to Building an Apprenticeship

The Practical Guide to Building an Apprenticeship

by Max Tiu

Summary of 'The Practical Guide to Building an Apprenticeship'

This video features a talk by Max Tiu at RailsConf 2018, focusing on creating a developer apprenticeship program. It addresses the disparity between the high volume of junior developers, who often emerge from boot camps, and the lack of positions available for them. An apprenticeship program is presented as a viable solution for organizations looking to foster junior talent while enhancing team productivity.

Key Points Discussed:

  • Need for Apprenticeships:

    • Junior developers are abundant, yet full-time entry-level positions are scarce. Apprenticeships can bridge this gap by offering structured, long-term options for growth.
    • They promote diversity in tech, providing opportunities for underrepresented groups in the industry.
  • Program Structure:

    • The program typically lasts around four months and focuses on sustainable growth over specific tasks.
    • Apprenticeship differs from internships as it emphasizes an overarching development experience rather than task-oriented contributions.
  • Foundation for Implementation:

    • Key components for establishing an apprenticeship include a clear plan, budget, and strong buy-in from company leadership.
    • Emphasis on return on investment by reducing hiring and onboarding costs for new engineers.
  • Hiring Process:

    • Importance of a fair and unbiased hiring structure to increase diversity.
    • The process involved anonymous evaluations of applications, a coding challenge, and final interviews focused on problem-solving skills and eagerness to learn.
  • Onboarding and Growth:

    • Comprehensive onboarding akin to regular hires, mentorship support, and exposure to various teams and tasks to foster independent growth.
    • Regular check-ins and team interactions are vital to guide apprentices through their development.

Significant Examples:

  • The speaker narrated their experience setting up a four-month apprenticeship program that resulted in hiring two successful apprentices after their term, illustrating the effectiveness of the structured approach.

Conclusions and Takeaways:

  • An apprenticeship program not only supports junior developers but also benefits organizations by increasing team connectivity and enhancing overall productivity.
  • Investments made into apprenticeships can yield long-lasting contributions to the engineering workforce and workforce diversity—offering junior developers sustainable careers in the tech industry.
00:00:10.639 All right, we're going to get started. Hello, this is the practical guide to building an apprenticeship. My name is Max Tiu.
00:00:17.699 I am an engineer at CallRail, and you can find me at MaxTiu on Twitter, GitHub, and most online platforms. I have the pleasure of giving this talk with all of you today.
00:00:24.720 Last year, I got to do something really awesome that I never thought I would be able to do.
00:00:31.460 At a company called Rail, I created a program for entry-level developers to bring new people into the tech industry.
00:00:37.980 That's something I'm really proud of, thank you. I love apprenticeships, and I think they are a severely underrated part of our professional systems.
00:00:46.289 They deserve more attention for a few different reasons.
00:00:51.809 For one, they fulfill a very real need. With coding boot camps and the general ease of learning to code, there are a ton of junior developers out there.
00:00:59.190 However, we rarely see actual junior engineering positions available.
00:01:05.189 Many fantastic and eager individuals are just waiting for the opportunity to be seen.
00:01:11.610 Furthermore, when we do see junior positions, they often ask for three years of experience.
00:01:17.880 There must be some kind of role in the middle, and apprenticeships can fill that gap.
00:01:23.189 Apprenticeships also help unify and engage your team, allowing everyone to rally around the common goal of teaching a new developer.
00:01:30.030 This developer is excited about learning, growing, and being part of your team.
00:01:36.900 They also help create more diverse and inclusive organizations.
00:01:43.649 Historically, the tech population has tended to look the same, especially in the United States, where we have a significant diversity issue.
00:01:48.930 More and more juniors are coming out of coding schools or are self-taught, representing groups that are underrepresented in tech.
00:01:54.079 Apprenticeships provide these individuals with the jumpstart they need for long-lasting engineering careers.
00:02:01.500 So what is an apprenticeship? It is an entry-level program designed for brand-new software engineers.
00:02:07.469 This program aims to sustainably grow their knowledge, establish a solid foundation for their craft, and allow them to learn from more experienced peers.
00:02:13.709 For us, this manifested as a four-month-long program with the ultimate goal of hiring our apprentices as full-time engineers afterward.
00:02:20.459 A question I often get when discussing apprenticeships is how they differ from internships.
00:02:27.690 Internships typically focus on very specific projects, such as hiring an intern to write API documentation.
00:02:34.200 They often carry a negative connotation, associated with doing 'dirty work' that no one else wants to do.
00:02:41.730 Internships are also usually shorter-term, with college interns often only staying for a semester.
00:02:47.610 Apprenticeships, on the other hand, focus on sustainable growth. They provide apprentices with exposure to various learning opportunities.
00:02:54.450 This type of program is an investment in their development as software engineers.
00:03:04.199 Typically, apprenticeships last longer than internships, ranging from several months to even more than a year.
00:03:10.980 Now that you understand what an apprenticeship is and how it differs from an internship, it's time to lay the groundwork.
00:03:20.459 This groundwork involves the pitching, planning, and preparation necessary for implementing the program.
00:03:27.900 What do you need to get it going? You need three things: a plan, funding, and buy-in.
00:03:34.889 You need a plan because if you expect someone to dedicate their time and energy to learning and growing, they should not have to worry about putting food on the table.
00:03:41.569 You also need buy-in from the majority of your engineering organization, and ideally the enthusiasm of everyone the apprentices will interact with.
00:03:47.639 Most importantly, you need buy-in from your boss. This can vary in difficulty depending on the size of your organization.
00:03:54.420 In for-profit companies, you may need to justify the time and money costs associated with the program.
00:04:01.530 For example, you can highlight how an apprenticeship can reduce onboarding costs.
00:04:07.620 Instead of spending time teaching new hires about the organization or getting them up to speed, you can teach them best engineering practices.
00:04:13.590 This approach empowers apprentices to learn from the ground up.
00:04:19.919 Apprenticeships can also help eliminate recruiting costs, especially since there's currently a significant demand for entry-level roles.
00:04:25.650 This demand leads to a large influx of applications for these kinds of programs.
00:04:31.530 In addition, having a program can make it easier to hire senior developers who are willing to mentor apprentices.
00:04:37.080 Senior engineers often want the opportunity to help grow new developers.
00:04:43.020 Being part of an apprenticeship showcases a company's focus on learning, growth, and mentorship.
00:04:49.680 There are also immaterial benefits to having an apprenticeship, such as increasing diversity and team connectivity.
00:04:56.010 It may even lead to enhanced developer productivity as collaboration increases.
00:05:04.199 Having a senior partner with an apprentice can foster a productive partnership.
00:05:09.240 Yes, the apprentice will learn a lot along the way, but the senior engineer will likely gain insights from the experience as well.
00:05:15.419 Once you've convinced your boss and are ready to start, there are a few things to decide — program length, number of apprentices, and defined roles.
00:05:22.620 We decided on a four-month duration, which ultimately became three months; I'll touch on that later.
00:05:29.250 The number of apprentices was set at two, which is ideal for pair programming.
00:05:35.070 One program coordinator, who would also serve as a mentor, was assigned to support the apprentices along with multiple reviewers.
00:05:41.639 You also have to decide what knowledge they should have prior to joining and what they will learn during the program.
00:05:48.510 These aspects will vary per organization based on values and needs.
00:05:55.169 For us, we wanted our apprentices to already know how to build web applications and have experience with basic programming concepts.
00:06:00.870 We also emphasized the importance of refactoring, testing, and best practices, particularly self-confidence as developers.
00:06:06.479 Pair programming was also crucial as it facilitates knowledge transfer and teamwork.
00:06:13.440 During planning, a game plan was essential. I conducted thorough research to inform our decisions.
00:06:18.900 Every piece of knowledge I absorbed improved our program significantly.
00:06:24.930 I continually referred back to our master plan throughout the entire program.
00:06:30.840 The outline included elements such as our goals, content to be covered, and how we would achieve it.
00:06:36.240 This detailed planning was crucial going into the implementation phase.
00:06:43.020 We divided implementation into three phases: hiring, onboarding, and growing.
00:06:49.680 Starting with hiring, our goal was to establish an unbiased, level playing field for candidates.
00:06:56.010 This aligns with our overall objective of increasing diversity.
00:07:03.020 It's crucial to ensure everyone has an equal chance if you're going to diversify your efforts.
00:07:09.420 Our hiring process involved three parts: an application, a code challenge, and a final interview.
00:07:15.780 We worked to keep bias as low as possible throughout the application review process.
00:07:21.930 When candidates submitted their applications, they were assigned a hashed candidate ID.
00:07:28.470 This ID was the only identifier used until the final interview, which helped reduce bias.
00:07:35.120 Our application for candidates included information about our company, who we were looking for, and a schedule of the process.
00:07:41.610 We asked them to provide links to their work on GitHub or personal websites, but we never reviewed those until the final rounds.
00:07:47.859 This kept their identity hidden until we were ready for a face-to-face interview, which helped reduce bias.
00:07:53.180 The bulk of the application consisted of questions aimed at understanding their motivations and backgrounds.
00:08:00.630 We wanted candidates who had no prior professional programming experience.
00:08:07.230 Interestingly, despite this specification, many candidates felt they had to justify their lack of technical experience.
00:08:15.060 The job landscape for juniors is so tough that candidates were apologetic about their experience level.
00:08:21.720 We also asked candidates to describe what parts of programming excited them and what unique traits they brought to the program.
00:08:26.850 Unfortunately, responses to the uniqueness question often focused back on their tech skills.
00:08:31.890 We even received some personally identifiable information, like a candidate sharing their height.
00:08:37.080 We'll definitely revise that question next time.
00:08:40.770 We also included a question about challenges they faced while learning to code.
00:08:45.930 This helped us gauge their perseverance and problem-solving abilities.
00:08:52.050 To standardize the review process, we developed a rubric to minimize bias and facilitate evaluations.
00:08:59.460 We asked reviewers to assess where candidates were in their learning process.
00:09:05.790 We aimed to find candidates who were in the middle — not complete novices, but also not fully qualified professionals.
00:09:11.220 We rated applications on eagerness, curiosity, and drive.
00:09:16.650 This numerical data was crucial for making informed hiring decisions.
00:09:23.120 Applications with consistently high scores were moved forward in the hiring process.
00:09:30.420 Conversely, those with consistently low scores were not moved forward.
00:09:37.680 The next step involved a code challenge.
00:09:45.840 When designing a code challenge, we had to determine what skills we wanted to assess.
00:09:52.250 We looked for control flow, idiomatic Ruby usage, and other foundational programming skills.
00:09:58.650 We decided a test-driven development (TDD) task would work best.
00:10:04.930 Candidates were given a file full of failing RSpec tests and required to write code to make those tests pass.
00:10:11.900 Writing effective prompts was essential; we wanted to allow candidates room to demonstrate their skills fully.
00:10:18.230 We created individual GitHub repositories for each candidate, allowing them to submit their work.
00:10:25.700 The project was called Grader, which assists teachers in grading multiple-choice tests.
00:10:32.230 We provided a detailed README to help candidates prepare for success.
00:10:38.600 We anticipated that many applicants might not have experience with automated testing, so we wanted to ensure they had adequate resources.
00:10:45.350 Each candidate was provided instructions on how to run and set up the tests.
00:10:52.120 The coding exercise included an empty class where candidates would write their code.
00:10:57.160 To support their understanding of the challenges, context comments were provided.
00:11:03.300 For example, if a method required a nil response, the prompt clarified why that might be the case.
00:11:09.600 Providing this meaningful context was essential to help candidates grasp the nuances of the problems.
00:11:16.740 In order to maintain anonymity, we crafted a script to scrub author information from commits.
00:11:23.120 This information helped us preserve meaningful commit history without revealing candidate identities.
00:11:29.470 For each code submission, we used the rubric again to gauge their control flow and Ruby comfort level.
00:11:36.390 We emphasized alignment with our initial goals and asked reviewers to provide actionable feedback.
00:11:43.900 This was crucial for the community of junior developers to receive constructive criticism and learn from the experience.
00:11:51.020 After the code challenge, we transitioned to the final interviews.
00:11:59.390 These interviews allowed us to connect names and faces with candidates' previous work.
00:12:05.390 The final interview consisted of three parts: an introduction to our product and company, a technical conversation, and a behavioral chat.
00:12:11.520 The technical discussion was different from those typically held with experienced engineers.
00:12:18.000 We utilized the code challenge as a focal point because it was content both parties were familiar with.
00:12:25.000 This enabled us to ask insightful questions about the challenges candidates faced during the task.
00:12:31.920 We could see how they processed feedback and identified problems based on their submissions.
00:12:38.500 We also conducted a behavioral chat, during which we asked standard job interview questions.
00:12:44.200 A unique question we posed was what candidates would change about their educational experience.
00:12:51.500 This provided insight into their learning needs and how we could best assess their fit for our program.
00:12:56.800 To improve our hiring, I recommend implementing an HR platform.
00:13:03.200 Our process was somewhat chaotic due to using various Google forms and documents.
00:13:09.600 A more streamlined approach would save time and support the overall hiring process.
00:13:15.000 I also suggest not limiting code challenges to one programming language.
00:13:20.490 This could broaden your candidate pool significantly and ensure a more diverse set of applicants.
00:13:26.810 Additionally, be very direct with your questions in the application process.
00:13:32.920 Candidates might try to deduce hidden meanings, so clarity is essential.
00:13:39.340 Now that you've hired some fantastic apprentices, it is time to onboard them.
00:13:45.840 Our goal during onboarding was to set apprentices up for success and teach essential concepts.
00:13:52.500 We wanted apprentices to receive the same onboarding experience as regular developers.
00:13:59.200 This included sessions on our different applications and vital parts of our codebase.
00:14:05.030 One specific activity we created was a scavenger hunt.
00:14:11.340 Apprentices received questions requiring them to deduce the names of controller actions based on context clues.
00:14:16.590 This task helped them become more familiar with our large production codebase in a fun, engaging way.
00:14:23.350 Alongside regular onboarding sessions, we provided lessons on foundational concepts.
00:14:30.140 Topics included object-oriented programming and debugging.
00:14:35.250 We wanted to ensure apprentices entered the program with the right skills.
00:14:41.360 To improve the onboarding process, we recommended giving early exposure to team practices.
00:14:47.550 Halfway through our program, I encountered an apprentice who asked, 'What is a sprint?'
00:14:53.330 Early exposure to these concepts is essential for our teams, even if they may seem obvious to seasoned engineers.
00:14:59.990 Once apprentices are onboarded, the growth phase begins.
00:15:06.450 Extensive information about engineering leadership is available, but I'll focus on specifics for apprentices.
00:15:13.680 We aimed to anticipate apprentices' needs, provide an inclusive environment, and promote independence.
00:15:19.650 Independence is a key marker of an engineer's experience, and we wanted to foster that throughout the program.
00:15:27.060 Our growth phase began with a ramp-up period.
00:15:34.080 Apprentices worked on small projects, fixing bugs or making minor CSS tweaks.
00:15:40.410 This gradually built their skills and confidence.
00:15:46.650 We then introduced team rotations with different development teams for customer-facing products.
00:15:53.850 This experience offered exposure to various coding practices, parts of the codebase, and team dynamics.
00:15:59.400 Early expectations were set, providing apprentices with a checklist to guide their progress.
00:16:06.180 We emphasized the importance of verifying their work and collaborating with teammates.
00:16:12.540 We introduced them to the book 'Apprenticeship Patterns' by Dave Hoover and Adewale Oshineye.
00:16:18.930 This book offers valuable insights and a common vocabulary for discussing their career development.
00:16:25.260 Regular one-on-one meetings were established, allowing mentors and managers to keep apprentices on track.
00:16:31.620 We also included apprentices in decisions about their team rotations, encouraging them to follow their interests.
00:16:37.740 Allowing for unstructured time was crucial, enabling apprentices to explore their interests.
00:16:45.000 It's essential to encourage experimentation; allowing apprentices to fail is vital for their learning.
00:16:52.320 Providing them with the freedom to learn from mistakes helps them internalize the lessons.
00:16:59.730 To enhance the growth process, you should be proactive in identifying early warning signs.
00:17:06.990 Junior developers often struggle to admit when they need help.
00:17:13.500 They should feel supported, and their mentors must be vigilant about recognizing signs of struggle.
00:17:20.190 It's also imperative that everyone involved in the program is on the same page regarding expectations.
00:17:28.170 We experienced some situations where team leads did not know what apprentices were meant to learn.
00:17:35.250 To track progress effectively, we implemented a shared rubric for everyone to follow during the program.
00:17:42.000 This helped ensure that apprentices hit their milestones and stayed on track throughout the program.
00:17:48.510 After implementing our improvements, we successfully prepared for the next iteration of the program.
00:17:55.920 As we wrapped up, we created a master plan for our program.
00:18:02.280 We utilized a fair and anonymous hiring process to attract exceptional apprentices.
00:18:09.240 Throughout the onboarding process, we set them up for success.
00:18:15.780 Finally, we guided them into becoming effective software engineers.
00:18:21.720 I'm happy to report that we successfully hired both of our apprentices after the program.
00:18:28.110 They joined our team in September, and the program ended up being three months long.
00:18:34.800 They have become productive members of their teams, who wouldn’t want to be without them.
00:18:41.490 I’m incredibly proud of their progress.
00:18:48.930 Through the apprenticeship creation process, some key lessons emerged.
00:18:55.200 During hiring, trust your instincts about candidates.
00:19:02.460 We found one candidate whose application raised minor confidence concerns.
00:19:09.000 Initially, their application was strong, pushing them through the challenge.
00:19:15.420 However, throughout interviews, that initial gut feeling was confirmed.
00:19:23.550 We knew egos have no place in effective teamwork.
00:19:30.570 Additionally, give yourself plenty of time for this process.
00:19:36.930 Our program received approval in June, but we found out that a four-month program would not meet our timeline.
00:19:43.320 We adjusted our timeline to three months to fit the end of the year.
00:19:50.220 The preparation and organization take considerable effort, but it's worth it.
00:19:56.430 Finally, always keep your goals in focus.
00:20:03.060 It's tempting to simplify the process, but remember that you're aiming to create a meaningful impact.
00:20:09.840 I'm pleased to share that we provided W-2 jobs that offered good wages and full benefits.
00:20:16.470 These positions are often not typical for entry-level roles, but they represent vital change.
00:20:23.370 This is our opportunity to make a significant impact on a small scale in tech.
00:20:30.240 We often express the desire to introduce diverse individuals into our industry.
00:20:37.200 We claim to value education and growth and to help junior developers.
00:20:43.170 This program is a concrete way to embody these values.
00:20:50.520 So go start an apprenticeship!
00:20:57.780 My name is Max Tiu. You can find me at MaxTiu on Twitter and GitHub.
00:21:03.240 I want to thank all the wonderful people who helped with this program's research and implementation.
00:21:09.750 I will be taking questions off-stage afterward and will be around throughout the conference.
00:21:15.750 I could talk about apprenticeships all day, so please feel free to come and chat.