Is the software industry trying to write the script for Hamlet by hiring a million monkeys to bang on keyboards?
Robert Martin once used this metaphor as a way to claim that the current state of software education is insufficient. Here's the gist of his concern: a Computer Science degree is not an adequate indicator of software professionalism despite our industry's tendency to use it as such. Allow me to demonstrate this with an excerpt from my own undergraduate journey.
In my last year of school, I took four Computer Science courses: User Interfaces, Bioinformatics, Concurrency, and Algorithms. I learned a great deal about each of these four topics, but I learned very little about their overlap. Though I spent hours understanding the concepts in each course, I would be hard-pressed to design a system informed by all of them. Each course represented a practiced focus. There was neither an expectation to synthesize these foci nor a reward for doing so.
Despite the severity of Uncle Bob's words, this post is not intended to diminish the value of my undergraduate experience in any way. This is not a "who needs college?" post. I value my time spent as a Computer Science student and the breadth of professors from whom I learned. I am instead writing to apprentices, mentors, and those considering either role to draw attention to the subtle difference between the traditional classroom and the modern software apprenticeship.
Here is what I have realized since completing my apprenticeship: software crafters must commit to a career of learning. That learning, however, more closely resembles that of an apprenticeship than that of the traditional classroom. In the classroom, the practiced focus of each course created incentive to compartmentalize. But in an apprenticeship, mentors should aim to do the exact opposite. To illustrate, I'll share another anecdote, the story of my 8th Light apprenticeship.
- Before I arrived, I had to write a Tic Tac Toe application.
- Then I had to write tests for my Tic Tac Toe application.
- Then I had to read about testing.
- Then I had to test-drive another Tic Tac Toe application.
- Then I had to refactor my Tic Tac Toe application so that it was a loosely coupled system.
- Then I had to read about interacting with clients.
- Then I had to read about a new language.
- Then I had to test-drive a loosely coupled server in said new language for an automated client.
- Then I had to test-drive a loosely coupled combination of my Tic Tac Toe application and my server for mock clients, my mentors!
My apprenticeship trained me to learn continuously by forcing me to digest information from various sources and deliver products informed by all of them. This is the kind of learning I will be doing for the rest of my career: synthesizing, not compartmentalizing. In the classroom, I learned for the evaluation; but in my apprenticeship, I learned for the unknown future.
If the Computer Science degree is not an accurate indicator of software professionalism, then what is? My theory: willingness and ability to synthesize knowledge is that indicator. In other words, I find that I must answer the question "do you know how to ...?" far less often than I do "can you figure out how to ...?" We earn trust with our clients when we can learn how to work effectively with their tools. We are more productive partners when we approach new problems informed by our previous engagements. We can teach more competently when we can learn more holistically.
For these reasons, classroom-based teaching does not suffice. Software professionals are created from experiences that force them to re-orient the manner and purpose with which they learn. Though apprenticeships may not be the only answer to that call, they certainly seem to be an effective one! When we commit to mentorship, we are teaching people to learn via synthesis, and by doing so, we create professional, career-long learners.