This is the last article from the series "Tips from The Clean Coder". Here we gathered and summarized the main tips from the last chapter.
I have been consistently disappointed by the quality of CS graduates. It's not that the graduates aren't bright or talented, it's just that they haven't been taught what programming is really all about.
Not all CS graduates are disappointing - far from it! However, I've noticed that those who aren't something in common: Nearly all of them taught themselves to program before they entered university and continued to teach themselves despite university.
Now don't get me wrong. I think it's possible to get excellent graduation at a university. It's just that I also think it's possible to wiggle yourself through the system and come out with a diploma, and not much else.
And there's another problem. Event the best CS degree programs do not typically prepare the young graduate for what the will find in the industry.
There are several ways to learn things. You can learn by reading manuals written by other developers (you can include here documentation, tutorials, articles, you name it). You also can learn by observing people doing their job, and so on.
I would have been far better if I'd had a mentor, someone to teach me the in's and out's. Someone I could have observed while I helped him with small tasks, and who would review and guide my early work. Someone to act as a role model and teach me appropriate values and reflexes. A sensei. A master. A mentor.
What do doctors do? DO you think hospitals hire medical graduates and throw them into operating rooms to do heart surgery on their first day on the job? Of course not.
Somehow the software development industry has gotten the idea that programmers are programmers, and that once you graduate you can code. Indeed, it's not at all uncommon for companies to hire kids right out of school, form them into "teams", and ask them to build the most critical system. It's insane.
Let's do not kid ourselves that this doesn't matter. There's a lot at stake. Our civilization runs on software. It is software that moves and manipulates the information that pervades our daily life.
Given that we entrust software developers with all aspects of our lives, from the minutia to the momentous, I suggest that a reasonable period of training and supervised practice is not inappropriate.
So how should the software profession induct young graduates into the ranks of professionalism? What steps should they follow? What challenges should they meet? What goals should they achieve? Let's work it backwards.
These are programmers who have taken the lead on more than one significant project. Typically they'll have 10+ years of experience and will have worked on several different kinds of systems, languages, and operating systems. They maintain that technical role by reading, studying, practicing, doing, and teaching.
These are programmers who are trained, competent, and energetic. During this period of their career, they will learn to work well in a team and to become team leaders. They tend to learn one language, one system, one platform; but they're learning more. As they gain experience, autonomy grows.
Apprentices have no autonomy. They're very closely supervised by journeymen. At the first they take no tasks at all, they simply provide assistance to the journeyman. This should be a time of a very intensive pair-programming. This is when disciplines are learned and reinforced. This is when the foundation of value is created.
All of this is idealized and hypothetical. However, if you change the names and squint ate the words, you'll realize that it's not all that different from the way we expect things to work now. Graduates are supervised by young team leads, who are supervised by project-leads, and so on.
The problem is that, in most cases, this supervision is not technical! In most companies there is no technical supervision at all. Programmers get raises and eventual promotion because, well, that's just what you do with programmers.
The difference between what we do today and my idealized program of apprenticeship is the focus on technical teaching, training, supervision, and review. What's missing from our current sterile approach is the responsibility of the elders to teach the young.
To understand, let's look at the word craftsman. This word brings to mind skill and quality. It evokes experience and competence. A craftsman is someone who works quickly, but without rushing, who provides reasonable estimates and meets commitments. A craftsman knows when to say no, but tries hard to say yes. A craftsman is a professional.
Craftsmanship is the mindset held by craftsman. Craftsmanship is a meme that contains values, disciplines, techniques, attitudes, and answers.
How do you get people to adopt the craftsmanship meme? Remember that a meme is contagious, but only if it can be observed. So you make the meme observable. You act as a role model. You become a craftsman first, and let your craftsmanship show. Then just let the meme do the rest of the work.
School an teach the theory of computer programming. But school does not, and cannot teach the discipline, practice, and skill of being a craftsman. Those things are acquired through years of personal tutelage and mentoring.