reading-notes

张俊的读书笔记

View project on GitHub

cover

作者: Dave Hoover / Adewale Oshineye
出版社: O'Reilly Media
副标题: Guidance for the Aspiring Software Craftsman
出版年: 2009-10-25
页数: 168
定价: USD 29.99
装帧: Paperback
ISBN: 9780596518387

豆瓣链接

CHAPTER ONE Introduction

  • What Is Software Craftsmanship?
  • What Does It Mean to Be an Apprentice?
  • What Does It Mean to Be a Journeyman?
  • What Does It Mean to Be a Master?
  • What Is Apprenticeship?
  • What Is an Apprenticeship Pattern?

CHAPTER TWO Emptying the Cup

“If you come to me with a cup that is already full, how can you expect me to give you something to drink?”

The more experience you already have, the more effort you will need to put into “emptying your cup,” clearing your mind of bad habits, setting aside the pride you have in your skills, and opening yourself up to the different, often counterintuitive, approaches of your more experienced colleagues.

2.1 Your First Language

Context

You are just starting out and have only a shallow understanding of one or two programming languages.

Problem

You feel your job depends on you delivering a solution written in a specific programming language and of the same standard of quality as your teammates. Alternatively, obtaining a job in the first place depends on your proficiency in a specific programming language.

Solution

Pick a language. Become fluent in it. For the next few years this will be the main language you use to solve problems, as well as the default skill you have whenever you are practicing.

Action

Find your language’s specification.For others there may only be a grammar available. For still others the only specification may exist in the language’s implementation. Consider taking up the challenge of writing the specification.

If the language’s standard library is open source, read through it using the techniques described in the Use the Source pattern. Another approach you can take to building up your knowledge of a language is to ask the people you work with how they chose the first language they mastered.

Finally, you can find out more about the idioms we mentioned earlier: the Muenchian method, the Schwartzian Transform, and Duff’s Device. They’re all named after programmers who had a practical problem to solve. Try to track down the problems that these idioms were originally meant to solve, and ask yourself how you would solve the same problems in your primary language.

See Also

“Breakable Toys” (5.3), “Dig Deeper”(6.4) , “Find Mentors”(4.2) , “The Long Road” (3.1), and “Use the Source” (5.4).

2.2 The White Belt

Context

You have developed a deep understanding of your first language and are walking comfortably on a plateau of competence. Your colleagues recognize your abilities and call on you to help them solve problems in your area of expertise. You have pride in your skills.

Problem

You are struggling to learn new things and it seems somehow harder than it was before to acquire new skills. The pace of your self-education seems to be slowing down despite your best efforts. You fear that your personal development may have stalled.

Solution

While retaining the confidence you have gained through your learning, set your previous knowledge aside as you approach new situations.

Taking this approach to learning new technologies accelerates the learning process tremendously. Training yourself to suspend the use of your customary programming idioms allows you to discover new possibilities. However, as a programmer finally feeling proud of achieving a significant level of expertise, taking a step toward ignorance and allowing yourself to look foolish can be painful.

How many times have you failed to try something new out of fear of being thought silly? How often have you censored your spontaneity out of fear of being thought childish? … Psychologist Abraham Maslow discovered a childlike quality in people who have met an unusually high degree of their potential. Ashleigh Montagu used the term neotany (from neonate, meaning newborn) to describe geniuses such as Mozart and Einstein. What we frown at as foolish in our friends, or ourselves, we’re likely to smile at as merely eccentric in a world-renowned genius, never stopping to think that the freedom to be foolish might well be one of the keys to the genius’s success.

Action

Find an opportunity to unlearn something. Ideally, this would be something that forces you to put aside your previous experience.

For instance, take a program you have written in one programming paradigm (e.g., imperative, object-oriented, functional, array/vector-oriented, etc.) and implement it in a language that uses a different paradigm.

See Also

“Breakable Toys”(5.3), “Practice, Practice, Practice”(5.2), and “Reflect As You Work” (5.5).

2.3 Unleash Your Enthusiasm

Context

You have an insatiable excitement and curiosity regarding the craft of software development.

Problem

You find yourself holding back, conscious of how much more enthusiasm you have for the work than your colleagues do.

Solution

Despite (and because of!) your inexperience, you bring some unique attributes to your team, including an infectious enthusiasm. Do not allow anyone to dampen your excitement for the craft—it is a precious commodity and will accelerate your learning.

However, on a team that is open to the excitement and contributions of an apprentice, you will provide some unique qualities that more experienced developers rely upon, such as unfettered imagination and enthusiasm. This is the time in your career when it makes the most sense to take risks and speak your mind. You have very little to lose. Your ideas and passions will add intelligence and diversity to your team.

Action

Think of the last time you had an idea but didn’t propose it. Find the person you would have suggested it to and describe your idea to her. If she points out flaws, try to persuade her to help you improve it.

See Also

“Expose Your Ignorance” (2.5) and “Nurture Your Passion”(3.4).

2.4 Concrete Skills

Context

You are seeking a role on a talented team of craftsmen that will provide you with better learning opportunities than you currently have.

Problem

Unfortunately, that team has no incentive to risk hiring someone who may not be able to directly contribute to the team’s workload. The team also faces the possibility that you may not even be able to indirectly contribute, such as by automating some simple manual tasks.

Solution

Acquire and maintain concrete skills. The point is that you will often require hiring managers to take a leap of faith in choosing you. Concrete skills (which are ideally discrete enough that you can bring toy implementations to an interview) allow you to meet them halfway. A deep understanding of Your First Language(2.1) will help establish your credibility and should prove to be extremely useful to your team.

Action

Collect the CVs of people whose skills you respect. You can either ask them for a copy or download the CVs from their websites. For each person, identify five discrete skills noted on the CV, and determine which of these skills would be immediately useful on the kind of team you want to join. Put together a plan and a toy project that will demonstrate that you have acquired these skills. Implement the plan.

See Also

“Your First Language” (2.1).

2.5 Expose Your Ignorance

Context

The people who are paying you to be a software developer are depending on you to know what you’re doing.

Problem

Your managers and team members need confidence that you can deliver, but you are unfamiliar with some of the required technologies.

Solution

Show the people who are depending on you that the learning process is part of delivering software. Let them see you grow.

The most obvious way to expose your ignorance is to ask questions. This is easier said than done, particularly when the person you’re asking has assumed that you already know the answer. Press on! Sure, you could protect your pride and take less direct routes to obtain the required knowledge, but remember that your road to journeyman will be shortened by taking the most direct route available. With practice and time, you will find that asking direct questions to the most knowledgeable people on your team will become second nature. While you are exposing your ignorance, you are also exposing your team to your learning ability.

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.

