What is this?

This page answers questions about how this course is designed and why we made certain choices.

One objective of a university education is to help you become an independent and competent thinker. This page explains why we do certain things in CS1010 instead of asking you to accept them without question. We have put a lot of thought into the different parts of this course, and we are happy to discuss them.

Course Foundations

Why does CS1010 use the C programming language?

This is perhaps the most frequently asked question, given that most other programming courses now use Java, Python, JavaScript, or another language. We will start with the drawbacks of C before explaining why it is still a good choice for CS1010.

Potential Drawbacks

  • Some simple tasks in C are complex from a teaching perspective. E.g., printf format strings for printing, the default scanf for reading input being both (a) requiring a more advanced topic (pointers) and (b) insecure!
  • Many “footguns”: careless mistakes in other languages usually lead to a simple “program crash” at runtime (e.g., in Python), whereas in C, you can get “undefined behaviour”, meaning anything is allowed to happen, and some errors are also hard to understand (e.g., what is a “segmentation fault?”)
  • A lot of “do it yourself”: tasks that are simpler in other languages often take many more lines of code in C, because the C language itself is quite minimal and does not provide as many “pre-written” functionalities in the standard library

So Why Use C? The core reason is the target audience of CS1010: computer engineering and information security students. Everything follows from there.

  • CEG and InfoSec students need to understand computer systems from the ground up, and C does not hide many of these lower-level details, such as the size of objects in memory and manual memory allocation. There is therefore less “magic” between the language and what the computer is actually doing
  • C is used heavily in microcontroller programming, including in CG1111A and CG2111A, as well as in low-level and systems programming. Not learning it at the start would make this kind of programming harder to understand in the near future

In short, C is a good language for teaching the fundamentals required by CEG and InfoSec, and it is also widely used in practice. Students often report that it is easier to pick up general-purpose languages such as Python and Java after learning C in CS1010.

Why do we have a focus on Linux/UNIX in a programming course?

This is also a common question, given that one of our three weekly hours of small-class instruction, the tutorial, focuses on these skills. We also ask you to use our CS1010-provided Programming Environment for your work. We could instead use existing online platforms such as CodeCrunch, Coursemology, or Source Academy and focus only on C and programming methodology.

A very similar reason applies here: CEG and InfoSec students often use Linux soon after this course, and no other course teaches these terminal skills explicitly. The value of these skills becomes even more obvious after CS1010.

Course Resources and Platforms

Why are there both lecture slides and online notes?

Lecture slides present an overview of each concept and introduce the core ideas. We do not have time during lectures to describe every possible variation and edge case, especially for C language syntax.

The notes provide another perspective on the concepts taught in lectures. They go into more depth and give you a way to pace yourself while learning.

In short, lecture slides are broad, whereas notes are more detailed. Both are useful: reading detailed notes without an overview can make the big picture harder to understand.

Why Do We Use Canvas and This Site?

Canvas and this site serve different purposes.

Canvas is the NUS course platform. We use it for matters tied to the current class, such as announcements, discussions, quizzes, grades, and information that should only be available to enrolled students.

This site is better suited to course material that students need to read, search, and return to regularly. Publishing content in a rich format with interconnected links is easier, and it should be easier to read.

Using both lets us keep official course administration within NUS systems while presenting the learning material in a format designed for the course. You should check both, since information on one may not be duplicated on the other.

Why must everyone use Entainer, even if they already use Linux?

Linux systems can differ in their installed tools, compiler versions, libraries, settings, and file layout. A program that works on one machine may not compile or behave in the same way on another.

Entainer gives everyone the same programming environment. This makes instructions easier to follow, ensures that our tests behave consistently, and allows the teaching team to reproduce problems when you need help. It also gives you access to your work from any suitable computer without having to recreate your setup.

Weekly Learning Activities

Why are there post-lecture quizzes?

Post-lecture quizzes help you check whether you understood the main ideas from the lecture while they are still fresh. They also give you an early warning if you have misunderstood something, before that misunderstanding affects your programming exercises or later topics.

You also have unlimited attempts for the quizzes, so they are intended to help you get full marks.

Why is lab attendance assessed?

Labs give you a fixed time each week to think carefully about the foundational programming questions in the course. These questions are easy to postpone when you are working alone, especially when there are more immediate deadlines.

During a lab, you can discuss how to approach a problem, ask why a particular solution works, and get guidance from a TA while you are still developing your understanding. Your TA can also help you notice gaps in your reasoning that may not be revealed by automated tests.

The attendance component encourages you to set aside this time consistently instead of waiting until shortly before an assessment to discover what you have not understood.

