My Take on Master Craftsman Teams
I enjoyed reading Uncle Bob’s post on Master Craftsman Teams. My first reaction was that I was happy that Bob was focusing on the people-side of software craftsmanship to balance out his ongoing message of technical excellence. My second reaction was that of being slightly amused since I knew that Bob was theorizing and proposing these ideas based on his decades of experience, but not based on an actual team that’s using the exact structure of 1 master, 3 journeymen, and 9 apprentices. I was amused because I know how much people respect Bob (myself included) and I knew that they would take his description very seriously.
Some people did take it very seriously and the comments are still coming in. Many of them are excellent, some are misguided, and I’m going to share my thoughts on them in this post. I feel compelled to post this in parallel because I have focused a lot of my time and energy on software craftsmanship, and specifically apprenticeship, over the last six years. I feel like my experiences could shed some light on Bob’s ideas. I know that there are other people like Micah, Paul, and Karl who could chime in with their experiences too, and I hope they do.
The most interesting theme that has come out of Bob’s post is that of education. Bob asked:
Why should a young aspiring software professional spend four years and $200K+ to attend an institution that will teach them less about their chosen profession than 3 months of working on a real project with talented mentors?
Not surprisingly there were some people who disagreed with Bob’s take on this. Unfortunately, many took Bob’s post as an all-or-nothing proposition. As if Bob would be in favor of completely shutting down all university computer science education.
Ronald Woan commented:
I would hate to start signing people up out of high school for a career in software development.
I assume Ronald means that he would hate if that were the only way people became software developers. Because there is certainly nothing inherently wrong with people trying to become software developers right out of high school. Nathaniel Talbott was an apprentice right out of high school and has become a successful software developer and entrepreneur. My company’s third apprentice was hired at the age of 20, lacking any formal training in software development. He has been a constant source of innovation and technical excellence since the day he was hired.
Several people brought up the idea of either intermixing apprenticeship and formal education or going back to school after you’ve learned enough to know what you need to learn. I think there is a lot of potential in both of these ideas. Jeff didn’t like Bob’s proposal because he thinks it would “rob the profession of prestige” and thought Bob was being “unfair and reductive about what CS students learning college.” But Jeff goes on to say that he was in fact self-taught and has gone back to school recently to get a MS in computer science. I think this idea of experienced software professionals going back to obtain formal education makes a lot of sense. As a self-taught software developer, I can imagine how much more effective this education would be for me now compared to when I first started programming.
Jeff comments again later:
As I said above, turning software engineering into the sort of profession that does not require a college education will greatly reduce any prestige associated with the field.
I feel the need to point out that software engineering is already the sort of profession that does not require a college education, so what Bob is proposing isn’t earth-shattering. To be clear, one of Bob’s points is that the ever-increasing cost of a college education has in many cases exceeded its value. If someone is already motivated to learn a specific subject, an apprenticeship is probably a better choice than an expensive college degree. When I was 18, I wasn’t a motivated learner, so college made sense for me because I still had a lot to figure out. I majored in psychology and learned all sorts of things that have helped me in my subsequent careers. When I was 25 I discovered I had become a motivated learner during graduate school. And when I needed to make some extra money after my daughter was born, I taught myself HTML. This learning process eventually morphed into me teaching myself how to develop software and eventually I forged my own apprenticeship. Along those lines, Renzo points out that what you learn in college, regardless of your major, can benefit you as a software developer:
Why not learn physics, maths, chemistry or other high abstraction disciplines with the specific goal to move to computer science right after? I know a lot of successful examples of cross-discipline CS professionals and the success seems to depend on their ability to think “differently” than the subject of their studies.
Brad Appleton proposed combining “college education and on-the-job training together, in some kind of work-study vocational program,” which I think has merit. Michael Hunger solidifies this idea by relating:
In Germany we have an apprenticeship education for all people not going to University. They work part time in companies to learn their craft and part time go to school to get some additional theoretical background.
This approach sounds like it has legs. Michael also reaffirms Jeff’s approach to going to school “AFTER gaining practical experience.”
I was surprised that I found myself disagreeing with Michael Feathers in his comments:
I don’t think any of us can conceive of a world where seat of the pants learning ever replaces institutionalized education for the bulk of the industry.
Well, it’s not hard for me to conceive of that world. That’s the world I live in, and most everyone I’ve met in the industry lives in that world, regardless of their academic background. In fact, some of our brightest people at Obtiva have either no college degree or have a degree in philosophy, economics, or theology. We’re professional learners. We’re learning to become great software developers. Craftsmen even. How is this possible? The INTERWEB and Open Source! The barriers to expert knowledge have largely been removed by our ability to instantly and cheaply access endless amounts of online discussions, articles, books, screencasts, and source code that pertain to problems we are solving. I think the bulk of our industry does not actually need much school-taught computer science theory for the majority of what we do, and that these things could be self-taught later, or we could use computer science specialists as mentors and implementers for tasks that require these skills. What our industry needs most is people who are passionate about learning and can communicate effectively with their customers.
Michael also commented that:
When you learn theory you gain a startling amount of practical insight into problem solving. Programmers who don’t do a rigorous CS degree are lucky if they find it on their own. Most won’t, even with apprenticeships. It doesn’t have to be that haphazard.
I disagree. Programmers who don’t do a rigorous CS degree can gain that insight through hard work and a lot less money. I suppose there may be some luck involved, but mostly it’s about reading a ton of books, coding all the time, and setting up learning opportunities for yourself by seeking out great mentors. Plus, you can always go back to fill in some gaps by taking courses after you’ve identified the holes in your knowledge.
Another theme of the comments was on the difficulty of finding master craftsmen. Pascal was one of the early commenters on this topic and it sounds like he has had a rough go. The most experienced programmers he worked with were “terrible mentors” and “kept some bad habits from their Fortran days.” Pascal thought “four years” was a better threshold for master craftsman in his workplace. And I can’t argue with him. He was talking about his experiences and his workplace. But it’s also very sad that this is true for him.
There seems to be a belief that master craftsmen are impossible to find or retain. I think this is bullshit. Ronald Woan lamented:
The master programmer is very difficult to scale even in smaller organizations. Most organizations can’t even afford to recruit and retain one that many of would think to qualify for this level.
It’s not that organizations can’t afford a master craftsman, they simply don’t understand how to attract them. The organizations that could most easily afford them (the large ones) are almost always full of middle managers who want to manage as many people as possible so they can tell their next boss, “I successfully ran a 50 person project.” These people are going to be much more interested in hiring several mid-level developers than hiring a single master craftsman who makes more than they do. Consider how much money a 30 person application development department spends on its people. Now, I wouldn’t propose a structure exactly like Bob’s, but I do believe that having a master craftsman is critical, along with a healthy mixture of apprentices and journeymen. I assert that a 30 person application development department could be replaced with a team of 10 craftsmen for half the cost and would deploy better software more frequently. Yes, some of those people would make a lot of money, but it’s still less than what you were paying before.
The team ratios that work for us at Obtiva is 1 master, 6 journeymen, and 3 apprentices. And to be clear, we don’t actually have a master, we are growing them. My job is to play the role of master craftsman while learning how to become one. I think the “grow-your-own-master” model can work well for small organizations who can’t afford an established master craftsman and have a solid team of journeymen.
While we’re talking about apprentices and team structure, I have to agree with several commenters that I would not make throwing away apprentices’ code a standard practice. In the 2 years since starting Obtiva’s Studio, I have brought in 6 apprentices, so I have some experience on this topic. I think there is an assumption that “apprentice” means a blank slate, someone without a clue about what they are doing. In my experience, thanks to the INTERWEB and Open Source, our self-taught apprentices all come to us with some practical experience. If you’re motivated to become an apprentice, then you must be motivated to at least build some toy projects on your own, before you even start. And that’s always been the case for us and while our apprentices have made mistakes, we rarely throw their code away. More often, we would pair program with them and refactor it into a better design.
By the way, our most recent apprentice was fresh out of university, where he got a computer science degree at Carthage College. He has been highly successful thus far and his computer science degree prepared him well for his daily work with us.
There were also some concerns raised about the master craftsman taking on too much leadership versus allowing the team to self-organize. We encourage our teams to be self-organized. There is nothing inherent in software craftsmanship that prohibits self-organizing teams. Naturally the master craftsman and senior journeymen will tend to be in leadership roles, but we often have apprentices speaking up and questioning decisions, and ultimately influencing our projects’ direction. Along those lines, a few commenters raised concerns over the structure of a traditional master/apprentice relationship. I hope that people understand that the apprenticeship experience can be incredibly diverse, and can vary widely between one organization and another. Being self-taught, I have always felt that an apprenticeship is the responsibility of the apprentice. It’s not my job to act like a professor or a drill sergeant for our apprentices. Master craftsmen and journeymen are certainly accountable to guide the apprentice in the right way, but ultimately the apprentices must take responsibility for their learning. An apprenticeship is a learning activity, not a teaching activity.
I believe our field, along with our entire society, has fallen into the trap of believing that we need to be taught, rather than believing that we need to learn. We need to create ideal learning situations for ourselves, and especially for newcomers to our field, in order for us to continue advancing the state of our art. We need to create better learning situations both in our academic institutions and our workplaces, and I’m beginning to see that this may be best accomplished by finding ways of intermingling these contexts.
In a society which emphasizes teaching, children and students — and adults — become passive and unable to think or act for themselves. Creative, active individuals can only grow up in a society that emphasizes learning instead of teaching.
A Pattern Language, p. 100