See Also

“Confront Your Ignorance” (2.6), “Dig Deeper” (6.4), and “The Long Road” (3.1).

2.6 Confront Your Ignorance

Context

You have identified gaps in your skillset, gaps that are relevant to your daily work.

Problem

There are tools and techniques that you need to master, but you do not know how to begin. Some of these are things that everyone around you already seems to know, and there is an expectation that you already have this knowledge.

Solution

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

For some people, the best approach involves trying to get an overview by reading all the introductory articles and FAQs they can get hold of. Other people find that jumping straight to the construction of Breakable Toys is the most effective way to understand something.Whichever approach works for you, don’t forget to ask around to your Kindred Spirits and mentors to see if anyone already has this skill and is willing to share what they’ve learned. Sometimes others will be trying to acquire this skill as well, and by working together you can make better progress.

This pattern is closely tied to Expose Your Ignorance(2.5), but implementing it is less of a challenge to your pride because it can be done in private, without anyone else ever finding out the things you did not know. However, as an apprentice with aspirations to mastery, you need to be willing to Expose Your Ignorance(2.5) as well. Using this pattern in isolation (that is, confronting your ignorance without exposing it) runs the risk of encouraging a culture where failure and learning are unacceptable because everybody does their learning in secret.

On the other hand, it is also possible to Expose Your Ignorance(2.5) without confronting it. People who do this merely shrug apologetically when confronted by their ignorance, as if to say “that’s just the way it is.” This leads to a lifetime of being humble, ignorant, and overly dependent on other members of the team. Eventually, it leads to teams where each member defends her own little silo of knowledge and shrugs when a problem crosses into someone else’s territory.

So it’s important to strike a delicate balance between this pattern and Expose Your Ignorance(2.5). Confronting your ignorance on its own leads to arrogant infovores who never get anything done, while exposing your ignorance without seeing it as a problem to be solved leads to excessive humility and helplessness.

Action

Take the list of items from Expose Your Ignorance(2.5) and strive to learn each one, crossing them off the list as you do so. This new knowledge you have may reveal gaps you hadn’t noticed before; don’t forget to add these things to your list.

See Also

“Breakable Toys” (5.3), “Expose Your Ignorance” (2.5), and “Kindred Spirits” (4.3).

2.7 The Deep End

Context

Taking small, safe steps has left you unsatisfied. You’re beginning to fear that this isn’t a plateau but a rut. On a plateau, you consolidate your skills through diligent practice in order to attain the next level; in a rut, bland competence eventually decays into mediocrity.

Problem

You need to grow your skills, your confidence, and your portfolio of successful work. You feel the need to challenge yourself with bigger things. This may involve bigger projects, larger teams, more complex tasks, new and business domains, or new places.

Solution

Jump in at the deep end.Even though we advocate seeking out the most challenging tasks you are capable of, you still need to remember that if the water level is above your head it means you’re drowning. It’s your responsibility to offset the risks of this approach by Finding Mentors(4.2) and Kindred Spirits(4.3) who can provide help when you need it.

It’s also your responsibility to Create Feedback Loops(5.8), so that if the challenging project starts to spin out of control you can catch it and get help immediately. Applying this pattern should feel brave rather than reckless.

Action

What is the biggest successful project you have ever worked on in terms of lines of code and number of developers? What is the biggest codebase you have ever built on your own? Write own the answers to these questions, and then see if you can find other dimensions of project complexity and other ways of measuring your projects. Use these metrics to measure every project you have ever been involved in. Now, when the next project comes along, you can draw a chart of all your projects and plot where the new project falls among the others. After a while, you will be able to use this chart to see where your career is heading, and even start to make choices based on it.

See Also

“Create Feedback Loops” (5.8), “Find Mentors” (4.2), and “Kindred Spirits” (4.3).

2.8 Retreat into Competence

Context

You are beginning to realize how little you know, or perhaps you have taken on a new challenge and things aren’t working out so well. Or both.

Problem

As you are introduced to the vast reaches of your ignorance you are overwhelmed.

Solution

Retreat briefly into your competence to regain your composure. Take some time to build something that you know how to build. Then use that experience to recognize how far you’ve come and how much you are currently capable of.

You must accept that this pattern is only a short-term fix while you gather your strength to bounce back. Set a time limit (or “timebox”) for yourself, such as “I will spend the next 10 minutes refactoring the JavaScript validation for this page before I optimize the SQL queries that provide the data.” Or “I will spend the next four hours implementing the command-line interface for this tool before I learn how to call this third- party SOAP API.” Or “I will spend the rest of today improving our test coverage before taking on the job of optimizing our code that is affected by Python’s Global Interpreter Lock.”

Another important aspect of this solution is to use the temporary break to seek support from the mentors and Kindred Spirits you have gathered around you. With their support and the boost of a recent display of competence, you should be better equipped to handle the inevitable bumps on the road when you try again.

Action

Pick something self-contained that you know really well and reimplement it.

See Also

“Confront Your Ignorance” (2.6), “Expose Your Ignorance” (2.5), “Kindred Spirits” (4.3), and “The Long Road” (3.1).

CHAPTER THREE Walking the Long Road

3.1 The Long Road

Context

We live in a culture that values overnight celebrity, rising stars, material wealth, and quick results. There are very few programmers around who can tell you what software development used to be like back in the old days.

Problem

You aspire to become a master software craftsman, yet your aspiration conflicts with what people expect from you. Conventional wisdom tells you to take the highest-paying job and the first promotion you can get your hands on, to stop programming and get onto more important work rather than slowly building up your skills.

Solution

First, accept the fact that you may be considered a bit strange for what you want to become. Second, keep your focus on the long term. During your apprenticeship, value learning and long-term growth opportunities over salary and traditional notions of leadership.

People aspiring to become masters of software craftsmanship need to plan for the long term. This long (yet bright) journey will bring you a rich set of abilities. You will become skilled at learning, problem solving, and developing strong relationships with your customers. You will come to wield knowledge and technology as the samurai uses his short and long swords. You will come to comprehend and appreciate the deeper truths of software development. But all this will take time.

You should be prepared for the length of this journey. When you Draw Your Own Map(3.5), you should keep in mind the expectation that you will be a working software developer even when you are middle-aged. Let this influence the jobs you take and the scope of your ambitions.

We don’t want to give the impression that everyone must follow a single road (see Draw Your Own Map(3.5)) or that this is the right road for every software developer (see A Different Road(3.8)). Some people leave development permanently and become executives, testers, salespeople, or project managers. Some people leave technology permanently and enter into entirely different fields.

Action

