Embarking on a study exchange program is an extraordinary opportunity for personal growth and academic exploration. It offers a chance to immerse oneself in a new cultural setting while gaining valuable knowledge and experiences. I had the privilege of participating in the Singapore University Student Exchange Programme (SUSEP) at the National University of Singapore (NUS). During my time there, I had the pleasure of delving into a variety of modules that are not offered by SUTD, which expanded my horizons and ignited my curiosity. I am Lester Leong from the Computer Science and Design (CSD) Pillar, and this is a short review of the modules I took at NUS.
During the exchange, I was required to take 4 modules that can be mapped directly to equivalent (70% similar or more) modules in the CSD pillar or is approved by the pillar as an elective, and 1 other module that could be mapped to an equivalent course offered by the Humanities and Social Sciences (HASS) Pillar in SUTD. I will be reviewing the modules that I took in the School of Computing (SoC) in NUS.
This module can be used for credit transfer back to SUTD as one of your credit-bearing modules. However, there are no modules that are equivalent to this course in our home university, so it is mapped as a CSD Mapping Elective. This course introduces students to the fundamental principles, theory, algorithms, and data structures behind digital representation, compression, synchronization, and processing of image, audio, and video data types. It also introduces students to the challenges and issues in developing media-rich applications, such as media streaming and media retrieval.
In this module, MATLAB is used as the programming language for all our assignments and projects. The content of the course is very mathematical. It teaches you the application of the Fourier Transform in various media types such as images and audio, and how it can be used to filter, compress and decompress such media. Our assignments provided us with tasks to apply the Fourier Transform with actual media files, which was extremely helpful for us to understand how these media processing techniques may be applied in real-world applications. For our final project, we were required to understand and write an image compression program in MATLAB that resembled JPEG compression. It was not an easy task and there were many steps involved in this compression process, but it was a very fulfilling project overall since we got to understand how image compression is usually done.
JPEG Image compressions of varying quality performed in MATLAB
Overall, the module barely scratches the surface of media computing. The workload is lightand the content is not that heavy, but I feel that it is an essential module if you’re looking to deal with and understand media processing in your coding projects in the future.
2. Parallel and Concurrent Programming (CS3211)
This module can be mapped back to the Parallel Computing on Multicore Architectures (50.049) module in SUTD. This module introduces the design, development and debugging of parallel programs and builds on the concurrency concepts learnt from the Computing System Engineering (50.005) module in SUTD.
The course content requires the use of three programming languages: C++, Go and Rust. Each programming language has each own way of ensuring safety (preventing race conditions, deadlocks, etc.) during the execution of its programs using different concurrency concepts (synchronisation primitives, coroutines, channels, etc.). It also introduces classical concurrency problems and how each language may be used to solve them. There is one major assignment for each programming language and it requires us to write an application such as a buy/sell matcher or task manager while applying the concurrency concepts we learned in the lectures.
Concurrency illustrated with the mascot of Go, the gopher!
Personally, I feel that this module was one of the harder modules for me. Having to deal with three different programming languages in the same term and writing concurrent and parallel programs for each of them in the assignments was a crazy task for me, since I did not have much experience in Go and Rust. However, this module builds on many concepts not elaborated on in our Computing System Engineering module and it is very useful if you want to understand how build concurrent and parallel programs that are efficient and safe.
3. Programming Language Implementation (CS4215)
This module can be used for credit transfer back to SUTD as one of your credit-bearing modules. However, there are no modules that are equivalent to this course in our home university, so it is mapped as a CSD Mapping Elective. This module provides the students with theoretical knowledge and practical skill in the implementation of programming languages. It discusses implementation aspects of fundamental programming paradigms (imperative, functional and object-oriented), and of basic programming language concepts such as binding, scope, parameter-passing mechanisms and types. It introduces the language processing techniques of interpretation and compilation and virtual machines.
A short program run with our C-sublanguage interpreter
I felt that this module was one of the more interesting modules. It introduced us to the basic structure and semantics of programming languages, and the different ways to interpret this programming language. Given that we are writing interpreters and not compilers, this module doesn’t really teach us many low-level techniques used for writing compilers, but there is some overlap with it since we are still dealing with parsing the programming language itself. The workload was very heavy, especially with the final project, since we had to write an entire interpreter from scratch (excluding the frameworks provided to us to support the writing of it), and since I chose C for the project, I also had to consider static typing and memory allocation (malloc, free) in my interpreter.
4. Introduction to Information Security (CS2107)
This module can be mapped back to the Foundations of Cybersecurity (50.042) module in SUTD. It is useful if you intend to take the Security Track in CSD. The topics covered in this module include classical/historical ciphers, introduction to modern ciphers and cryptosystems, ethical, legal and organisational aspects, classic examples of direct attacks on computer systems such as input validation vulnerability, examples of other forms of attack such as social engineering/phishing attacks, and the practice of secure programming.
There are two Capture-The-Flag (CTF) assignments and one short project presentation on specific software vulnerabilities in this module. The CTF contain puzzles of varying difficulties which simulate real-life problems, such as attempting complicated SQL injections or manipulating and exploiting the buffer overflow of a C program to obtain the Flag. I found the CTF challenge to be fun, but it was also challenging, as you are required to complete 10 different puzzles on your own. Without some scripting and webdev (inspect element is useful!) knowledge, the CTF can be almost impossible to complete.
Overall, this module was a useful introduction to cybersecurity. However, as expected of an introduction module, it does not cover the topics it covers in detail. Therefore, if you are hungry for more cybersecurity knowledge, you would probably need to self-learn or take more advanced cybersecurity modules during the exchange or in SUTD.
As I conclude this blog post, I am grateful for the opportunity to embark on this study exchange journey and to share my experiences with you. The National University of Singapore has not only broadened my academic horizons but also allowed me to connect withmany brilliant minds from the school. I am confident that the knowledge and skills I have gained will serve as a solid foundation as I continue to navigate the ever-evolving landscape of computer science.