OMSCS debrief - part 0
Online Master of Science in Computer Science
I’m at the tail-end of Georgia Tech’s Online Master of Science in Computer Science (OMSCS) program—tailend as in, I took my last exam yesterday (at the time of writing this). So in the spirit of revitalizing this blog, I’ve decided to unpack my experience completing the program.
Tl;dr: OMSCS has been a good ride; I’m grateful to have had the opportunity to work through it.
My background
Knowledge gaps. My undergrad was not in CS, and my work experience (upon entering the program) was neither in software engineering nor software development. I’d taken two programming classes, one that covered Mathematica and MATLAB for scientific computing and another that used VBA for extending Microsoft Office applications; I’d also used MATLAB and R in a variety of other classes (e.g., differential equations, Markov chains, time series analysis, etc.). But I’d never had a proper CS class.
Similarly, I’d never taken classes on algorithms, data structures, or discrete math. I had self-studied algorithms on my own and I spent the summer before starting the program doing a self-imposed algorithms bootcamp using Tim Roughgarden’s Algorithms Illuminated books—specifically, the first three books:
(I used the fourth book in the series, Algorithms for NP-Hard Problems, as a reference when taking CS 6515—more on that in a later post.)
Even though I’m not a baseball player (or a golfer), we’ll call this: Strike 1.
Programming languages. I entered the program with experience in R, Julia, MATLAB, VBA (π ), Mathematica, some Python (almost all of it from using CVXPY, a domain-specific language for convex optimization / modeling), and some C (based on Zed Shaw’s Learn C the Hard Way materials). Case and point, I was weak on “real” programming languages and paradigms when I applied to the program. Strike 2.
Math and stats. Although I had notable CS-related gaps, I felt confident that I could pick things up as I progressed through the program, in part because I felt good enough about my math and stats background (and I knew I was going to pursue the program’s machine learning track). My undergrad minor was applied math and I’d taken a healthy helping of probability and (mathematical, not particularly applied) statistics courses.1
After finishing my undergrad in 2013, I spent the next six years digging in to convex optimization, statistics, machine learning, information theory, concentration inequalities, algorithmic game theory, some numerical linear algebra and network science. I more-or-less took Mike Jordan’s booklist (see AMA: Michael I Jordan and Learning About Statistical Learning) and ran with it, modulo a few modifications; someday I’ll post my book / article lists, and discuss my ongoing self-study quest.
Between undergrad and OMSCS, I did an independent study with information extractor Stephen Becker focused on “Convex optimization in statistical settings” at the University of Colorado in the fall of 2016. I also attended the inaugural Statistics, Optimization and Machine Learning Seminar, organized by Rafael Frongillo and Stephen, and gave a talk on the bag of little bootstraps.
Work experience. Like I mentioned, I didn’t have proper experience as software developer or software engineer. I’ve spent my working years in finance doing analytic things. I worked for Deloitte for a couple years doing stress testing, credit loss modeling, model risk management, and a variety of other risk-related things. I used VBA regularly and R on occasion.
I left Deloitte in 2015 to work for CoBank, where I continued to do risk-related things but primarily focused on stress testing and credit loss modeling. I used R (almost daily) and also used MATLAB regularly.2
Upon starting the program, I lacked proper software engineering and/or software developing experience.3 Strike 3.
OMSCS background
Here’s a quick take of the OMSCS program:
The OMSCS degree requires 30 hours (10 courses). Students must declare one specialization, which, depending on the specialization, is 15β18 hours (5β6 courses). The remaining 12β15 hours (4β5 courses) are βfreeβ electives and can be any courses offered through the OMSCS program.
Courses
The program offers a variety of courses that map on to four specializations:
- Computational Perception & Robotics,
- Computing Systems,
- Interactive Intelligence, and
- Machine Learning (ML).4
The specializations dictate some of one’s coursework. I followed the ML specialization and took the following classes:
- ISYE 6420: Bayesian Statistics (fall 2019);
- CS 7642: Reinforcement Learning (spring 2020);
- CS 7646: Machine Learning for Trading (summer 2020);
- CS 7638: Artificial Intelligence for Robotics (fall 2020);
- ISYE 6669: Deterministic Optimization (spring 2021);
- CS 7643: Deep Learning (summer 2021);
- CS 7641: Machine Learning (fall 2021);
- CS 7280: Network Science (fall 2021);
- CS 6515: Intro to Graduate Algorithms (spring 2022); and
- CS 6250: Computer Networks (spring 2022).
The majority of my coursework tracks the ML specialization, except for CS 7638 (which falls under Computational Perception & Robotics) and CS 6250 (which maps to Computing Systems)—CS 7638 uses many ML or ML-like techniques, but more on that in a later post.
Costs
Tuition and fees.
All courses were three credit hours and cost $540
—seriously, $180
per
credit hour is a steal! (Compare that to Coursera and EdX and you’ll be stoked;
compare that to an on-campus program and you’ll be ecstatic.)
Fees were $107
(technology fee) and $194
(special institutional fee).
So for a one-course semesters it shook out to $841
and for two-course
semesters it was $1381
.
Books. From the classes I took, it appears that many classes in the program don’t have required textbooks or, when a textbook is required, have a free version available. That said, a couple classes do have required books but most of them are fairly cheap—especially if you take the used-book route.
Time. In my opinion, the most salient cost of the OMSCS program is your time. Sure, there’s a distribution over the amount of time you’ll spend on each course and all that. But I feel fairly confident claiming that regardless of your distributions, you’ll invest / devote / spend (choose your verb wisely) a nontrivial amount of this limited resource to complete the program. To be clear, I do not consider this a negative (nor necessarily a positive) aspect of the program—just a reality.
TAing
I started TAing in the summer of 2020. I was fortunate to be able to TA the class I’d finished during the spring 2020 semester: Reinforcement Learning and Decision Making. I’ve TA’d CS 7642 four times (summer 2020, summer 2021, fall 2021, and spring 2022) and ISYE 6420 once (fall 2020). Like I said here, TAing is an opportunity to simultaneously pay it back and (hopefully) pay it forward, where it is the positive experience that Iβve had in the OMSCS program. In certainly biased, but the TAs make or break many (if not all) of the courses in the program.
Ramblings
Discipline and commitment. For years, I thought of them as synonyms, but there’s an interesting dichotomy between discipline and commitment. With respect to OMSCS, commitment manifested as completing assignments and classes to ultimately complete the program; there wasn’t any “question” about doing that. Discipline on the other hand, came about in the day-to-day process of going through the program, dictating what I should do on a given day. I needed both commitment and discipline, as well as the dance between them to forge ahead.
The big picture. As much as I like being in the weeds and details, I found it immensely helpful to have a plan for OMSCS. My plan changed at various times but updating it as opposed to purely shooting from the hip worked well—receding horizon control in action.
One _______ at a time. I find it useful (arguably necessary) to approach tactical things in small steps—think of short-step or homotopy methods. Whether it’s one course at a time, one week at a time, or one day at time, keeping things a manageable size allowed me to take things that seemed unmanageable in their entirety.
The good. Learning is fun!
- You take interesting courses.
- You meet lots of neat people.
- You get the opportunity to put theory into practice.
- You see how practice highlights or invalidates (aka, suggests an alternative) theory.
- You learn new things.
- You reinforce “old” things / things-learned-by-past-you.
The bad. One of the super cool things about OMSCS is its scale: there are thousands of people in the program from all walks of life! Unfortunately, a program this large (given current technologies and the like) doesn’t lend itself to certain of the perks of an on-campus program. The biggest detriment (in my opinion) is the limited menu of courses. That said, I have no doubt that the online course list will continue to grow and evolve over time.
The ugly. I was definitely a curmudgeon at various throughout the program. Two instances stick out. I was particularly pissy while working on the third project when I took CS 7642 (which has since changed) because my soccer agent was failing to learn anything that resembled the results in the paper that we were supposed to be replicating. Naturally, I later found a pesky bug deep in my code. Classic.
The other time was while taking CS 7643 during a summer semester; our final project was stymied by data-preprocessing bugs, which caused a lot of last-minute (really, “last-week”) work. But thankfully, I was part of a great group (shout-out to Matthew, Pavneet, and Rick!) and we pulled it all together.
Imposter syndrome. Being (digitally) surrounded by smart, competent, motivated people is great. The dual of its positive effects can be feelings of inadequacy. And I had (many) times where I felt dumb; I’d have to remind myself that learning is hard (and I seem to have a high sample complexity—which is less than ideal—so more samples, please). I think it’s totally normal to feel incompetent and inadequate when doing something challenging; although it’s disquieting to feel like that, I think that’s not unusual (and that it’s actually okay if not good).
Recharging. Between work and OMSCS, I felt like I didn’t have a lot of free time, but that’s somewhat dishonest. I didn’t have much free time after I accounted for spending time with my wife (β ), exercising (β ), and engaging in other not-directly-school activities (e.g., reading a “for fun” book, having a movie night, getting enough sleep, and so on). Cliche as it may sound, finding time for “things that make you whole” (or, minimally, move you in the direction of being whole) is key.
I’ve definitely let personal relationship lapse during the program, and I’m hoping to right those wrongs going forward.
Chi sono io? Am I a computer scientist? I don’t know… I wouldn’t really consider myself a computer scientist—certainly not in the traditional sense (not that I can even define what the “traditional sense” means).
That said, I do very much subscribe to Charles Isbell’s view of computing. And to that end, I’d call myself a computationalist or a computer scientist. I think there’s great utility in bringing a computational mindset to other fields (e.g., Fisher’s and Efron’s approach to statistics) and embracing a Stephen Wolfram-esque view that life (and the universe more generally) is computing in action.
Wrapping up
Well, thanks for slogging through that. I hope there were some useful tidbits about the program. In my mind, one’s background (upon entering the program) doesn’t really matter; what does seem to matter is one’s willingness to get in a bit too deep, learn on the fly, and embrace/trust the process. For anyone who’s on the fence: lots of people have done this and you can too.
Next up
… a best-efforts recollection and breakdown of ISYE 6420—put on your best Bayesian hat, aka, your $\widehat{\theta}_\textrm{map}$!
-
Even though it was my minor, I took more applied math courses than finance classes, which was my major—go figure. ↩︎
-
I used MATLAB for convex optimization (portfolio optimization, $\ell_1$-trend filtering, transition matrix calibration, etc.) before CVXR was released. ↩︎
-
Since changing jobs in 2020, I now spend a lot of time programming in Rust as well as writing some in OCaml / ReasonML, and occasionally playing in the Imandra Modeling Language. (Python is our lingua franca at work but not what we use for heavy lifting.) ↩︎
-
The mapping from courses to specializations is not one-to-one but it is onto. ↩︎