Close your eyes and imagine the strangest possible role you could be playing in 10 years’ time. Have fun thinking of the wackiest possible future for yourself. Then think about 20, 30, and 40 years from now. What kinds of experiences do you want to have tried? Imagine that 40 years from now you are asked to write a short description of your professional history and the biggest influences on your path. Use the output from that thought experiment to help you plan your future career choices.

See Also

“A Different Road” (3.8) and “Draw Your Own Map” (3.5).

3.2 Craft over Art

Context

You are being paid to build something that will solve a problem for a customer.

Problem

Although there is a proven solution available, your customer’s problem represents an opportunity to do something truly fantastic, providing you with an opportunity to create something beautiful that will impress your colleagues.

Solution

Craftsmanship is built upon strong relationships. Focus on delivering value to your customer over advancing your own self-interests.As a craftsman you are primarily building something that serves the needs of others, not indulging in artistic expression.

You need to do your best work in ways that place the interests of your customers over your desire to display skill or pad your resume, while still adhering to the minimum standards of competence provided by the software development community. Walking The Long Road(3.1) means you must balance these conflicting demands.

The things we build for customers can be beautiful, but must be useful. Part of the process of maturation encompassed by this pattern is developing the ability to sacrifice beauty in favor of utility if and when it becomes necessary.

Action

In the next 24 hours, find an opportunity to do something useful rather than beautiful. This may be a straightforward choice, or it may involve a more subtle trade-off. The important thing is to make yourself aware of the issues discussed here when you choose what to do.

See Also

“The Long Road” (3.1).

3.3 Sustainable Motivations

Context

As an apprentice, you must develop your technical skills. Because of this you will often find yourself working in the messy realities of ambiguously specified projects for customers with shifting and conflicting demands.

Problem

Working in the trenches of real-world projects is rigorous, sometimes tedious, sometimes exhausting, often frustrating, and frequently overly chaotic or constraining.

Solution

Ensure that your motivations for craftsmanship will adapt and survive through the trials and tribulations of The Long Road(3.1).

Some programmers become inadvertently trapped by their motivations. In More Secrets of Consulting, Dorset House, Jerry Weinberg describes this phenomenon as the Golden Lock: “I’d like to learn something new, but what I already know pays too well.” The risk of the Golden Lock highlights the importance of aligning your motivations with The Long Road(3.1), which requires the ambition to achieve mastery. A desire for mastery should motivate you to be wary of Golden Locks as they inevitably present themselves. As you progress as a craftsman, you will be faced with tough decisions that will determine whether you have the freedom to stay on The Long Road(3.1) or whether you will find yourself trapped in a Golden Lock.

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? Are the percentages different between your first 15 and the final 5? How many of the motivating factors can you do without? Now write down a list of the five most important things that motivate you. Keep that list somewhere that you can look at it when times get tough.

See Also

“Nurture Your Passion” (3.4) and “The Long Road” (3.1).

3.4 Nurture Your Passion

Context

You have been hired as “just” a software developer.

Problem

You work in an environment that stifles your passion for the craft.

Solution

Take steps to protect and grow your passion for software craftsmanship. Unfortunately, your daily activities often work to diminish this passion.

Work on what you like. Find something at work that interests you, identify it as something you enjoy, and pour yourself into it. If you can’t spare enough time during the workday for this activity, consider putting in some extra time. If this isn’t feasible, dedicate some time outside of work to build some Breakable Toys(5.3).

Seek out Kindred Spirits(4.3). Join a local user group that focuses on something you want to learn more about. Start a weblog and read blogs that interest you. Participate in online forums and mailing lists and Share What You Learn(5.7).

Study the Classics(6.3). Immersing yourself in some of the great literature of our field can carry you through the rough spots when your passion is in jeopardy. These timeless books can open your eyes to a different world, a world where things can be better.

Draw Your Own Map(3.5). There are times when your needs, goals, and aspirations contradict the career paths your employer provides. Moving into an organization that offers career paths congruent with your own can protect your passion.

Action

On your way to work prepare a list of three positive ideas to talk about. During the day, if the conversation starts to sap your energy, steer it to one of these three topics. The aim is to take control and avoid being dragged down by the negative conversations around you. On the way home, review your level of success and think about other ways to improve your environment.

See Also

“Draw Your Own Map” (3.5), “Kindred Spirits” (4.3), “Study the Classics” (6.3), and “The Long Road” (3.1).

3.5 Draw Your Own Map

Context

Any given employer can offer only a limited subset of all possible career paths.

Problem

None of the career paths that your employer provides fits for you.

Solution

Identify a logical but ambitious next step for your career. With your next career step identified, visualize the smaller, interim steps you need to take to move forward.

Rather than simply writing down high-level goals, try to define small, achievable steps. These small steps will provide feedback that you can use to modify your map, but they also make it easier to get help from Kindred Spirits(4.3) to achieve your goals.

If you find that your vision of yourself is not in accord with your employer’s vision for you, and there doesn’t seem to be a way to reconcile the differences, examine other opportunities to see if they’re heading in the desired direction.

You should continuously reassess your map as your circumstances and values change. Sometimes your map will be in accord with that of those around you, and sometimes your map will require you to chart your own path through the wilderness. Some apprentices we’ve spoken to have found that being open about their current map has enabled them to find Kindred Spirits(4.3) while maintaining healthy relationships with current and past employers. The only constant is that the map is always yours, and you’re free to redraw it at any time.

Use Sustainable Motivations(3.3) and Use Your Title(3.6) to prevent your current title and salary from narrowing the possible destinations on your map. If you need to move into a less hierarchically impressive role in order to stay “on the map,” consider The Long Road(3.1) and compare the relative importance of impressive (short-term) titles and salaries to working in a company that is more congruent with your goals and will lead you greater heights in the long term.

Some organizations will be able to rally behind the audacious goals their people set for themselves. Other organizations choose not to. If this is the case at your organization, you need to begin to look elsewhere by Expanding Your Bandwidth(5.1) and Finding Mentors(4.2) who can provide guidance.

Action

List three jobs that you think you could do following your current one. Then list three jobs each of those could lead to. Take a hard look at all 12 jobs. Is this really the full range of desirable jobs for the next few years of your life? Is there something missing? Extend this diagram by adding three jobs for each of the nine jobs you recently added. This should increase the number of jobs in your diagram by 27. Ask yourself if this set of jobs is more representative of the range of career options you have and the places you want to take your career. What are the constraints that are limiting your options?

If you’re unhappy with the diagram so far, repeat the exercise with different jobs, perhaps in different business or technology domains. Then try the exercise yet again and see what happens if you relax one of the constraints that you’ve always accepted. What if you become willing to move to another country, get a new qualification, or learn a new human/programming language? What if you were to start your own business? What if that business merely used software as a means to an end? There are more possibilities than you might think.

