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?