On the most recent Stack Overflow developer survey 69% of the respondents identified as being self-taught. You know what? All developers are self-taught. I’m self-taught. I taught myself how to program from the age of 12 to 18 without any formal training. Then I went to college and got a formal education in electrical engineering and computer science. Since then, I’ve read books, learned new languages, designed systems, collaborated with others, all in the process of learning – self-learning. So, yeah, I’m self-taught, and all of the best developers I know are self-taught. If you are a developer and you aren’t self-taught or don’t want to be, then you won’t make it in the industry.
Tech moves too quickly to not be self-taught.
So, what is the actual issue we need to be considering instead of talking about how developers have learned the craft?1 What we really care about is the experiences they have been able to internalize and learn from. I firmly believe (and I’m pretty sure some science will back me up) that our brains cannot make subconscious connections between ideas without having knowledge and patterns encoded in our neurons. Pretty much every point Steven Johnson makes about innovative leaps in technology in his “How We Got To Now” book and series follow the pattern of someone knowing about two independent projects and making a leap in logic to put them together into something more valuable than the sum of the two. And Kieran Egan makes the point elegantly in his proposal on Learning in Depth:
The imagination can work only with what we know. It can’t work with the contents of the library or the internet. It can work only with what we know. Ignorance and vaguely grasped general knowledge provide only arid food for the imagination; richness of detail is what gets imaginations up in the morning.
In other words, the most important task required for building software – creative innovation and problem solving – cannot be done effectively without having experience, failures, lessons, and knowledge tucked away in the brain to be drawn upon at a moment’s notice, in a fit of inspiration, as an instinct.
Can you be self-taught and also have those neurons built up? Yes, of course. Can you be formally taught and not have those neurons build up? Yes, of course.
Knowledge Is Fundamental
One benefit of a formal education (which of course can be achieved informally) is having fundamentals from computer science shoved into your brain. That knowledge is required to make good decisions about the software you are going to write and cannot be acquired just by building apps by yourself using the latest super simple app-building technology.
For example, if all I knew how to do was build web apps using ATG Dynamo (I’m using a purposefully very old web-building technology so that people won’t say I am being judgemental of Angular or Rails or Flask, but you can substitute any technology you’d like to rail against for this argument – pun fully intended). If all I knew was how to build web apps in ATG Dynamo, then I’d probably understand really well how to model domain objects that apply to the business problem at hand and how to build web forms to create and edit them. But without further inquiry on my own, I wouldn’t know anything about the data structure used in the caching layer for Dynamo’s Nucleus or how my data model changes the runtime of the queries that Dynamo’s ORM generates. And therefore, I would not have a deep understanding of how the decisions I make in my code will effect the long-term viability of the product (from a technology point of view). I would have to spend extra time learning about those things. I would have to decide that I wanted to dig into them… and then dig past them.
Oh, Dynamo caches objects? How does it do it? It uses an LRU? How is that implemented? Is it thread safe? How does it achieve that without locking?
The nice thing about having been formally taught for several years is that I got to learn about some of those concepts in the abstract and can quickly recognize them in the real world. This is totally possible for the strictly self-taught as well, and could be completely ignored by a person with a formal education. Both must make the effort to form the connections.
The Experience Of Old People
This gets me thinking about experience. There is push back against old people. People with a lot of experience are discriminated against in the tech world. We think that the young people are the ones who can do the most creative work and who can challenge the way something is currently done. Old people with experience can do that, too. They can also draw on things they’ve seen before and avoid obvious pitfalls. Just because something didn’t work in the past doesn’t mean it cannot work in the future, and it helps to understand why it failed in order to figure out how to make it work next time. If you were around when it failed the first time, you probably have some ideas of why that happened.
If your mind is empty, it is always ready for anything, it is open to everything. In the beginner’s mind there are many possibilities, but in the expert’s mind there are few.
To me, the best state of being is as an expert with an open mind.
My past experiences often come up as instinct that helps me decide how to put layers of a system together. Where good abstractions are needed. Where to spend time testing. How to decide on a good name for a module or variable. I have an instinct for where failures will more likely occur because I have a broad range of experience across a number of technologies and across full systems from the UI down to the chips.
Maintaining an application in production, over a course of several years, with users banging on it is the best way to learn about the mistakes you made building it to begin with.
It Ain’t Just In Technology
The tension between formal and informal learning and experience and “youth” are not isolated to writing code. If I had studied physics or economics in college, I might have a better understanding of how to design experiments using the scientific method and how to use the results to refute hypotheses. If I had a degree in statistics I would certainly understand better how to decide if the results of an A/B test were significant or not.
But this isn’t even isolated to the sciences. If I had a writing degree I bet I’d be better at writing documentation with some empathy for the reader.
Despite it’s shortcomings, a college education offers discipline and depth in learning, which are often hard to accomplish with self-learning. Dedicating four year of focused time, guided by people with experience, builds a strong basis on which to improve further.
Knowledge And Experience Required
While we have much in common, we humans are also all unique and special. When we encounter new people, we should not judge them based on their age or their education, we should look deeper to learn what their experiences are and how those experiences have shaped them.
You don’t have to be self-taught, and you don’t have to be formally taught, but you have to have learned stuff and tucked away experiences to recall later.
Yes, I used the word “craft” to talk about writing software. I believe it is a creative process that requires a high degree of skill. To me that sounds like a craft. Yes, you can build software without being creative and without having a lot of skill, but I bet those people won’t have jobs sustaining products for a long time. ↩