My three years at the University of Maryland have come to an end. Without a physical event to demarcate the end of life as a student and the start of my life as a (worker?), I’ve been left with a few ambiguous gray months.

[A graphic of my journey throughout college].

If this isn’t nice, what is? Or, why celebrations are important

It’s important to celebrate the end of university life. There are numerous wellness benefits of “savoring”. By savoring positive events, you gain mindfulness, increase resilience against bad events, gain stronger relationships, and improve your creativity.

Even more important might be the anticipation leading up to the celebration. The few months leading up to graduation is often a period of nervous, optimistic excitement. There’s not very many times in our lifetime where we get to experience this kind of forward-looking well-being - a chance to cement past relationships, figure out what idealized versions of ourselves would like to do, and make optimistic projections about the future.

Now, without that event, I’m trying to do what I can to celebrate. Part of that includes this blog post, as an effort to reflect on my past few years, give myself a pat on the shoulder, and look to the future.

Now without further ado, I’m going to talk about classes I liked and some that I did not. And some professors I liked and some that I did not. And clubs. And so on.

Beware the first year trap


During my first semester at Maryland, I took two CS courses. The first was an introductory programming class by one of the highest rated professors in the department, Fawzi Emad. His lectures were packed with information, the projects were well defined, and the students around me had a general excitement to learn the material. For the first time during that class, I felt that I gained the ability to know exactly what a program was going behind the scenes. I felt liberated. No longer was programming an exercise in tireless debugging and walking along in the dark, guessing at what the language would do at one instance or another. I had felt the light.

In this class, the language was Java. Recently, Maryland has been offering a new introductory sequence in Racket, inspired by the Lisp-driven SICP derivatives from other universities. While languages like Lisp are certainly “cleaner” than the likes of Java, I think that this effort kind of misses the point. Yes, there is meaningless boilerplate that Java forces you to learn - but this meaningless muscle memory doesn’t get in the way of comprehension - if anything, its verbosity gives students a chance to rest and think while programming, in comparison to the powerful density of a Lisp. The purpose of a class like this is to give students the confidence of knowing a language well enough to know what other programs will do without feeling lost, to be able to envision a certain flow and write it up without ambiguity.

For what it’s worth, I haven’t touched Java since freshman year.

The other CS class was a discrete mathematics class, again by one of the highest rated professors in the department, Tom Goldstein. His lectures were less structured since he’d only taught the class once or twice before, but they were still information dense and he knew the material inside out.

The class was also restricted to “honors college” students, which was not so much of a restriction in the sense that many students could still take it (25% of students at Maryland are in the honors college), but that most honors students preferred to take the regular version of the class for fear of a harsher curve. However, with these kinds of classes, professors often give a higher level of trust/respect to the students, which inevitably becomes a self-fulfilling prophecy. It’s also more likely that your fellow classmates will ask higher quality questions during classes and be more willing and able to help you during homework or study sessions.

This first semester made me complacent. “If all my classes are as good as this, I have nothing to fear. No need to look into other avenues of learning. No need to drop out, graduate early, or transfer.” This was a huge mistake. The drop off in quality came insidiously at first, before precipitously dropping by the end of my sophomore year. All the while, I was repeating things like “next semester will be better”, “I just have to get through these bad classes now”, “I just have to take harder classes”.

During my second semester, I took two more CS classes, systems programming and algorithms. These, along with a programming languages class, covered the remainder of the fundamental required classes in CS. Systems programming was a mish-mash of various topics that were rushed through without a large degree of real depth. Algorithms. Algorithms, or CMSC351, is notorious at our school for. Students gradually began the insidious transformation from sincerity to irony. Algorithms

Previous department chairs have readily stated that the best lecturers are reserved for the introductory classes, to give the incoming class a better impesssion of the CS program.

The archetypal “machine-learning” student

Characteristics of a good class

Professors that know the material inside and out, and happily answer your questions. Ones that continuously deliver solid material. Classes where other students are engaged in the material.

Recitations vs. office hours

