Apprenticeship Patterns

2021-07-29

Notes from Apprenticeship Patterns

Introduction

An apprenticeship is a season in your career when your focus is more on your own growth than almost anything else.

This is a time for you to delay your ambitions of immediately maximizing your earning potential in order to maximize your learning opportunities ... And once that season is over, your priorities will need to adapt

Emptying the Cup

Michel Grandmont’s “Tasting a New Cup of Tea.”

Your First Language

Become fluent in one language for the next few years which will be used to solve problems and the default skill to hone when practising (Python).

Best way to improve-- solve real problems (duh). The fundamental way to improve this experience is to seek out opportunities to create short feedback loops (which help gauge progress).

... test-driven development techniques can keep you focused on taking small steps and ensure you check your assumptions.

Read the language specification.

The White Belt

You've reached some competency but are at a plateau, how do you continue to accelerate the pace of learning and personal development?

Learn new technologies, explore, try new paradigms.

"Now you must try to avoid synthesizing new and old knowledge until the new knowledge has had time to sink in, and approach this new knowledge with the mind of a beginner. This may mean losing some productivity in the short term in order take a leap forward once you master the new approach."

Learning new domains, you learn to express yourself idiomatically.

Action

Find something to unlearn: write an existing program you have written in another language that uses a different paradigm.

Unleash Your Enthusiasm

As an apprentice you bring freshness and enthusiasm to the team.

Team dynamics should always be considered. If you find yourself on a team that does not accept your excitement, you will need to find ways to nurture your passion.

For a team that is open to excitement and contributions of an apprentice, this is the time to take risks and speak your mind.

Concrete Skills

Acquire concrete skills so that others know you can take responsibility. Examples: writing build files in various popular languages, knowledge of various popular open source frameworks, basic web design, JS and standard libraries.

Expose Your Ignorance

Conceding to unspoken pressures and telling people what they want to hear is not a good way to build strong relationships. Tell people the truth. ... your reputation will be built upon your learning ability rather than what you already know.

The most obvious way to expose your ignorance is to ask questions.

One of the most important traits that a craftsman can possess is the ability to learn, identifying an area of ignorance and working to reduce it.

Action

Write down a list of five things you really don’t understand about your work. Put that list where others can see it. Then get in the habit of refreshing this list as your work changes.

Confront Your Ignorance

Pick one skill, tool, or technique and actively fill the gaps in your knowledge about it.

As an apprentice you must be able to expose ignorance as well as confronting.

The Deep End

How to get involved with bigger, larger projects and problems

Jump in at the deep end. Take the promotion or foreign assignment even if there is a high chance of failure. Be prepared to fail and recover.

... you still need to remember that if the water level is above your head it means you’re drowning.

Track the projects you work on in terms of size, complexity. Use it as a measure the progress of taking on responsibility.

Retreat into Competence

(Dunning-Kruger, knowing that you know nothing in the vast scope of your field)

Reflect on how much you do know and what you have learnt.

Reinforce what you do know via a small project.

Walking the Long Road

Craft Over Art

Focus on delivering value to your customer over advancing your own self-interests.

Sustainable Motivations

“Do what you love and the money will follow.” ... While many programmers could probably find higher-paying jobs in the short term, the money that follows from doing what you love will pay off handsomely in the long run.

Action

Write down at least 15 things that motivate you. Wait a little while, then write down another five. How many of your motivations are about what other people think rather than what you feel? Write down the list of five most important things and refer to it in tough times.

Nurture Your Passion

"Try to keep the sense of wonder about programming that you had at age 14. If you’re worried that your current job is rotting your brain, it probably is." - pg.

Draw Your Own Map

If your role is not aligning with what you want to do day to day or there is no opportunity within the company to transition into increasing the work you enjoy, leave.

Use Your Title

Stay in the Trenches

A Different Road

Accurate Self Assessment

Be the Worst

If you are the smartest person in the room, you're in the wrong room. Surround yourself with excellent devs. Being the weakest, your goal is to work harder than anyone else and work your way up from the bottom.