See Also

“Expand Your Bandwidth” (5.1), “Find Mentors” (4.2), “Kindred Spirits” (4.3), “Sustainable Motivations” (3.3), “The Long Road” (3.1), and “Use Your Title” (3.6).

3.6 Use Your Title

Context

As a result of your dedication to learning, you have been hired or promoted (formally or informally) into a position with a title containing words such as “senior,” “architect,” or “lead.”

Problem

Your job title doesn’t match what you see in the mirror. When you introduce yourself in a professional setting, you feel as if you have to apologize or explain away the difference between your skill level and your job description.

Solution

Do not allow your title to affect you. It is a distraction that should be kept on the outskirts of your consciousness. Use your title to gauge your organization, not yourself.

Don’t be fooled by an impressive title. The other side of the coin is an unimpressive title despite the fact that you have surpassed your colleagues. Like the flattery of an impressive title, the frustration that comes from a lack of recognition should remind you that our industry has a problem.

Another variant of this theme is informal versus formal titles. For instance, you may have grown into a position of authority on your team, despite your formal title remaining the same. These informal titles can be hard to ignore, because they are constantly reinforced by your peers, even if they conflict with your self-assessment. During these times, your connections with your mentors and Kindred Spirits(4.3) will be critical to keep you grounded in reality.

Action

Write down a long and descriptive version of your job title. Make sure it accurately reflects what you really do at work and your skill level. Keep this updated, and from time to time imagine how you would view a stranger who had this job description.

See Also

“Draw Your Own Map” (3.5) and “Kindred Spirits” (4.3).

3.7 Stay in the Trenches

Context

As a result of your dedication to learning, you have established a reputation as someone who can effectively deliver software. Within your organization, exceptional work is rewarded with promotions up the hierarchy.

Problem

You have been offered a promotion into a role that will pull you away from programming.

Solution

The offer of a promotion will test whether you have Sustainable Motivations(3.3) and are willing to walk The Long Road(3.1). Most people equate promotion into management with success.

So to remain on that path, work with your employer to find other mechanisms for rewarding you. These may include more pay or nontraditional technical leadership roles such as internal consultancy. If your organization is inflexible, then it is better to seek opportunities elsewhere (see Draw Your Own Map(3.5)) than to permit yourself to be promoted away from the craft.

Staying in the trenches is a way to Nurture Your Passion(3.4) for software development. When you accept a promotion that allows you to continue programming full time, remember to Use Your Title(3.6).

Action

How does your employer reward excellence? If their current rewards aren’t appealing, start thinking of other ways they could reward you. Consider whether there are standard constraints that could be loosened in your case. Perhaps there are restrictive clauses in your contract or you have a radical idea that needs sponsorship. Prepare a list of these alternative rewards so that when you reject that promotion, you’re in a position to negotiate based on a clear understanding of your own motivations.

See Also

“Draw Your Own Map” (3.5), “Nurture Your Passion” (3.4), “Sustainable Motivations” (3.3), “The Long Road” (3.1), and “Use Your Title” (3.6).

3.8 A Different Road

Context

You have used Draw Your Own Map(3.5) and followed it diligently.

Problem

The map you have drawn leads you away from The Long Road(3.1).

Solution

You have been walking The Long Road(3.1) for some time. But now as a consequence of Drawing Your Own Map(3.5) you have realized that this road is no longer a suitable choice for you. You have found another path that has rewards more in tune with your current values: more time with your family or more money, or perhaps a new vocation has captured your attention. Whatever it is, it means saying goodbye to the craft and The Long Road(3.1). This may or may not be permanent.

Even if you leave the road permanently, the values and principles you have developed along the way will always be with you. If you walk away from software development, you will find that the habit of rigorous thinking and automating tasks involving large volumes of data will still be useful wherever you go.

Action

If for some reason you could no longer be a software developer, what would you do? Write down some of the other jobs you think you would enjoy doing. Find people who are doing those jobs and loving it. Ask them what they love about it and compare that to the things you love about software development.

See Also

“Draw Your Own Map” (3.5) and “The Long Road” (3.1).

CHAPTER FOUR Accurate Self-Assessment

4.1 Be the Worst

Context

You have Unleashed Your Enthusiasm(2.3) and taken every opportunity to learn new skills. As a result, you have outgrown your team and possibly your entire development organization.

Problem

Your rate of learning has leveled off.

Solution

Surround yourself with developers who are better than you. Find a stronger team where you are the weakest member and have room to grow.

Being in a strong team can make you feel as if you are performing better. The other members of that team will often prevent you from making mistakes, and help you recover from mistakes so smoothly that you won’t realize that you may not be learning as much as you think. It’s only when you work on your own that you will see how much your team increases your productivity and realize how much you have learned. This makes Reflecting as You Work(5.3) and building Breakable Toys(5.5) particularly important for people who are the worst on their team. Both provide opportunities to take a step back from the team environment to see what habits, techniques, and knowledge you’re picking up from Rubbing Elbows(4.4) with your more experienced teammates.

First, there is the risk that you will drag the team down. Second, since good teams won’t tolerate (for long) someone who is just a passenger, you run the risk of being fired if you’re so far behind that you can’t catch up or don’t seem to be catching up quickly enough. Another side effect of joining a strong team is that you can end up feeling bad about yourself and your skill level unless you’re actively honing your skills. At its best, this can motivate you to improve. But like any “sink or swim” strategy, when it fails you will find yourself drowning. This is why it is essential to Create Feedback Loops(5.8) so that you can tell when you’re in trouble. This feedback will tell you if the team is too far ahead of you or hostile to people trying to work their way up.

Like Stay in the Trenches(3.7), Be the Worst clashes with cultural norms that encourage you to attain a position of superiority as fast as you can. But as an apprentice, you should value opportunities to learn the craft over expanding and asserting your authority. Sometimes that means you’re leading a team (see The Deep End(2.7)), but as an apprentice, you should typically look to be led.

There is a selfish aspect to purposely joining a team as the worst member. To counter this, complement Be the Worst with Sweep the Floor(4.5) and Concrete Skills(2.4). Sweep The Floor(4.5) means to explicitly seek out menial tasks in order to directly add value to the project. Developing Concrete Skills will increase your contributions to the development effort and is fundamental to your role as an apprentice.

Collaborating with great developers will help you maintain a more accurate self-assessment as well as provide help in Finding Mentors(4.2).

Action

