• Course Number: 01:198:214
  • Instructor: John-Austen Francisco
  • Course Type: Undergraduate
  • Semester 1: Fall
  • Credits: 4
  • Description:

    This course teaches students how to think about, build, debug, and test large computer programs. The course stresses learning how to use tools such as debuggers, profilers, source version control systems, and integrated development environments as an essential part of developing large programs. The course also stresses the understanding of how programs execute on today's computers and how to measure and optimize performance. Programming will be in C on Unix systems to introduce students to a new programming eco system, as well as enable the mapping of high-level language constructs to the underlying machine.

  • Syllabus: Visit Website
  • Video Intro: Visit Website
  • Prerequisite Information:
    01:198:112; Corequisite: 01:198:211 (or currently enrolled).
    If you are currently enrolled in 01:198:211, you will need a prereq override to register for 01:198:214.

    - A grade below a "C" in a prerequisite course will not satisfy that prerequisite requirement.

  • Course Links: 01:198:112 - Data Structures, 01:198:211 - Computer Architecture
  • This course is a Pre-requisite for the Following Courses: 01:198:416 - Operating Systems Design, 01:198:437 - Database Systems Implementation
  • Topics:
    Systems programming in C and Unix:
    - C programming
    - Memory management and the C memory model
    - System calls
    - I/O
    - Caching
    - Multi-threaded programming
    - Shell scripts
    Software development:
    - Performance (space and time) analysis and measurement
    - Debugging
    - Testing
    - Performance optimization
    - IDE (e.g., Eclipse)
    - Source version control (e.g., CVS)
    - Debugger (e.g., gdb)
    - Memory errors (e.g., valgrind)
    - Profiling (e.g., gprof, valgrind)
  • Expected Work: Large programming project spread across several parts
  • Learning Goals:

    Computer Science majors ...

    • will be prepared to contribute to a rapidly changing field by acquiring a thorough grounding in the core principles and foundations of computer science (e.g., techniques of program design, creation, and testing; key aspects of computer hardware; algorithmic principles).
    • will acquire a deeper understanding on (elective) topics of more specialized interest, and be able to critically review, assess, and communicate current developments in the field.
    • will be prepared for the next step in their careers, for example, by having done a research project (for those headed to graduate school), a programming project (for those going into the software industry), or some sort of business plan (for those going into startups).