Find Mentors

Kindred Spirits

Rubbing Elbows

(Pair Programming, or broadly collaboration.)

Sweep the Floor

As a new apprentice volunteer for the unglamorous but necessary tasks. Writing docs, editing wiki, tests, bug fixes, code reviews, ...

Avoid becoming the team gopher that only does the unglamorous tasks or shying away from more responsibility. If that does happen, remember to Nurture Your Passion, Unleash Your Enthusiasm, advocate for yourself, and look for every opportunity to prove yourself worthy of higher-level work.

Perpetual Learning

"software development is composed of two primary activities: learning and communication..." - Andy Hunt.

Expand Your Bandwidth

You must develop the discipline and techniques necessary to efficiently absorb new information, as well as to understand it, retain it, and apply it. Seek new knowledge and experiences.

Practice, Practice, Practice

"Deliberate Practice" (K. Anders Ericsson)

[T]he masters described by George Leonard love to practice is that they do something a little bit different each time an exercise is performed. The point is not to hone your memory, but to discover the nuances in even the simplest skilled activity.

Practice makes permanent.

Get the fundamentals sharpened!! Data structures and algorithms.

Breakable Toys

Build small (useful) projects such as address book, wiki or calendar to learn and explore without the fear of failure. Actively try ideas and techniques that might lead to failure.

Personal wiki is a good project to work with HTTP, REST, web design, full text search, databases...

Other examples: Games (Tetris, tic-tac-toe), IRC clients, blogging software.

The goal is to learn new things (technologies, language idioms) and create a custom app that serves your needs. They should be fun.

Use the Source

Examine the structure of the codebase and try to work out why the files were laid out that way. See if there is a rationale behind the way the developers modularized the codebase and compare it to the way you would have done it.

Action

Pick an algorithmically sophisticated open source project (mercurial?). Browse the source noting algorithms and data structures and design patterns that are new. Write a post describing the architecture and new ideas learnt. Where can it be applied in your everyday work?

Reflect As You Work

Consider whether your practices are novel, innovative, or outdated. Ask yourself questions about the things that the rest of your team takes for granted. If there is something particularly painful or pleasant about your current work, ask yourself how it got that way, and if things are negative, how can they be improved?

Personal Practices Map: Writing down things they do and connections between them. (?)

Record What You Learn

Code diary :). Chronological record of lessons learnt

Try to make new connections every time you review the material.

Public and Private wikis

Share What You Learn

Write blog posts on lessons learnt. Provide the information you wish had existed and that would have helped you learn.

Create Feedback Loops

Find something in your working environment that you can measure and, more importantly, affect. Track that metric for a while.

Learn How You Fail

[T]he goal is to gain self-knowledge about the patterns, conditions, habits, and behaviours that lead you to failure.

Construct Your Curriculum

Reading List

Read Constantly

Study the Classics

Dig Deeper

Going to the primary sources of concepts (Roy Fielding's PhD thesis on REST)

Find out who first came up with the ideas and understand the problems they were trying to solve.

When you read a tutorial, you should not be looking for code to copy but for a mental structure in which to place your new knowledge. Your goal should be to understand the historical context of the concept and whether it is a special instance of something else.

[Y]ou need to take care not to accidentally become a narrow specialist. The goal is to be able to acquire as much specialized knowledge as necessary to solve any problem, without losing your perspective about the relative importance of different aspects of software development. (?)

Action (Come back to this later)

Familiar Tools

Know when to use the right tools. Trade-offs between the tools you know and productivity of the team. Don't let tools become "Golden hammers".

Acknowledge tools can become obsolete (subversion) and better tools are out there.

For your career to prosper, you must learn to acquire and abandon familiar tools with ease.

Action

Write down a list of familiar tools. If the list has less than five items, look for tools that will fill gaps. Unfamiliar tools or new tools altogether.

For lists greater than five, are there more powerful tools available? Are there tools that may become obsolete?