I’ve had the fortune of having a number of great TAs over the years, including Maxx Cho (mathematics) and Soham De (computer science). Both of these TAs held recitation or discussion sessions where they reviewed the week’s material and practiced problems with us.

During these recitations, they answered any student questions that would have normally been brought up in office hours, but with the benefit of these answers now being visible to the entire class, not just a single person. The very act of being in class also stimulated new questions that I wouldn’t have thought of otherwise.

Right now, classes like Algorithms and Programming Languages have legions of TAs, on the order of 30+ per class. It’s inefficient, ineffective, and lazy to relegate them to “office hours”. Any TA that would be able to provide good “office hours” would be able to provide a good recitation, and benefit infinitely more from teaching a structured recitation each week. Give students responsibility and they’ll surprise you.

Classes that I liked and were worth taking

Object Oriented Programming II (CMSC132) and Discrete Mathematics (CMSC250H). I talked about these classes above.

Databases Architecture (CMSC624). This was a graduate class taught by Daniel Abadi. It was hard and rewarding. Professor Abadi knows his field well, so questions that were brought up in class were immediately and accurately answered. The class was also full of knowledgeable students that were passionate about the material. Databases is not a particularly hot topic (many people consider it a “solved field”). As a result, the students in this class were just a small group of students that really liked databases. Contrast that to the graduate machine learning classes I took, whose classrooms constantly overflowed with students, yet whose conversation never emerged from surface level topics. The issue with engaging in a “hot field” is that you’ll constantly be surrounded by people in it for the “wrong” reasons - those reasons being status, wealth, or just a mimetic draw.

Cognitive Science (PHIL209N). Taught by a philosopher, this class introduced me to a ton of different evidence-based approaches to live as a human being. Not only did we consume vast quantities of papers on topics like sleep, the “brilliance phenomenon”, and willpower, but we also took the additional step of talking about how to apply our learnings to benefit our own lives. I still haven’t found any singular resources that cover the same array of topics that this class does. This is the only class that, to this day, I still look back on the notes for.

Public Speaking (INAG110). This is a pretty standard undergraduate class. I took it under the agricultural school, which is generally considered to offer an easier version of the class. My professor was Rob Ballenger. While he did recognize that most students were taking this class for an “easy-A”, he still respected the class, so the students did too. We learned about the basics of public speaking and put them into practice multiple times over the semester. I’ve certainly forgotten the exact principles that I learned in this class, but like a good book, I’ve experienced them and they’ve become a part of me.

Classes I wished I had taken

While writing this, I struggled with whether or not I should keep this section in the post. Someone who doesn’t have experience with something is more likely to speak about their idealized version of that thing than


People say to focus.

I tried to “focus” to make room for harder classes. I went from exploring different things, signing up for things for the heck of it, to stripping away anything that wasn’t “necessary” for building up my portfolio of accomplishments.

During my freshman year I did things like:

  • Signing up to becoming the filmmaker for my honors program. This took a lot of time, but was also a really fun way to connect with other people and bring some creativity into my life.
  • Help organize the VR club, volunteering for various events, attending weekly meetings, etc.
  • Help organize Bitcamp, attending weekly meetings, meeting the Bitcamp family, set up travel for students.

I dropped these things because they covered such a disparate array of interests and took so much time. In pursuing “focus”, I lost sight of the big picture. I lost out on the incidental connections, the feeling of giving back to the community, the responsibility of organizing/managing, the creative outlets of random interests. I lost out on the fun.

A comment on gen-eds

It often feels like professors have been forced to push their knowledge through a narrow hole of static “general-education” requirements imposed by the administration.

Some of these requirements include:

The current general education system at Maryland has four components:

  • “Basic” classes to help you with your career (basic english, technical writing, public speaking, mathematics)
  • Taking a variety of classes across natural sciences, history, “humanities”, and “scholarship in practice”. It’s worth noting that only “scholarship in practice” has any

Classes every CS student should consider taking

CMSC828M: Applied Mechanism Design for Social Good Mechanism design/auction theory is both highly relevant in the real world, as well as relatively unknown by most of the CS student population. Most univerisities don’t have a class like this. As a result, it’s a highly valuable skill to understand the basics of mechanism design.

