Master Craftsman Teams.
Posted by Uncle Bob on 04/01/2009
In the early ‘70s F. T. Baker, and Fred Brooks wrote about the notion of Chief Programmer teams. The idea was that a highly skilled chief programer would be assisted by a team of helpers. The chief would write most of the code, delegating simpler tasks to the helpers.
Though the idea was tried at IBM and shown to work well, the idea has never really caught on. One reason may be that the economics don’t appear to be all that good. A team of four juniors making $50K supporting a senior making $100K costs $300K. That just seems like a lot of money for one well supported chief programmer writing most of the code.
But in light of the movement towards software craftsmanship, perhaps it’s time to dust off this old idea and look at it from a different perspective. Consider the following thought experiment…
We are in the throes of a recession that is challenging us to think differently about things. At the same time our universities are raising tuitions and increasing faculty salaries, while requiring ever less from both the faculty and the students. Today’s professors spend about 9 hours per week in the classroom. And the quality of the CS majors graduating from these institutions is, to put it bluntly, wretched.
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? Indeed, why should employers pay $50K for undertrained programmers who are sure to make horrific messes for the next three years of their career?
Consider instead a team of craftspeople. At the center of this team is a master programmer. This is someone who has been programming for two decades or more. This person understand systems at a gut level, and can quickly make technical judgements without agonizing over them. Such a person can direct a team with the kind of calm confidence that only comes with years of experience and seasoning.
Our master has three lieutenant journeymen who themselves each have three apprentices. Our journeymen have at least five years of experience, and are capable both of taking and giving direction. They can make short term tactical decisions, and direct their apprentices accordingly. At the same time they take technical and architectural direction from the master.
The journeymen write a lot of code – almost as much as the master. They also throw away two thirds of the code written by the apprentices, and drive them to redo it better – always better. They teach the apprentices how to refactor, and often pair with them and sit with them while reviewing their code.
The master probably writes more code than any of the team members. This code is often architectural in nature, and helps to establish the seed about which the system will crystalize. The master also sets technical direction and overall architecture, and makes all critical technical decisions. However, the chief job of the master is to relentlessly drive the journeymen towards higher quality and productivity by establishing and enforcing the appropriate disciplines and practices. From the master’s point of view, it’s “my way or the highway.”
Yes, I know this is very anti-scrum. But this is a case where I think scrum in particular, and agile in general just got it wrong. No battle was won by gaining the consensus of the soldiers. And if you don’t think developing a system is a battle against time, resources, and attitudes, then you’ve never built a system. No great team has ever succeeded without a strong coach who imposed discipline, set the vision, and had the final authority over who played and who sat on the bench. Consensus and team rule may be useful tools some of the time, but only in the context of effective leadership.
The apprentices write a significant amount of code—most of which is discarded by the journeymen. The journeymen act as committers. When an apprentice delivers code that the journeyman finds acceptable, the journeyman will commit that code to their main line. Otherwise he sends it back to the apprentice to do over. By the same token the master accepts subsystems from the journeymen and, if acceptable, commits it to the master main line.
The master sees every line of code in the system. The Journeymen see every line of code written by their apprentices, and they write a significant amount themselves. Pairing is prevalent though not universal. Anyone on the team can pair with anyone else. It should not be uncommon for the master to pair with the apprentices from time to time.
Apprentices begin at a young age—perhaps 18 or 19. After all, the idea is that they aren’t going to a university. Rather, the brightest would start as apprentices right out of high school, while others might opt for two years of community college first.
Apprenticeship would last 2-4 years, depending on how quickly the apprentice learns. Apprentices earn no more than minimum wage. After all, they are young, barely productive, and are deriving great benefit from working with experienced journeyman under the guidance of a master.
Attaining journeyman status is something for the master to decide, with advice from the journeymen. The decision is bittersweet because it is a decision to eject the apprentice from the team so that he or she can start the journey. Usually the new journeyman would join the team of a different master.
Some apprentices simply won’t attain journeyman status. In the end, if they fail to make progress, they must be removed from the team. No one should stay an apprentice year after year. It is the responsibility of the journeymen and master to decide if an apprentice should be removed from the team.
The skills of new journeymen will gradually increase. At first they should have only one apprentice. Over the months and years their increasing leadership skills will allow them to take two or three at a time. The most experienced Journeymen might play the role of master in smaller projects.
Attaining master status is no small feat. It requires the consensus of other masters, and must be demonstrated through several successful accomplishments.
I expect a journeyman would make $50-100K depending on their experience. I expect a master would make $150-$250K or more.
Now imagine a team of 13. One master, three journeymen, and nine apprentices. This is a powerful unit. Its size is right at the sweet spot for hyper productive teams. It has the right balance of experience. And… it’s pretty cheap. This team costs ~$600K per year, or about $50K per person. Or (consulting companies take notice) about $23/person/hour.
It seems to me that such a team could do much more, much better, than a team of 12 graduates lead by a tech-lead with five years experience. The productivity and efficiency (and efficiencies of scale!) of this approach should be obvious. Moreover, I think that being an apprentice on a team like this would provide a much better, much faster, and much cheaper education than a university degree. Finally, I think that using teams of this kind could be a remarkably cost-effective way to get very high quality software written very quickly
Comments
Steve Tooke 32 minutes later:
I would love to work in an environment like this!
Steve Tooke 32 minutes later:
I would love to work in an environment like this!
David Alpert 43 minutes later:
me too.
Emil Cardell about 1 hour later:
You are raising a good point.
My experience with creating a more hierarchy based team structure is that it usually creates a lack of responsibility. My guess is that we will see the quality increasing over time but the price will be a lack of creativity.
I’m not going to argue the economics of it all but isn’t an non-hierarchy team based solution better?
Let’s say we have a core team of good developers all equal and they add a new apprentices too the team. Then isn’t the goal of the team too to never let the apprentices add code without it being toughly reviewed? And later on when the team feels he can be trusted the apprentice becomes a part of the team. If the apprentice doesn’t show signs of progress then they let the apprentice go.
I would love to see the discussion leaning more about how to manage and train new apprentices and set a high craftsmanship standard in your team. I have a hard time believing that hierarchy is the key.
Dave Nicolette about 1 hour later:
Nine supporting Three supporting One to rule them all.
Happy Day!
Liam McLennan about 1 hour later:
This sounds like a great idea, but one that faces overwhelming resistance.
As a person leaving school I have the following choice:
1. Complete a CS type degree then enter the workforce. I immediately earn good money and within 5 years I am effectively indistinguishable from my peers. I can work anywhere and my skills and experience are acknowledged.
2. Undertake an apprenticeship. The apprenticeship could last up to 4 year, or I might not finish at all. All this time I receive minimum wage. At the end of my apprenticeship I am highly skilled but I have no recognized qualification, so my career prospects are poor.
My point is that I don’t believe many school leavers would find this plan appealing. Why start at the bottom when you can start near the top?
Tim Ross about 1 hour later:
Maybe colleges/universities need to see an apprenticeship as a valid way of obtaining a recognized qualification.
Dean Wampler about 1 hour later:
I toured Frank Lloyd Wright’s home and studio recently. The studio really is a marvelous space for a craftsman, his apprentices, and customers. I wish all software “shops” felt and worked like that.
In 50 years or so, maybe a lot sooner, we’ll have separate degree programs for people destined to write software in industry vs. those destined for academic computer science. A similar split happened a long time ago for engineering vs.the basic sciences.
It’s interesting to look at other professional fields. Law, medicine, (building) architecture, etc. all have craftsmanship models of one sort or another. In fact, it used to be that none of them had dedicated degree programs. (Abraham Lincoln, who had little formal education, apprenticed to a lawyer and became a very good one, before a career change…)
Today, however, all these professions start out with academic programs. The professions have grown sophisticated enough that a preliminary academic grounding is considered essential (and probably for other reasons, too, like weeding out the unqualified). Of course, the real benefit of a rigorous education is to teach you the discipline you’ll need for a lifetime of learning and adapting.
As a non-CS major (Physics was my drink of choice and I didn’t know when to stop drinking…), I’ve been playing catch up for 20 years now. I don’t regret my background and I know many other people who came late to software from music, science, etc. Most of them are pretty good ;) Still, I think a thorough grounding in the basic sciences of our profession will usually, but not always, make the craftsman better in the long run.
So, @Liam, I think you’re doing the right thing!
Ronald Woan about 2 hours later:
I would hate to think this is just about writing code or even software craftsmanship. There is a lot of value in a college education and the experience in terms of citizenship, i.e. critical thinking/decision making, as well as the transition of living with parents to independence and finding a passion in life. I would hate to start signing people up out of high school for a career in software development.
The top tier of research CS schools may not crank out graduates that are geared towards writing quality software, but the fundamentals of computational theory/language/OS design are very valuable and hard to find time for in an apprenticeship model.
I do think a structured program for developing talent is valuable in the commercial world.
The master programmer (and related chief engineer of the lean model) 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.
Pascal about 2 hours later:
You have some good points but if I may express a remark:
This is someone who has been programming for two decades or more.
The people I have met who had programmed for 2 decades or more would be terrible mentors. They come from other fields because CS was not taught in their time. Generally that means that they do not have enough theoretical bases. They have kept some bad habits from their Fortran days that they ported over to C++, which they use for tasks that would more adequately be done in Python.
Hey, I can understand… Computer science is new and it’s moving fast. But in the environment where I work, replace the “two decades” by “four years”.
Adam Sroka about 3 hours later:
It’s not about time per se. Someone who has spent twenty years studying and perfecting their craft is different from someone who spent two years learning and then showed up for eighteen more. Telling the difference between the two isn’t hard if you ask the right questions (e.g. craft questions instead of stupid interview questions.)
Tim Andersen about 3 hours later:
Thanks for the article. I’ve been thinking about how to implement a coaching/mentoring program, this gives me some ideas.
Tyler Jennings about 5 hours later:
Four years of apprenticeship, at no cost to you, where you receive an education many times better than the best CS schools currently offer. If you succeed you walk away with the recommendation and blessings of a well respected master craftsman.
Sign me up for that.
Tyler Jennings about 5 hours later:
Four years of apprenticeship, at no cost to you, where you receive an education many times better than the best CS schools currently offer. If you succeed you walk away with the recommendation and blessings of a well respected master craftsman.
Sign me up for that.
Peter about 5 hours later:
You may be interested to see that Steve McConnell has posted an update about the classic Chief Programmer example here (http://forums.construx.com/blogs/stevemcc/archive/2008/03/31/chief-programmer-team-update.aspx )—he summarizes by saying:
—
Bottom line: The Chief Programmer Team organization can make sense in the rare case in which you have a near genius on your staff—one that is dramatically more productive than the average programmer on your staff. But from I’ve seen there are far fewer near geniuses than there are near genius wannabees, and that limits the applicability of the technique.
—
This is only tangentially related to the topic; I just thought you’d all be interested.
mike about 5 hours later:
I think it’s great that the comments take this proposal very seriously!
mike about 5 hours later:
I think it’s great that the comments take this very seriously!
Najati about 7 hours later:
I’m assuming- nay, praying this article was an April Fool’s joke.
Jeff about 8 hours later:
You raise several very interesting points, and on a certain level your suggestions are very practical, but I have a few objections, primarily involving the suggestion that programmers should skip college in favor of a system like this.
1. Having programmers skip college robs the profession of prestige. I think that this in turn would result in lower quality developers entering the field, as the brightest students will continue to opt to go to college and pursue careers as doctors, lawyers, engineers, bankers, etc. Software development would become akin to something like carpentry, which is certainly a noble profession, but not as prestigious or as intellectually demanding as engineering.
2. I think you’re being a little unfair and reductive about what CS students learn in college. (I myself did not study computer science as an undergraduate, and I’ve been playing catch up over the course of my career as a result. I’ve since returned to school to earn a MS in computer science, and what I’ve learned has made me a drastically better developer.) While a programmer can learn much of what he/she needs to know on the job, there are many important areas of computer science a programmer simply won’t be exposed to in a particular job. A web developer probably won’t learn anything about assembly language and computer architecture at an internet company. Hell, they probably won’t even learn much of the content of an operating systems course, and that’s something I’d consider crucial to any programmer.
Now, they may learn to crank out code on the job, and they’ll do a lot more of that on the job than they will in school. I definitely agree that students coming out of college typically aren’t very strong in this area. They just don’t code enough in their classes; they don’t have time in classes that meet three hours per week for maybe 15 weeks, and where a variety of concepts need to be taught. I’ll definitely agree with the premise that the classroom is not the ideal place to become a great coder.
Still, there’s a lot of conceptual stuff that can be taught well in schools, and not so well on company time. Right now college and self study are the only options most aspiring developers have to learn these things.
unclebob about 8 hours later:
It seems to me that anyone who is willing to apply themselves in college, would learn learn most topics faster and better through self teaching guided by a reading curriculum. I think any good team of craftsmen would support, and likely require, their apprentices to pursue such a program.
Dagfinn Reiersøl about 9 hours later:
I don’t know about the exact model, but I fully agree with the basic idea of some sort of systematically implemented apprenticeship.
The problem with this in the current world is how to get started or to bootstrap the process somehow. How can you pick the master programmer? If an apprenticeship model were already common, you could at least require apprenticeship before designating someone a master. But in practice, the process doesn’t exist yet, and I don’t think the current decision-makers in the business have the ability or resources to distinguish between-on the one hand-master programmers, and-on the other-wannabes or the kind that Pascal mentions that have bad habits from their Fortran days.
Tobias Mayer about 10 hours later:
Like Najai, I am hoping this is a joke. What you suggest is a backward-looking hierarchical system designed to belittle as much as it is to mentor. Education isn’t just about practical skills, it is about intelligent investigation and asking challenging questions. But you know that.
Of course we want developers who are craftsmen, but let’s look forward to figure out how to make that happen, not backwards. Let’s look to the best XP teams. Mentoring and coaching is rife in such teams. There is no “one who has all power”. Argh! My finger is down my throat.
Machiel Groeneveld about 11 hours later:
I love the idea, but it would be quite hard to find someone with 20 years of development experience who still writes code on a daily basis. At least here in the Netherlands senior developers get promoted to ‘Architect’ after about 6 to 8 years of development and only write memos after that.
Parag Shah about 12 hours later:
It’s a nice idea, but there is value in some theoretical grounding in CS as well.
In grad school, I learned more from doing research and writing code, than I did from attending classes. So, I can see the value in what you say.
Perhaps an open university system, where students decide how they want to learn might be suited for what you suggest.
Mat Roberts about 13 hours later:
1 April?
But if not…You are an apprentice for 5 years, but a work career lasts 40 years. So won’t you have 7 times the number of journeymen than apprentices?
Your team would be more like 1 master, 10 journeymen, 2 apprentices.
unclebob about 13 hours later:
In the internet age, the notion that University is the only, or even the best, place to learn critical thinking is parochial at best. Indeed, many universities have become cul-de-sacs of decaying thought that can’t see past their own self-importance.
The notion that the model I proposed is “backwards” is puzzling. There is no arrow of time, nor any notion of “progress” that can be credibly defined. The idea is neither backwards nor forwards, it is simply an idea modeled after similar systems that have been successful. (e.g. military squads, surgical teams, legal teams, etc.)
Sebastian Kübeck about 14 hours later:
Bob: As you mention the military: Scrum teams are organized similar to emergency teams in the military. There are no ranks in an emergency team. Just a few people with the right skills are put together to come up with a solution (this is taken from a talk Jeff Sutherland gave some time ago by the way).
I agree with the commenters that point out the critical role of the master. If you have a weak master, the whole thing collapses and good masters are – and have always been – extremely hard to find. So I think that you take the craftsmanship metaphor a little bit too far here.
Dave Nicolette about 14 hours later:
I agree with Bob on the importance of craftsmanship in bringing our vocation up to the level of a true profession. It’s something that is sorely lacking in our work today.
I’m also on board with his general assessment of the quality and real value of formal education, especially in an age when information is readily available at low cost. A person willing to invest sweat equity in learning a craft can certainly succeed.
Notwithstanding Bob’s disclaimer (on Twitter) about which time zone he was in when he wrote the piece, I suspect there is an element of April Fool’s in it. The LOTR references – nine rings for kings of men, three for the elves, and one to rule them all, with the wearers of the respective types of rings in a sort of superior/subordinate hierarchical relationship – and the implication of a Master who can say, in effect, “You shall not pass!” are, if not intentional, then at least Freudian. The team size of 13 may be taken as tongue-in-cheek as well, in view of traditional Western cultural implications, particularly in the era when guilds and apprenticeships were commonplace. The references are as subtle as hammer-blows to the forehead. Even so, many a truth is said in jest, as the saying goes.
We definitely need to start paying serious attention to craftsmanship in our work, but there is more to the picture than just that. To the extent you accept the notion that we share “collective experience” as an industry (or “profession,” if I may use the word informally), our collective experience informs us that 13 is too large to be a highly effective team (even if nine team members weren’t incompetent by definition), and that software whose design crystallized around a seed created by a single mind operating in isolation is the source of most of our day-to-day woes, not to mention the topic of a book by our mutual friend, Michael. Perhaps even more obvious is the Bus Number problem on such a team. So, Bob may have taken an extreme position by intent, to grab our attention. I would say he succeeded. After all, can a craftsman in writing software not also be a craftsman in writing words?
We would be well advised to heed Bob’s advice. The quality of the code is central to our overall goal of delivering value through software in a sustainable way. Let’s not forget, though, that it isn’t the only factor to consider. The military squads and surgical teams held up as positive examples don’t operate in isolation, and although they do have leaders, the other team members are obligated by law and by professional ethics to refuse to carry out inappropriate instructions from the leader. They are expected to know enough to be able to tell the difference, as well.
The sort of team proposed in the blog post would generate one person’s vision of “good code,” and nothing else. Nothing else at all. If I were the customer, I wouldn’t pay for that. I think what Bob is proposing here is necessary, but not sufficient, for effective delivery of valuable software.
Tom about 15 hours later:
You can combine this approach with “formal” education. A number of technically skilled crafts do this in the UK (Farrier springs to mind ‘cos I nearly did it myself). The apprentice works with a master and also takes day release/evening classes on more formal/theoretical elements. After a couple of years the apprentice takes a year out to go to college to ‘round’ out their training to ensure everything is covered. The farriers guild sets exams and tests to ensure quality.
The college period is more effective because you have a bunch of motivated students who already have a good grasp of the practical skills and an understanding of the real problems the theory helps solve.
Just my 2c.
Tom
Tom about 15 hours later:
You can combine this approach with “formal” education. A number of technically skilled crafts do this in the UK (Farrier springs to mind ‘cos I nearly did it myself). The apprentice works with a master and also takes day release/evening classes on more formal/theoretical elements. After a couple of years the apprentice takes a year out to go to college to ‘round’ out their training to ensure everything is covered. The farriers guild sets exams and tests to ensure quality.
The college period is more effective because you have a bunch of motivated students who already have a good grasp of the practical skills and an understanding of the real problems the theory helps solve.
Just my 2c.
Tom
Tom about 15 hours later:
Matt Roberts is correct. With craft shop style training there are always more journeymen than anything else.
Tuomas about 15 hours later:
01 Apr 2009, come on people don’t be so gullible.
unclebob about 16 hours later:
Wow, it looks like McConnell wrote on the same topic just a day before I did. Wierd. I agree that the Chief Programmer model requires a single hyperproductive leader.
The model I’m proposing is considerably different. It does not depend on the master writing the bulk of the code. Indeed, the master and journeymen would write half the code, and the apprentices would right the other half (after the bulk of their output had been discarded).
I agree with the commenter who said that graduates would not want to work as apprentices. I think apprentices are hired at age 19 or 20, the age of a freshman or sophomore in college.
I disagree that such an apprenticeship would starve the apprentice educationally or culturally. Motivated self learners should become apprentices. Everyone else should go to college.
Renzo about 17 hours later:
Perplexity (other had the same): skipping higher CS education for a serious apprenticeship? Could be. But somehow higher education is important beside the actual subject of training. So why not learning 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. It just takes time to train someone to do something really hard for years at college with the goal of moving to something else. Thoughtful and provoking post, thank you.
unclebob about 17 hours later:
unclebob about 17 hours later:
The military seems to find plenty of people to staff their hierarchies. There’s no reason our profession should be different.
Keith Braithwaite about 19 hours later:
What happens when the Master is hit by a bus on his way home from the ‘flu clinic?
Jeff about 20 hours later:
I don’t think we want our profession to become too much like the military. First of all, the vast majority of military recruits leave before they’re in their mid 20’s. It’s a stepping stone, not a destination. it’s also the very opposite of an institution meant to encourage creative thinking and innovation.
Second of all, and I hate to have to point this out, a large number - perhaps a majority - of the people joining the military out of high school because they don’t have a lot of other options and haven’t done that well in school. At least that was certainly the case when I was in high school. This isn’t even specific to the military. In this day and age, the people who don’t go to college after high school are the ones who struggled in school. Those aren’t the people we necessarily want to attract to the profession. We want the brainy eggheads who aced their classes and got into every school they applied to.
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. That will hurt the quality of people coming into the field in the future. This is a HUGE deal. I’m honestly surprised no one else has addressed this.
I’m getting a whiff of anti-intellectual, anti-ivory tower resentment here. Much of the criticism of universities has been off the cuff, stock argument stuff, not really backed up by anything. It’s hard to take seriously.
I still think there are some valid ideas in this model, though. I would certainly be interested in seeing this sort of thing combined with formal education. I liked another commenter’s suggestion that something like this being tied into an academic education, with the student taking time away from school after a couple of years to work at an internship, then returning to school after the internship is complete. I know that some companies sponsor such programs.
Ronald Woan about 21 hours later:
Many of the Canadian schools do this, with one semester on, one semester co-op. MIT used to have this program for undergraduates too where you get some credits of the co-op as well. The real problem with these models is the quality of the co-op assignments and mentorship.
zvolkov about 22 hours later:
Excuse my French but whether this is a fool’s day joke or not it still smells of old fart :)
Seriously, not sure what’s the use of apprentices if most of their code is thrown away. Maybe if THEY pay for being part of the team…
Dagfinn Reiersøl about 22 hours later:
After thinking more about it, I think that the approach might be excellent if you, Uncle Bob (or a number of others), were making sure it was done properly. But let loose on the world as a viral meme, I can easily see it leading to Dilbert-style nightmares.
carlo.bottiglieri@gmail.com about 22 hours later:
I will address the issue of turning software engineering into something that does not require a college education.
I think that people pick a profession through a variable blend of two reasons : interest and projected quality of life. Bright/wealthy youths enter higher education because they aim at interesting professions which can also guarantee a fairly high living standard. To make sure that the profession keeps an high degree of prestige we just have to make sure the professionals are effective and provide a service worth an high pay and an interesting job.
Instead I believe the best way to damage a profession is to enforce college education. This if due to the lack of feedback : once a degree is compulsory for a profession there’s no need for the institution delivering the degree to stay competitive and effective at forming people which are truly valuable professionals.
I myself was taught a couple of very useful things in university. In fact three : practical networking, basic algorithms and relational databases. This was at the price of four/five years of education. On my own I learnt design principles, refactoring, tdd, systems architecture (modern systems I mean, not the thirty year old stuff I was being taught), network programming, patterns, concurrent programming, gui programming and, most importantly, the pric e of code degradation and the value of quality. Not that all of this stuff was not provided by the university curriculum, some of it was, but very poorly taught.
What university really taught me well is that I must always look around to learn whatever allows me to work better and gather more satisfaction from my work rather than waiting for someone else to teach me what is “required”.
Overall I found that good professionals I had the pleasure to meet so far were both from academic and non-academic backgrounds, what they all share is a genuine passion for their profession. Apprenticeships, as well as demanding and well structured classes, certainly do a good service in improving those with such a passion and sorting out the rest.
As far as I am concerned, regardless of the team structure suggested, anything that will let learning flourish in our workshops will put pressure on educational institutions to produce quality and effective would-be professionals and thus will improve the profession as a whole.
Channing Walton about 23 hours later:
Unclebob said: “In the internet age, the notion that University is the only, or even the best, place to learn critical thinking is parochial at best. Indeed, many universities have become cul-de-sacs of decaying thought that can’t see past their own self-importance.”
I must object to this. Some of the best science in the world is being done at universities. My own experience was working at a research lab in microwave opto-electronics that was not only doing world-leading research it was also advising some of the biggest players in the industry for products being planned 10 years in advance. Many other labs were doing the same thing. Indeed, this is how many labs are funded.
As an industry we are doomed to keep rediscovering the past until we accept that there is much to learn, and that the right place for that learning to start is at our academic institutions. Why should programming be different to every other field?
It is a sad state of affairs that many programmers generally regard anything they do not understand as ‘too academic and not useful in the real world’. An inability to see past one’s own importance is not limited to academia.
Dave Nicolette 1 day later:
I think Bob and Channing are both right, and Dean is even righter. Academic research and industry application are two different career paths.
Jason Catena 1 day later:
I posted a follow-up, on my experiences with the teams Bob describes.
http://swtools.wordpress.com/2009/04/02/my-experience-with-master-craftsman-teams/
Dave Astels 1 day later:
I disagree, Pascal. 2 decades is right. I’ve been at it for about 25 years now. With a total of about 6 years of undergraduate and graduate studies, in Computer Science. I’d be programming for about 5 years before going to university… some of it “professionally” (i.e. in exchange for money). So I agree with Bob, that 2 decades is quite realistic. If your most senior people have 4 years experience… I feel sorry for you and your employer.
Mike Wilson 1 day later:
I’ve been writing software on my own steam for 30 years, professionally for 20. I’d take any role in a team like that happily.
Mike Wilson 1 day later:
well… in the bottom two tiers anyway ;)
Michael Feathers 1 day later:
On the one hand, it’s foolish to not recognize skill differences among programmers, but on the other hand it’s foolish to institutionalize them. What you end up with in many cases is less effective bilateral communication and ego cul-de-sacs. I remember that before Agile I saw way too many cases of “wrong guy as lead.” After agile, I see a number of cases of “no one steps up to lead.” I guess you have to pick your poison.
Re education, I agree it’s not as good as it could be I wouldn’t want to throw the baby out with the bathwater. 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.
unclebob 1 day later:
If the master is hit by a truck, the senior-most journeyman takes his place either as the new master, or until a replacement for the old master can be found.
There’s nothing new about this. Companies do it all the time.
andy zanark 1 day later:
a multi-leveled approach toward software development is just what our industry needs. a mere ten years ago you were trying to recast software as a partnership of equals. how misguided you were!
amen to our new triangular progress!
unclebob 1 day later:
The “anti-academic” flavor to my post comes from my rather significant disappointment with the quality of CS graduates I have had the misfortune to interview. In one case I interviewed a young lady pursuing a masters in CS. In all the years of her coursework, she had never written a line of code.
One of my favorite tests for a new grad is to ask them to implement the sieve of Eratosthenes – a simple nested loop. Only about 1/3 of the grads I’ve tested over the years have been able to approach this algorithm.
On the other hand, I know a number of very good programmers who have no degree at all. Who taught themselves, and did a very good job. For some strange reason these people often have a lot of musical ability.
The bottom line is I don’t think our universities do a particularly good job of providing value for money. Those four years cost a fortune and don’t really deliver all that much. I think if you took that $200K and invested it in simple mutual funds and started working 4 years earlier, you’d wind up with a bigger net worth by age 60.
Having said all this, I don’t think all universities should be disbanded. Lots of good research happens at the better schools. Indeed, I have taught hoardes of post-docs at high-energy physics labs, and have thoroughly enjoyed the process. And there are degree programs that I think are excellent. My son is enrolled in EE at the University of Illinois, and he is getting a terrific education. I don’t begrudge the money I am spending there at all.
OTOH it is perfectly clear that you don’t need a degree to be a good software developer so long as you are surrounded by experienced mentors. Getting a degree is something a journeyman could choose to do. It would likely help his quest for mastery.
unclebob 1 day later:
Oh, and by the way, that old fart you smell is me. I’ve been in the software industry for a good long time and have finally decided that the best way to combat the odors in our profession is to raise an even bigger stink. [grin]
Steven Baker 1 day later:
@Liam In option 1, after five years you are indistinguishable from your peers. If being indistinguishable from your peers is a goal, find another industry.
Who wants to be indistinguishable?
Brad Appleton 1 day later:
Is there an assumption that someone who hasnt yet started college, and quite probably only recently graduated high-school would be expected to make an all-or-nothing decision about going to college first or “straight to the pros” at such a young age?
For those who did go to college, how many times did you or someone you know change their “major” between the time you started and when you graduated? Wouldnt similar “mind changing” be just as likely if they tried to “go pro” first?
And should we really expect 18 year old apprentices to be full-time right off the bat? Why wouldnt it be more desirable and feasible to be trying to combine college education and on-the-job training together, in some kind of work-study vocational program?
You’d still have your apprentices, but maybe dont expect them to be full-time because maybe they’d also be taking at least a couple classes at the same time. And maybe there is a mentor role to be played here, where either the master or one of the journeyman (or all of the above) plays an explicit part of mentoring/tutoring apprentices in the coursework.
Heck, it might even be a way to help keep some of us gray hairs better abreast of what’s going on in Universities and with “the young folk”, while at the same time helping transfer more pragmatic knowledge and experience to the apprentices.
I remember my last couple years of undergrad I had to cut-back on my course-load by a class or two because I had to work 20-30hrs/week as an intern programmer to help pay the rest of my way thru school. Yeah – it took me a year longer to get my degree, but I had 2 years of programming experience when I got it.
So I would think rather than suppose an either/or choice between college-first maybe its better to take the “do a little bit of everything all the time approach” and see if maybe we can find a win-win way to help them get the educationand the work experience at the same time, to complement each other, as well as ourselves.
Keith Braithwaite 1 day later:
Seems to me that a category error has been made somewhere along the line to get us to the point where a Comp. Sci degree is talked about as something that could, or should, inculcate competence as a professional programmer. That’s not what degrees in general are about.
As it happens, my company has a very academic slant in its recruiting (partly because the chairman is a full professor) so a lot of our engineers have gone down a BSc->MSc->PhD->post-doc route before we got to interview them. Most candidates don’t make it because we also require the folks we hire to be skilled programmers, and indeed it turns out that going down that route might not teach you anything much about the craft of programming. Worse yet, it sometimes seems to teach that the craft of programming is a side issue, and sometimes there is some re-education to do on a promising candidate of 25 with more letters after his name than are in mine.
I have to say, though, that those folks are capable of doing truly remarkable things on projects, things that I struggle to imagine someone who came through a purely vocational, pick up the theory as you go along route would struggle to do.
I also worry that a purely vocational industry would stagnate. Which Master Programmer team, cranking out the features (rah! rah!), is going to take the time to find a better way to implement method dispatch in dynamic OO languages? Which Master Programmer team is going to find the key to some new algorithm and prove it correct, and get that proof peer-reviewed and…no, they’re too busy cranking out code. (Ooo-ha!)
My boss, the prof, took part in some very interesting meta-research that traced common every day tools of the working programmer (config management, compiler features, etc fairly mundane stuff) back to the original research that spawned them. There is very little that the software craftsman uses day-to-day in cranking out code that didn’t get to be as good as it is through puling together ideas from several PhD theses.
The industry as a whole relies on both strands for its success. Both are necessary and both must be in balance.
Dave Nicolette 1 day later:
I came across the most practical-minded reaction to Bob’s idea on Jason Catena’s blog, pointed there from Twitter. This is what caught my eye:
“Perhaps the thing to do is to compensate people outside the company by bounties for the code they contribute; set up a contractor arrangement for journeymen; and actually hire only masters. This keeps companies small, focused on their core competencies and most valuable people. Even better for the community of programmers, this provides a structure for programmers to put food on the table while contributing to as many projects, and at the levels of depth, that suit their inclinations and abilities.”
It answers one of the questions that’s been nagging me about the concept – Why would a customer pay for the Master’s mentoring program? With the arrangement Jason describes, the Master is responsible for paying his/her own people. It harks back to medieval economic structure, which is exactly what the proposal recommends. As a customer, I’m paying for results. I don’t need to tell the Master how to produce those results.
Those who favor this sort of structure for the profession have to deal with the practical aspects of the proposal. They can’t just keep repeating how cool it would be to work with a great Master, and so forth. Well, technically they cando that, I guess.
Dave Nicolette 1 day later:
Bob writes,
“Companies do it all the time.”
Hmm. Yeah. Fifty million flies like it; it must be delicious.
Michael Feathers 1 day later:
Re the education, it seems we’re trapped in an either/or mode of thought here. Last year, I visited a company in Russia and I was stunned by the quality of their people. It turns out that kids go to what we call university very early. They go at about 16 or 17 and they learn quite a bit of theory. But (here’s the rub) they go into industry at the same time (half time). The result is stunning. I was meeting people at 22 and 23 who had 5 solid years of industrial experience and they are grounded in their discipline; they know why somethings are possible and why some things aren’t, and they know where to look when they encounter problems they’ve never seen before.
The discussion on this thread is nice, but as a practical matter, 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. That makes reform important.
Tobias Mayer 1 day later:
Firstly +1 to Dave Nicolette’s last comment. Wake up!
This whole notion of a master is ridiculous, and dangerous. No one person can or should know everything. A good software team will consist of masters in different areas. Even a new developer is a master in his (or her) own way. If he isn’t, don’t hire him. A college graduate will bring something new and fresh to a team, and we need to hear that or we are in danger of growing stale, self-righteous and entrenched in old/safe thinking. Some of my best learning came from working with a new developer, 20 years old, and straight out of college. He was a risk-taker and a courageous challenger of the status quo… as well as being a truly awesome developer.
Every voice is valuable, even (and maybe especially) the voice that says “you are not adding anything to this discussion and need to step down”. That can be said as much to the “junior” (I hate that term) developer as to the old-timer with 20+ years of experience. In a healthy self-organizing team it will also be said _by anyone and no offense will be taken. Thus open dialog is encouraged, which is rarely (I’d guess almost never) found in a master/apprentice relationship.
Software is a craft. Developers are craftsmen. All craftsmen must spend time honing their skills and sharpening their tools. Only a fool would disagree with that. But this doesn’t mean we have to create a master/apprentice structure, which is outdated and in many ways demeaning. There are better ways, better tools. We know what they are, so let’s use them, improve them, rather than throwing them out just because some people don’t know how to use them properly. This is far preferable than a fearful retreat to the dark ages.
Tobias Mayer 1 day later:
Firstly +1 to Dave Nicolette’s last comment. Wake up!
This whole notion of a master is ridiculous, and dangerous. No one person can or should know everything. A good software team will consist of masters in different areas. Even a new developer is a master in his (or her) own way. If he isn’t, don’t hire him. A college graduate will bring something new and fresh to a team, and we need to hear that or we are in danger of growing stale, self-righteous and entrenched in old/safe thinking. Some of my best learning came from working with a new developer, 20 years old, and straight out of college. He was a risk-taker and a courageous challenger of the status quo… as well as being a truly awesome developer.
Every voice is valuable, even (and maybe especially) the voice that says “you are not adding anything to this discussion and need to step down”. That can be said as much to the “junior” (I hate that term) developer as to the old-timer with 20+ years of experience. In a healthy self-organizing team it will also be said _by anyone and no offense will be taken. Thus open dialog is encouraged, which is rarely (I’d guess almost never) found in a master/apprentice relationship.
Software is a craft. Developers are craftsmen. All craftsmen must spend time honing their skills and sharpening their tools. Only a fool would disagree with that. But this doesn’t mean we have to create a master/apprentice structure, which is outdated and in many ways demeaning. There are better ways, better tools. We know what they are, so let’s use them, improve them, rather than throwing them out just because some people don’t know how to use them properly. This is far preferable than a fearful retreat to the dark ages.
James H 1 day later:
It’s seem like open source software is already taking this tact. It’s not quite as formal as what you describe, but many projects already do this in some form. For the linux kernel, Linus and few others are the masters. The various subsystem maintainers are at least journeymen if not masters. They coordinate work with the “apprentices”. Some apprentices stick around long enough to contribute a fix and go on others end up sticking around to become the journeymen and eventual masters. These people may be formally educated, in the process of obtaining and education or just advanced “users”.
I may have missed it, but no where does it talk about the problems with highly technical areas of software development. High energy physics, engineering, bio-informatics are areas where I see that there could be issues. In a typical CS curriculum, there’s lots of math so that gets covered for those areas above. However, do you want a Master that has skills in a particular area of knowledge? If the Master switches from say business/accounting to medical does that mean that he comes in as a journeymen for a while under a Master for that field?
Ben 1 day later:
Like the idea, but where the heck am I going to find nine intelligent, motivated 20 year olds who are so sure about what they want to do with the rest of their lives that they’re willing to skip college and work for minimum wage for a year?
unclebob 1 day later:
Seems to me that a category error has been made somewhere along the line to get us to the point where an apprenticeship is talked about as something that couldn’t, or shouldn’t, inculcate competence in the theory of software. That’s not what apprenticeship in general are about. [grin]
As it happens, 1n 1969 I decided that a degree was the wrong approach for me, and so I became a programmer at age 18. I’ve never looked back. Nor has any employer ever questioned my background, nor even raised an eyebrow. I am quite willing to stand toe-to-two with those who have more letters after their name than are in Kieth’s. Indeed, I am often mistaken for “professor” or “doctor” Martin.
The bottom line is simply this. If you want theory, you can get theory. You don’t need to pay $200K and spend four years at a university to get it. For some folks, university is the right strategy. For others, it’s not. For still others, Brad’s hybrid approach works fine.
In this day and age, and in this economic climate, an apprenticeship program of the kind I’ve described could provide opportunities to many folks for whom they would otherwise be out of reach. At the same time, it could provide a means for companies to create hyper-productive teams and stop shipping programming jobs overseas.
unclebob 1 day later:
Ben, where are you going to find them? If universities keep raising their tuitions (they’ve doubled in the last decade) you’ll find plenty!
Hank Roark 1 day later:
I’m not sure what else I can add to this thread..
I went to a US state university where a large number of the students we co-op students…meaning one year at school, follow by alternating quarters in industry and at school. The benefit…. best of both worlds, plus students that took this path often paid for their own education along the way and had a job when they got done with their education.
It seems to me this and what Bob is proposing should be considered viable alternatives to developing skilled developers.
Michael D. Hall 1 day later:
How can this be put into practice without becoming like a union trade? If it’s put into place with an eye towards elevating the skills as fast and efficiently as possible that’s good. But people tend towards dogma and rigidity and the good idea becomes a block to progress or is abused. Look how Agile is thrown around without real understanding. And how to prevent the concept from being abuse by seniors who use it to prevent competition? Finally, I’ve met more than my share of seniors who’ve coasted through their careers and now shouldn’t be entrusted with an email account much less the steward of a system and mentor to a junior.
Luca Minudel 1 day later:
I agree the value of experienced people in the team. This post also raised me some questions.
If I get it right, some points of this post do not only contradict some scrum/agile principle, they contradict also modern findings on people/team dynamics.
About the mix of experienced and inexperienced people this post seems to ignore the trad-off between (over) specialization and flexibility/adaptability of new/young (see modern biology)
About the hierarchical organization: it seems to ignore the impact on reaction time, resilience to changes/failures (see ‘Corps Business : The 30 Management Principles of the U.S. Marines’ – David H. Freedman & Charles C. Krulak)
About authority vs consensus: it seems to ignore the balance between authority and responsibility, the balance about having authority and being authoritative, the trad-off between control and freedom on motivation (see modern sociology and psychology)
Also Bruce Sterling a Science Fiction writer that described the impact of internet and new technology on out daily life many years before their diffusion, describe a different dynamic in Islands in the Net (1988).
I would like to hear more about this post to get an idea if it is an innovative breakthrough or it is not
Michael D. Hall 1 day later:
How can this be put into practice without becoming like a union trade? If it’s put into place with an eye towards elevating the skills as fast and efficiently as possible that’s good. But people tend towards dogma and rigidity and the good idea becomes a block to progress or is abused. Look how Agile is thrown around without real understanding. And how to prevent the concept from being abuse by seniors who use it to prevent competition? Finally, I’ve met more than my share of seniors who’ve coasted through their careers and now shouldn’t be entrusted with an email account much less the steward of a system and mentor to a junior.
Michael D. Hall 1 day later:
How can this be put into practice without becoming like a union trade? If it’s put into place with an eye towards elevating the skills as fast and efficiently as possible that’s good. But people tend towards dogma and rigidity and the good idea becomes a block to progress or is abused. Look how Agile is thrown around without real understanding. And how to prevent the concept from being abuse by seniors who use it to prevent competition? Finally, I’ve met more than my share of seniors who’ve coasted through their careers and now shouldn’t be entrusted with an email account much less the steward of a system and mentor to a junior.
Will Green 1 day later:
My wife and I were discussing this concept last night. It sounds interesting, for sure. In our discussion, the concept of a Patron came up. Specifically relating to the compensation of an apprentice. We understand that the apprentice is gaining huge value through education by the Masters and Journeymen. However, living on minimum wage, even at 18 or 19, is simply unrealistic. Basic living requirements, such as room and board, must be funded. Minimum wage ain’t going to cover that, especially if you have to move away from home to get into an apprenticeship program.
This is where the idea of a Patron comes in. In the old days of guilds, if an apprentice had to leave home for his apprenticeship, the Patron sponsoring the Apprentice was expected to provide room and board for the Apprentice. The idea was that the Apprentice would become a Journeyman in the service of the Patron, so it was an investment on the part of the Patron.
So, without the presence of a Patron, you limit the pool of potential Apprentices to those who can afford to be an Apprentice for a couple of years, not necessarily the best candidates.
Michael D. Hall 1 day later:
Sorry about the double post above. The site is wonky when trying to reply on the G1 Android.
Michael Hunger 1 day later:
That was one question I wanted to ask at the QCon London ending panel. Should companies stop to accept CS graduates but instead focus on real apprentices. Great writeup of the ideas proposed by Pete McBreen in “Software Craftsmanship”. Some more notes on the role of reputation and customer relationships would be helpful though.
Matt Wynne 1 day later:
I think this all sounds rather ego-centric and autocratic. On good teams I’ve worked on, there’s a mutual respect between members of the team that would naturally recognise and defer to the authority and experience of this person you describe as a ‘master’ without them needing to be given the explicit title and role within the team.
I also find the picture of the apprenitice programmer being told to throw away his code and come back when it’s workable rather sad and demoralising. I’ve put time in pair-programming with interns who are on work-experience breaks from CS degrees and helped them write code they could be proud of, and learned a few things myself from them in the process.
Your final conclusive paragraph seems to be all about cost and efficiency, which is obviously an important factor in the current economic climate, but I think you’re missing something important here about the humanity of all this: in the end these teams are made up of people who need to feel valued and respected in order to produce their best work.
Matt Wynne 1 day later:
I think this all sounds rather ego-centric and autocratic. On good teams I’ve worked on, there’s a mutual respect between members of the team that would naturally recognise and defer to the authority and experience of this person you describe as a ‘master’ without them needing to be given the explicit title and role within the team.
I also find the picture of the apprenitice programmer being told to throw away his code and come back when it’s workable rather sad and demoralising. I’ve put time in pair-programming with interns who are on work-experience breaks from CS degrees and helped them write code they could be proud of, and learned a few things myself from them in the process.
Your final conclusive paragraph seems to be all about cost and efficiency, which is obviously an important factor in the current economic climate, but I think you’re missing something important here about the humanity of all this: in the end these teams are made up of people who need to feel valued and respected in order to produce their best work.
Dave Astels 1 day later:
Brad’s thoughts on a combined study/work apprenticeship echos mine pretty much to the letter. A class or two to provide the theoretical foundations, and active apprenticeship to learn how to apply it.
Hank Roark 1 day later:
A thought on minimum wage…
Uncle Bob I’m surprised you would suggest minimum wage as the pay level. I figured the market would set the price. Even the people that framed my house made $8-$10/hour. I would suspect something similar for an apprentice…but who knows.
Dave Nicolette 1 day later:
Michael writes, “How can this be put into practice without becoming like a union trade?”
The implication of your question is that it would be a bad thing for software development to become like a union trade. Some comments in the broader discussion Bob’s post sparked (particularly in the Yahoo! Extreme Programming List) actually seem to be calling for just such a structure. Maybe not everyone considers it a bad model.
Personally, I like the well-known seven-stage model of professional development (which seems to subsume the master-journeyman-apprentice sequence) as a replacement for present-day career path options, which generally require a person to make a binary choice between staying technical or going into management. I’m not sure whether I agree with the proposed method of implementing that change. There are a lot of interesting arguments on both sides. Anyway, I just wanted to point out that some people appear to believe a “union” approach to the profession would be desirable.
Michael Hunger 1 day later:
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.
What I’d also propose is the possibility for the apprentice / journeyman to acquire more theoretical background. AFTER gaining practical experience.
Most things I was presented at university are more relevant to me now that I have 10+ years of real experience. Functional Programming, Compiler Construction, Operating System Theories etc. were of no use when I started with software development (too much knowledge, facts that were not applicable) but are highly interesting now that I deal with many languages, concurrency and the broader domain.
In Germany university education is almost for free but the quality is very questionable (depending on institution). Most clients I worked with even preferred career changers and non CS people to the narrow minded CS graduates.
But I agree with most of the commentors that finding and employing the masters will be the real challenge. Perhaps having the masters starting their own companies / workshops would be more sensible (also in regard to decision making etc.)
Troy T 1 day later:
Well I strongly agree with the idea of apprenticeship for all professions, trades and jobs.
I am not sure about the idea of formalizing it though since this leads to politics, legislation, beureaucracy, protectionsim and unions which are not a good thing for anyone involved.
I disagree with your statement about the quality, usefulness and necessity of a C.S or engineering degree. No offense you’re coming of as an old timer saying in my day we actually learned something in school, we never disrespected our elders etc etc. Those kind of statements are “truthiness”http://en.wikipedia.org/wiki/Truthiness.
>
I find my computer engineering degree and my current masters degree in computer science to be very useful and relevant.
Completing such a C.S degree expresses some minimum level competence and commitment to the subject. I doubt any senior programmer enjoys wasting their time explaining some basics of the trade like what a compiler is and how to use it. Believe I have wasted time explaining this and other things that any CS grad would know to people with no computer background at all. I wish if they were serious about working in the software industry they would get some appropriate education or read a book.
Not saying it isn’t possible to a be good programmer without a C.S degree but it is a useful low pass filter. There are many useful things that a C.S student might have had exposure to that a beginning self taught programmer probably would not have. Many useful things come out of academia having some insight into that world is better than none.
One thing to consider about academic programmers is they general get to build the kind of programs they want to where in industry this not usually the case. I have definitely learned more in some of my school projects then projects at work since I am free to explore at school where at work I am highly constrained.
Both experiences are essential and I have learned from both fellow students, co workers and professors.
In general an interesting post minus Ad hominem against current C.S grads.
Mark Nijhof 2 days later:
Hi Uncle Bob,
Very good read, I have some questions that I formatted in a blog post:http://blog.fohjin.com/blog/2009/4/4/Re_Master_Craftsman_Team_by_Uncle_Bob
-Mark
Arnold James 2 days later:
This may or may not be an April Fool’s prank.
Loving how indignant some folk are about the idea of spending any time taking directions from someone much more senior. Speaks volumes about their lack of humility, I think.
Christian Theune 2 days later:
Good read.
On the idea: Some already mentioned that Germany has a general apprenticeship-system with time divided into school and working. I’m training apprentices for software development myself in a team of 3. I find that the school hurts more than it helps as all the teachers are basically so bad they wouldn’t stand a day when they would have to apply what they teach.
In general I like the approach a lot, however, it takes a good amount of time to actually do teaching alongside the actual project work. If you want to introduce people completely new to programming, that’s gonna cost about 1 journeyman for 30-50% of his time for a year to cover 3 apprentices.
On the math: you seem to have computed the ourly price of a team members (with reference to consulting) at 23$/hour. This looks like you computed 600k$/(250days8h13). At least for me, I learned to compute this with 200 days and 6 hours per day billable hours. That’s 38$/hour. Still a good deal, though. ;)
PS: I wish there would be a place to have an extensinve/ongoing discussion/evaluation of applying craftsman educational practices for software development.
unclebob 3 days later:
But people tend towards dogma and rigidity and the good idea becomes a block to progress or is abused.
True enough. We see plenty of that at our universities and our employers (not to mention our government). The point is that it’s nothing new or different. So it’s not a problem unique to the kind if teams I’m suggesting.
unclebob 3 days later:
However, living on minimum wage, even at 18 or 19, is simply unrealistic.
It’s better than shelling out $50K/year for four years…
unclebob 3 days later:
I also find the picture of the apprenitice programmer being told to throw away his code and come back when it’s workable rather sad and demoralising.
I’ll tell you what’s sad and demoralizing. It’s a system in which the novices have created such a horrible mess that it simply cannot be maintained any longer. There’s nothing wrong with throwing out crap before it can do too much damage. And it’s a damned good way to learn.
unclebob 3 days later:
Uncle Bob I’m surprised you would suggest minimum wage as the pay level. I figured the market would set the price. Even the people that framed my house made $8-$10/hour. I would suspect something similar for an apprentice…but who knows.
I know of one employer who expects his apprentices to pay him.
Keith Braithwaite 3 days later:
Re Matt’s point. A genuine apprentice wouldn’t be expected to produce work of saleable quality by themselves—they might not even be allowed to try. I’m not impressed by the way that vocabulary from a well understood social structure is bandied about by some folks under the “software craftsmanship” rubric.
I recall a story from a fellow who had been an engineering apprentice, back in the day. His first task on the job was to make a surface plate by the Whitworth method: long, hard and tedious work also requiring great attention to detail. Also, in some sense, pointless. If the shop needed another surface plate, they’d buy one. But it gives him an excuse to hang around, and see what’s going on, and some practice handling the tools. One item sticks in my mind. Upon receiving the plate his gaffer would check it against a known good plate and if it were not up to standard take a scriber and score a line down the face of it. That will destroy whatever flatness a cast-iron surface plate has and make the task of bringing it back to true quite a bit harder.
This is the nature of apprenticeship, in the early days at least: to spend a lot of your time doing stuff that is no use to anyone but yourself, and the only use it is to you is to learn from it.
Keith Braithwaite 3 days later:
Bob, you said:
I am quite willing to stand toe-to-two with those who have more letters after their name than are in K[eith]’s
Toe-to-toe, eh? The only group I know of that habitually stand that way are sparring boxers (or similar). Are you involved in some sort of fight? Is programming now a martial art? Do you need to knock your fellow programmers down for some reason? Is that how you “win” at programming? I must have missed that memo.
I want programming to be a gentle art, not a martial one. Like flower arranging. It’s social, it’s technical, it’s creative, it involves skill and artistry and taste and appreciation of materials and imagination under constraints. Ikebana even has a Japanese vocabulary we can all misunderstand.
Steven Baker 3 days later:
Bob,
I like that you notice that some great programmers that don’t have degrees often have musical ability; I would like to suggest that it’s not specifically about music, that it’s about outside interest in general.
Great programmers will have many interests, music is a common one. Other non-programming hobbies I’ve noticed in great programmers are carpentry, martial arts. Flying seems to be popular as well. Model railroading was one fellow’s hobby. I know one fellow who’s nutty about Magic: The Gathering. :P
Keith Braithwaite 3 days later:
Re programmers and music, consider this 1993 interview with Knuth, in which he observes
There is a very profound change that I can’t account for. In the 70s, the majority of our students were very interested in music. The first thing we’d ask them when they came in was “What instrument do you play?” We had lots of chamber groups and so on. Now almost none of the students are interested in music. I don’t know if it’s because a different kind of people are enrolling in computer science, or because it’s true of all today’s students, or what. If you ask computer science students now what their hobby is, the chances are most of them will say “Bicycling”. I recently had one who played a harmonica, but there were almost no musicians in the group.
Hank Roark 3 days later:
> I know of one employer who expects his apprentices to pay him.
Ok, I was wrong. Maybe apprenticeships shouldn’t be viewed as employment…and subject to the regulation of employment. Maybe the are learning opportunities (like college used to be) and the apprentice should be expected to pay for the opportunity. I like it!!
Hank Roark 3 days later:
Another data point…
Bureau of Labor Statistics (US), March 2009.
Unemployment Rate, 25 and older (percentages).
Less than high school degree: 13.3 High school degree, no college: 9.0 Some college or associate degree: 7.2 Bachelors degree and higher: 4.3
Mark Nijhof 3 days later:
I know of one employer who expects his apprentices to pay him.
Register your company as a school/uni then that way you can get the best of both worlds and perhaps even get government funding as well.
Tyler Jennings 3 days later:
A little more ammunition for the apprenticeship model. A college degree is so expensive in the U.S. these days that you’d be better off sticking your money in a mutual fund and getting by on whatever pay you can get with only a high school education.
And consider that in this industry pay is almost entirely defined by your experience and your reputation. You’ll be making as much as the grads, probably more, without the $80k in debt.
Dave Hoover 4 days later:
I had so much to say about this topic, I posted an epic on my blog
Steven Baker 4 days later:
The “people with degrees earn more money” argument is misguided, at best. They’re measuring average people who didn’t go to University (not smart enough, social situation, whatever) against people who could go.
When I talk about going vs not going, I’m referring specifically to a group of people that could if they wanted to. If you can, and have a choice, make sure you consider both options.
As far as the earnings go; I didn’t go to University, and I earn more now than anyone I know who is the same age as me (26) that has a degree. And I know a lot of 26 year old folks with degrees.
unclebob 4 days later:
Kieth,
Despire your idyllic desire to arrange flowers you seem quite adept at the kind of toe-to-toe verbal sparring that I quite enjoy.
Mike Polen 4 days later:
Uncle bob,
Does Object Mentor practice this approach? If not I would be interested in why.
Phil Booth 4 days later:
From my own experience in the UK, which is probably not hugely relevant to most of the people that have commented here, university was pretty much an expensive waste of time.
I did a four-year degree, the third year of which was spent working placed as a professional in the field (I think you call this an internship in the US). In the first two years at university I learned a lot of different stuff: C++ syntax; database normalisation; object-oriented analysis; entity-relationship diagrams; boolean algebra; et cetera and so on ad infinitum. In and of itself, it was all very important stuff that I needed to know.
But then I get to my third year, where I was fortunate enough to land a placement/internship with a multi-national telecomms company. They were pretty busy when I joined so I was thrown a non-critical-but-annoying problem to get stuck into while everyone else got on with the real work: “Here you go, we think we’ve got a memory leak in this embedded system, we’re not sure where it is exactly, find it and fix it.”
Thus began the most intensive learning experience of my life. Memory leaks, debugging, threads, inter-process communication, even vi (!) were all completely new to me at that point. Perhaps this is a poor reflection on my university course or (more likely) myself, that I was so ignorant about so much. But, compared to, say, Codd’s third normal form, the stuff I gradually learned while working in that industrial placement seemed infinitely more important and more advanced too.
On returning to university for my final year, I was quite sure that in the one year spent in industrial placement I had learned far, far more than I’d even approached learning in the preceding two years of formal study. Think about it: How can formal study – lectures, books, projects, whatever – ever hope to even begin to compete with actual, real, industrial experience? With getting your hands dirty alongside experienced practitioners on code that actually does something in ‘the real world’ (with profuse apologies to all those who dislike that turn of phrase)?
So, April foolery aside, I for one am genuinely overjoyed to see signs that the perpetual myth of our industry is being busted. Software development is not engineering. It is not science. It is craftsmanship.
claudia.frers@gmail.com 5 days later:
>From the master’s point of view, it’s “my way or the highway.”
>Yes, I know this is very anti-scrum.
Hi RCM:
I’ve battled many a scrum master for precisely having this anti-scrum view :-)
I’ve been involved in development since the 70’s as you have. Whatever I lacked in natural skill and talent was hopefully compensated by discipline and 30+ experience. My students or collagues have always been my best teachers. IMHO, in any workplace we should allow ourselves to be “inspired” by any Master that adds value. The quality of a good master is easily recognizable don’t you agree? Roles can be appointed but respect is only earned. Don’t you think?
The “my way or the highway”…is an attitude that works well in some cultures and would totally flop in others. I guess that is why I took the NYC highway and ended up in Denmark. There’s less hierarchy here. Though its changing.
I read this C++ book with the longest title in computer science history (you know which one) and it became the foundation upon which i built what I know today about technical direction and overall architecture. If it had been called “My way or the highway”, I may have missed it.
Software is about getting it right or wrong. Scrum or Agile practices is situational. The prerequisite demand for skill and talent is very high.
Perhaps a metaphor may be made to a classical orchestra where most of the musicians have played more than one instrument for a number of years subordinate only to the conductor.
Software development is engineering, science, art and craftsmanship. I’ve been in too many companies where their choice of “masters”, “architects” or “mentors” would not have been my choice…A wise man once said “Never trust an expert” :) Oh yeah. Now I remember: that was you in your younger days. :)
Claudia Frers
Elliott O'Hara 5 days later:
Beautiful. I actually really like your “sad and demoralizing” point.
If an apprentice doesn’t have thick enough skin to handle most of their code being thrown away, they have 2 choices.
1) Get better 2) Leave
Either is good for the industry.
How about another value statement?
We value well crafted software over happy apprentices?
Adrian 5 days later:
I’d hate to be the apprentice :P It’s not like you’re a jedi, you’re just a codemonkey
Brett L. Schuchert 5 days later:
I’ve been meaning to chime in on several points.
This was introduced as a though experiment.
Nobody with the authority to change reality is making any statements (Bob as well as all posters), so this thought experiment is just that. Your agreeing or disagreeing has no bearing on any actual change that’s going to happen.
If anybody actually did this, all people involved would be in a position to balk and walk. If they felt they were not in that position, then either they’ve given their power to someone else, or we’re talking about human trafficking, which is not being advocated anywhere here.
I am probably reading way too much into many of the responses, but it seems to me many people are responding from a “that’s not going to happen to me” standpoint, which is correct. It won’t happen to you, unless you chose to enter into such an arrangement, assuming you could even find such a situation. (20+ years ago, I’d have made the choice to enter into such an arrangement, now I’ve got a house, wife, daughter, etc., so it’s not practical. I also hope it’s not necessary.)
Many people are also responding from a somewhat defensive position of “Well my education was not a waste of time.” And it might not have been. I personally learned a shit-load from my undergraduate classes in CS. For example, writing recursive algorithms on a stack-based CPU in assembly, manually rolling stack frames. VERY useful (no sarcasm)! I used that experience when I was porting a C compiler (K&R, style 1, no auto bitwise copying of structures) to a 65HC11 embedded processor.
I got a lot out of my fundamentals class (with Prof. Arthur Fleck) where I worked with fp (pure functional language), SNOBOL, and others. I used that SNOBOL experience soon after college both in terms of hand-written data translation in AWK as well as parsing and executing C++ code and examples to generate java-doc like man pages before Java even (or oak for that matter) even existed.
I learned quite a bit in my OS classes. Writing different memory allocation algorithms for Minix, using shared memory and other IPC techniques, learning the fundamentals of Semaphores (p and v), and fundamental algorithms such as producer/consumer, readers/writers, dining philosophers.
I really enjoyed discrete mathematics. I took a similar class in EE where we practiced using K-Maps to reduce circuit designed. I’ve actually used K-Maps occasionally to simplify logic in a complex system (OK, 3 times but still, I’ve done it). I have an appreciation for big-O notation, algorithm analysis, NP-complete algorithms (I’ve developed a few from scratch and only realized later what I had done).
I also too my first class in OO programming. It was a seminar. As a result, I landed a roll as an RA, using C++ (before the overload keyword, and MI), I started learning Smalltalk. However, this was a great class because of my professor Mahesh Dodani. And in fact, I had a lot of great professors.
Having said that, I learned much of what I left college with based on my own practice and also working as an intern. If I did not have those experiences, then my education would have been much less valuable.
When I was in college, I did not take a “Java” class or a “C++” class. Such classes were available for non-majors. As a major, I could not take those classes for credit. We were expected to learn new languages. My total training for C was 3 50-minute sessions. Then I practiced, read (Andrew Koenig’s C Traps and Pitfalls, excellent book, C A Reference Manual, excellent book – liked it better than the K&R book) and just basically learned C with the help of my classmates. (Actually, I can say that porting the C compiler I mentioned elsewhere was a groking moment. I first figured out the stack frames, then I wrote the code in assembly, then inline assembly, and finally just using direct memory addresses as you can do in C).
Later, when I started using C++ one semester, I made a commitment to not use C again until I really grok’ed C+. This was before google, and before there were any books. The first C+ book I bought (on my own $ as a college student paying my way through college, working nearly full time), was the Annotated Reference Manual (first edition, templates and exceptions were listed as experimental). Later, I read Cope’s C++ Programming Styles and Idioms (again, purchased with my own $).
I suffered through that decision. I made the mistake of trying to put objects with vtables in shard memory. Didn’t realize that was a no-no at the time. On the other hand, I had a pretty good grasp of C++, well ahead of my peers, as a result of deciding to suffer.
That, coupled with the summer after that semester, when I stopped using C++ for 2.5 months, really solidified my basic foundation of understanding C++ under the covers. C++ is one of those languages where you miss the forest because of not so much the trees as the texture of the bark.
Having said all of that, knowing what I know now, would I have managed to learn even more in the configuration suggested by Bob? I know I learned a lot from my peers working as a research assistant (well the undergraduates, the graduate students were not good programmers). I also know I’ve learned a lot over the years from my friends and colleagues. So this configuration would have been nice in the 80’s for me to have a chance to experience. I think it would have been a great way for me to learn. However, I have many good memories of suffering though several programming classes, and I’d hate to give that up. No regrets on the college education for me. But I do like what-if’s.
Basil Vandegriend 5 days later:
I like the craftsman model you propose, but I disagree on the abolishing of computer science degrees. I think such degrees have value, but definitely could be made more effective. See my articleImproving Computer Science Degrees for Software Developers for more details.
Matt Wynne 5 days later:
I’ll tell you what’s sad and demoralizing. It’s a system in which the novices have created such a horrible mess that it simply cannot be maintained any longer. There’s nothing wrong with throwing out crap before it can do too much damage.
Sure, and people who have worked with me will know quite how low my tolerance for crap, and people who gladly churn out crap, is.
And it’s a damned good way to learn.
So I guess that’s where we differ. I am quite prepared to give a less experienced programmer a hard time for producing crap, but if I recognised that person had a genuine desire to learn and improve, I would always find the time to help them in that endeavour. Simply telling the apprentice their code is ‘crap’ and they should start again seems to be a rather blunt mechanism for passing on knowledge of the craft.
Matt Wynne 5 days later:
To be fair, your post also says:
[journeymen] teach the apprentices how to refactor, and often pair with them and sit with them while reviewing their code.
Which sounds much more like what I’m talking about. I must have missed that the first time around.
Keith Braithwaite 8 days later:
Looks as if my previous attempt to post this failed. (Anyone else find it hard to tell with this blog engine?)
Anyway: yes, Bob, I am quite adept at the kind of toe-to-toe verbal sparring that you enjoy. I find it a very appropriate mode for kibitzing on blog postings.
I find it a much less appropriate mode when working collaboratively in a team to add value for a customer, so I don’t do it in that setting. Those who only know my rather spiky “public commentator” persona are often pleasantly surprised to discover what a cooperative colleague I turn out to be.
Reminds me of a job interview I once had. The COO asks me “are you a team player?” and I tell him that I’m not, and that I have no interest in team sports. But that I am a very committed team worker, and since he’d be paying me to work that was the interesting thing.
Brett L. Schuchert 8 days later:
Keith Braithwaite wrote:
Looks as if my previous attempt to post this failed. (Anyone else find it hard to tell with this blog engine?)
Yes!
And we are not alone. Look at all the double postings. Since we’re using an open source blog, we could fix it I suppose. But, in reality, the pain caused is relatively minor and while there is a cost (people have commented on it), the people experiencing the pain (us) are either unable to fix it or (in my case) too busy. I could probably get rights to fix it, but I haven not felt the pain enough.
Jeffrey Palermo 9 days later:
I am all on-board with the chief programmer notion. I’m wrestling with the thought of all the journeyman time being consumed by training apprentices. It seems that the journeyman would be pairing constantly with the apprentice. Perhaps you’ve seen this work before, and I haven’t. I don’t have the benefit of a master, and unfortunately, in my career, I have only had the pleasure of reading the writings of a master, not working on the same projects as one. I’ve learned a lot from journeymen, though. Having only 12 years of software experience myself, I think I cringe at the thought of pulling even 1 18-year old onto the team. Perhaps you just have to find the right 18-year old.
Doktat 10 days later:
UncleBob rightly notes that things aren’t right in academia. While I doubt that it’s the responsibility of academic institutions to produce industry-ready proletarians, I do question whether the current way we teach programming is appropriate. More specifically I think we aren’t doing a good enough job teaching about the uncertainty inherent in writing code. The contemporary pedagogy is perpetuating the cowboy attitude that “my code is always right and I don’t need no stinking tests.” To me this is the answer to the question Michael Feather’s posed in his recent infoQ presentation. Why do we continue to ignore all the practices available to minimize programming errors? I suggest that it’s because most of the programmers currently in the workplace came from academic environments where they were taught this cowboy philosophy – and this is not the philosophy of a craftsman.
Peter 10 days later:
I worked for a company that had one team like this (and I worked on that team). One of the reasons it was structured this way was that the main replication system was built on Access, and to keep the hundreds of thousands of lines of code working with the thousands of tables spread out all over the place was for everyone to write code exactly the same way as each other. It was very dull code that was extremely vanilla, and because everyone wrote it the same way, there was no way you could say “oh, we better ask Peter, because that’s Peter’s code.”
Background note: this company did electronic prescriptions, lab reports and medical claims.
Jon Kern 12 days later:
Bob, I agree about the ridiculous increases in university educations… nothing else has grown in cost and delivered less over time. (Likely due to government-backed loan money being poured into students, so the universities just “upped” their prices to absorb the free taxpayer money.)
I think your argument can be made with or without the university angle.
A couple years back, I was recruited for a position to lead development group at a major telecom. This company had decades of history, going through many takeovers. I spent a couple days with various teams, really attempting to get to know how they worked, what the “flavor” of the place was like. How product development interacted with marketing department, etc. What was their process maturity, how sharp were their designs on current systems, and so on.
My conclusion: I would sooner raise a staff of 100 from babies, through high school, and train them myself—before I would “inherit” that amount of entrenched politics and what not.
I also thought of creating something like an “Agile software institute” where people would come to do internships, work on real projects as they learned the ropes. If we set up such a practice, we could franchise it out to great doers in our industry.
Then folks would be hiring graduates of “Uncle Bob’s” for example…
Dan 13 days later:
You got to be kidding. Craftsmanship is the blueprint of a closed society, with a wretched sense of hierarchy and horrific methods for quality assessment.
Why not fire the scholars and close the universities altogether, thus eliminating the last source of people that are able to think for themselves? A good old society of Masters and well-behaved Apprentices can consequently establish itself building on the already arbitrary standards of the industry-specific hierarchies.
No need for challenges or new thinking. The only necessary factor for evolution is the old Master, who in his wisdom (and its utter incapability of change) is able to think and decide for us all. We should continually honor him in the hope that maybe one day, his greatness will look upon us and allow us to enter the close circle of the Wise ones.
Will the craftsmen wear robes? It would be a nice touch.
If you really mean this, you disappoint me greatly. Beyond my wildest expectation, actually.
Brendan 14 days later:
Google was not created by 55 year old masters.
Inexperienced people often have ideas and intelligence that surpasses more experienced people. This translates to greater ability to deliver value, in spite of less ability to deliver software, because they can imagine ways of achieving things that don’t involve delivering software.
Ancient hierarchies are outdated.
Going to university is so strongly associated with a quality career than any plan that removes this is unlikely to attract career minded people.
Whether or not universities contribute or detract from the quality of developers compared to practical work, the cultural inertia is intense.
The answer to delivering better software is to advance the science and technology of delivering software. We don’t have a strong base of objective research for the cost / benefit effect of the things we know from our folk wisdom. Knowledge from objective research can be independently verified and shared cheaply and easily by everyone. It is not locked in the heads of a few individuals.
Brett L. Schuchert 14 days later:
Brendan wrote:
Going to university is so strongly associated with a quality career than any plan that removes this is unlikely to attract career minded people.
Based on what research exactly (to use your own argument against you)? I can think of 5 people off the top of my head who did not go to college and are excellent. I could come up with more if I though about it, but right now I can name 5. I know many more who did go to college but did not study CS and are great at development.
I also know people who went to college, studied CS and are great.
Turns out I also have met people who did go to college and people who did not go to college and are anywhere from bad to awful. (In fact, some of the worst developers I’ve worked with had masters or PhDs. But since I know Google does pretty well and has a lot of PhDs, clearly it’s not the degree that makes the difference.)
Bottom line, people who are smart and driven and generally not satisfied can do well with or without a college education.
However, you bring up a good point at the beginning when you wrote:
Inexperienced people often have ideas and intelligence that surpasses more experienced people.
I’d reframe that as great ideas can come from anybody at any time.
And that can be a problem with hierarchies. It really depends on the benevolence at the top.
Since I work with Bob, I think I have a good idea of how he’d behave in such a situation. (He’d be benevolent.)
OTOH, I did not take a job with OM in 2001 because I though there was a little too much XP zealotry. Looking back I’m not sure if I was right or wrong about that at the time. However, I can say now that while Bob can come of as a zealot, he’s first and foremost pragmatic.
The thing that interests me most about this thread is you can get good insight into the psychology of the responders.
dkaz 14 days later:
where are you pulling these numbers from…
1 master between 150-250 3 journeymen between 50-100 9 apprentices
I hate the giant gaps in your proposed compensation…sure seems like this strategy would backfire in real life
Or maybe it’s one ObjectMentor person on top + 3 avg/pay experienced people + 9 college grads…that would be disastrous
CSharpSean 21 days later:
Very good view on the way a team SHOULD work.
You are right. To tell you the truth, I didnt learn to much from college. I spent 4 years and over 130k and all I got was a piece of paper (diploma). I went to college to learn about programming (which I did), but almost nothing that I use today. I learned team dynamics and public speaking and stuff like that (which I believe was the most beneficial skill I learned at college)... lol .. . funny huh?
My first 2-3 years after college I struggled learning all this stuff myself and applying it to real world applications. Most of my learning was through trial and error, bringing a lot of work home to finish and learning through my team (most helpful). I also made the decision to join the asp.net community and contribute as much as time allowed.
But anyways, this is a great concept and it would be nice not to have to pay my $1,000 student loan payment each month b/c there would be systems like this out there available for programmers not having money or resources to pay for college.
So. . . Great article.
Kleinecke 4 months later:
I did a stint once as a chief programmer. I am not sure anyone else, especially management, knew that was what I was doing. The job was to replace the unworkable mess left behind by a prima donna. The time scale was ASAP. I got to do what I wanted to do because nobody else had any idea what to do.
I chose three journeymen for support. The situation was so desperate I got whoever I asked for. I think you cannot use just anyone on a chief programmer team. Using apprentices is an interesting idea but I think they would have slowed us up.
It all worked as planned. We made ASAP means about one month. But it was hard work.
I would have done is again. But nobody ever asked.