I applied to Georgia Tech’s Online Master of Science in Computer Science (OMSCS) program back in September 2015. One of my friends was applying and encouraged me to apply as well. So I did, not really knowing what I was getting myself in to. I was accepted and took my first class, Software Development Process in Spring 2016 – right as I was moving out to California. Now, three and a half years later, it’s over. I’ve graduated and completed the Computing Systems specialization while working full time! Now I want to take the time to look back and reflect on my experiences in the program.
Why Enroll in OMSCS?
Many folks enroll in the OMSCS program to open doors. Some seek to transition into software engineering. Others are looking to further specialize (e.g. in machine learning). For me, I was already working as a software engineer so enrolling was less of a practical decision and mostly for my own self-fulfillment.
I added my Computer Science major pretty late in the game during undergrad, so there were a number of classes that I had wanted to take, but just never got to. OMSCS provided the opportunity to shore up my knowledge in some of these areas and get a master’s degree without having to give up my job. So the opportunity cost was low and the monetary cost was surprisingly affordable – just $811 a semester! All I gave up was my nights and weekends for three years. 😊
Seriously, though. The program is an amazing deal and the flexibility of the program is unparalleled. I was able to read some of the papers for HPC on a black sand beach in Waipiʻo Valley, after all (check out the cover image)! 🏄♂️
How I Selected Courses
In 2016 I had just started a new job in San Francisco and I wanted to focus most of my energy on it. So for those first few semesters, I chose courses based on their workload (as recorded on OMSCentral) instead of by my interests and what I hoped to get out of them. This was probably my biggest mistake. Courses like Software Development Process and Network Security are fine. I mean I did learn some stuff from them, but they just felt like an extension of undergrad – if not easier.
As I got settled in at my new job, however, I began to challenge myself more with the program and that’s how I discovered some of my favorite classes. I thought harder about what I hoped to get out of my degree, and came up with two learning goals.
I wanted more depth in the area of systems programming. I work with distributed systems daily and it’s definitely an area that interests me, so choosing the Computing Systems specialization was a no-brainer for me. I wanted more breadth and to explore some areas outside my comfort zone. For me, this meant taking coursework in machine learning and AI as electives. To come up with an effective course plan to meet these goals I turned to the OMSCS Slack and OMSCentral reviews. However, this time instead of looking for low workload courses I filtered by user rating. Of the ten courses I completed, the following left the greatest mark on me.
Graduate Intro to Operating Systems
Graduate Intro to Operating Systems (CS 6200) was the first class that truly made me feel like a student again. I got to write C for the first time in years and implement my own concurrent webserver using low-level network primitives. The teaching staff was highly engaged and the class Slack workspace felt reminiscent of The Mine at Indiana University (a Linux computer lab home to a bunch of regulars). I wrote more about my experiences in this class previously here.
Machine Learning
Coming from a non-data science background, I found the pace of Machine Learning (CS 7641) to be pretty intense. This course is a whirlwind tour through various machine learning topics such as supervised learning, unsupervised learning, non-deterministic optimization, and a bit of reinforcement learning. Every three to four weeks you experiment with a couple datasets (of your choosing) and write up a 10-12 page analysis describing the results and techniques you used. If that sounds like a lot of work it’s because it is, but fortunately, the professor allows you to use any libraries/code you want*.
I found this course valuable on two counts. First, it introduces you to Professor Isbell, one of the key faculty behind the program and the Dean of the Georgia Tech College of Computing. He would occasionally drop in on Slack and chat with us. And two, I got exactly what I wanted out of the course. Although I’m far from qualified to be a machine learning engineer or data scientist, this course demystified the field for me and I now understand what folks are talking about when they mention neural networks, reinforcement learning, etc. I wrote more about my experiences in this class previously here.
Intro to High Performance Computing
Intro to High Performance Computing (CSE 6220) was hands down my favorite class in the program. Although the exams were pretty brutal (covering parallel algorithms), the material, projects, and Professor Vuduc were a delight. We were given access to one of the school’s supercomputing clusters and had some really interesting parallel computing labs that were graded on a combination of correctness and speed. Although the course has one of the highest difficulty/workload ratings on OMSCentral, it also has some of the most positive reviews.
I blogged a bit on one of the algorithms we studied in the course, but didn’t get a chance to write up anything more. It was a great course, though, and it provided exposure to a field (HPC) that I wouldn’t have gotten otherwise. I cannot recommend this course enough.
Graduate Algorithms
The final course I took during the Summer 2019 semester was Graduate Algorithms (CS 6515) and I have a bit of a love-hate relationship with it.
Let’s start with the positive. The recorded lectures by Professor Vigoda were really well done and the textbook, Algorithms (DPV), was surprisingly approachable. I learned a ton about dynamic programming, linear programming, and graph algorithms. And for the first time, I really feel like I got the concept of P vs NP. Although I took an algorithms course in undergrad, I feel like I learned a lot more from this one.
Now for the downsides. I feel like the course was way more stressful and ulcer-inducing than it needed to be. During the Summer semester, 90% of our grade came from just three exams. Each exam had two long-form questions worth 40% apiece and a handful of multiple-choice comprised the remaining 20%. The grading felt pretty subjective at times and messing up just a single question could cost you almost a letter grade in the class. Since most specializations require a B or higher in the course you can see how this could get stressful.
I ended up supplementing the Georgia Tech lectures with content from MIT’s 6.046j Design and Analysis of Algorithms course and Tim Roughgarden’s lectures on YouTube. To help reinforce what I was learning I also wrote a few blog posts to explain the material in my own words. I essentially dedicated my entire summer to this course and I am so glad to be done. 😔
How to Succeed In OMSCS
Disclaimer: This approach worked for me, but everyone’s circumstances are different. Take this all with a grain of salt.
Stay active on Piazza and Slack
All courses have a Piazza forum that serves as the official method of communication between the instructors and students. Subscribe to email summaries and check in every now and then so that you don’t miss anything important. Most classes also have Slack workspaces (or channels) associated with them. I’ve found these to be pretty helpful for staying motivated and getting to know your fellow classmates. There can be a lot of noise from both of these, however, so you gotta get good at filtering that out at times.
Watch the Lectures and do the Readings
This one should be pretty obvious, but it’s important to stay current with the lectures on Udacity. I would download the .mp4
files from Udacity and put them on my cheap Kindle Fire tablet to watch during long BART rides. Then, when it comes closer to exam time, I would rewatch at a higher speed to refresh.
Most courses also have an assigned textbook or papers to read. In some classes doing these readings isn’t absolutely critical to pass, but if you’re here to get the most out of your degree I’d recommend keeping up with these as well.
Put in the Time
Last, but not least, you have to be prepared to put in the necessary time. Although some classes have lighter workloads than others, none can be completely breezed through. If you’re working full time you’ll have to be prepared to put in some nights and weekends to get projects done on time and to prepare for the exams.
Was It Worth It?
I’d say so. Especially now that I’m done! 😉
I really enjoyed my time in the program (apart from the last 9 weeks or so of Graduate Algorithms) and I feel like it has helped me grow as a software engineer. In fact, I can’t get enough. This Fall I’ll be taking a victory lap and will take Advanced Operating Systems as a non-degree seeking student to get some more of that sweet sweet distributed systems knowledge. 🙃
Cheers!