I have a certain ultimately meaningless conundrum. I don’t know if I’m self-taught or college educated as a programmer. Seems like something that would be easy to sort out, right? If so, maybe you could enlighten me
When I was first enrolled at my alma mater, I had selected Electrical Engineering as my major. To this day I’m fascinated by and greatly enjoy working with circuits, but generally ones driven by microcontrollers and involving plenty programming, as you might know if you’ve read more of this blog. I didn’t quite have what it took to learn Calculus from the Physics PhD that was assigned to teach it to me, even while dutifully attending all the lectures, doing the (admittedly probably innefective) online homework and even utilizing the tutoring service. Algebraic calculus was fine, I was struggling with the density of material around triginometric calculus and so many correlaries and postulates. I couldn’t hold on to the proofs to really mentally integrate the model fast enough.
At the same time, I had started work at a flower shop just down the street from my high school best friend’s house. The spouse of the florist was running a remote web development team all the way back in 2008 and I got my first work with them (a small bounty bug analysis) in 2013 that first semester while I was in school. He taught me the LAMP stack (linux, apache, mysql, php) or rather helped me get un-stuck many times. I learned to check the logs.
The guy living above me that same semester, thanks to troubles with my original roommate, was in CS while I was still enrolled in EE and between that and my own adventures into what I had found an appreciably cheaper hobby/profession I had good reason to switch to CS. I also learned, upon checking the bulletin, that the full Calc/Diff Eq. coursework was missing from the CS degree at my particular school because it wasn’t accredited with the rest of engineering and was instead considered part of the business school. Business school meant I could take “Business Calculus” which is literally just the algebraic first half of the course I had passed before my grade dipped in the trig coureswork and I took my W (withdrawal, not a win).
That upstairs peer had the intro to OOP I/II book. I got it from him sometime late that spring when he decided instead of game design he would pursue economics. I read the entire book in a little under a week, and before I enrolled in either class. My Advisor was a patronizing a**hole and required I take a boo-boo-baby-key intro to computing course that first semester in CS (my second in College).
I had already learned enough PHP to put a couple toy websites under my belt, one a site hosting Doge memes (before and just at the inception of dogecoin) and one reminder tool that operated through the SMS gateway for US phone carriers.
I didn’t even really enjoy those OOP classes. It was C# and it wasn’t obvious that we were really learning about how the computer worked, instead we were mostly copy pasting small patterns of code to meet new assignments and I didn’t feel empowered becuase everything was code-generated with button pressing in visual studio, a disorienting experience compared to the much more comprehensive view I had of the workings when I was editing configurations and code in vim and restarting services and tail -fing logs.
I did enjoy microcomputer engineering. MCE 347. We learned assembly from the reference manual for the motorola 68000 and it was a joy. We also programmed an FPGA with VHDL but I didn’t care for the finicky nature of the hardware description language, much more so hitting my strid when we switched to the 68k 1⁄2 or so through the course. I remember we got as far as counting button presses and displaying them in bits and I was upset that we weren’t given a method to de-bounce the button press, it was plenty bouncy. The professor brushed this off but of course I’ve encountered the same problem even in higher level languages working on my own silly projects.
So you see, I really value bottom-up learning and found great value in narrow slices of my university education, some of the operations of discrete math still visit from time to time but most of my problems are solved by parentheses. I don’t know if that makes me a self-taught programmer who completed a college education or a college-educated programmer who also self-taught but beforehand, a skill that many learn after getting an internship later in school or in a job after graduation.
If I’m the former, self-taught, then I sure don’t have many people around to identify with. I have a small friend group on discord whom I believe was mostly self-taught as everyone but me had more interest and available teaching knowledge/materials in their environment, or maybe just more perseverence. You see, when I was 13 I tried to learn python, but they were going through the first of the 2.7->3.0 breaking migration. Even though the book my family had bought me said 2.7 on the front, I downloaded 3 because newer > better, right? Well, it mostly worked, until it didn’t. Then I couldn’t understand the error messages because of all the jargon and I swore it off.
When I went to an EE camp later I didn’t enjoy Matlab or Arduino programming, and much more enjoyed the signal-generator and oscilloscope-based demonstration of half and full-bridge AC->DC rectification. I really kind of bounced back and forth over a lifetime now, first trying to program then finding circuits more interesing, learning to program in college and attaining a degree of professional experience and now I’m back spending that salary tinkering with electronics.
So I really don’t know where I fit. I know I’m not in the bootcamp crowd, which is an especially large crowd around me at my current job. I know I’m not entirely self-taught becuase I know I would have never thought of Karnaugh or K-maps for optimizing truth tables (and ultimately reducing the complexity of a set of logic gates). I know that I’m not entirely university-educated because I had mostly integrated the lesson of checking the logs before I landed in professional work at a respectable salary.
So I don’t fit anywhere. Or maybe I kind of fit everywhere.
I still have an inkling of what it was like start programming all those years ago. 2009. failure. forfeit.
I still have an idea of what it’s like to finally gain a mentor, and have those hints for getting un-stuck.
I still remember the striking moments of clarity that some of the concepts in Computer Science provided, like Extended Backus-Naur Form (EBNF) or how interrupt subroutines are defined, set, answered, and returned from.
So maybe I can fit in well enough wherever.
Whatever it is, I feel like a type of living proof that there’s no entirely wrong way to learn programming.
I do have my own opinions, sometimes shared, like that you should have in mind what you want to build even if it’s silly (like my doge meme website) because that can keep you from being overwhelmed by what you could learn. You have to start picking things, things that will narrow the focus of your learning and increase the speed you progress through individual concepts, forcing you to remember them as you implement each next step or feature one by one.
If I could really impart anything from my position as a cyber pedagological shapeshifter, it would be that we need to teach security. I did not learn about XSS and SQL injection attacks in school. Sure they may have been in books, but it needs to be in lectures. It’s insanely important now as frameworks purport to handle all this for you, as we need to know the dangers we face when we inevitably have to escape the scope of the frameworks we’re familiar with.