List all the teams you know. Include open source projects, other departments, and other companies. Sort these teams by skill level, then identify a team that is open to new members who want to work their way up. This may require you to join several mailing lists and ask various people questions in order to gauge their relative skill level. At the end of the process you will be better at comparing skill levels, and may even have a new team!

See Also

“Breakable Toys” (5.3), “Concrete Skills” (2.4), “Create Feedback Loops” (5.8), “Find Mentors” (4.2), “Reflect As You Work” (5.5), “Rubbing Elbows” (4.4), “Stay in the Trenches” (3.7), “Sweep the Floor” (page 4.5), “The Deep End” (2.7), and “Unleash Your Enthusiasm” (2.3).

4.2 Find Mentors

Context

You have realized that you’re not the first person to walk the path and that you are spending a lot of time exploring blind alleys.

Problem

You’re walking along a path with no idea of what’s around the next corner or how to prepare for it. You need help and guidance.

Solution

Seek out those who have gone ahead of you and strive to learn from them.

When trying to Find Mentors, an apprentice must remember that we’re all walking The Long Road(3.1) and no one knows everything. It can be tempting to feel that your mentor must be a master because she knows so much more than you do. That temptation must be resisted, because you do not want to become so disillusioned with your mentor’s inevitable weaknesses or blind spots that you feel you can no longer learn from someone who still has much to offer.

Sure, it’s easy to locate authors, conference speakers, committers on popular open source projects, and developers of successful websites. But the difficulty is twofold. First, these people may not be interested in mentoring; and second, reaching out to ask for something as strange as “apprenticeship” can be incredibly intimidating. This is similar to the risks associated with diving into The Deep End(2.7). Just keep in mind that the risk of being rejected or thought strange by a potential mentor is low, while the potential payoff is huge.

Action

Pick a tool, library, or community that has an active mailing list. Sign up to the list, but don’t post any messages yet. Just lurk. Over time you will start to understand the values of the community and learn which of the subscribers are patient teachers. When you have this understanding, seek out the members of this list at the next conference and see if they would be interested in providing you with some informal advice about the lessons they have learned.

See Also

“The Deep End” (2.7) and “The Long Road” (3.1).

4.3 Kindred Spirits

Context

You are months or years into your apprenticeship and you find yourself discouraged by the culture of your development organization.

Problem

Organizational cultures that encourage software craftsmanship are rare. You find yourself stranded without mentors and in an atmosphere that seems at odds with your aspirations.

Solution

To keep your momentum going, especially in the absence of a full-time mentor, you need to be in frequent contact with people who are walking a similar road. Therefore you should seek out people like yourself who are also looking to excel.

The Long Road(3.1) is not a road that anyone walks alone, and particularly during the years of your apprenticeship, you need camaraderie. Some relationships are brief but career-changing; others are long-lasting and help Nurture Your Passion(3,4).

Action

List all the communities you could potentially join based on the tools you use, the languages you know, the people you have worked with, the blogs you read, and the ideas you are intrigued by. Identify which of those groups gather in the real world in your city. One by one, attend all these gatherings, and decide which groups seem most interesting.

As your group grows, feel free to explore a wide and bizarre range of topics until you have a core group of irregulars. Over time, that self-selected group of irregulars will define the nature of your group.

See Also

“Find Mentors” (4.2), “Nurture Your Passion” (3.4), and “The Long Road” (3.1).

4.4 Rubbing Elbows

Context

While you may have mentors and kindred spirits that you meet with periodically, when it comes to developing software, you work alone.

Problem

Your productivity has reached a plateau, your learning is stagnating, and you have the feeling that there are superior techniques and approaches to the craft that are eluding you.

Solution

Find ways to sit with another software developer and accomplish a hands-on task together, side-by-side. There are some things that can only be learned while you are sitting with another software developer to accomplish a shared objective.

This pattern can be closely related to Kindred Spirits(4.3). The development practice of Pair Programming is a concrete example of this pattern, and apprentices should look for opportunities to work on teams that use this technique.

Whether your experience rubbing elbows is positive or negative, you should Record What You Learn(5.6) so that you can reflect on your experiences later on.

Action

Find someone you know who has already expressed an interest in starting or contributing to an open source project. Arrange to spend one evening a week working together on the project. See how long the two of you can keep each other motivated. The strains of a busy life will inevitably weaken the motivation behind your collaboration; when that happens, you must adapt and find ways to keep the project going until that motivation returns. Of course, if motivation never returns, it is up to you to seek out a new partnership where you can learn new things.

See Also

“Kindred Spirits” (4.3) and “Record What You Learn” (5.6).

4.5 Sweep the Floor

Context

You are a new apprentice on a project.

Problem

You’re unsure of your place on the team, and the team is unsure of you. You wish to find a means of contributing to the team’s work, earning the team’s trust, and growing in stature as a craftsman.

Solution

Volunteer for simple, unglamorous, yet necessary, tasks. This is a good way to contribute to the team’s success early on by showing that you can do a high-quality job even when it doesn’t seem to matter.

Examples of these tasks include maintaining the build system, production support, responding to maintenance requests, bug fixing, code review, eliminating technical debt, setting up the project wiki, updating documentation, acting as a sounding board for other people’s ideas, and so on.

There are a few negative consequences that may occur when you apply this pattern. One is that you may end up as the team’s gopher, condemned to do the menial tasks no one else will do. Alternatively, you may find yourself intimidated by doing anything other than Sweeping the Floor. There is also the danger that you may not be able to develop an appreciation for the bigger picture if you only work on piecemeal tasks with no wider coherence. If you find yourself in any of these situations, try to Nurture Your Passion(3.4), Unleash Your Enthusiasm(2.3), advocate for yourself, and look for every opportunity to prove yourself worthy of higher-level work.

Action

What’s the grungiest task that your team has been putting off for months? It will be the one that everybody complains about and that no one wants to tackle. Tackle it. And don’t just hold your nose and force yourself to do it; see if you can creatively resolve the problem in a way that exceeds people’s expectations and makes it fun for you.

See Also

“Nurture Your Passion” (3.4) and “Unleash Your Enthusiasm” (2.3).

CHAPTER FIVE Perpetual Learning

5.1 Expand Your Bandwidth

Context

You have picked up a basic set of skills.

Problem

Your understanding of software development is narrow and focused only on the low-level details of what you’ve worked on in your day job.

Solution

  • Sign up for Google Reader (or another blog aggregator) and begin subscribing to software development blogs.
  • Start following some software luminaries on Twitter and pay attention to what they’re working on.
  • Subscribe to a moderately high-traffic online mailing list and try to answer people’s questions by reproducing their issues.
  • Join a newly formed local user group that is excited about a new technology. Don’t just attend silently—introduce yourself to the organizer and offer to help.
  • Persuade your employer to send you to a technical conference.
  • After you read a book, contact the author with a note of appreciation and a question.
  • Don’t forget that there are hundreds of online academic courses, podcasts, and videos (such as Google’s extensive series of Tech Talks) available for free through iTunes and YouTube.

