Apprentices are people who are willing to take on a junior role that maximizes their learning opportunities, as opposed to people who try to climb as quickly as they can into roles that maximize their financial opportunities. In my experience, if the apprentice has talent and the right attitude, their financial success will inevitably follow their learning success.
==========
“I want to change the way people think about programming,” Kent said. I agreed. We both wanted to reverse what we thought had been a wrong turn in the progress of our industry. And, amazingly, we did it.
==========
The strongest patterns are the ones that are applied productively over and over again.
==========
Patterns don’t have to be new to be useful. In fact, it’s better if they are not new.
==========
Well, we’ve overloaded our profession with resources.
==========
So, why this book now? Well, we’ve overloaded our profession with resources. There is more information available about our revolution than any one person can absorb. Still, some people manage to do it. They internalize all the advice available to them and always seem to have it close at hand. How do they do achieve that level of mastery? This book is full of patterns for mastering our complex field. Mastering is more than just knowing. It is knowing in a way that lightens your load.
==========
All the advice that has come out of our revolution does not help much until it becomes second nature. The craftsmanship movement in software recognizes that making this stuff second nature isn’t, well, second nature. These patterns are a welcome contribution to this progression.
==========
He who knows not and knows not that he knows not, is a fool — shun him!
He who knows not and knows that he knows not, is unlearned — teach him!
He who knows and knows not that he knows, is asleep — awaken him!
He who knows and knows that he knows, is enlightened — follow him!
==========
A pattern is a named description of a recurring solution to a problem in a given context.
==========
Patterns are meant to be open to modification to fit your circumstances rather than mechanically applied.
==========
As with all pattern languages, you should be careful not to overuse these patterns. Don’t look for excuses to use every single pattern, but instead pick and choose the most appropriate set for your situation.
==========
book—you can dip into it for inspiration from time to time.
==========
This book is written for software apprentices—for people who have had a taste of developing software and want to take it further, but need some guidance.
==========
There are many other books we would recommend for people in those roles, but this book is for people at the beginning of the journey.
==========
The journey discussed here starts with “Hello world!”, but where does it end? Far too often, it ends with a promotion to middle management.
==========
The journey discussed here starts with “Hello world!”, but where does it end? Far too often, it ends with a promotion to middle management. Too many talented people thoughtlessly take that promotion and find themselves just a few years later in jobs they don’t enjoy and yearning for retirement. But for those who have a knack for developing software and enjoy the learning process, software development is a career that can last a lifetime, and it can be a great ride.
==========
For any programmer proficient in his first language, it’s always a temptation to fall back to the standards and idioms of your native language when you’re learning a new language.
==========
Our goal here is not simply to hand people a rule book, but to give them the ability to create new practices for new contexts, which in turn drives the discipline of software development forward.
==========
An attachment to Carol Dweck’s research, which calls for a “growth mindset.” This entails a belief that you can be better and everything can be improved if you’re prepared to work at it. In her words, “effort is what makes you smart or talented” (Mindset, p. 16), and failure is merely an incentive to try a different approach next time. It is the opposite of the belief that we’re all born with a given amount of talent, and that failure is an indication that you don’t have enough of it.
==========
A need to always be adapting and changing based on the feedback you get from the world around you.
==========
A desire to be pragmatic rather than dogmatic.
==========
A belief that it is better to share what we know than to create scarcity by hoarding it.
==========
A willingness to experiment and be proven wrong. This means we try stuff. We fail. Then we use the lessons from that failure in the next experiment.
==========
A dedication to what psychologists call an internal locus of control.[6] This involves taking control of and responsibility for our destinies rather than just waiting for someone else to give us the answers.
==========
Instead, we think that a useful system should be able to identify and absorb the best ideas from all elements of the software development community.
==========
“I guess it basically means having the attitude that there’s always a better/smarter/faster way to do what you just did and what you’re currently doing. Apprenticeship is the state/process of evolving and looking for better ways and finding people, companies and situations that force you to learn those better/smarter/faster ways.”
==========
“It is not an internal quantity that is fed by easy successes and diminished by failures.... It is not something we give to people by telling them about their high intelligence. It is something we equip them to get for themselves—by teaching them to value learning over the appearance of smartness, to relish challenge and to use errors as routes to mastery”
==========
you must learn to grow yourself, to learn how you learn.
==========
At some point, an apprentice is approached by a master or a journeyman and told that her work and her role in the community are that of a journeyman. In such a case, the apprentice had previously begun taking on more responsibilities, and like a “boiled frog” had made a gradual but not discrete transition from one state to another. That transition may take longer for some people than for others. For some, the transition may take longer than their professional careers.
==========
The journeyman’s responsibilities are wider than those of an apprentice. As such his failures can do more harm. Some of the patterns we will discuss are not appropriate for a journeyman, precisely because he has a greater responsibility to others who may see him as a mentor.
==========
They might be facing overbearing and/or incompetent managers, de-motivated coworkers, impossible deadlines, and work environments that treat novice developers like workhorses, storing them in small, rectangular stalls with a PC and a crippled Internet connection.
==========
An apprenticeship is a season in your career when your focus is more on your own growth than almost anything else.
==========
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.
==========
One of the fundamental ways to improve the experience of learning your first language is to have an actual problem to solve.
==========
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.
==========
One danger of digging deep into your first language is getting stuck. It likely will remain with you throughout your career as your native tongue.
==========
Apprentices comfortable with an object-oriented language should explore a functional programming language. Apprentices comfortable with dynamic typing should explore static typing. Apprentices comfortable with server-side programming should explore user interface design.
==========
You shouldn’t be wedded to any particular technology, but have a broad enough background and experience base to allow you to choose good solutions in particular situations.
==========
never stopping to think that the freedom to be foolish might well be one of the keys to the genius’s success.
==========
Find an opportunity to unlearn something. Ideally, this would be something that forces you to put aside your previous experience.
==========
Ask that person to explain some of the misconceptions that people from your particular background usually have about their community.
==========
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.
==========
They either repress their enthusiasm altogether, or allow it to manifest only outside of their day jobs.
==========
Comprehension can be increased if more levels of experience are connected, as when newcomers who take nothing for granted interrelate more often with old-timers who think they have seen it all.
==========
Craftsmen learn from the apprentices, even as the apprentices learn from them. Enthusiastic beginners not only renew the craftsmen, but also challenge the craftsmen by bringing in new ideas from the outside. A well chosen apprentice can make even a master craftsman more productive.
==========
Collect the CVs of people whose skills you respect.
==========
According to research by the social psychologist Carol Dweck, the need to appear competent is ingrained into people of most industrialized societies.
==========
Software craftsmen build their reputations through strong relationships with their clients and colleagues.
==========
Expertise is a by-product of the long road we’re all on, but it is not the destination. Over the course of their journey, craftsmen will work with countless technologies and domains.
==========
However, as an apprentice with aspirations to mastery, you need to be willing to Expose Your Ignorance as well.
==========
Remember that learning in public is one of the ways in which an apprentice begins the transition to journeyman. It’s a small step from learning where people can see you to teaching.
==========
One of the distinguishing facets of the craft approach is a willingness to put the wider interests of your community before your own, rather than using the team and the client to further your personal growth.
==========
This new knowledge you have may reveal gaps you hadn’t noticed before; don’t forget to add these things to your list.
==========
It’s your responsibility to offset the risks of this approach by Finding Mentors and Kindred Spirits who can provide help when you need it.
==========
Dave saw that although these exceptional people were miles ahead of him, they were all walking the same road.
==========
you should keep in mind the expectation that you will be a working software developer even when you are middle-aged.
==========
And rather than counting the days to retirement, the craftsman will willingly and joyfully work into her final decades.
==========
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.
==========
The things we build for customers can be beautiful, but must be useful.
==========
utility and beauty are not opposed, but interdependent.
==========
Sometimes you will make the wrong trade-off, and fixing that mistake by rewriting the system from scratch may not be in the customer’s best interest. In those situations you will need to develop the ability to refactor and repair.
==========
Anyone who has ever seen a programmer at work...knows that programming itself, if the programmer is given the chance to do it his way, is the biggest motivation in programming.
==========
“I’d like to learn something new, but what I already know pays too well.”
==========
Your mother might think you deserve it, but impressive titles and responsibilities do not indicate that your apprenticeship is over.
==========
more time with your family or more money, or perhaps a new vocation has captured your attention.
==========
If and when they came back, we welcomed them with open arms because those experiences had given them new perspectives they could share. Sadly, conventional software organizations may not be so welcoming. They often see these detours as suspicious gaps in your career that you must justify. They will expect you to have a rationale that makes sense within their value system for why you left and why you’re coming back.
==========
Be the lion’s tail rather than the fox’s head!
==========
Organizational cultures that encourage software craftsmanship are rare.
==========
Humility is one of the foundations of a successful apprenticeship. Combined with ambition, humility will help keep you focused and progressing in the right direction.
==========
Andy Hunt, a highly respected software craftsman, has asserted numerous times that software development is composed of two primary activities: learning and communication
==========
We would build on that idea and assert that the core theme of an apprenticeship is learning and the dominant trait of a successful apprentice is a demonstration of her learning abilities.
==========
The only people who achieve much are those who want knowledge so badly that they seek it while the conditions are still unfavourable.
==========
Apprentices are thirsty for opportunities to replace their ignorance with skill.
==========
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.
==========
Over time, maintaining a wiki can teach you about HTTP, REST, parsing, web design, caching, full-text search, databases, and concurrency.
==========
Your notebook, blog, or wiki should be a nursery, not a graveyard—lessons should be born from this record, rather than going there to die.
==========
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.
==========
Furthermore, teaching is a powerful learning tool for the person doing the teaching, perhaps even more so than for the students. Thus the old saying “When one person teaches, two people learn.”
==========
Ingenuity is often misunderstood. It is not a matter of superior intelligence but of character. It demands more than anything a willingness to recognize failure, to not paper over the cracks, and to change. It arises from deliberate, even obsessive, reflection on failure and a constant searching for new solutions. —Atul Gawande, Better
==========
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.
==========
Be sure to intermingle classics with modern, pragmatic books and/or articles in your Reading List.
==========
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.
==========
Armed with your deeper knowledge of HTTP, try to implement a client and a server for RFC 707.
==========
We can guarantee that the tools you use as an apprentice will be obsolete by the time you become a journeyman. In time, all of your favorite tools will become junk. For your career to prosper, you must learn to acquire and abandon familiar tools with ease.
==========
When we say that 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.
==========
In software development, we don’t know exactly what constitutes mastery, but we do know what it isn’t.
==========
As an apprentice, you should aim to become better than your teachers. And if they are good teachers, they should try to help you achieve that goal.
==========
Mere genius is not mastery, but if a person is able to train others to equal or surpass her genius, then it becomes evident that person is a potential master.
==========
there are no masters...yet.
==========
Working with masters is the best way to learn a craft.
==========