The Education of a Programmer
No, I'm not going to talk about learning to code. I've always wondered what in my past made me not only want to become a programmer, but led me to the particular skill set I have worked with for the past 3 decades. This post is a little personal but maybe there is some value in it.
Everything we learn at an early age may potentially influence what we do as an adult; at the time of course we have no idea where it might lead. This makes teaching difficult, as there is no immediate feedback as to the success or failure of teaching methods or even an individual student's ultimate end result. Often this leads to attempts to standardize some particular educational process, in the hopes that conformity in teaching might result in better measurement of the adult state.
I can say for me that my education as a child and young adult was a little odd, or at least not particularly standard at all. How did my experiences affect my future career as a programmer? If people did exactly the same with their children would they get the same result? I certainly have no clue. It goes back to the old argument about nature vs. nurture, are people condemned only to what they are born with genetically, or does the experience at a young age make more of a difference? What creates a programmer?
I have no exact answers, maybe a few details would at least be useful to mention.
I went to school in three different countries growing up, in the US, in Germany (4th and 5th grade) and Canada (12th grade). Trying to fit into a new culture as a kid isn't very easy, and especially in Germany where I only had rudimentary knowledge of it (my parents and grandparents came from there). Even in Canada the school people had a negative view of schooling the US and thought me somehow backward. It meant making friends from scratch was hard sometimes, and I wound up being alone more than most kids. I had a younger sister, but still found myself finding ways to keep from getting bored. In middle school and even in early high school I played a couple of sports board games by myself, inventing a way to play a two person game fairly with one, and then keeping ridiculous statistics on every player and every game. Yet in that clearly pointless activity I know I learned a lot of personal discipline in writing massive datasets on paper (no computers back then).
My parents made me learn to play the organ when I was 8, like most parents. I hated it, even to the point of running in the woods when the teacher came sometimes if I hadn't practiced. By the time I was 11 though I got a teacher who was different, and actually wanted my involvement in what I learned, and he was big into popular music and broadway, and I suddenly realized music was fun. By 13 I started playing in church which is pretty intimidating to a kid who can barely reach the pedals. But I found practicing new music every week was tedious.
So starting something that eventually became a habit as a programmer, I thought there had to be a better way. I noticed chord symbols in the music and asked my teacher to explain the theory. Once I understood it I started to improvise the accompaniment. People failed to notice so I was encouraged to go further and began to improvise entire pieces (instrumentals to fill in places) and people though it amazing how many pieces I knew.
Most music teachers do not teach improvisation, a skill mostly in the jazz community. In Bach and Mozart's time it was a skill required of any instrumentalist but today most teachers only teach playing the notes on the page. Improvisation is basically a skill to create music on the fly based on understanding how things fit together. I still do the same today, though mostly on bass and keyboard. I find this ability to think while doing has always helped me be able to choose a direction to go while coding, and evolve design over time; it's not that different.
The other key thing I got out of my improvisational music background is confidence. I know then when I start making it up it will generally turn out well because I've done it so many times. I have always had the same confidence in my code. I think as a young person the experience of not only doing something but succeeding at it breeds more of the same. The experience of creating something that works also makes you more likely to want to create something the next time, and not just "play the notes on the page you are given."
During my year in Canada I did get to take two classes that reinforced creativity and improvisation in my mind, I took a class in creative writing where we wrote poetry, a short story, a novel and a one-act play, all in that one year. In order to write all this stuff I had to have the discipline to write every day (especially the novel), think logically, adapt the story with little time to rewrite (writing on a typewriter!), and then deal with criticism. The other class was in electronic music, where often we would simply grab whatever was in the room (not a musical instrument) and as a group create a musical piece. It was an amazing experience, to realize that you could work with others to create something you couldn't do by yourself, and do it on the fly. I learned how to listen actively, which of course is handy when you lead a development team to create something.
I don't think I am particularly autistic or anything, and I've never thought myself as all that smart, but my background in creativity and on-the-fly thinking, adaptability to different surroundings, self motivation and confidence that I can actually succeed at things all helped to make me a better programmer. Is there a lesson in here for teaching the next generation of programmers? I don't know if any of this is exactly a repeatable formula, but I do think there is something to be learned.
Kids who are given the ability to think for themselves, to fail, to succeed, and to be pushed in new directions are more likely to be successful as adults. I've never cared much for the "no child left behind" mentality in schools in the US. My friends who are teachers all lament that they are required to only teach specific points they are given (I live in Texas) and have to follow everything to the letter. Freedom to innovate, to take risks, to let the children lead the direction of learning is not really permitted. In many school districts money is not available for music or the arts or the programs are very basic and not always inspiring. Even learning things like history (which I love, particularly military) is learning to pass a test, not to inspire a student. It doesn't really matter what you inspire a kid with in school, it's the inspiration that matters. That teacher who fired me up about music probably changed my life completely in ways not obvious at the time.
The most popular class and teacher in my high school (before Canada) was Latin. Why Latin? The teacher had an amazing way of getting every student interested in the subject, the history of Rome, and anything else even remotely related, and everyone had a blast in the class. Inspiration is not a bulleted list or a test, it's a state of mind, and kids are always going to pick up on it. What that class did for me was created a desire to learn, it made me love history and desire to learn new stuff even when it appeared to be useless at the time.
So is any of this meaningful to anyone other that me? I have no clue but I offer it anyway. Programming is not just a job, it's a way of life to me. Not everyone feels the same but I know enough people who agree with me. Teach people to code? No, you need to inspire them first, otherwise it won't stick. Teach kids to think creatively, to improvise, to take chances, to fail and eventually to gain confidence through success, and the next generation of programmers will appear naturally.
Just don't take my job yet, I still love it too much.