In choosing to teach people to write software via an apprenticeship, we draw from a very old tradition of learning. Apprenticeship was born in a time without centralized centers of learning for trades. There were no trade schools or community colleges that a person could attend to learn their vocation. It was a time before the printing press, so books were not readily accessible. All trade knowledge was tied up in individuals. If you wanted to learn a trade, you needed to find a person who would teach you. You needed to find a mentor. Today, not only do we have centers of learning and cheap books, but we also have nearly instant access to practically everything that has ever been known by anyone. While that may be a slight overstatement of what one can find on the Internet, it is not that far off. Anyone can find all the information, all the knowledge needed to do something without ever setting foot in a master's studio.
It is precisely because of the volume of information returned, even by the most specific of Google searches, that apprenticeship has again become relevant. Where is a person to start? How can a person trust what they are seeing? Who wrote it? Do they know what they are talking about?
In an apprenticeship, we carve out a path for the apprentice. Our experience gives us the ability to filter through the volumes of knowledge and information available and lay out a guided path for one person to follow. This is akin to the tour guide who takes a person through a foreign city by showing them the best of what the city has to offer and bypassing the uninteresting and unsafe parts.
The other timeless value of apprenticeship is that the apprentice learns by doing. Knowing 'what' is quite different from knowing 'how.' There are real skills to be acquired through persistent practice. An apprenticeship provides the place for the development of those skills.
What makes a good apprentice? What kind of person should you look for? These answers are indeed varied. There is no one perfect type of apprentice, but there are a few indicators that can be a helpful starting point. Your potential apprentice should be..
- Smart. Software development is ultimately about finding and solving tough problems. Look for someone who has natural intelligence.
- A doer. Can the person get things done? Software has to ship or deploy before it is useful.
- A self-motivated learner. In the apprenticeship, you create the environment for self-learning. There is no spoon-feeding.
- Available.The apprenticeship is a fast-paced, intense experience that will not fit into the confines of 9 to 5. Can the apprentice put in the time needed?
- Humble. No room for ego. A person will be subject to a mentor, performing tasks without necessarily understanding why
- Committed. Can the person commit to doing something well? Do they have the determination to push through and solve tough problems?
- A builder. The person should have already tried to build something before. Perhaps they built a website for a friend etc.
An apprenticeship is no easy journey. It's important from the outset to set high expectations of your apprentice. You want to give the apprentice a high mark to rise up to. Set the expectation that this learning journey will not be a 9-5 engagement. There will be projects and duties to fulfill during the day, but coding and reading on nights and weekends will also be required. An apprenticeship is not for the faint of heart. Learning will consume a lot of time.
Establish clear expectations for the apprentice's work hours in the office. Often, an apprenticeship is a person's first all-day job, and they may not understand when they are expected to be present. Do not listen to excuses about alarm clocks or transportation woes. The first step in an apprentice's journey is learning how to show up on time. Take your apprentice out to lunch on the first day. Make the apprentice feel like a member of the team, as though the apprentice belongs. Take the time to learn about your apprentice as a person. What other things does the apprentice enjoy doing? Who are the important people in the apprentice's life?
As a mentor, you've committed to setting aside time each day for direct instruction of your apprentice. This time is vital for the growth of your apprentice as well as your own personal growth. Lessons at the whiteboard are an effective way to go. Concisely present the day's topic, and work through a couple of examples. Allow time for questions and expansions at the end.
This is also a great opportunity to use other apprentices as teachers. The surest way for an apprentice to demonstrate mastery of a topic is to present it. Even an apprentice who just learned a principle last week is a good candidate for teaching it this week. Be present if you have one apprentice teaching another. Fill in the gaps and gently correct any mistakes made.
A lot of the teaching will be reactionary. Use the problems that the apprentice is facing with the current project, and teach the concepts as they arise. For example, introduce mock objects as the apprentice is struggling to figure out how to test the IO portion of the Tic Tac Toe game. This implies that you should be ready to teach any of the concepts at any time.
Have your apprentice begin reading right away. Go over the book list and set out an aggressive schedule. The list in the appendix is roughly in order. Add and subtract based on what your apprentice has already read, or the areas the apprentice is strong or weak in.
Katas are another important learning tool for your apprentice. Set out a schedule of katas for your apprentice to learn, practice, and perform. Every kata you choose should be targeted at a particular skill. See the appendix for a list of katas and their associated purposes.
Schedule your apprentice to perform a kata as a warm up act on a Friday. Be sure that the kata performed fits in under 10 minutes and is well practiced. The public performance of katas will help to build confidence and presentation ability. There are many varied opinions as to what kata performances should look like, so you are free to coach your apprentice to the style that suits you.
Help your apprentice connect with the local software development community. Invite your apprentice to the meetups or user groups that you attend. Encourage them to seek out other groups that line up with the apprentice's particular interests. Set up the expectation of attending at least one meeting per month
In addition to the planned projects, reading, and practice, other opportunities for the apprentice will arise.
- Agile Software Development, Principles, Patterns, and Practices - Bob Martin
- Clean Code - Bob Martin et al.
- The Clean Coder - Bob Martin
- eXtreme programming explained - Kent Beck
- Software Craftsmanship - Pete McBreen
- Apprenticeship Patterns - Dave Hoover and Ade Oshineye
- Pragmatic Programmer - Hunt / Thomas
- Refactoring - Martin Fowler
Goals: An apprentice should show proficiency in the following areas:
- Crafting code Can create simple applications without any assistance
- TDD Unit Testing. Acceptance Testing
- Refactoring Identifying smelly code. Improving the design. Staying green
- Design Principles SOLID. Package Principles.
- Object Oriented Design Patterns Can identify patterns. Can apply patterns. Aware of costs and benefits of patterns
- Pair Programmer Can articulate a design or algorithm. Effective as a driver and navigator.
- Agile Software Process Works in iterations. Writes story cards. Demos new features. Performs stand-ups. Performs retrospectives
- Estimating Commits to a task and timeframe. Identifying tasks too large for a timeframe.
- Customer Collaboration Creating stories based on a customer discussion. Creating Acceptance Tests with the customer. Providing transparency to customer
- Polyglot Familiarity with a variety of language constructs. Can read code in unfamiliar languages. Can write code in multiple languages
- Communication Skill Engaging live presentations. Clear writing.
- Teaching
- Community Involvement Blogs
- Collective Ownership Follow conventions. Leave the code cleaner than you found it
- [GitHub issues] – submit issues and send feature requests
You can contact us via email [email protected].
Copyright © 2018-2022. This content is licensed under the [MIT] license.