Use this pattern judiciously, for while it will accelerate your learning, it will slow down your development velocity, and therefore will have diminishing returns if applied for more than a few months.

Action

Attend a local user group within the next month. Research a related national conference you’d like to attend. Start reading a book by one of the conference speakers. Contact the author with some questions after you’re finished with the book.

5.2 Practice, Practice, Practice

Context

You want to get better at the things you do and you want to develop Concrete Skills(2.4) in new areas.

Problem

The performance of your daily programming activities does not give you room to learn by making mistakes. It’s as if you’re always on stage.

Solution

Take the time to practice your craft without interruptions, in an environment where you can feel comfortable making mistakes. The key to this pattern is to carve out some time to develop software in a stress-free and playful environment: no release dates, no production issues, no interruptions.

Short feedback loops need to be incorporated into your practice sessions. While practice is good in theory, if you’re not getting periodic feedback you’re probably developing bad habits.

A good way to ensure you have interesting exercises to use in your practice sessions is to trawl through old books like Programming Pearls, More Programming Pearls, or Etudes for Programmers.

Action

Find an exercise in one of the previously mentioned books or contrive one of your own. Make sure that it’s just a little harder than one you know you can easily solve. You should have to struggle to solve it the first time. Solve this exercise from scratch once a week for the next four weeks, and observe how your solutions evolve. What does this tell you about your strengths and weaknesses as a programmer? Take that knowledge and try to find or devise a new exercise that will have a measurable impact on your abilities. Repeat.

See Also

“Breakable Toys” (5.3)and“Concrete Skills” (page 2.4).

5.3 Breakable Toys

Context

Experience is built upon failure as much as (if not more than) success.

Problem

You work in an environment that does not allow for failure. Yet failure is often the best way to learn anything. Only by attempting to do bold things, failing, learning from that failure, and trying again do we grow into the kind of people who can succeed when faced with difficult problems.

Solution

Budget for failure by designing and building toy systems that are similar in toolset, but not in scope to the systems you build at work.

When implementing the Breakable Toys pattern, make your systems relevant and useful to your life as an apprentice.

A classic example of the use of this pattern is the multitude of people who have built their own wikis. A personal wiki is a great tool for the apprentice because you can use it to Record What You Learn(5.6).

The Breakable Toys pattern is similar to Be the Worst(4.1), but that pattern is about finding a team where you can grow. Breakable Toys is more about deliberately creating opportunities to learn by stepping beyond your boundaries and single-handedly building complete software projects. It is also related to The White Belt(2.2) and Confront Your Ignorance(2.6), but is less focused on letting go of your previous knowledge.

Action

Use your favorite tools to build the world’s simplest wiki while still maintaining the highest standards of quality. The initial version doesn’t need to have anything more than a simple user interface that lets you view and edit plain-text files. Over time, you can add more features and find interesting ways to distinguish your wiki from the thousands that already exist. Do not be constrained by existing implementations; instead, let your professional interests guide you. For instance, you might have an interest in search engines; in this case your wiki could experiment with ranking algorithms or tagging. It really doesn’t matter what you decide to do, as long as you experiment and learn.

See Also

“Be the Worst” (4.1), “Confront Your Ignorance” (2.6), “Record What You Learn” (5.6), and “Use the Source” (5.4).

5.4 Use the Source

Context

Newcomers to the open source world often find that their questions are answered with the phrase “Use the source, Luke.” This expresses a fundamental truth about software: the code is the ultimate arbiter. The programmer’s intentions are irrelevant if the code disagrees. Only by reading the code can one truly understand a system.

Problem

Without exemplars of good practice to study and emulate, the Practice, Practice, Practice(5.2) pattern only entrenches the bad habits you don’t know you have. If you never walk a mile in someone else’s moccasins, you may come to believe that all shoes are meant to have stones in them. So how do you find out if your work is any good, given that those around you may not have the ability to tell good code from bad?

Solution

Seek out other people’s code and read it.

Action

Pick an algorithmically sophisticated open source project such as a source control—system, for example, Subversion, Git, or Mercurial. Browse the project’s source, noting down the algorithms, data structures, and design ideas that are new to you. Now write a blog post describing the architecture of the project and emphasizing the new ideas you have learned. Do you see places in your everyday work where the same ideas can be applied?

See Also

“Practice, Practice, Practice” (5.2).

5.5 Reflect As You Work

Context

Anyone who is reasonably competent will find themselves being pushed up the promotion ladder over the years. Sooner or later you end up wearing the senior developer hat in a corporate team or open source project. If you do not take steps to prepare yourself for that elevation, you may suddenly find yourself a victim of the Peter Principle, where you are promoted to your “level of incompetence.”

Problem

As the number of years and projects you have under your belt increases, you find yourself awaiting the epiphany that will magically make you “experienced.”

Solution

Become a reflective practitioner of software development. This involves regular introspection into how you are working. 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? The goal is to extract the maximum amount of educational value from every experience by taking it apart and putting it back together in new and interesting ways.

One technique that’s useful in making this kind of reflection explicit is to use something like a Personal Practices Map.

Action

Draw a Personal Practices Map for your working habits. Concentrate on the connections between any practices that have not changed in a while. Ask yourself how your map would change if you discovered that one of those practices was actually counterproductive. Closely examine one of those practices and find out if there are other ways to achieve the same goal. These don’t have to be better ways; it’s enough for them to be different. Now ask yourself what would happen to your map if you were to adopt one of these different practices.

5.6 Record What You Learn

Context

You learn the same lessons again and again. They never seem to stick. You often find yourself repeatedly doing things such as setting up CruiseControl, modeling hierarchies in SQL, or introducing patterns to a team. You remember doing very similar things in the past, but the exact details escape you.

Problem

Those who do not learn from history are doomed to repeat it.

Solution

Keep a record of your journey in a journal, personal wiki, or blog.

Using a blog to record the lessons you’ve learned also has the side benefit of helping you meet Kindred Spirits(4.3), while a wiki that has accidental linking allows you to see the connections between your experiences.

Also keep in mind that your choice of record-keeping tool can also be an important Breakable Toy(5.3).

This pattern is similar to Share What You Learn(5.7), but there the emphasis is on preparing to become a journeyman by improving your ability to communicate with honesty and humility. Here the emphasis is on preserving the route you took to mastery so that in future you can extract new lessons from it.