Why do programming exercises have an initial submission and a resubmission after feedback?

Writing a program is only the first part of producing good code. You should also be able to step back, read what you wrote, question your decisions, and identify how the program could be improved. Code is read far more often than it is written, both by other people and by your future self.

The initial submission gives you something concrete to review and gives your TA an opportunity to comment on your approach. The resubmission then gives you another chance to act on that feedback, reconsider your decisions, and improve the program.

The aim is to develop the habit of treating code as something that can be examined and refined, rather than something that is finished as soon as it passes the tests.

Why are there tutorial submissions?

Tutorials focus on practical tools and working habits, including Linux, remote access, Vim, debugging, the command line, scripting, Git, and processes. These skills support your programming work in CS1010 and will continue to be useful in later CEG and Information Security courses.

The submissions provide a reason to practise each skill yourself. Simply watching someone use a tool is not enough to become comfortable with it.

Assessment and Grading

Why are there practical exams?

Programming is a practical skill, so part of the assessment should involve writing, running, testing, and debugging programs in an actual programming environment.

Practical exams let you demonstrate that you can apply the course concepts independently. They also assess parts of programming that are difficult to measure using quizzes or pen-and-paper questions, such as working with the compiler, interpreting errors, using debugging tools, and managing your time while developing a solution.

The programming exercises and labs give you regular practice for this. The practical exams check that you have developed the underlying skills yourself.

Why do we still have pen-and-paper exams?

Pen-and-paper exams assess whether you can reason about a program without relying on trial and error. You may need to trace code, explain its behaviour, identify errors, or work out how a solution should be structured before writing it.

Compilers and debugging tools are valuable, but they cannot replace a sound mental model of how a program works. If every step depends on running the code and reacting to the output, it becomes difficult to reason about larger or unfamiliar programs.

These exams complement the practical exams. The practical exams assess your ability to work in a programming environment, while the pen-and-paper exams focus more directly on your understanding and reasoning.

Why Can We Bring Only a One-Page Cheat Sheet to the Practical and Written Exams?

The assessments are meant to test whether you can understand and apply the course concepts, not whether you can memorise every detail of C syntax or every command.

A cheat sheet lets you record details that are easy to forget, such as syntax, library functions, or debugging commands. Limiting its size encourages you to think about which information is genuinely useful and to organise it in a way that makes sense to you.

Making an exam fully open-book often causes everyone to panic and print every single thing they can think of. Most of that material is never used, and searching through it during the exam wastes both paper and time. A limited cheat sheet gives you a useful reference without turning preparation into a printing exercise.

Why is CA capped even though the CA components add up to more than the cap?

The CA components add up to 65%, but CA contributes at most 60% to your final grade. The extra 5% acts as a buffer.

This means you do not need full marks in every CA component to receive the full 60% for CA. A weaker result in one component can be offset by stronger results elsewhere. The buffer gives you some room for an occasional mistake or difficult week while still encouraging you to participate consistently throughout the semester.

Your final score is therefore calculated as:

Why is CS1010 not graded on a bell curve?

Your grade should reflect how well you have learned and can apply the course material, not how many classmates you outperform.

There is no fixed quota for the number of students who may receive an A, and there is no requirement that a certain number of students must fail. Students can receive the same grade when their work meets the same standard.

This also means that helping your classmates does not reduce your own chance of doing well. We want students to discuss ideas and help one another learn, while still following the collaboration policy and producing their own work.

Independent Work

Why do we restrict AI use?

Learning introductory programming requires you to spend time thinking through problems, making mistakes, and working out why a solution does or does not work. If an AI tool performs that work for you, you may finish an exercise without developing the skills that the exercise was meant to teach.

This matters in the short term because formative assessments account for 15% of the course grade, while summative assessments account for 80%. A small short-term gain from AI assistance is not useful if it leaves you unprepared for an assessment that you must complete independently. In the long term, not using AI here develops the mental muscle required to think through problems in this field.

Why are collaboration rules so strict about code?

Discussing a problem can help you understand it, and we encourage discussion of high-level ideas. Looking at someone else’s code is different because code contains the solution’s detailed structure and decisions.

Once you have seen another person’s code, it can be difficult to separate their solution from your own thinking. Sharing code can also leave both students responsible for submissions that are too similar, even if copying was not the original intention.

More importantly, our experience and data show that students with highly similar exercise submissions tend to perform poorly in practical exams. Writing the code yourself is the practice that prepares you for those assessments.

Discuss ideas, explain concepts to one another, and credit the people who helped you. Do not look at, share, or copy code solutions.