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.