Action

Grab a paper notebook and start jotting down your thoughts about this book and any ideas it inspires. Make sure your notes have a date on them. Once you’ve finished this book, keep using the same notebook in the same way for the other things you learn. Over time these entries may become the basis for blog posts, magazine articles, or even a book.

See Also

“Breakable Toys” (5.3), “Kindred Spirits” (4.3), “Read Constantly” (6.2), and “Share What You Learn” (5.7).

5.7 Share What You Learn

Context

You have been an apprentice for a little while. You know a few things and people are starting to look to you as a source of knowledge.

Problem

Up until now, you have focused exclusively on your own improvement as a craftsman. To become a journeyman you will need the ability to communicate effectively and bring other people up to speed quickly.

Solution

Early in your apprenticeship, develop the habit of regularly sharing the lessons you have learned. This may take the form of maintaining a blog or running “brown bag” sessions amongst your Kindred Spirits(4.3). You can also make presentations at conferences or write tutorials for the various technologies and techniques that you are learning.

This pattern is most clearly connected to Record What You Learn(5.6). If you have recorded the things you have learned, it is easier to share them with others. On the other hand, this pattern carries the risk that people won’t always appreciate the things you share.

The gains made through the application of Sweep the Floor(4.5) can easily be undone if others, rightly or wrongly, feel that you are insufficiently humble in the way you share or that you are sharing your lessons due to some ulterior motive.

Be the Worst(4.1) steers you toward better learning opportunities at the risk of neglecting your responsibilities to the craft. You could fall into a perpetual mode of selfishly sponging knowledge by constantly looking for opportunities to accelerate your learning without ever considering the people who would benefit were you to Share What You Learn.

Action

Think back to the last significant lesson you learned. Write a blog post about it. Provide the information you wish had existed and that would have helped you learn.

Having written the blog post, imagine you’re being asked to prepare a workshop for a conference that will teach other people the same lesson. Sketch out that workshop. See if the act of thinking about how you would teach others in an engaging way causes you to rethink the lesson and the blog post.

See Also

“Be the Worst” (4.1), “Kindred Spirits” (4.3), “Record What You Learn” (5.6), and “Sweep the Floor” (4.5).

5.8 Create Feedback Loops

Context

You can’t tell if you’re suffering from “unconscious incompetence” since, as Justin Kruger and David Dunning put it in their article of the same name, those who are unskilled are often unaware of it. Moreover, the less skilled you are, the worse you are at assessing the skills of yourself and others. Success or failure tends to come as a surprise, and what little feedback you receive is an abrupt shock to your self-assessment instead of a support mechanism to help you improve.

Problem

Your self-assessment is only relative to the abilities you used to have, and will always lack objectivity. The teams you work with can easily skew your sense of your own competence. Being on an above-average team can either make you feel like a superstar when you’re really more of a backup singer, or destroy your self-confidence when everybody seems so much more competent than you. On the other hand, a below-average team can make you feel complacently smug. Even if you use Reflect as You Work(5.5), it will only help you analyze the past rather than inform you about the present.

Solution

Create mechanisms for regularly gathering more or less objective external data about your performance. By soliciting feedback early, often, and effectively, you increase the probability that you will at least be conscious of your incompetence.

So what does useful feedback look like? Useful feedback is data that can be acted upon and that gives you the option of doing more or less of a certain behavior. If you can’t do anything about it, then it’s not useful feedback. Or at least it’s not useful today.

Acquiring the ability to avoid defending your current level of knowledge in favor of paying careful attention to any feedback is one of the ways in which this pattern overlaps with The White Belt(2.2). Both patterns emphasize the idea that the apprentice should strive to become more teachable so that the pool of potential teachers expands.

Action

Find something in your working environment that you can measure and, more importantly, affect. Track that metric for a while. As it changes, ask yourself what it’s telling you about your world. See if you can use it (and other metrics) to understand the effects of the changes you are making to your working environment.

See Also

“Reflect As You Work” (5.5)and“The White Belt” (2.2).

5.9 Learn How You Fail

Context

Failure is inevitable. It happens to everybody sooner or later. In fact, someone who has never failed at anything has either avoided pushing at the boundaries of their abilities or has learned to overlook their own mistakes.

Problem

Your learning skills have enhanced your successes, but your failures and weaknesses remain.

Solution

Seek to identify the ways in which you tend to fail and try to resolve those that are worth fixing.

This is not about wallowing in self-pity about past mistakes nor is it an exercise in seeking perfection. Instead, the goal is to gain self-knowledge about the patterns, conditions, habits, and behaviors that lead you to failure. Armed with that self-knowledge, you can make conscious choices and temper the tendency toward idealism when applying “Draw Your Own Map” (3.5) with an awareness of your boundaries and limitations.

By becoming conscious of the things that trip you up, you allow yourself the choice between working to fix these problems or cutting your losses. Accept that there will be some things that you’re not good at, or that would require a disproportionate investment of time and effort in order to make a small improvement.

Action

In the programming language of your choice, use a simple text editor (later on you will see why it’s important that you don’t use an IDE for this exercise) to write an implementation of binary search in one sitting. Do not compile or run it yet. Now, write all the tests that you think you will need to verify that you have a correct implementation. Keep note of the bugs and problems you discover at this stage. Now, still without compiling or running the tests, go back and fix all the problems that you have discovered so far. Iterate until you’re satisfied that the code and the tests are both perfect. Finally, try to compile and run the tests. Most people will discover corner cases they hadn’t thought of and trivial little errors. Before you fix these errors, try to understand how they could have occurred in something you were sure was perfect. What does that tell you about yourself? Write down what you learn in the iterations between what you thought was perfect code and the point when you have code that actually compiles and passes all the tests.

See Also

“Draw Your Own Map” (3.5).

CHAPTER SIX Construct Your Curriculum

6.1 Reading List

Context

After developing enough competence and skill to become proficient in Your First Language(2.1), you’re beginning to look around and see the incredible amount of information you still need to learn.

Problem

The number of books you need to read is increasing faster than you can read them.

Solution

Maintain a Reading List to track the books you plan to read, and remember the books you’ve read.

In the spirit of the Share What You Learn(5.7) pattern, consider storing your list in a public space.

Action

Create a text file, perhaps putting it under source control. Type in all the books you’re currently reading. This is your Reading List, and the simplest possible implementation of this pattern. Now all you have to do is keep this text file up to date.

See Also

“Find Mentors” (4.2), “Kindred Spirits” (4.3), “Share What You Learn” (5.7), and “Your First Language” (page 2.1)

6.2 Read Constantly

Context

