How I Learned to Stop Worrying and Love the Bell Curve
About 20 years ago, I had the chance to visit NUS. I attended a summer school organized by an English center back in Vietnam. To this day, it still leaves a strong impression on me. That was the first time I set foot in a university, and strangely enough, it was not even a school in my home country. I remember walking through the campus, not fully understanding what university life meant, but sensing that something important happened in places like this.
Twenty years later, I found myself back at NUS, this time as a student.
The path there was not straightforward. I gave up on an academic career early on. I wanted to work on practical problems, to build things that people actually use. I joined an ML startup and learned a lot - how to ship models, how to deal with messy data, how to work under pressure. But the field moves fast. New architectures, new techniques, new papers every week. At some point, I realized that without solid fundamentals, I was just chasing trends. I needed to go back to the basics to move forward.
So I applied to NUS, got accepted, and started my part-time Master’s while working full-time.
What followed were two years of juggling deadlines, battling exhaustion, and learning more than I expected - about machine learning, about distributed systems, and about myself.
The Bell Curve
The bell curve was something entirely new to me.
In Vietnam, we don’t have such a grading mechanism. Most of the time, you can game the system by enrolling in easy courses, coasting through with minimal effort, and walking away with decent grades. The incentive structure rewards playing it safe.
At NUS, it’s the opposite. Grades are curved relative to your cohort. If you take an easy course, you’re competing against everyone else who also thought it was easy. If you take a hard course, you’re often surrounded by people who underestimated the workload or overestimated their preparation.
I discovered this the hard way. Courses I thought would be easy A+s? I ended up with B+/A- due to minor mistakes in assignments or midterms. The competition was fierce, and small errors compounded.
But here’s the twist: I got my highest grades in the hardest courses.
My A+ came from Graph Machine Learning, notoriously one of the most difficult courses in the School of Computing. The workload was intense, the material was dense, and the pace was relentless. But I thrived. Maybe because I genuinely enjoyed the challenge. Maybe because difficult courses filter out those who aren’t fully committed. Or maybe the bell curve god was simply kind to me.
Whatever the reason, NUS taught me to stop fearing difficult courses. The bell curve punishes complacency, but it rewards those who lean into the struggle.
The Challenges
Balancing work and study is no joke. Anyone who tells you a part-time Master’s is “manageable” has either never done it, or has a very different definition of manageable.
My first semester set the tone. I had to attend the RecSys conference, then caught COVID just two days in. At the same time, I had a midterm for Deep Learning with zero preparation. I took the exam while still recovering and did poorly.
I redeemed myself with subsequent assignments, but by the end of that semester, I was already running on fumes.
Then work got intense. I was assigned to redesign the Multisearch architecture - a critical project that demanded my full attention. It was challenging, exciting, and fun in the way that high-stakes engineering problems can be. But combined with coursework, my stress level went through the roof.
On top of all this, there was the knowledge gap.
There was a huge gap between what I studied in my bachelor’s program and what NUS professors expected, especially for math-heavy ML courses. I spent a lot of time catching up on prerequisites I never had.
It was humbling. It was exhausting. But it was also necessary.
The Courses
I took 10 courses over two years. Here’s my take on each, ordered by how vividly I remember them.
Graph Machine Learning - 5/5
Challenging and fun. I learned a lot of new stuff, from spectral analysis to graph neural networks. This course definitely expanded my knowledge horizon. Be warned though: the pace accelerates exponentially toward the end, so be prepared.
Reading the professor’s Jupyter notebooks was extra fun - most of them are directly translated from Matlab. You can tell.
Knowledge Discovery and Data Mining & Text Mining - 5/5
Both taught by Prof Christian von der Weth. Both are high quality.
The assignments, midterms, finals, and projects are all well-designed and fun to do. Lectures move at a reasonable pace. I particularly enjoyed the midterms since they actually tested understanding of the subject, not just memorization. Got A/A+ for the projects in both courses.
AI Planning and Decision Making - 4/5
The content covers the second half of the famous AI textbook, which has become very relevant today with the rise of RLHF and other reinforcement learning techniques. Planning techniques are briefly mentioned; the focus is definitely on RL.
I liked the homework exercises a lot. They helped strengthen my understanding, especially for topics like dynamic programming.
Not the course’s fault, but I wish I had had more time spending on the materials.
Distributed Systems - 4/5
I love the content. I hate the final.
I didn’t understand half of what was on the final exam. Some questions were completely out of scope, and I still wonder what the purpose was. 4/5 for the course material, 1/5 for the final.
At least I got solid foundations in distributed computing, which turned out to be quite applicable to my work. I was moving from research engineer to more of an AI full-stack role. For this course, I learned Java to develop a multiplayer game and implemented some distributed mechanisms for real-time interaction.
Neural Networks and Deep Learning - 3/5
I’d rather have traded this one for Machine Learning Systems.
The pacing was odd. Early lectures went very slowly, and the professor sometimes wandered into irrelevant topics (mostly his own research). Then after the midterm, everything was rushed.
I got a pretty good grade (A), but I still felt the time attending lectures was wasted. Assignments and mini-projects were good though. Also met new friends (virtually).
Big Data Systems for Data Science - 4/5
Light workload, practical content. The usual tech for large-scale data is covered: the good old MapReduce, then Spark. The second half on distributed techniques (mostly Spark’s checkpoint mechanisms) was new to me.
Uncertainty Modelling in AI - 4/5
One could call it Bayesian Machine Learning. The final was brutal. I think the bell curve god helped me here.
Most assignments are classical machine learning problems - reimplementing algorithms taught in lectures. The slides are full of formulas, and don’t expect the professor to explain them in detail. The lectures are long as well, starting at 6:30 PM and usually ending around 9:15 – 9:30 PM. Combined with commute time (about an hour each way), I was exhausted after attending.
Luckily, the professor shares his lectures on YouTube, which turned out really convenient for warming up before class.
Cloud Computing - 3/5
The lightest workload of all courses. However, I was too careless and got a lot of wrong answers on the final, which tanked my grade.
The project was fun though. We proposed a SaaS to recommend sports based on different signals like availability, weather conditions, and so on. It also provided a booking service to help users pair with others or share courts.
Computer System Performance Analysis - 4/5
Fun course with light workload. I had a chance to learn about queueing theory and got hands-on experience with low-level optimization for matrix multiplication.
Even the theoretical parts (performance analysis and queueing theory), this course is really practical. I would recommend it to anyone serious about software development and being performance-aware.
The Road Not Taken
The program limits you to 10 courses. Between that and schedule conflicts, I had to leave some interesting ones behind. Here’s my list of regrets.
Machine Learning Systems - I was excited when this course was announced, but I had already graduated by the time it started. Timing is cruel. The professor seems generous though, publishing all the materials online. I’ll be going through them on my own time.
Simulation and Modelling Techniques - A combination of simulation techniques and distributed systems. The kind of course that makes you want to build things just to watch them break in interesting ways.
Trustworthy Machine Learning - Given how ML systems are deployed today, this feels less like an elective and more like a moral obligation.
Advanced Computer Animation - In another parallel universe, I would be a game developer. This course belongs to that timeline.
3D Computer Vision - SLAM, VR, AR, self-driving. Ten years ago, this was my dream. Life took a different turn, but the fascination never left.
Algorithms at Scale - I heard this course is legendary. The joy of learning algorithms in me never perishes. Maybe one day I’ll audit it just for fun.
Tips, Tricks, or Whatever
A few things I learned along the way.
Always attend the lectures. Even if they’re boring (rare, but it happens). At the very least, it forces you to engage with the material on a schedule. Self-discipline is hard; showing up is easier.
Work with different classmates for each course. More networking, more experience working with different people. Yes, you risk getting a lower grade if the collaboration doesn’t go well. Worth it anyway.
Enroll in difficult courses. Those that people complain about the workload? Those are the ones where I usually got high grades (A-, A). Maybe because I like challenges. Or maybe because I’ve stopped caring about grades and just want to learn things that intrigue me, regardless of difficulty.
The bell curve rewards those who show up for the hard stuff.