The lectures can be somewhat difficult to understand if you don’t have a background in algorithmic game theory, so I would highly recommend getting a head start on the material in the books, and rigorously reading before and after class.

From Dan Luu, “Why should you care? Some of the world’s biggest tech companies run on ad revenue, and those ads are sold through auctions. This field explains how and why they work. Additionally, this material is useful any time you’re trying to figure out how to design systems that allocate resources effectively.1

In particular, incentive compatible mechanism design (roughly, how to create systems that provide globally optimal outcomes when people behave in their own selfish best interest) should be required reading for anyone who designs internal incentive systems at companies. If you’ve ever worked at a large company that “gets” this and one that doesn’t, you’ll see that the company that doesn’t get it has giant piles of money that are basically being lit on fire because the people who set up incentives created systems that are hugely wasteful. This field gives you the background to understand what sorts of mechanisms give you what sorts of outcomes; reading case studies gives you a very long (and entertaining) list of mistakes that can cost millions or even billions of dollars.”

CMSC624: Database Systems Architecture No matter what career path you decide on, you will almost certainly use the system design lessons you learn in this class. If you ever work on backend systems or infrastructure, you’ll benefit a lot from the database principles you learn in the first half of the class. If you ever engage in systems design (which is also asked in ~50% of new grad interviews), the latter half of this class will also prove highly useful. In this class, you engage in a seminar type discussion where one team of students presents the material, and Professor Abadi as well as the class asks questoins to an “expert panel” of students who have also pre-studied the paper. Not only do you learn about a lot of real-world systems like Spanner, Aurora, and Calvin, but you also get experience with critically reviewing papers, figuring out what details have been left out, what design decisions were good/bad, and learning from an expert in the field.

Classes that you should supplement

Operating Systems

Machine Learning This is an extremely hit-or-miss class at UMD, depending on who’s teaching. However, since the professors for this class change so often, the curriculum/TAs never has time to build up. That, combined with the speed with which the field of ML has been changing, makes it so that ML classes at Maryland are often not as well-designed as other classes.

I’d highly recommend taking a class like CS189 from Berkeley to substitute for or supplement an ML class at Maryland.

What classes not to take

  • Don’t take classes with poorly rated professors
  • Don’t take classes with poorly defined projects. Some people say that these classes prepare them for the ambiguity of real world projects. I don’t buy that. First, most real world projects don’t give you some obscure documentation that you have to work through. New grad tasks at big companies are usually short and well-defined, while new grad tasks at startups are either the former or self-defined. Second, there is not much learnability
  • “Joke” classes. There’s a well established set of classes that both the professors and students don’t take seriously. There is a serious difference between a schedule that has 0 joke classes and a schedule that has even 1 of these classes.
  • Don’t take new classes with professors with unknown reputations (audit them first)
  • Don’t take CS classes from other departments. Taking CS class equivalents from CE, STAT, INFOSCI, etc. is usually not a good idea. This is because the material is targeted at students with a different background than yours. So the pure CS concepts may be watered down, and you may also have to work hard to catch up on necessary background material.
  • If you’re me, don’t take morning classes


History of CS at Maryland

In my mind, it is incredibly worthwhile to learn about how the computer science department was founded. Computer science is a rare field in that its creation came less than a century past. Compared to fields like mathematics, physics, or biology, which have been around for millenia, computer science is a baby. What this means is that you can easily trace things from the inception of computer science to why things are the way they are now. Having this context is incredibly useful. BY knowing these things, you can know which decisions have been arbitrary, which were applicable in the past but not applicable now, and which mistakes to not repeat. There is also the benefit of still being able to interface with some of the early figures in the field - letting you learn about some of the history and original motivations from them. But furthermore, having these early figures still be around, means that you can read about their actions and motivations in history in order to be able to understand what they’re doing now / predict what they’ll be doing in the future.