You have Unleashed Your Enthusiasm(2.3) to open lots and lots of doors.

Problem

There seems to be an endless stream of deeper and more fundamental concepts that are eluding you, despite your proficiency at Your First Language(2.1).

Solution

Focus your thirst for learning on consuming as much of the written word as possible. Emphasize books over blogs as you construct your Reading List(6.1).

There should be seasons of The Long Road(3.1) when you have (or take) the opportunity to read a significant number of books.

Immersing yourself in the classics and primary sources of the field provides an unparalleled education when coupled with Finding Mentors(4.2) and frequent interactions with Kindred Spirits(4.3).

Action

By reading this book, you have already begun to apply this pattern. The trick is to keep up the momentum after you’ve finished this book. Decide now what your next book will be. Buy or borrow it so that when you finish this book, you can switch immediately to the next one.

See Also

“Find Mentors” (4.2), “Kindred Spirits” (4.3), “Reading List” (6.1), “The Long Road” (3.1), “Unleash Your Enthusiasm” (2.3), and “Your First Language”(2.1).

6.3 Study the Classics

Context

You are self-taught, or had a highly practical education that valued skills training over theory.

Problem

The experienced people you collaborate with are constantly referencing concepts such as Brooks’ law from books that they assume you—and any self-respecting software developer— have read.

Solution

Expose Your Ignorance(2.5) and ask about the unknown concept and the book it came from. Add this book to your Reading List(6.1). By Reading Constantly(6.2) and Reflecting as You Work(5.5), you will, like Jerry, eventually be able to “only read the good ones.” The wisdom captured in such classics is vital information to keep you heading in the right direction on The Long Road(3.1).

Action

What is the oldest book in your pile? Read that one first. The next time you’re flicking through another developer’s book collection, take note of the oldest books and ask the developer why she still owns them.

See Also

“Expose Your Ignorance” (2.5), “Read Constantly” (6.2), “Reading List” (6.1), “Reflect As You Work” (5.5), and “The Long Road” (3.1).

6.4 Dig Deeper

Context

You live in a world of tight deadlines and complex software projects that use a multitude of tools. Your employers cannot afford the luxury of employing enough specialists to fill every role. You learn only enough about any tool to get today’s job done. You select a handful of tutorials on the language or library that you’re working with today. You make decisions without taking the time to understand the issues, and copy the toy examples provided with the tools. This works to the extent that you can turn your hand to anything. You acquire the ability to dive into a new technology and come up with a solution very quickly. You only ever learn the parts of a technology that you need to get your portion of the system working, and you depend on other members of the team to learn the other parts. For instance, you may be a server-side Java developer, and consequently have little or no knowledge of how the user interface was built.

Problem

You keep running into difficulty maintaining the code you’ve written because it turns out that the tutorials you followed cut corners and simplified complex issues. You find that your superficial knowledge of a thousand tools means you’re always floundering whenever a subtle bug arises or you have to do something that demands deep knowledge. People often accuse you of having a misleading CV because you don’t distinguish between a couple of weeks of extending an existing web service and a deep knowledge of the issues inherent in maintaining an interoperable and highly scalable enterprise system. What’s even worse is that because your knowledge is so superficial, you’re not even aware of how little you know until something or someone puts you to the test.

Solution

Learn to dig deep into tools, technologies, and techniques. Acquire the depths of knowledge to the point that you know why things are the way they are. Depth means understanding the forces that led to a design rather than just the details of a design.

The areas where you have deep knowledge feed your confidence and guide you when you are deciding how to apply Sweep the Floor(4.5), because they indicate places where you can deliver value early in your time with a new team.

One of the ways to use this pattern is to get your information from primary sources. This means that the next time someone talks to you about Representation State Transfer, better known as REST, you should take that as an excuse to read Roy Fielding’s PhD thesis in which he defined the concept. Consider writing a blog post to clarify or share what you’ve learned, and to encourage others to read the original document as well.

Find out who first came up with the ideas and understand the problems they were trying to solve. This kind of context usually gets lost in translation as the idea gets passed around.

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. Ask yourself if there appears to be some underlying computer science concept behind what you are learning, and what trade-offs were made in the implementation that you are using. Armed with this deeper knowledge, you should be able to go beyond the initial tutorial when you run into problems.

If you apply this pattern regularly, you will become one of those people who truly understand how their tools work. You will no longer just be gluing bits of code together and depending on other people’s magic to do the heavy lifting. Be aware that this understanding will separate you from the vast majority of programmers you work with, and will make you the logical choice for the most difficult assignments. Consequently, you will be the most likely to fail completely or succeed spectacularly. In addition, do not allow this knowledge to make you arrogant. Instead, continue to seek out opportunities to Be the Worst(4.1). Challenge yourself to assemble useful tools from these fundamental building blocks, rather than just basking in your ability to take things apart.

Action

Find and read RFC 2616, which describes HTTP1.1, and RFC 707, which describes the state of the art in Remote Procedure Call technology as of January 1976. Armed with your deeper knowledge of HTTP, try to implement a client and a server for RFC 707. When you feel you have a good understanding of the trade-offs made by the editors of RFC 707, examine a modern open source implementation of the same ideas, such as the Apache Thrift framework that powers Facebook. Then, from your informed vantage point, write a blog post describing the evolution of our knowledge regarding remote procedure calls and distributed systems over the last three decades.

Now, go and read Steve Vinoski’s articles about RPC. Do you now have doubts about the depth of your understanding? Write a blog post about your doubts and your current level of understanding.

See Also

“Be the Worst” (4.1)and“Sweep the Floor” (4.5).

6.5 Familiar Tools

Context

Every project is filled with new things to learn. There are new team members, new roles within the team, new business domains, new techniques, and new technology.

Problem

Amid all this flux, something has to stay the same, or you might as well be engaged in research. How can you provide any guarantees about anything to your customer? When you say it will take a certain amount of time to deliver some feature, your customers need some basis for their confidence in your ability to deliver.

Solution

Identify and focus on a set of familiar tools.

Action

Write down a list of your familiar tools. If the list has less than five items, start hunting around for tools that will fill the gaps in your toolbox. This may simply be a matter of identifying a tool you already use but don’t know well enough, or it may involve finding new tools altogether. Either way, put together a plan for learning these tools and start implementing it today.

If you already have five familiar tools, carefully examine them. Are better and more powerful tools available? Are you clinging to tools that are already obsolete? Are there emerging tools that threaten to render elements of your toolbox obsolete? If the answer to any of these questions is yes, then start the process of replacing these tools today. If you need somewhere safe to experiment with new tools, make use of Breakable Toys(5.3).

See Also

“Breakable Toys” (5.3).