NUS finals are over and I see that people are checking my module reviews to decide which ones to take and which ones to avoid. I took a look back at my reviews and found a lot of them quite interesting or amusing.
So here is my retrospective on all of the CS (and maths) modules that I took in NUS, and how I feel about them after working as a full stack software engineer for one and a half years:
(Module names are also links to my original module reviews)
CS1101S Programming Methodology – 13/14 Sem 1
Still one of my favorite modules in NUS. Still highly recommend. The choice of JavaScript is certain a controversial one.
As a software engineer mostly working on frontend, I have my bias towards JavaScript. However, as I learnt more about functional programming, I understand more why people are against using JavaScript for CS1101S. To be fair, the language used in CS1101S is the “good part” of JavaScript, but module did in some way led me to believe JavaScript was the ONLY language I needed for a very long time.
In retrospect, I think teaching in JavaScript is okay, but students taking this module should be aware the functional style of writing JavaScript in CS1101S is not what you would be typically writing if you were to use JavaScript in real work. And if you are interested in functional programming, there are better languages out there, such as Haskell or Lisp.
CS2020 Data Structure and Algorithms (Accelerated) – 13/14 Sem 2
One of the must-takes.
You will need it for the interviews, as well as daily jobs where you need to know your basic data structure and algorithms to do some optimizations for the backend logic.
CS2100 Computer Organisation
I honestly cannot remember what I learnt from this module except that it involves some hardware, logic gates and was pretty fun.
Unless you are going into hardware, the knowledge is too low level to be useful in work.
CS2101 and CS2103 Software Engineering Twin Modules – 14/15 Sem 2
These two modules are hard to judge.
In theory, they teach you all you need to know to become a software engineer. However, in reality, most of the knowledge are either common sense or too broad to be useful in actual work. And you will pick up the actual useful knowledge on how to do sprint planning, gathering requirements, writing simple tests in either internships or first full-time job.
Nonetheless, they are compulsory modules so no point complaining. And I guess companies don’t really want to take in interns who didn’t even have the basic ideas?
CS2105 Computer Networks – 14/15 Sem 1
Not much to say about this. Useful for interviews and nothing much else.
On top of my head I don’t remember anything from this module except OSI has 7 layers. The funny thing is, during one of the interviews I was asked which layer was DNS in. I managed to answer it just because I happen to know the term DNS over HTTPS from reading Hacker News, not because I learnt it from CS2105.
CS2106 Introduction to Operating Systems – 14/15 Sem 1
Similar to CS2015, useful for interviews and nothing much else. Maybe it would be more useful if you are going into security or sysops? I am not sure.
ST2334 Probability and Statistics – 14/15 Sem 1
Absolutely not used in work at all. Unless you need to do machine learning related work, maths is rarely used.
CP3200 Internship 15/16 Sem 1
Now this is the most important module in CS, even though it starts with CP.
Internship teaches you way more things than any modules you take. That’s because you are actually solving a real problem, instead of practicing on some demo sets.
I would highly recommend taking at least 2 internships during the course of undergraduate, preferably in different settings (big company vs startup, different industries). This would allow you to get a feel of what you actually want to do. Do take the project scope and deliverables into consideration when choosing them. Go for the one that actually requires coding and interests you.
CS3216 Software Product Engineering for Digital Markets – 16/17 Sem 1
This one was probably the most intense CS module that I took. Definitely learnt a lot, especially on the knowledge of Single-Page Application (SPA) and Progressive Web Application (PWA) which I still use regularly in my work.
If you are looking to get into full stack, frontend or backend role, this module is really good and forces you to pick up useful skills in a short amount of time.
CS3219 Software Engineering Principles and Patterns – 16/17 Sem 1
This is an interesting module in retrospective.
On one hand, I find myself frequently referencing the concepts from this module in my daily work when making architectural decisions or refactoring. However, I don’t know if they were intuitive to begin with, or require formalization from a module.
In discussions, we often make decisions based on general concepts such as intuitiveness, code complexity and the amount of tech debt, not so much on specific patterns. So while it is useful to know the patterns, it is also not hard to derive them on the spot based on general principles.
CS3230 Design and Analysis of Algorithms – 14/15 Sem 2
There is not much to say about this one. You need it for almost all the interviews, both the ones you are attending and the ones you are conducting.
Is it used in daily work? Absolutely no, unless you are working on some really hard problems. The most you will need to know is how to get rid of extra loops and reduce the complexity, but that’s something taught in CS2020 already.
CS3241 Computer Graphics – 15/16 Sem 2
Enjoyed this module when I took it.
However, I also learnt from this module that coding games was too math-intensive for me. So I didn’t work in a game company and all the knowledge I learnt are quite useless and I barely remember any of them.
CS3243 Introduction to Artificial Intelligence – 14/15 Sem 2
One of the must-takes for AI-related jobs.
Even if you are not going into AI research, it is good to have some general understanding of AI so that you can land a job that has some kind of AI component.
Also very useful for chitchatting with colleagues during lunch.
CS3244 Machine Learning – 16/17 Sem 1
Same as CS3243, except this one is deeper so you have more things to say during lunch.
Of course that is when you are not working on machine learning projects.
CS3245 Information Retrieval – 15/16 Sem 2
This one is kind of useful because it is a mix of Natural Language Processing (NLP), search engine and basic concepts on working with data in general. I personally got interested in NLP after taking this module and eventually did my FYP on NLP. Even though my daily job is not related to NLP, I still do personal projects on NLP and have fun with it.
I also still regularly use the concept of precision, recall , F-score when designing systems that need to produce some kind of analysis of data.
CS3281 & CS3282 Thematic Systems Project – 15/16 Sem 2
When I took this module, it was still under Facebook Open Academy, so I have the chance to work with influential figures like rauchg and popular open-source projects like socket.io.
It was a great eye opener for me and that first-time experience of working on open-source projects also led me to contribute more to open-source later during my internships and my full-time job now. Needless to say, open-source contributions also play a role in interviews. So definitely take this module, if it was still about open-source projects.
CS3882 Breakthrough Ideas for Digital Markets – 14/15 Sem 2
Honestly this module is like a 6-month hackathon, where you study to how pitch and build MVP. Not much technical knowledge, but more on marketing, design, pitching, etc.
I would suggest someone who wants to build their own startup to take this module, but not everybody else who are aspiring to become a software engineer.
CS4218 Software Testing – 16/17 Sem 2
Err, this module is a bit too theoretical to be useful in real work. I have worked in 3 different companies and never had I encountered a case where I need to apply complicated theory in designing my test cases. I think the knowledge on testing from CS2013 is more than enough for daily work.
Of course if you are interested in QA roles, then this is a fantastic module for teaching you how to catch more bugs.
CS4244 Knowledge-Based Systems – 15/16 Sem 2
This was actually an eye-opener for me and it still is. Many people working on AI are just focused on machine learning, whereas this module teaches you a completely different set of approaches in AI, under the name of expert systems.
Is the knowledge useful as a software engineer? Probably not. But still, makes for a really good lunch topic.
CS4246 AI Planning and Decision Making – 16/17 Sem 1
Even more hardcore AI module. Don’t think I will ever need this kind of knowledge until I plan to do master or PhD in AI.
CP4101 FYP 16/17 Sem 1 – 16/17 Sem 2
FYP is a good module to take if you are not sure if you want to do research or software engineering. Personally I enjoyed the process of doing literature review, trying out various solutions and finally coming up with some numbers to prove that my system is better in certain ways.
It definitely gave me a glimpse of life in academia and made me realize how much I miss writing code all day.
What about databases?
I didn’t take any database related modules (because it was optional) but I am doing fine for simple backend tasks. My advice:
- Pick up a SQL book or do some online tutorial
- Write some simple apps to learn how to actually use a database in a real project
Do these two before going for your first the interview, and you should know enough for a junior role.
General Thoughts
- Given another chance to choose, I would probably not take modules that are too intensive and time-consuming. Instead, I would rather work on more side projects or invest in another hobby.
- Some modules, even though not useful in daily work, are still worth taking because they open up different perspectives and opportunities.
So, what are your thoughts? Do you regret taking any of them? Were there any changes to these modules after I graduate?
Leave a comment below to let me know!
One comment