A history like this is an invaluable map into how and why things are the way they are at UMD, and trying to navigate without having the context and appreciation of the personalities and decisions that have shaped the now is like trying to navigate in the darkness without a light. If you want to appreciate things (to learn more, to be happier), if you want to change things, if you want to figure out what should change and what shouldn’t, if you want to create new things, if you want to figure out who to ally with and who to not, you must know the history.

Being able to see how things went wrong in the past (e.g when they couldn’t purchase computers without the permission of the state of Maryland) helps us avoid making the same mistakes in the future.

History of Computer Science at Maryland by Jack Minker

From the first chair of the CS department at Maryland (1973), this retelling of the early years is an entertaining read that takes you through the very first years of Maryland CS and how things came to be. You’ll be surprised to read about many professors that are still around that happened to be there since the inception of the department. You’ll also see how a lot of decisions that were made at the very beginning of the department’s creation (sometimes for arbitrary reasons), have remained almost untouched up to today.

Take for example, this passage.

Passage about establishment of CS undergrad program in 1973

From the day that the CS undergrad curriculum was created, these requirements have gone virtually unchanged. Today, we still have two freshman-level courses, CMSC131 and CMSC132, where CMSC131 can be skipped if you’ve programmed in high school. And the bulk of your required classes are still in the 400 levels, where you have to take 5 classes.

Differences are that we now have four additional required classes, being discrete mathematics (CMSC250) systems (CMSC216), programming languages (CMSC330), and algorithms (CMSC351), pushing the number of required 400-level classes to just 5.

Also talks about

  • The first CS research labs and their leaders at Maryland - their contributions to the field
    • Numerical Analysis
    • Vision
      • Azriel Rosenfeld, led famous vision lab and author of first textbook on vision
    • Information Retrieval and AI
    • Systems
      • Ashok Agrawala, still teaching at Maryland!
    • Programming Languages
      • Marvin Zelkowitz created the PLUM lab, still at Maryland

Creation of the center

In the 1950s, computers became available for public purchase for the first time. For context, there were roughly 1000 commercially installed computers in the world in the mid-1950s, most being massive mainframe computers. Programming was done on punch cards, and one of the most popular languages was Fortran. Computer users fell into two categories: those who wanted to do more intensive scientific computation (e.g seismic processing, reservoir modeling), and those who wanted to create business processing.

As mainframe computers grew in popularity, universities began to see the value in teaching programming skills and potentially buying a computer for research. By 1959, there were two classes at Maryland related to computing: MATH156 Programming for High Speed Computers and EE131 Digital Computers. In 1959, the President of UMD asks the state for funding to build a Computer Center. Note that the proposal was for a center, not a department, of computer science. The plan was to have a building with one or two mainframe computers that professors could use for research and teaching programming classes. There would also be some faculty hired to manage the center, maintain the computer, and do independent research into the computer itself (most researchers would instead be using the computer to do data processing). By the end of the year, funding is approved.

In 1962, the director of the Computer Center, Werner Rheinboldt is hired. A handful of lecturers and programmers are hired for the center. And the building 1 for the Computer Center finishes construction. The Computer Center is officially open for business 2.

the Atlantic Building. Floors were incrementally added over time to support unplanned capacity - resulting in what today’s students now call a maze. Today, the building houses Maryland’s Quantum Computing labs.

In 1964, just two years after he arrived as director of the Computer Center, Rheinboldt expressed interest in turning the Center into a full blown department of Computer Science. He asked one of the faculty of the Center, Dr. Schweppe, to write a proposal outlining the projected costs of such a department - $196,022. The proposal was sent to the VP of Academic Affairs, Dr. Hornbake, who told him that the proposal had to be sent to a university Senate Committee (composed of faculty and students), and then sent to the Board of Regents (a set of professionals chosen by the governor, mostly current or former business executives) for approval. Nothing more came of this attempt.

The center is a hit

In 1965, Rheinboldt resigns to get back to doing research and Professor Atchison takes over as director of the center. At the same time, the center begins offering informal classes in computer programmng.

