A recurring theme that I’ve seen popping up frequently in development-centric forums that I visit regularly is the problem of the “expert beginner”. Erik Dietrich does an excellent job describing this in his blog, and while I think he makes many valid points, I would argue that there is a third path that an advanced beginner could take in the development world. Dietrich describes his view on the path to becoming an Expert Beginner:
“As such, Advanced Beginners can break one of two ways: they can move to Competent and start to grasp the big picture and their place in it, or they can ‘graduate’ to Expert Beginner by assuming that they’ve graduated to Expert.”
This view generally categorizes expert beginners as individuals who assume that they know “the whole picture” and no longer find ways to improve, but I’d like to point out another possible option for advancement, and the one that I personally as a developer fall into.
Repeat Beginner: an “Advanced Beginner” who recognizes a big picture and fails to find a place within that picture, and opts to relearn from the beginning a new technology stack or language.
If you look at the Dreyfus model of Skill Acquisition that Dietrich describes, traditional fields seem to fall nicely into the process. Computer programming adds a separate level of complexity, with Dietrich attempts to explain with the addition of an option (the expert beginner). The assumption that the expert beginner model “fixes”, though, is that there is One Big Picture that a developer is able to find themselves a part of, when I’d argue that there are multiple “Big Pictures” that can contribute to the confusion on the part of growing programmers and lead to a rise in the “repeat beginner”.
The Experiences of a Repeat Beginner
I identify as a repeat beginner. I have a degree in Computer Science from Virginia Tech and have been “programming” for 7 years now. That said, I often look at my lack of substantial end to end projects and lament my perceived lack of development skills, particularly since I have been living in the heart of the Silicon Valley. I would argue that I am not a “beginner” developer. I’ve written an implementation of a Linux shell in C. I’ve poked around in scripting languages, studied automata theory, written a substantial amount of iOS UI, Windows 8 modern applications, and can recognize the importance of threading, memory management, and algorithmic optimization. But my GitHub profile is empty – not because I don’t have an interest or ability to complete projects, but because with the huge amount of variety in the development world, I have fallen prey to becoming a repeat beginner in a large number of languages, rather than becoming competent or an expert in any one.
The above image takes the original design from Dietrich and adds in a loop that developers can fall prey to – consistently taking on the challenge of relearning principles that they are familiar with and learning how to do them in every possible language or stack. Instead of solidifying a solid understanding an ability to develop in-depth for a given set of tools and identifying the validity of those skills in the “Software” big picture, the variant of course requirements and personal preferences in different tools can make it challenging for a classroom-educated computer scientist to adapt to the realistic needs of producing code.
Classically-educated Computer Scientists vs. Self-Taught “Hackers”: Personal Reflections
I often find (I will say this has been true only of my personal experience, and do not intend to speak for the whole of the development community) that “classically educated” developers are the ones who tend to fit in to a nice little niche of being able to perform exceptionally well in large companies, and the “self taught hackers” are the ones running startups, putting together full applications, passionate about learning personal projects, and are actually better equipped to become end-to-end “experts” in the software realm.
I’ll use myself as an example again here. My introductory courses to programming were in Java. I learned Java for two years before entering college, when I was required to work in MATLAB, Java, LabView, C, and assembly all in the same semester. When I got my first internship, I had to learn how to use C++, C#, and Powershell. With new classes came new languages and tools – It wasn’t until my final year of college that I was able to choose to use the languages I was most comfortable in; this was my sixth year of studying computer science. Six years until I was granted the ability to learn on my own within the structure of my degree program. I frequently tried to work on side projects, but unfortunately when environments are constantly switching and time is limited (as it tends to be with heavy course loads in college) it was difficult to stick with any one language/environment/stack long enough to become proficient, much less towards expert.
Why Overcoming the Repeat Beginner Loop is Critical
I will not argue that it is impossible to succeed as a software engineer as a repeat beginner, but I do believe that there are unintended side effects that could come into play to those who identify as one. It may manifest itself in a transition from a programmer to a managerial role, or as an unwillingness (or inability) to branch out from being a developer at a large corporation into a smaller company or startup due to a perceived lack of skill. It is a notebook full of ideas, but a lack of an understanding on how to bring them into fruition. It’s holding back individuals, and it’s holding back innovation. On a personal level, it’s critical to me to overcome this “repeat beginner” status because I’m tired of being able to write an individual function in seven languages, but unable to complete an end to end application to publish in an app store.
Now, I am certainly not implying that everyone should pick one language and stick to it – rather, I think that the trap of the repeat beginner is that we spend time that could be used to further our skills in any one language to prove that we are capable of learning more by demonstrating what we already know.
Imagine that you are learning to speak Spanish as a second language. In the first few years, you learn the basics of languages that you miss out on with English as your primary language: complex conjugations that are passed over in English, subject agreement & gendered verbs. New roots and stems are given, and there is a lot of basic vocabulary. Once you’ve mastered the basics, you can continue to become an expert by regular practice and exposure. Or, you can pick up French. You’re starting back at the beginning, except that you’ve already learned general sentence structure. A lot of the stems are similar, so vocabulary is familiar. You spend a year, and suddenly you know as much French as you do from your 4 years of Spanish. But you know what? It’s incredibly difficult to remember how to speak a second language when it isn’t practiced enough, and odds are, it isn’t. Now you speak some strange amalgam of “Frenchspaniol” and while it’s incredibly easy to keep adding on the start of new languages, you end up with a lot of garbled nonsense that negates a lot of your abilities until you actually get really, really good at one in particular.
The major problem with this behavior and way of thinking is that the learning skills that the repeat beginner develop do not require as much time as we’ve spent training them. By becoming an actual expert, I would be just as capable of picking up a new stack as I am now as a repeat beginner. I don’t need to train the skills to learn a new language, I need to train the actual language or my actionable ability is questionable at best. Personal experience here: Despite a combined 8 years of experience with French and Spanish, I cannot converse with a native speaker of either (and I aced all of those classes.)
How do I stop being a repeat beginner?
If you’re identifying with this, you may think that I’m making a valid point and want to learn. You also might think I’m full of shit and let’s be honest – this is subjective, I can’t claim to be an expert. If you fall into the second camp, then you’re in luck, but if you’re looking for a guaranteed path to move out of the beginner loop, then all I can give you is more personal musings.
For me, I’ve decided to take my strongest language (C#) and stick with it. I will be tasking myself with building an app in the app store (Windows) and the first one I make is going to be crap. It’s going to be some silly little project that I could have done in a class project – but it’s going to happen. And then I’ll build something a little harder. But first, I have to admit that my C# skills have softened (In the past year, I’ve taught myself the beginnings of iOS and Android development, sound familiar yet?) so I’ve been working on strengthening the basics. Because I’ve forgotten a lot. But that’s okay – because now, I’m doing something about it.
If you’re interested in practicing algorithms and problem solving in specific languages, I highly recommend Hacker Rank. I’ve tried a LOT of different ways to brush up on my fading development skills, and this one takes the cake. That said, depending on where your skills lie, jumping right into a simple app might be the place to go. As I progress, I’ll be updating my blog with my journey, so feel free to tag along and let’s see what we can come up with together!