Instructor: Szymon Rusinkiewicz
Description of Course Goals and CurriculumFrom a previous article on this course (F 2014), but still very accurate: "COS-217, Introduction to Programming Systems, is a course designed to introduce major and non-major students to the fundamentals of “lower-level” programming and program development. It is a course required for COS major and certificate students, and knowledge learned in this course lays the groundwork for more advanced computer science classes in the department. The class covers a broad set of topics, from general development advice (e.g. how to test and debug a program) to specific details of programming (e.g. how memory is allocated in a symbol table), and intends to equip students with knowledge and tools that will be beneficial in a wide variety of fields in computer science, such as programming languages, algorithms, compilers, software development, and others." The course is divided into three major sections, in order: C Language, Assembly Language, and Services and Processes. Broadly, these sections cover some of the following topics: C Language: This section focuses on programs and code written in C. You'll learn the intricacies of the C Language and create 4 different programs using this knowledge. By the end of this section, most students will be reasonably adept at C and able create programs that can accomplish most tasks that a Java program can. Assembly Language: For this section, you'll take a break from learning more about C and focus instead on the what happens "under the hood." This means you'll learn about the C compiler and how a program goes from human-readible C code to machine-executable 1's and 0's. You'll learn how to read x86 Assembly language, which is the step between C code and a binary executable, and how to convert C code to Assembly and vice versa. One of the assignments even teaches you how to "hack" a program to alter data. Services and Processes: This section focus on the background services that enable and support the execution of a program. For example, you'll learn how a processor can manage multiple programs at the same time and maintain an illusion of simultaneous execution, even if it can only execute one process at a time. You'll learn how the system allocates memory to programs. The final assignment for the class will have you create a command line shell that can perform most basic instructions and run programs.
Learning From Classroom InstructionThis course has lectures and precept, both of which meet twice a week. Additionally, there are plenty of office hours (14 hours total) and debugging help at COS lab TA's. As with most other COS courses, there is a Piazza forum for questions and answers, and instructors are extremely active and helpful (over 600 posts and average response time is only 7 minutes). Overall, lectures focus on broader, more general concepts while precepts focus on specific examples and the implementation of concepts covered in lecture. Essentially, you'll learn the what's and why's of a topic in lecture, and the how's in precept. Precepts are where most of the learning in this course takes place. You'll learn how to write code and assembly, and learn about specific implementation of the concepts discussed in lecture. You'll also walk through specific examples of code, many of which are very helpful for the assignments. You'll also discuss the assignments in great detail, almost to the point of receiving a point-by-point guide to the assignment (with the exception of the challenge section). Absolutely never ever miss precept, since assignments get exponentially more difficult without knowledge from precepts. In fact, COS217 precepts are some of the best attended precepts I've ever seen (probably 90-100% attendance). Another gem from the same previous article (F 2014): "The required reading is helpful as a reference, although a very close reading is probably unnecessary unless a student does not follow the lecture. The most important information is covered in lecture. One exception is the required Bryant & O’Hallaron reading related to the Unix Shell programming assignment; there is a fair amount of useful information for the assignment in that reading. If a student is new to C Programming or studying for the exam, keeping the King C Programming book close is recommended. The course recommended reading is relevant and interesting, but not critical to success in the class."
Learning For and From AssignmentsAssignments are the main focus of COS217. You'll probably spend upwards of 75% of the time you spend on this course on its assignments. Be advised that these assignments tend to be extremely long, and in some cases quite tedious. Also be careful of the challenge sections of the assignments, which are NOT extra credit (not doing the challenge means you CANNOT get 100% on an assignment). COS217 assignment are some of the longest and most tedious coding assignments in the COS Trinity of COS126, COS226, and COS217. In part, this is because the assignments require many lines of code and are pretty exacting in their style and formatting requirements.
External ResourcesIn general, external resources should never be required to complete any part of the course. But if you do decide to use any external resources, be very very careful. COS217 has an extremely strict policy on external resources, and the challenge section of the assignments forbid external resources altogether. Personally, I never felt the need for any external resource, and hence never used any.
What Students Should Know About This Course For Purposes Of Course Selection
Introduction to Programming Systems