By 1967, there are ~1000 users of the Computer Center around the university. Every day, groups of students and researchers meticulously write their Fortran, Cobal, or Algol programs onto IBM punchcards the size of a hand, and hand deliver them for inspection to department personnel. Once “verified” for correctness, the punchcards are sent off to the Computer Center and fed in to one of the Center’s several IBM mainframe computers for computation. The most avid users of the Center come from the University’s Physics and Astronomy departments.

By the end of 1967, a UNIVAC 1108 arrives - the first computer on campus capable of timesharing. With timesharing built in, students and faculty can now access the UNIVAC from anywhere on campus with a remote terminal built in. Here, “terminals” refer to what were essentially electromechanical typewriters 3 attached to the UNIVAC through telephone cable. Instead of having to deliver punch cards by hand, feed them into the machine one by one, wait overnight, and then go to the center to receive the printed results (or have someone send them), programmers could now write their programs, send them from the comfort of their department building, and receive output “immediately” from the typewriter. Five of these terminals were built, including three in the Physics, Electrical Engineering, Biology buildings.

fortran punch card

Creating a department

In 1971, as the Computer Center continued to offer more and more classes and computing services, a university committee was formed to discuss a reorganizing the Computer Center. Director Atchison writes to the committee that a separate school of Computer Science would be the best course of action.


The committee reads the letter and concludes that the educational/research aspects of the Center should be separated from the servicing function Center. However, instead of creating a whole new school of computer science, they instead create a department of computer science, nested in the mathematics, physical sciences, and engineering department (MPSE) 4.

called Natural Sciences (NS) to account for the absorption of the Biology department, and Computer Science (C) earns its own initial.

In 1973, the Department of Computer Science was offically created and recognized by the university. Center Director Atchison, Professor Rheinboldt (former Director), and Professor Minker (writer of the earlier report that details much of this history), created a plan for how the Department would be separated from the Center.

  1. They need to create committee to find a department chairman.
  2. Faculty members should have dual appointments in the Center and Department (to maintain close ties).
  3. The Department will initally share the same space as the Center, in the same building (kicking out some administration to make room for new offices).

Interestingly, the Department did not allow for “Research Professors”. Research Professors Azriel Rosenfeld and Rheinboldt had to stay in the Center.

They also established five field committees on information processing, numerical analysis, programming languages, systems, and theory, who would each be responsible for their area’s classes.

Building the research department

In 1974, the head of MPSE (CMNS) chose Minker as the chair of the department (moreso because the two other candidates had withdrew). As chair, Minker wanted to do two things:

Build a strong research program

Because of all the administrative work that creating the new department entailed, professors had little time to do research and their productivity suffered. To address this, Minker told all the professors that promotions would not be given for administrative work and teaching. Instead, promotions would be given to those who perform research (and teaching). This incentive scheme explains why many professors at Maryland today don’t put effort into their classes.

Research productivity went up, resulting in a ranking at #12 in 1982 ranking of top CS PhD programs in America by the National Academy of Science. This ranking has largely stayed constant since then.

Create a structured education system

Too many students

By the fall semester of 1974, there were 20 professors and 150 entering undergraduates in the department. By 1979, when there were now undergraduates in every grade level, there were 625 undergraduates. But only one professor was hired from 1974-1979. This was a student to faculty ratio of 32:1 5, way too much too handle.

Why were there no additional professors were hired during this time? Because some departments in MPSE (CMNS) were rated lowly (in research productivity), so the university administration cut the number of faculty positions for all of MPSE (CMNS). This is one of the problems with being a department, not a school - your faculty positions are drawn from an overall pool, influenced by other departments - making it difficult to scale with your own needs and performance. One solution could be to simply not have a school-wide pool and have pools be by department, but this makes it “harder” to have a hierarchy of oversight, pushing one person to be responsible for weighing all department needs together, instead of the head of the administration handling school needs, and school provosts handling departmental needs.

