Skip to content

CS2030S Course Review

Introduction

  • Full name: CS2030S Programming Methodology II
  • Target audience: NUS Year 1 SoC Students
  • Purpose of the course: To introduce the fundamental yet essential concepts of Java, object-oriented programming (OOP), and functional programming, while bridging the gap between CS1010-equivalent and CS2103-equivalent courses.
  • Notes Structure: View the CS2030S Lecture Notes
    1. CS2030S-Cheatsheet: Here, you'll find the cheatsheet I created and used in the PEs, midterms and finals, summarizing key concepts and methods for quick reference.

I took this course in AY24/25 Semester 2 as an elective because I wanted to experience one of the flagship courses at NUS SoC and to continue learning under Prof. Wei Tsang after CS1010.

Course Content

Overview of Topics Covered

  1. Object-Oriented Programming
    • Compiler Types, Classes, and Objects
    • Class, Instance / Methods, Inheritance
    • Polymorphism
    • Exception and Wrapper Classes
    • Generics
    • Wildcards
    • Immutability and Nested Classes
  2. Functional Programming
    • Basics of Functional Programming
    • Infinite Lists and Streams
    • Monad and Parallel Stream
    • Parallelization and Asynchronous

Depth and Balance of Coverage

Theoretical Understanding

As a core course taken by all Computer Science students, CS2030S contains a substantial amount of theory, much of which is mathematically inclined. This makes the course relatively challenging for a Computer Engineering (CEG) student without prior functional programming background. However, in retrospect, I was impressed by how many of these theoretical concepts are actually applied in real-world software engineering, such as Java streams and functional-style programming.

This course not only builds a strong foundation for using Java as a primary programming language, but also serves its purpose well in preparing students for software engineering courses such as CS2113.

Application and real-world examples

I strongly believe that after completing this course, you will be well equipped with the essential knowledge of Java. This provides a solid foundation that allows you to focus more on algorithmic problem-solving in courses like CS2040S.

Programming languages are ultimately just tools. However, Java remains a practical and widely accepted choice, especially for technical interviews. In addition, functional programming concepts such as lambdas and streams, which may initially seem abstract, are widely used in real-world Java software engineering projects.

Challenging or Unique Aspects

  1. Theoretical Rigor: As mentioned earlier, CS2030S continues the strong tradition of theoretical depth common in CS core courses, with significant mathematical content. While this increases the overall difficulty of the course, having some basic mathematical intuition can greatly simplify your understanding to some certain topics. For example, the concept of a subset in mathematics is particularly helpful for understanding subtype relationships in Java.
  2. Practice versus Theory: There is inevitably a trade-off between theory and practice. As CS2030S places greater emphasis on theoretical understanding, the amount of hands-on coding practice is comparatively lower. This can make it challenging to achieve perfect scores in the Practical Exams (PEs). However, the true opportunity to apply this theory extensively comes later in CS2103 or equivalent software engineering courses.

Teaching Style and Materials

Teaching Style

Lectures

My original tutor was Dr. Tan Yugin, but I switched to Dr. Enzio from the second tutorial onward. Dr. Enzio is very passionate about teaching and consistently explains concepts clearly and effectively. His tutorials are also highly interactive, which greatly enhances the learning experience.

Tutorials

My original tutor is Dr. Tan Yugin, but I just switched to Dr. Enzio's starting from the second tutorial (IYKYK 😂). Enzio is very passionate about the class and can always explain the concepts very clearly and well. His class is also very interactive! Like his tutorial!

Labs

My initial plan was to join my CS1010 tutor, Mr. Zhang Puyu's lab. However, as I was unable to secure a slot under him, I attended two lab sessions per week instead. My lab tutors were Mr. Zhang Puyu and Mr. Quek Yew Wei. For Puyu, there is little more to add -- he is simply outstanding. As for Yew Wei, he is extremely kind and always responds to my questions promptly and patiently.

Assessments

  1. Take-Home Exercises: These are ungraded and are completed in a Vim-based environment similar to CS1010. The exercises are non-trivial, and those related to functional programming are particularly important for PE2.
  2. Practical Exams (PE): Compared to CS1010, the PEs in CS2030S are relatively more manageable. For my cohort, it was quite feasible to score near full marks in both PE1 and PE2.
    • For PE1, it is important to practise with the practice problem sets and become familiar with typing speed and environment, as many students struggled to finish on time.
    • For PE2, the difficulty is generally moderate, and many students scored close to full marks in my cohort.

Course Book

Textbook: There is no specific textbook for CS2030S, I would say the most useful resource I have used in this course is the official Java document.

Learning Experience

Personal Insights

As an unrestricted elective chosen due to my very positive experience in CS1010, I must admit that this course did not fully meet my initial expectations. This is not to say that the course is not good -- it certainly is -- but for me, CS1010 remains the most impressive SoC course I have taken so far.

That said, studying and competing alongside many highly talented CS students at NUS is itself a unique and meaningful experience. It further reinforced the lesson I first learned in CS1010: that grades are not everything. At times, pursuing perfection can be exhausting, especially when surrounded by exceptional peers. In such situations, focusing on the skills you are gaining and the experiences you are accumulating can make the journey far more fulfilling and far less stressful.

Skills Developed

This course taught me the fundamentals of Java programming, as well as how to program in both an object-oriented and functional style. These skills will be highly valuable for my future courses, for solving problems on platforms such as LeetCode, and for my long-term development in the software engineering field.

Workload and Time Management

  • Level of Difficulty: 8/10
  • Tips for future cohort: I hope that my compiled lecture notes can help ease your workload and support your learning throughout the course.

Conclusion

This course is by no means easy, but it is certainly eye-opening for anyone who aspires to pursue a future in software engineering.

Comments