NUS CS Course Reviews Part 1
- Chong Chin Herng
- Jul 13, 2024
- 9 min read
Updated: Aug 9, 2024
Getting closer towards the end of the AY23/24 summer break, we can't help but to start planning the courses we will take in the upcoming semesters. I have been doing that for quite a while and let's just say it has been a frustrating journey - might be worth another blog entry. Recently, I have been getting requests from my past students to share my reviews on the CS courses I have taken. I see this not just as an opportunity to help my students make more informed choices, but also a motivation to kick-start my blog-writing in the website.
So far, I have cleared all the CS Foundation Courses. It turns out that these are exactly the list of CS courses I have cleared so far, no more no less. I was exempted from CS1101S. Not the wisest thing to do - worth a blog entry about this.
Update: I have so far written three reviews and have found the blog to be a bit lengthy. This blog will be part 1.
CS1231S Discrete Structures
I took this in AY22/23 Sem 1 under Prof. Aaron Tan Tuck Choy and Leong Hon Wai. My final grade is A.
Tutorial Attendance (5%)
2 Assignments (20%)
Midterm (25%)
Finals (50%)
I have a lot to say about this because well, I am a tutor of the course and I do enjoy mathematics. Let me emphasize that this is a CS-coded course that is covering mathematics. There will be no programming involved. This course precludes MA1100 Basic Discrete Mathematics. Both courses cover discrete mathematics. CS1231S ends with a touch of graph theory, a specific topic of relevance to computer science, while MA1100 covered number theory instead of graph theory.
In some other universities, the corresponding course would be named something like "Introductory Proof Writing". Proof writing is almost the core learning outcome from CS1231S. More broadly speaking, CS1231S is helping us develop mathematical maturity. Most topics covered in the course are applicable to almost every field of mathematics. This means two things:
Almost every other field of mathematics is built on top of the topics covered in the course.
The framework we applied to study CS1231S can also be applied to study any other field of mathematics.
Content Difficulty: 5/10. Students like me who have experience in mathematical olympiads will be advantageous due to the excessive exposure to mathematical thinking. Most contents are intuitive to grasp. Being a course aimed at developing mathematical maturity, its actual difficulty lies on proof writing. One recurring theme of the course is to provide justifications to very obvious statements. Consequently, developing the right intuitions and being able to understand the material well is insufficient to do well in the exam.
Workload: 7/10. 3 hour weekly lectures and 2 hours of tutorial. Students are expected to attempt the tutorial sheet prior to the tutorial class. The difficulty of the tutorial question ranges from trivial to famously difficult. The former is to check our understandings of the contents in the lecture. The latter is for us to appreciate the wide applicability and thus the beauty of the contents. They typically take a while to finish.
There is an assignment in the middle of the semester and another one towards the end of the semester. Officially™, no collaboration is allowed. The questions are moderately difficult. I have had students who spent an entire weekend on them and were still unable to finish them.
Profs: 10/10. Prof. Aaron is easily the most engaging prof in the faculty. He would share about his life by putting pictures on his lecture slides and do April Fools' pranks on his students. I mean, what is more to expect? Fun fact is that he also teaches SOCT101, a compulsory online workshop for all SoC tutors. It just seems like he knows everything about teaching.
Prof. Leong is not bad. yea.
Assessment. Let me emphasize once again that developing the right intuitions and being able to understand the material well is insufficient to do well in the exam. The exams consist of MCQs and structured questions. The MCQs are there to test our intuitions, and hence are designed to be not as straightforward. The structured questions are where the proof writing comes into play. In general, do not expect to finish all questions. Attempt easy questions and leave the difficult ones for later. Lastly, "this statement is intuitively true/false but I don't know how to prove" is a good sign! Write down some steps you think are important to earn some partial marks. These are the marks you won because you understood the contents. With that said, proof writing is still essential to get good grades and can be practiced by experience (a.k.a. doing past years papers).
Relatively more time is allocated for assignments, so do actually spend the time to refine it until you think it is flawless. Correspondingly, they will be graded more strictly compared to the exams.
If you didn't do well in the exams due to time constraints/unable to formulate your intuitions in a proof/stupid mistakes, give yourself a pat in the back. None of the reasons above is directly related to your actual understanding of the contents. This is so important I am going to reemphasize this somewhere in a more prominent location.
CS2030S Programming Methodology II
I took this in AY22/23 Sem 1 under Prof. Adi Yoga Sidi Prabawa. My final grade is A.
Diagnostic Quizzes (5%)
PE1 (10%)
Midterm (10%)
PE2 (20%)
Final (25%)
Labs (30% + 4%)
Fun fact is that I attended my first ever lecture in NUS under this course. Most students in the CS cohort would take the course in Sem 2, so the class size is small enough to host physical lectures. This course is taught using Java. The main theme of the course is OOP and FP. Throughout the course, I find a strong emphasis on typing (not keyboard). Towards the end of the semester, there is a cute introduction to concurrency and parallelism.
Content Difficulty: 7/10. Assuming prior programming knowledge, it is implied that we are now capable of picking up any programming language syntax relatively quickly. There is little to no mention on stuff like "how to declare a variable in Java". I have learnt some OOP concepts prior to taking the course, so the contents in the first half of the course felt pretty light. Towards the middle of the semester, I struggled with topics like generics and wildcards. To me, that was the peak difficulty of the course. The rest of the semester has been pretty interesting and not hate-inducing.
Workload: 7/10. 2 hour weekly lectures, 2 hour of lab session and 1 hour of recitation. Lab sessions typically end early. TAs (there are two of them) will do a quick recap on the lecture content, discuss solutions from previous week's lab assignment and then brief us on the next assignment. Recitation is hosted by Prof. Adi himself. It typically covers concepts in lecture but in more detail, which makes the recitation sheets quite tough to work on.
There are diagnostic quizzes after each lecture. These are multiple-attempts and are meant to be a giveaway. The main workload of the course arises from the lab assignments, mostly given weekly. In the first half of the semester, the assignments focused on OOP design. These are standard and, to some extent, quite useful exercises for us to apply the OOP concepts taught in lecture.
Towards the second half of the semester, I find the lab assignments required little actual coding but a good amount of thinking. There was an (understandable) obsession towards one-lining every single method that needs to be implemented, and there were restrictions that prevent us from using loops/conditional statements. I remember having to consult my TAs for hints and submitting late by 2-hours for one of these assignments. The last lab assignment was on concurrent and parallelism and is optional. It was meant to be given as extra credit to make up for previous lab assignments/PE1.
Profs: 10/10. Prof. Adi is very humorous and his lectures are very entertaining. I remember him congratulating us for staying in the course longer than Liz Truss had served as the Prime Minister of the UK, and jokingly answering a lecture question regarding the Barclays Premier League (couldn't remember the details very well). He was also very helpful when my friend and I consulted him for help with the optional lab assignment. It was an online Zoom meeting and he had been very patient throughout the consultation.
Assessment. Midterm and final are MCQs/MRQs/Short-response questions regarding the theories covered in the lecture. I find the questions very tricky. The PEs are essentially lab assignments with a time limit. This makes them very time-constrained. PE1 had two separate questions on OOP design and I only managed to finish the first one. PE2 had us implement a monad and then do something about streams. I did well on PE2 and overall it seemed pretty doable after attempting a few past years.
CS2040S Data Structures and Algorithms
I took this in AY22/23 Sem 2 under Prof. Seth Gilbert and Arnab Bhattacharyya. My final grade is A. Grade components are a mystery.
Easily my favourite course. I mean, I decided to major in Computer Science exactly because I found data structures and algorithms interesting. Topics covered ranges from non-rigorous asymptotic analysis and linked lists all the way up to Dijkstra's algorithm and dynamic programming.
We study the space-time tradeoffs of different data structures and the running time of their operations. We also study some of the most classic algorithms and the problems they solve, why they work, their space and time complexity, as well as their variants. The course covers every data structure and algorithm one needs to know in order to solve any typical LeetCode problem, but needless to say, solving LeetCode problems is not the only learning objective of the course.
Oh yea, I TA this course as well.
Content Difficulty: 5/10. I was quite advantageous when I took the course due to my experience in competitive programming. I had a big picture in mind regarding what the course will actually cover. That said, much of the things I already know are practical in nature, since theories are deemphasized in informatics olympiads, so I still find a lot of content new to me. As a quick example, I have been using C++ maps for 3 years before learning what a balanced binary search tree is while taking this course. I also gained an early exposure to Java in Sem 1 from CS2030S. Most students in the cohort will take CS2030S and CS2040S together, requiring them to pick up Java in an unrealistic pace. This also means lighter workload from my side.
For concepts that are new to me, I did not really find them too difficult to wrap my head around. Again, I had an early exposure to this sort of computational thinking.
Workload: 7/10. 3 hour weekly lectures, 2 hour of tutorial and 1 hour of recitation. Tutorial sheets are quite difficult to attempt. Recitations are generally more abstract-themed as it typically covers general problem-solving approaches. One special recitation will cover B-trees, which will then be tested in the midterm and final.
There are lecture reviews after each lecture. These are generally single-attempt MCQ/MRQ questions. Workload mainly arises from the weekly problem sets. Most students would take a few days to complete them. Please consult TA if you are stuck. There were also two contests which are optional to participate, but can earn you Coursemology XP.
Profs/TAs: 9/10. Prof. Seth is perfect. He is overall experienced and professional, but also occasionally informal. Heavy lecture contents are accompanied by his enthusiastic and engaging tone, making the lecture never too dry. He keeps a fast pace because I believe he has to. There is just so much to cover. Kudos to him for being able to explain everything so fluently. He is also very patient with answering students' questions after lecture.
My TA Devansh is also goated. His tutorial sessions are engaging and actually motivated me to think deeper into the tutorial problems. I remember being invited by him to present an answer to a monotonic stack problem. Outside of tutorial sessions, he is also a member of NUS Hackers and I would attend one of their weekly events. I remember him stopping me from doing a problem set while listening to the talk. I understood why this is important never did my own work during talks again in subsequent events.
It's currently 2:30AM, I can't wait to go to bed, but I also can't sleep peacefully without mentioning Eldric the recitation TA. Some students knew him from CS1101S, some knew him from CS2040S. I did not take his recitation classes when I was taking the course, but I managed to get in touch with him as a fellow TA in the last semester. I would sit in his recitation classes because admittedly, I didn't fully grasp the recitation contents when I was taking the course. Eldric is a good TA that really has his own style of explaining things. I genuinely wish I can engage the class like he did.
I sure hope I didn't forget anyone.
Assessment. The course uses a learning management system known by the name of Coursemology. The continual assessments are gamified into XPs and levels. Completing lecture reviews and problem sets earn you XPs. TAs will also allocate XPs based on tutorial participation. Taking part in contests, answering mini lecture quizzes and participating in the forum also earn you small amounts of XPs.
There is no official format for midterms and finals. All we know is that they are mostly MCQs/MRQs, but there could also be short-response questions/fill-in-the-blanks questions. Some MRQs have up to 42 choices. :) Most of the questions are tricky and difficult. Looking at the past-year paper for the first time will probably make you question life. Do try to go through the 5 stages of grief and start to get comfortable with the difficulty as soon as possible.
Comments