The past and present show the university administration don’t care about the needs of the undergraduate student. And because of this cemented lack of care, professors are hard-presseed to change the status quo. Furthermore, since professors are incentived to do research, those who would want to teach well or lobby for more resources are met with the prospect of career failure. This results in a self perpetuating cycle where education and “service” at Maryland continues to decline, while research remains relatively high - attracting professors to Maryland because of its research reputation and little else - resulting in very few professors that would take action to build a better student experience.

Honors Program

One thing Minker did to improve the undergraduate program was to establish an departmental honors program6, for students who had a 3.5+ GPA, finished 3 of their 400 levels, and would work with a faculty mentor to write a research paper.

Beef with Info Sci

Messy Labs. Here’s the history. AKA WTF is UMIACS?

Remote instruction

Cycle of undergrads AKA This already happened and we already tried to solve it

Visual comprehensive diagram of the eras.

More context

Timeline of CS department
Video timeline of professors getting hired, with events of world, CS, and UMD on the side
This is an organized timeline to help you chronologically order the creation of the department.

In order to get context into all of this history, I would highly recommend reading The Dream Machine, by Mitchell Waldrop. This is an incredibly helpful book for learning about the history of personal computing.

Meta note

Researching for this post was incredibly fun. I was mostly reading for personal interest before having the idea to turn this into a post for others to read as well. I got to read reports and essays from important figures in the university’s history, dig through old Maryland yearbooks and student newspaper issues to find pictures and articles of the student life at the time, look through various computer catalogs, and so on. It was really amazing how rich the student newspapers were with what was going on at the time (and what people thought). Looking at catalogs and marketing material of early computers was also an awesome way to see how certain products evolved over time, and the justification provided by the companies for why innovations were worthwhile to the end user.

Interestingly, I found it much harder in comparison to find information on various professors and faculty responsible for the early history of the computer science department. Nowadays, when I search up an asssistant professor in their 30s-40s on Google, I’ll find countless links to their personal websites, CVs, biographies, class websites, seminar videos, and other such digitalizations of their lives. I took for granted just how much digital notarization as a default mode has contributed to a persistent and accessible record of people and their lives on the internet. I assumed that most information that wasn’t originally created on the internet would still eventually be digitalized, like the student newspaper, or a handful of seminal papers that I’ve read for class. But I was mistaken - the vast majority of professors I looked up had nearly 0 results on the internet - leaving me completely in the dark about who they were and what they did. I associated this loss of information more with

Respecting the institution

Sometimes it feels as if the professors and administration themselves don’t respect UMD. As a result, they look down on the students, which in turn makes the students not respect the classes or each other.

Take MIT for instance.

I’ve talked to several professors and previous members of the administration about this. Their argument goes as follows. Some public examples include Kruskal.

This is the result of that.

This is how I would fix it.

Happy memories

Most of this blog post has been either negative or neutral. There’s a lot of things I would have changed and hope others can learn from my lessons. However, I don’t want to give the impression that I didn’t have a lot of happy memories. I’d like to share a few of the work-safe ones with you here!

And with that, thank you fellow Maryland-ers for taking the time to hear my thoughts, and best of luck with the rest of your time as a student. And thank you Maryland, for the happy memories.

  1. This building was renamed to the Computer and Space sciences building, and then recently renamed in the 2010s to 

  2. Literally - in a few years, they begin charging other departments ~$10-300/hr for using an IBM-7094 computer. 

  3. Only in the late 1960s, did graphical terminals with video screens, like the UNIVAC UNISCOPE 300 become commercially available. These terminals allowed for more interactivity in computing, like being able to edit programs instead of rewriting them from scratch. The earliest of these types of terminals had no microprocessors, so every key typed had to wait for the mainframe to process it, before shipping the appropriate letter back to the terminal. Later terminals added microprocessors with burned in text-editor programs, so that users could type up text locally, before pressing a button to ship the whole block of text to the mainframe computer. univac ad 

  4. Today, MPSE is now CMNS. Engineering (E) has split off into a separate school, Physical Sciences (PS) is now 

  5. Today (as of 2019), Maryland’s ratio is even worse, 58:1. By contrast, MIT’s is 12:1 and CMU’s is 4:1. 

  6. Still around today.