In August, I started graduate school at the University of Colorado at Denver, joining their PhD program in Computer Science and Information Systems with a focus on Theory and Algorithms.
This return to school was the first time since I graduated from the University of Rochester that I attended actual classes on a campus (my Master's program was entirely distance learning). I wanted to record some of my thoughts about returning to school, since it's been such an adjustment for me.
University of Colorado at Denver
The University of Colorado at Denver turned out to be exactly the kind of school I wanted.
The University of Rochester was a great school, considered to be one of the "New Ivy" institutions. The Computer Science program was very intensive there, and I was barely able to survive a few of my classes. This was good for me as an undergrad - that was the right time in my life for an extremely intensive program, since I was in school full-time and focused on nothing else. These days, however, I'm a full-time Software Engineer professionally, and I didn't want to be part of such an intense program for graduate school. I went back to grad school for fun, not for my career, and I wanted a program that would not burn me out due to difficulty. Often I found undergrad classes so difficult that I was unable to comprehend some material, leaving me to feel lost, like I** was missing out on interesting stuff because I couldn't understand it before moving on**. I wasn't interested in that kind of experience.
My master's program with Regis University, on the other hand, was too far at the opposite end of the spectrum. Since it was online and largely self-taught, I didn't have much interaction with academics, professors, or even other students. Often I wouldn't bother doing the readings, and there were very few actual assignments (usually just a few projects per course). In short, I felt like Regis was too easy, and I was often bored while attending. I really enjoyed my thesis work, but the actual courses were so low-key that I was able to get straight A's without really focusing on school, which reminded me way too much of high school.
I wanted something that would challenge me enough to keep me engaged, but not so challenging as to frustrate me. I wanted actual lectures, homeworks, and exams, but I didn't want them to be so difficult that I felt lost with the material. This is precisely what I found at the University of Colorado at Denver.
The material was thorough, but the more difficult topics were always taught at a slightly slower pace, and the professors have been great about making sure their students understand. There were definitely some frustrating nights doing difficult homeworks, but I was always able to correctly solve the problems with enough time and effort (as compared with undergrad, where no amount of time would have helped me with some assignments). It was exactly the right level of challenge - enough that I knew it felt like a challenge, but never enough that I couldn't find the solution. Completing homeworks was intensely satisfying.
If I had applied the same level of effort to UCD that I had applied to Regis, I would have failed out. But applying the same level of effort that I applied at Rochester yielded me two A's, rather than the B's and C's I got as an undergrad. It was perfect.
Like I mentioned, this was the first time I was back on an actual campus in seven years. I worried I would feel old and out of place. As it turns out, the UCD physical campus is shared between UCD, the Metropolitan State of Denver, and the Community College of Denver. As a result, the diversity of people on campus helped me feel completely at-ease. I definitely wasn't part of the younger crowd of undergrad college kids (wearing what is apparently a nationwide school uniform of "skinny jeans, boots, North Face jackets, and huge sunglasses), but I wasn't part of the older "I'm-changing-careers" crowd either. It felt just about right, and I felt about the same age as the other students in my graduate courses.
I really enjoyed going to campus and attending classes. Both classes were taught in a single building, so any time I was on campus I was in that building, save for a few rare instances of grabbing lunch at the food court. I'm really glad I lived on campus as an undergrad because of the socialization doing so provided, but I went back to grad school exclusively for education, so the lack of social aspects worked well for me. I probably wouldn't recommend UCD to young undergrads, but it's great for commuters and grad students.
My classroom building is a ten-minute walk from where I work (and the Computer Science department might soon move into a closer building). My employer has been great about letting me leave work to attend class, and it's so conveniently close that it's been a real pleasure. I'm pretty sure that my classes are even closer to my office than my classes were to my dorm room as an undergrad.
Textbook: Introduction to Algorithms, 3rd ed.
My first class, taught by Dr. Ellen Gethner, was a continuation of my undergrad Algorithms and Analysis class. Algorithms at the graduate level focused a lot more on proving correctness and runtime boundaries than my undergrad classes. I always struggled with proofs, but the constant practice I got with this class made me understand the techniques far better. The sense of satisfaction I felt when I completed a difficult proof was great.
I'm lucky in that my undergrad course lightly touched on a few subjects that many undergrad courses don't mention, namely Graph Theory. Having seen a bit of Graph Theory before, I found that section of the course a bit more familiar than some of my classmates, and I really enjoyed learning a lot more about it (it helped that it's Professor Gethner's research area, so she was very excited about it and it showed). Another large portion of the class was devoted to studying Number Theory and Cryptography, both of which I was a little familiar with thanks to a Cryptography course I took as an undergrad. It was nice to learn in areas that I had seen before but never fully understood, thus really rounding out my grasp of the subjects.
My professor for undergrad Algorithm Analysis and Design was a really nice Japanese man who had a great passion for the subject, but who I had a hard time understanding due to his extremely thick accent. I never really understood a lot of the material as well as I'd have liked, particularly Dynamic Programming and Greedy Algorithms. Professor Gethner is a native English speaker, and it made it so much easier for me to follow the lectures. I finally came to a thorough understanding of the material from undergrad, but I also learned about a lot of new subjects such as M-pire/Earth-Moon graphs, Huffman encodings, Fast Fourier Transform, and computational geometry.
Homeworks were fun and interesting, often with a slightly humorous slant (one encoded message we had to decipher decoded to "CHILL OUT EVERYONE"). Exams were extremely fair, largely based on the homeworks and never testing material that hadn't been discussed in class. I did quite well, getting an A as a final grade.
Theory of Distributed Computing
Textbook: Distributed Computing
Taught by Dr. Bogdan Chlebus, this was the first course I've taken that had virtually no connection to anything I did as an undergrad. I took a "Parallel and Distributed Systems" course before, but that was a Systems course, focused primarily on implementing shared memory systems at a low level. This class was much more theoretical, focusing a lot more on proofs (and counterproofs) than implementation. Occasionally I'd see terms I was familiar with from previous classes, but 95% of the material was brand-new. I learned about the Consensus problem, various types of shared memory registers, fault detection, byzantine processes, the attack problem, the theoretical differences (and similarities) between shared memory and message-passing distributed systems, linearizability and sequential consistency, theoretical mutual exclusion models, and the wait-free hierarchy.
I found the course extremely interesting, though sometimes I felt like the presentation of the material left me wondering where it was going. Rather than present a difficult problem, then discuss the tools used to solve it, often we would be presented with the tools first. Many times this left me (and other students) studying completely academic-seeming tools without any understanding of how they related to anything else. For some of the subjects we learned about, the payoff wasn't until the very end of the course.
Though the material presentation order left a bit to be desired, the decision as to what material to include in the class was excellent. We never got into any system-implementation details, always staying very theoretical, focusing on proofs and reductions rather than actually writing code. All assignments were written with text and occasionally drawings, never any programming required. Since I went back to grad school to focus on theory and algorithms, this was right up my alley, and I really enjoyed it.
Professor Chlebus was very passionate about the subject, and though he had a pretty thick accent, I was able to follow him extremely well. The homeworks were all really interesting and thought-provoking, and he even supplied hints for many of the problems if you read his lecture notes closely. Exams were very difficult, often relying more on memorization than understanding, but he also curved the grades to compensate for the obscene difficulty. In the end, I actually got the highest grade in the class.
Grading: Fundamentals of Computing
I also volunteered to be a grader for an intro course, Fundamentals of Computing. This was the least rewarding part of my semester, by far.
Though I enjoyed getting a refresher on C++ by reading a LOT of student code, a particular aspect of grading this class marred the experience: cheating.
After a few assignments, I began to notice peculiar similarities between student submissions. I gave the same feedback, word-for-word, on a handful of assignments and around the third time I decided to look at the assignments a bit closer. It was clear to be that some students were submitting the exact same assignments.
I was really disappointed in my fellow students for this. I don't know what it is about cheating that bothers me so much, but it really irritated me. I informed the teacher for the class and he gave these students zeroes for the assignments, but it didn't seem to have that much effect.
On the next assignment, I noticed the same thing, only this time some of the students clumsily renamed variables in arbitrary ways, hoping to trick me. It was still obvious they were copying, so I brought it to the teacher's attention again. Moreover, there were actually 3 or 4 different clusters of students that copied off of each other within the group. I spent hours combing over code to find patterns indicating cheating between 40 different assignments, and sent my findings to the teacher.
Finding these cheaters was extremely time-consuming for me, taking far more time than what grading should have reasonably taken. And yet, despite students getting zeroes as a result of the cheating, students were still turning in identical, copy-pasted assignments even as late as the final assignment for the class at the end of the semester.
This really ruined the grading experience for me, so I don't plan on doing it again.
Overall, I'm incredibly happy with my decision to return to school. I'm learning fascinating stuff in a tough but manageable academic environment, and it's been very rewarding.
I honestly don't know if it's the school itself that's been so enjoyable, or if it's been a matter of getting out what I put in. Since I'm paying for school myself and I'm attending voluntarily (not because I "have to if I want a job" as I did as an undergrad), I find myself much more motivated to do the readings, give my best effort on assignments, and pay attention in class. I only missed one lecture the entire semester, in stark contrast to times as an undergrad where I'd skip the entire day because it was cold out (sorry Mom).
I speak up in class, ask questions, and have even felt a bit like a teacher's pet a few times due to my enthusiasm. A number of other students have come to me asking homework questions like I'm some kind of expert (I'm not), which feels great.
Taking only two courses at once (rather than 4 or sometimes 5 as an undergrad) has allowed me to really focus on the material and I've gotten a lot out of it. There's very little from the semester that I feel like I didn't understand fully (looking in your direction, Fast Fourier Transform), which gives me a real feeling of accomplishment. Being able to work in both the academic world of theoretical Computer Science and the practical world of professional Software Engineering has kept a nice balance of satisfying my interests.
I've absolutely loved being back in school, and I can't wait for next semester.