- Apprentice is someone who is always looking for better ways to solve problem. This includes finding new people, companies, situations that force you to learn. As apprentice learns, he is able to improve his craft. Improving here can be doing something faster, or using novel solutions.
- A journeyman is one who mentor those around him and communicate new ideas within them.
- A master performs all the roles of an apprentice or journeyman. He also focuses on expanding the industry forward. A master seeks new solution, or explore uncharted territories.
This book contains apprenticeship patterns in software craftsmanship. Beginners and professional software developers can use these patterns to advance their skills.
Chapter 1: Emptying The Cup
The first step in learning something new is by “emptying your cup”. This means that you have to clear your mind of bad habits. Set aside your pride and open yourself to new, counterintuitive approaches to craftsmanship. The following is the list of apprenticeship patterns in “emptying your cup”.
Your First Language
Pick a language and learn it to depth. Build projects in it and ask more experience programmers for feedbacks. Or, use testing framework and REPL to check your understanding. Having mentor is very important. As Ralph Johnson puts it,
”It is possible to learn a language on your own, but it takes a long time to learn the spirit of a language unless you interact with experts”.
To start learning your first language, find the language specification and read it. Read through the standard library and understand the techniques. Find out idioms and what were they used to solve.
Wearing Your White Belt
After learning your language, your progress seems to stall. Wearing the white belt means that you have no choice but to learn the way. This includes the what’s and the why’s. Acknowledge that in learning the new way, you may have to sacrifice productivity. Avoid synthesising old and new knowledge until the latter sinks in.
Unleash Your Enthusiasm
As an apprentice, it is your duty to inject enthusiasm to the team. Enthusiasm is infectious. You might have fresh perspective from your background. As Pete McBreen puts it,
“Enthusiastic beginners not only renew the craftsmen, but also challenge the craftsmen by bringing in new ideas from the outside”.
One way to do this is to collect the CVs with skills you want. Or, you can look at their portfolio website or LinkedIn. Then, identify five discrete skills noted on the CV. After that, determine which of these skills would be useful in your career. Put together a toy project to show that you understand these skills.
Pick an item from the list before and try to learn it. But, you have to strike the balance between confronting your ignorance and delivering product. Learning new tools should not prevent or sacrifice your team’s productivity.
Expose your ignorance in a specific technology.
Show the people who are depending on you that learning process is part of delivering software.
Expose your ignorance and ability to learn by asking questions. Asking questions not only help you to learn new things, it also help the answerer to foster his understanding of the problem/ solution.
One way to do this is to identify the things that you know, related to the work. Put a list of 5 things you don’t know and put it where others can see it.
In Malcolm Gladwell’s book, Outlier he outlined the 10000 hours rule. The rule says that to be an expert in a field, one have to spend approximately 10 000 hours of deliberate practice. Deliberate practice means doing exercises that stretch your abilities.
To stretch yourself in software craftsmanship, identify the biggest successful project you have ever worked on. Then, see if you can build another project that explores a different complexities. Measure the metrics to see how much you’ve grown in building this project.
Retreat Into Competence
Once in a while, you’ll get stuck in learning new things. This is fine. Acknowledge that you are stuck, then retreat into competence. This means, pick something self-contained that you know well and reimplement it.
Chapter 2: Walking The Long Road
The Long Road
Long term growth and learning trumps short term salary and traditional notions of leadership.
Craft Over Art
Always serve your customer’s values first, over building artistic program that is hard to maintain.
Alway think long term. When your current work pays well, learn something new.
Nurture Your Passion
Find new project that you like. Learn about ideas that you like.
Draw Your Own Map
Find the things that you want to achieve in 1, 5,10,20,30 years. Draw your map on how to get there.
Stay In The Trenches
Always prefer learning over money.
A Different Road
Suppose you can no longer be a software developer, what would you do? Write down some of them and find other people who are already working there. Ask what they love about it and compare it with software development.
Be The Worst
When your rate of learning decreases, surround yourself with developers better than you. Find a stronger team where you are the weakest and have opportunities to grow. How do you balance between being the worst, but providing the value to the team? You can Sweep The Floor or use your Concrete Skills.
Find teachers who can teach you. Find a meet up group and join it. Contact the more experienced developer them and ask them to mentor you.
Be in contact with other craftsman. Join a community and provide values to it. Be aware of group think. Always ask questions and provide answers.
List all the tools that you use, the languages that you know or ideas that you like. Attend gatherings related to these or start your own. Advertise anywhere and everywhere that software developers can see. Grow it until you have a community.
Find ways to work with another software developer and work side by side. Work in open source project together.
Sweep the Floor
Seek out menial task to add value to the project. Volunteer for simple, unglamorous, yet necessary tasks. These tasks include:
- Maintaining build system
- Production support
- Responding to maintenance request
- Bug fix
- Code review
- Cut technical debt
- Setting up project wiki
- Update documentation
Chapter 3: Perpetual Learning
Expand Your Bandwidth
Be quick to learn new things. Follow software development blogs, Twitter and high traffic online mailing list.
Practice, Practice, Practice
Do deliberate practice. This includes Breakable Toys or implementing new algorithms.
Build your own wiki.
Read other people’s codes and documentations. Find the way they do things, what algorithms or data structures they use.
Reflect As You Work
Get feedback and think if there’s other way to solve a problem?
Record What You Learn
Learn and write everything you’ve learnt.
Write things that you wished you know existed when you were first starting out.
Create Feedback Loops
In development, use tests, a lot. In project, find people that are willing to give you honest feedbacks.
There will always be more books that you could ever read. Maintain a reading list and start reading them. Put the more impactful on a reading list so others can read it as well.
Always read a book when learning new technology. When given a choice between book or blog, choose book. Books ground you with better fundamentals. Strong fundamentals allow you to learn more difficult stuffs later.
Read the documentation. Read the old books.
Read the documentation and specifications. Understand the low level. Use debuggers. Read RFC 2126 and RFC 707 documentation.
Write a list of your tools. Increase the list overtime. In time, all tools will be junk. So choose breadth over depth.
“When we say something is a craft, one of the things we mean is that it is a discipline and a tradition that places a high value on skill. This includes acquiring, growing, and eventually transmitting that skill. We believe true mastery is shown in the effect you have on others by transmitting your superior skill.”