My Computer Science Blog
A computer science degree program located in the state where I live, but that I could do entirely in cyberspace, became available and I decided to just go for it. My transfer credits were welcomed, my FAFSA is filed, and my laptop's CPU is well up to this task, so... I'm all done! Okay, I just need to complete the core classes, then I'll be done. Now let's get started!
CS 162
My first catchup prereq, an introduction to Python syntax, and some concepts like Python lists and dictionaries (the common sparse arrays that also allow string keys), sets (unique items only, no values), exceptions (called try/raise/except), classes/inheritance/polymorphism (Python doesn't enforce any types, so you never have to declare anything the way C++ does), recursion, search, and sorting. A few minutes a week, passed with >100%. We used a cute little app called Thonny to run the homework.
Python has a non-C block syntax. It starts with a colon and requires you to indent a multi-line block with spaces, so it ends where you stop indenting. The interpreter will complain if your indent doesn't come in exact change of a tab or 4 spaces.
class SuperClass :
"Bare values are ignored"
class MyClass(SuperClass) :
def Method(self, x, y, z) :
if z == True :
while x < y :
# comment
x += 1
elif y != 1 : self.Method(x * 2, y, not z)
else : raise ValueError("Exception!")
instance = MyClass()
try:
instance.Method(1, 1, False)
except ValueError as e:
print("There was an error " + str(e))
Not a curly brace nor semicolon in sight. I'm not sure why the creators made these syntax choices outside of making a new language look different, but at least it's kind of regular looking to scroll through when the block syntax is enforced. All classes derive from global Object, and you don't have to declare virtuals and pointer types like C; any instance is a dictionary of its methods and superclasses' methods. I didn't notice anything that would slow down writing a low-effort transpile to Javascript, and...yep, others already did.
Thoughts: I see that the latest Pythons are supporting type hints in the style of Typescript that do nothing at all yet but will eventually be nitpickable at static analysis time. I suppose as typing reaches maturity, it will be converging on something you can bolt onto any other system. I've done C++ (everything is declared so heavily you're basically writing all your code twice) and Javascript (type errors don't exist, you just legally get a "1NaN" or something), and I've read enough Slashdot and Hacker News where they argue with each other about the code instead of the executable that I think I can guess that static typing will be something everyone wants to have, but will resent when people start playing Calvinball and building delightful Turing complete type subsystems.
Teacher: Benign.
CS 221
C/C++ Programming using the cloud shell Replit to compile and share assignments. Students already overstand loops and logic statements so we started with printf/scanf (C) and cin/cout (C++); then memory, strings, arrays, and structs; Vectors and other bits of stdlib; and then template functions and classes. The online class was laid out and listed so nicely, with every weekly assignment, that I just ran them all off the first couple of days, which piqued the intructor a little.
Teacher: Easy.
CS 260
Abstract Data Types is an oddball class with some fundamental ideas that is also an upper writing credit (yes! writing is an enjoyed activity for me) using a long online textbook with animation and quizzes for the abstract ideas of Lists, then Stacks and Queues and Deques, then binary trees and ways to keep them balanced so searches stay approximately O(log n). ADTs don't need a real programming language to run. You can just learn the operations with a notepad and pencil. The class ended with a paper to turn in. My first draft was criticised only for its poor presentation and typesetting so I used Apple Pages to make a final version I could be prouder of than before, HyperCard Simulator to make some diagrams, and a nice conclusion: ADTs are a product of a language of mathematics that emphasizes correctness, precision, and repeatable solutions. Every programmer should take this class.
Teacher: Frustrating.
CS 372
Cybersecurity. There's not much I'm allowed to reveal about this but we did emulate Linux, use TOR to browse from an exit node in the Netherlands (cool country name!), analyze our home network security, and discuss incidents constantly. The professor has a long résumé and lot of knowledge, and a fascinating cyber-backstory I googled about some legal problems he got into and then turned the tables on. Cybersecurity is a path I'm not currently considering. It feels goonish, like I'd have to be a perpetual background character in a spy movie. And how simple! I mean, run Time Machine and roll back if you get hacked. That was a joke.
Teacher: Unsure.
CS 318
Algorithms, the sequel to Abstract Data Types. The assignments were nominally in Java but I did most of them in JavaScript; it's just faster, especially with a few tiny helper utilities I built. We started with some simple sorting algorithms and quick union, toured red-black and 3-2 trees, then moved to undirected graphs to find connected components and cycles, then ended with directed and weighted graphs, and algorithms to build the minimum spanning tree. I enjoyed the class, and it gave me everything I need to fully understand this writeup of binary array set I saw recently.
Thoughts: Primarily thinking in JavaScript for some years now has changed what kind of programmer I am. It's a beautiful language. What could be more of an array than [1, 2, 3]? What could be more of a dictionary than { a: 1, b: 2, c: 3 }? I don't have to declare mutability or anything because it picks the most obvious general case for you. Why should I care about low level memory use and efficient virtual tables when I'm trying to produce a result?
Teacher: Same as CS260.
CS 330
This was a course how to think in relational databases, normal forms, transactions, vocabulary, and the syntax of mySQL. Also introduced was the use of Java and Python APIs. The idea of relational databases is to essentially reduce everything to a simple two-dimensional table, and using queries to connect the data together. I enjoyed this for both the subject and for the comprehensive writeups and little programming labs. MySQL syntax is kind of famous: SELECT * FROM etc. Remember, you SELECT FROM, JOIN ON, and GROUP BY USING; the syntax is english, but is it really?
Teacher: The ZyBook was the entire class.
CS 361
“Software Engineering I”: in quotes as both the name of the class and to note the strangeness of it. The setup was that we all wrote up an idea for a project that could be done in 40 hours, then broke into teams and picked a project from the pool. It had to be done in a trackable way involving a specification phase, a design phase, an implementation phase, and so forth. Then we proceeded through the phases, in which one of us ended up doing all the work and one of us paid no attention. Throughout we took blatantly AI-created quizzes, made from chapters of a textbook that chewed the scenery and never seemed to come to any conclusions about anything. Here is a rant with comments that covers what I felt about how non-replicable these teachings seem.
Teacher: Responding to my concerns, he implied he was doing the best he could to prepare us for the field, which I wasn't really able to argue with. If you can be immune and keep a straight face when they introduce methodology, you can probably escape faster and get more work done.
CS 369
Mobile application design, specifically Android and Kotlin. I used a Mac running Android Studio, it works like an alt-universe xCode with a lower elegance level. For a final project, I made an Android clickygame called Firewood Incremental where you tap a button to chop sticks and then sell them to buy new axes, etc. Kotlin runs over the JVM so you can use it as an official alternative to Java. Java syntax, of course, is often redundant:
TypeOfVariable tov = TypeOfVariable.CreateTypeOfVariable(TypeOfVariable.SubType);
Kotlin is a weird intermediate language that hypes itself as being more concise than Java, so it would let you do something like:
var tov = TypeOfVariable(SubType);
Nothing magical, just preprocessing. It says you can get a 40% Lines-Of-Code reduction. But what you reduce in breadth seems to bite you in depth, and vice versa. There are so many not-well-explained splits between mutable and immutable structures, for example, and the official docs are sprawling. It is the Google way.
Teacher: Always put a friendly comment in his feedback.
CS 335
Networking info that was supposed to get you to pass the Networking+ exam. I learned quite a bit about fiber and exactly why a hub isn't a switch isn't a router, Virtual LANs, OSI layers, and lots of trivia.
Teacher: Lectured about stuff he knew, but the class was mostly a ZyBook.
CS 362
Sofware Engineering II. This time the team project was most of the class, after a few labs and some UML assignments. At the last minute they decided to make this our senior capstone class so we don't have to do that. My team made a Wordle clone to specification using HTML in front and backed with Python/Flask and MySQL, then turned in several documents and a presentation over Zoom. Everything worked perfectly.
Teacher: Did a really good job.
CS 311
Operating Systems, an informed walkthrough of kernel vs. user space, threading, scheduling, and concurrency, and some memory management, all covered in a rented textbook. I knew what locks were, which bracketed my learning exactly what a condition variable is, so I could write an efficient two thread reader-writer script.
Teacher: He was sick a few times and there wasn't much work to do.
CS 360
Object oriented programming, but mostly platform video slideshows about verbiage you might need like what a fully qualified name is. The Eight Queens problem has 92 solutions, and we discussed ways to generate and test them using C++, Python, and old Smalltalk. I offered a brief JavaScript solution too. Is JavaScript object oriented?
Teacher: He talked through the slideshows and commented back on the platform.
CS 407
Seminar. I thought it would be putting together a little CV of our student output, but it was actually developing and giving a semi-casual talk on a topic of our choice. Many students chose AI but I decided to learn the fundamentals of TypeScript and recorded a half-hour presentation. The teacher gave their own talk on Python type hints, which was a really nice bookending to that first class, CS162.
Teacher: Easy A.
So? Did you graduate?
Yes I did! I got my BSCS in five terms, not counting summers, over 2023-24. My heaviest term was 24 credits. My past EE credits that I transferred in covered a lot, but I still needed six off-core electives to graduate: music, archaeology, diversity, Photoshop, linear algebra, and web design. There were a few scattered points where I did learn something new to me. I've got some Python and SQL experience that I didn't have before, and managed to produce some cool Photoshop files. I'd never been versed on red-black trees nor the union-find algorithm. All in all, it was fun, and cool to have that piece of paper. I'm confident I would be successful at a MSc if I wanted to spend the money. In the end, I found that my most valuable skill was to effectively write JavaScript. At this level there was no general algorithm or technique it couldn't handle, and the time and effort it saves really stacks up.
The ease factor was exactly as I expected it to be. I've got a reasonably deep base of experience, and only self-management was necessary to keep an A average. I think my most interesting class and teacher was..."COM315: Media, Power, and Difference", a series of readings and countercriticism about how mass media / hegemony (heh-JEH-mo-NEE) portrays and perpetuates views on class, race, and ability. The most challenging class was the one that should have been the flakiest piece of cake: I had to lock horns with a professor of web design who seemed to desire to balance me out and improve an early F (!) back to an A.
My only real criticism is the fluff of an online degree. To be honest, textbooks could be PDF files, right? They're compatible with everything now, you can scroll, read, search, copy, and they even seem to even have enough logic to support basic forms and quizzes. The only problem with that is they're free and you can't charge students for them. So there's a variety of worthless platforms designed to make sure that none of that is available. For example, they won't let you scroll, you have to click tiny previous-and-next buttons that only work 90% of the time; etc etc. Technically, none of these platforms work reliably and none of them ever will because the entire value proposition of them is that they block everyone from just using the PDFs...and to add insult to injury, you usually have to pay a fee for a "student license". Someone is blatantly getting juicy off of this state of affairs, and maybe that's the most realistic preparation for the real world.
That's it! I was lucky the whole time not to have any roadblocks or happenstance that held me back. I've got my degree, and a folder full of work backed up to the cloud. Go Mountaineers!