CS5007: Computer Systems Course Charter
Introduction
This course is in intended to provide Align students with a common base of knowledge in systems programming, including memory management, multi-threaded programming, and introductions to related topics.
CS5007 is part of the second semester of the Align bridge. Before taking this course, students should have completed CS5001 and CS5002.
CS5006 and 5007 are each half-semester courses that can, in theory, be taught in either order. Because C is taught in one and used in both, the courses should ideally be taught by the same instructor, and students taking one should register for both.
The current preferred order is CS5007 followed by 5006.
Goals
The goals of this class are to provide students with the following:
Experience incorporating resource management into software design. Lessons in resource management will be reinforced through practice.
An introduction to concepts from computer architecture, programming languages and software engineering. This course is heavily project based and gives students hands-on experience with selected topics.
CS5007 uses the C programming language. The motivation for this is that C readily exposes resources (allocated memory, file handles, sockets), making it simple to gain experience writing programs that manage said resources. This can also present a challenge to some students who are newly introduced to computer science and who have previously had experience with other languages.
As a means of encouraging experimentation, students have used Ubuntu running in a virtual machine as their development environment. Using linux necessitates that most of the students learn a new OS and how to develop software using a new set of tools. While there is a ramp-up cost, this does seem to build students’ confidence and it certainly broadens their toolkit.
High-Level Learning Objectives
At the end of CS5007, a student should be able to:
- Configure and develop inside a virtual machine. Also, explain what a virtual machine is and how it works.
- Write a script to automate a process. For example, an instructor could choose to have students do this using bash.
- Using a compiled language, create an executable binary that utilizes a shared library. For example, using C with a Makefile.
- Make use of input & output in a computer program. This includes:
- Command line IO
- File IO
- Network IO
- Manually manage memory used in a program. Explain the difference between memory on the stack vs heap memory.
- Author a program that explicitly makes use of concurrency. For example, using pthreads in C.
Implementation Details
Students submit assignments via the school’s git server and class discussions are conducted via piazza. The TAs grade the homework (using guidelines provided by the instructor), though it is not uncommon for the instructor to field student questions pertaining to grades.
For a given topic, a typical cadence for the course is:
- assign reading on the topic
- cover the topic in lecture
- assign a homework based on the topic that is due 8 days after that lecture
- set aside time at the start of the lecture the following week to answer any questions from the homework. This is in addition to providing timely responses on piazza, the online forum software used for the class.
Class time is a mix of lectures, code review and live coding. This class is broad in that it touches on a wide range of topics outside of the core systems concepts, including: working at the command line, linux, scripting, build systems (e.g., make), non-graphical editors (vim, emacs), computer architecture and its advancement over time, the history of programming languages, and virtualization. The two main challenges of addressing this wide an array of topics are 1) tying them together and 2) not having the time to go too deeply on any one topic.
This class admittedly covers a more constrained set of systems programming topics than a typical undergraduate “introduction to systems” course. This is necessitated by the students’ newness to programming and limited knowledge of computer hardware. Instructional staff should be aware of the cognitive load generated by picking up this many new tools, this fast.
An example of a per-week course schedule is as follows:
- Week 1: Overview of Computer Systems, Linux crash course
- Week 2: C programming language; data structures
- Week 3: Assembly and Machine Representation, CPU Architecture, and Operating Systems
- Week 4: Compilers, Linkers, and Code Generation
- Week 5: Processes and The Memory Hierarchy
- Week 6: Concurrency
- Week 7: Networking with Sockets
Topics and Learning Outcomes
Note that the topics and learning outcomes are the minimum to be achieved in CS5007. Faculty may choose to present additional material or cover a topic in greater depth. The order of topics here does not imply an ordering for the course itself. Faculty are encouraged to develop syllabi that complement their teaching style. Faculty are also encouraged to share syllabi and other materials with each other.
A note on levels of mastery, which are taken from CS2013 (see cs2013.org): For levels of mastery, CS2013 takes inspiration from (but does not directly follow) Bloom’s Taxonomy. CS2013 defines three levels:
- Familiarity: The student understands what a concept is or what it means. This level of mastery concerns a basic awareness of a concept as opposed to expecting real facility with its application. It provides an answer to the question “What do you know about this?”
- Usage: The student is able to use or apply a concept in a concrete way. Using a concept may include, for example, appropriately using a specific concept in a program, using a particular proof technique, or performing a particular analysis. It provides an answer to the question “What do you know how to do?”
- Assessment: The student is able to consider a concept from multiple viewpoints and/or justify the selection of a particular approach to solve a problem. This level of mastery implies more than using a concept; it involves the ability to select an appropriate approach from understood alternatives. It provides an answer to the question “Why would you do that?”
Note that course topics appear in regular font. Learning outcomes appear in italics.
Also note that some learning outcomes apply to many course topics. More specific learning outcomes appear with their respective topics.
Networking and Communication Introduction
- Organization of the Internet (Internet Service Providers, Content Providers, etc.)
- Switching techniques (e.g., circuit, packet)
- Physical pieces of a network, including hosts, routers, switches, ISPs, wireless,
- LAN, access point, and firewalls
Articulate the organization of the Internet. [Familiarity]
List and define the appropriate network terminology. [Familiarity]
Describe the layered structure of a typical networked architecture. [Familiarity]
- Stacks [Use, Implement] Also in 5001
- Queues [Use] Also in 5001
- Maps [Use] Some in 5001, 04, 06
| Course Topics | Learning Outcomes |
|---|---|
Computational Paradigms
|
|
Parallelism
|
|
Networked Applications
|
|
Overview of Operating Systems
|
|
Cross-Layer Communications
|
|
Defensive Programming
|
|
| Though not a Data Structures course, CS5007 introduces several data structures in the context of introducing C and various C implementations. They appear in other courses as well; various presentations reinforce / complement each other.
Abstract data types: Usage and Implementation
Data Structures: Use and Implementation
|
|