Over the last two months, I’ve had my first apprentice. I don’t consider myself a Software Craftsman, not even quite near yet. But still, I’ve learned a lot of things, and after some sessions with him, I have no doubt that you don’t need to be a complete craftsman in order to have an apprentice.
I’ll bring some backup on the story before getting to the main point.
Super story time
At last year’s Code Week, our Software Craftsmanship community organized an event which target was teaching programming. We divided into two groups, one for the very beginners (first time programming), and another one for intermediates.
I was in the beginners group as a facilitator. Over the length of the event, the attendants learned the core basics, some of them quite liked this programming idea, and between those one was really liking it a lot. My friends Juan and Ronny noticed how much interest this last one had and approached him.
At the time he was a random person for me, I only knew he was called Victor. After talking to him, Ronny said to me that they had discovered quite a passionate dude, he was 17 years old and would study Computer Engineering starting next year. He was also asking for some Java courses online so he could take a look at it. So, Ronny made sure to stay in contact (nice work!) and I got to meet him around half this year`s September.
Oh the questions!
Victor started out College with very little programming knowledge, but still he was a bit ahead of the fresh students. We could think about him as a (nearly) total beginner, but passionate and wanting to learn.
So let’s get to the main question, are we really able to take him as an apprentice? Not because of his level, but regarding our level, are we ready to start sharing our knowledge?
I mean, what if we don’t actually have a deep understanding of some topics, but we think so? Wouldn’t it be better for a real craftsman to get him as an apprentice? Wouldn’t he learn more, faster and better in that case?
I’ll drop a little spoiler. I now believe that you are ready to take someone as an apprentice if she can’t tell the difference between you and a craftsman that you consider to be better than yourself.
Of course this last statement requires knowing each other a bit, if the apprentice doesn’t even know how you program, it’s unthinkable that she may know the difference between you and another developer.
About your level (it inevitably matters a little)
I’m guessing everybody who knows about apprenticeship also has some background on Software Craftsmanship, unit testing, some design concepts and at least an intermediate level in programming, no matter the language. If that’s not the case, then I believe those are the minimum requirements for you to get an apprentice in the correct meaning of it. Again, to know the “correct meaning of it” in the craftsmanship sense, I’m pretty sure you would have to be familiar with SC.
Event thought it’s a bit against the title, I would totally recommend reading Apprenticeship Patterns before taking an apprentice. The book is oriented to apprentices, but will clarify how to approach the whole process.
Ok, with those thoughts in place I’ll be answering my previous questions.
I’m not quite the craftsman yet, but I’ve learned a lot of things. What if I don’t really understand them the way they should be understood? What if I have misconceptions?
Well, you actually know those concepts. Your apprentice can’t (yet) tell the difference between you and a better craftsman you respect, one of the key reasons has to deal with her not knowing the concepts you have in your pocket. You’ve also made it quite far to get them, and I’m pretty sure your apprentice will be grateful even if she later discovers you got something wrong. That’s totally normal, you are allowed to make errors and you will find them because you are also constantly learning.
Wouldn’t she learn way better and faster if a more experienced craftsman took her as an apprentice? I may spend some time searching for a craftsman who’s willing to have an apprentice instead of me and will get better results.
The speed rate at which your apprentice learns depends on two factors, her own dedication and the time you’re able to spend with her. But here comes another key point. There will come a time where you will be both near, the apprentice should reach a level where you cannot teach her any more with confidence. In this moment, you become Kindred Spirits as described by Apprenticeship Patterns. You no longer have an apprentice, but a great colleague to learn new stuff with and deepen in the craft together. You should be happy when this time comes!
You’ve just talked about the speed, but wouldn’t she learn better with the more experienced craftsman?
Well, that may be true. But you don’t know yet how much of a good or bad teacher you are unless you take an apprentice and start teaching. You may do it better than the more experienced people or not. Let the apprentice decide on that matter, this is a relationship between you two, you don’t have all the responsibilities.
The great profits
We are always learning and trying to become better professionals. Having an apprentice may boost your own learning experience. There is no better way of reinforcing your concepts than having to explain them, even more when you have to clearly explain them to someone who has not all the means to understand you. Her toolset may be quite empty, explaining new concepts in a simple way will force you to clarify them resulting in your own profit too.
Good practices to the limit. You want your apprentice to start up without bad practices, so you really stress out the good practices when pairing with her, and unconsciously become better at those yourself. At least, that’s true for me. I’ve sometimes made a pretty ugly commit, not atomic at all, and let it happen (for my own projects). After some sessions where I’m totally making it clear to my apprentice Victor to make damn only atomic commits! I find myself being way stricter with myself. No more spaghetti commits, I must be writing clear messages and not pushing all the time so I can reverse anytime and correct a message or further divide a commit.
I had an especially productive session with Victor where we started out the Tennis kata. The TODO list, the possible tests list, baby steps and red-green-refactor was the order of the day. I let him drive all the time and just took the keyboard to show him something if he did not quite catch my explanation on what to do next.
At the end of the day, he told me “I have learned a bunch today!” Now that’s one really satisfying thing. But even more satisfying to me was saying “I may have learned more than you!” which is not a lie at all. I may not have learned new things, but got great value by revisiting and explaining every single detail of the process for the kata and how things should be done to achieve better results for Victor.
This post became way larger than I ought it to be at first, I was considering on writing some details I thought we were doing right and some not so right about Victor’s apprenticeship with us. Yes, because we are actually 4 people teaching Victor: Ronny, Jose, Ángel and finally me. We are all organizers of the Software Craftsmanship GC community.
Are we doing it good or bad? Well, I think the real question should be are we doing it great or good enough? Because I think that getting an apprentice, promoting craftsmanship and learning together can’t ever become a bad thing, and that’s the reason behind this post, which is kind of motivating people who is still on its way to craftsmanship to take apprentices if they can!