(Mis)adventures in Coding Self-Education
Recently I’ve been struggling through a coding MOOC. The class is only few weeks long and it has been a bad experience. The process, however, has reminded me of the challenges that I notice when I try to approach coding self-education.
The assumption that I’ve done this before
Classes that label themselves as introductory classes often assume a fairly high level of familiarity with another programming language for foundational knowledge. While they don’t really care what language it is, that baseline expectation is there. In this MOOC, the instructor launched into “here’s different ways you could do this one function” and told us they were all legal (his term) but then qualified that we shouldn’t really use them. He never did give us the structure that we should actually use. In conversation, the Philosopher* later suggested that the instructor is assuming that he’s showing parallels to how the language is similar or different to other language formats. For someone without that robust background in programming, this was just confusing. While I understand that not all intro classes, certainly not rather short ones, can cover all of the basics of programming, too many assume that it’s not their responsibility.
Failure is the best way to learn/is how coding works
I learn better with a little success before I start failing**. Coding instruction doesn’t seem to work that way. I’ve tried online courses and books and the examples seem to focus on repeated failure until you get it right, which is often what coding is once you’re sorting things out for yourself. While that may be what we’re getting to, starting me with failure sets me up for a lot of self-doubt that I struggle to get past.
One of my last classes in library school was Jim Vorbach’s MS Access/XML class. Dr. Vorbach would lecture and then would give us very clear building-block type assignments to work through during the rest of class. The written instructions he gave at each step of the assignment were always excellent. As a result, I usually finished in 15 minutes what he allotted an hour to do. Grounded in that initial success, I built and supported Access databases professionally up until a couple of years ago. I figured out how to do all kinds of things beyond what he taught us, but I guarantee that the best practices that he led with are what I fall back on and are certainly the reason I still draw squares and arrows.
However, when I cannot seem to succeed, where it’s failure after failure and frustration–I stop (or certainly want to). Even though I expect to need this skill set in my career, my programming self-education is not part of my current job. That means it gets squeezed into a couple of hours following busy days and trying to work around all of my other obligations. Coming home and contemplating something that is continuously not working and where the rewards are only “finally, it’s over and isn’t spitting out error messages” is not especially appealing. I don’t expect everything I try to learn to be fun or easy but there have to be ways to make it feel less like I’m beating my head against a wall.
Bad Examples or No Examples
Writing universal examples is hard, if not impossible. I understand that. But writing poor examples or no examples at all is even worse. In my current class, an example was given on scoping. Unfortunately, because the instructor failed to be clear that he was using the same letter (x) to mean two entirely different things in two different functions and didn’t properly use formatting, I ended up completely misunderstanding what was scoping to what and how he was using x and hugely struggled to make heads or tails of what I was supposed to do.
If I’m going to be regularly using whatever it is I’m being taught, then I’d like a real world jargon-free example. Tie it back to something really general like laundry or grocery shopping or something that most people do at least semi-frequently. Also, if instructors want students to write clear, reusable, well documented code, then they should lead by example. Showing a quick and dirty function tossed off because it can be done in that few of characters doesn’t help me learn, again assumes that I have higher level knowledge of other languages that I can translate to this example, and promotes bad practice.
We had to learn it this way; this is just how you learn coding
“This is just how coding is taught.”
“You have to go get the foundations somewhere else”
“You’re getting more than I did, *I* had to start with the language documentation”
“You should have already __________ before you started this” (where blank is taken programming in high school or college; been exposed to this 9 other ways; read 5 books/take 3 in person classes; played more with computer code at age 12; given up all other hobbies)
If I had a dollar…
I disagree with the idea that this is how we should teach people and this is how coding should be learned. I’m trying to learn this now. The classes are being offered now, which suggests a desire for people to learn this in the present. While what is being presented may have been historically how one has learned things, that doesn’t make it the best way to go forward. Continuing to drum out potential coders by running them through this “how I had to do it” gauntlet does nothing to enhance the coding community. I fully expect to need to go bash around and break things, to read documentation and run into massive roadblocks when I get through the basics. But I look for these courses–labeled introduction–to give me some basics so I am confident to break things, to find out how to solve things, and to not penalize me for coming to this later in the game.
All of these factors are barriers to me wanting to continue to learn or continue with coding. And this doesn’t even touch on my concerns about when I get through the basics for a given language–trying to find a project, general trepidation about code being the thing most valued in OSS, specific trepidation about being female and seen as representative while I’m actively struggling to learn this. And honestly, I’ve found these online classes so frustrating that I’m hesitant to find a live course–because while I know that I can learn these things, I have this fear that I will fail and then it won’t be alone, where I can close the computer and walk away, but that it will be in front of people and then I’ll feel especially exposed.
I will be giving extensive feedback to the instructor of the class I’m currently in but this isn’t the first, nor I expect the last, iteration, and it seems to be pretty much on autopilot except for the forums so I don’t expect much to change. I’m not the only one who has struggled in this class, I’ve spoken to at least 3 other people who have dropped out from frustration and these are all people with capacity and strong interest in learning and using this programming language.
I continue to look for better methods to learn so that I can contribute, so that I am confident in programming. And maybe then I’ll start teaching and you can tell me how while I’ve addressed these points, I’m missing five others.
*The only way I am getting through this course, and I have no shame in admitting it, is that despite also not knowing the language the Philosopher is willing to explain some of this stuff to me and help me dig my way through it. I know I would not have gotten this far without him. Maybe I should add “don’t assume I have a willing-to-explain-all-of-your-bad-examples coder in the house” to this list.
**I highly doubt I’m the only person like this.