Useful Computer Science Modules
Motivation
During my work as a software engineer, I've discovered that certain computer science modules have remained invaluable. These modules have played a significant role in both grasping new concepts and tackling everyday problems at work. Here are a few that frequently come to mind.
CS2030S Programming Methodology II
While Java is not as low-level as C or C++, this module taught me the fundamentals of Java programming. Understanding a statically typed language has been instrumental in grasping other languages, as concepts like types, classes, and objects are universal. Specifically, topics such as Generics, Streams (Functional Programming), and concurrency have proven to be broadly applicable across different programming languages.
CS2103T Software Engineering
This module offered a comprehensive overview of software engineering practices, instilling numerous best practices that I still strive to adhere to in my professional life. Skills in diagramming, testing, and team collaboration (including writing effective commit messages) have been practical and sometimes surpass what is commonly achieved in the industry.
CS2102 Database Systems
Although I've largely forgotten the specifics of BNFs and normalization forms, encountering SQL and databases is inevitable as a software engineer. The knowledge gained from this module proves useful during interviews and instills confidence in schema design. Understanding the CAP theorem is also beneficial when designing distributed systems. Additionally, insights from the NTU module CE/CZ4153 Blockchain Technology are pertinent in this context, especially regarding balancing consistency, availability, and partition tolerance in systems.
CS3282 Thematic Systems Project II
This module essentially equates to managing a small open-source project. The tasks of reviewing PRs and gaining a deep understanding of a complex codebase are invaluable. It emphasizes taking ownership of code and its continuous evolution. This includes navigating through issues, PRs, and discussions to grasp the codebase's context and handling code changes by others. I have gained a profound appreciation for maintenance burdens and code design, recognizing the long-term impacts of design decisions and becoming more cautious with feature introductions and refactorings.
CS4218 Software Testing
Especially relevant for QA roles, this module's focus on unit/integration testing and developing a robust test suite remains pertinent. It covers managing combinatory explosions with a well-chosen subset of test cases—a critical skill for software engineers. Additionally, the project that involved implementing common command-line tools provided a solid foundation in Unix shell basics, including piping and using tools like cat and grep.
Conclusion
While there may be more modules worth mentioning, these are the ones that stand out to me. Reflecting on my academic journey, I realize that even the modules that seemed less immediately useful at the time can become highly relevant later on. Whether it's technical theories or database normalization strategies, such knowledge becomes a valuable resource when facing challenges or making informed decisions in the field.