Control and Information

Computer Science for Non-Computer Scientists


This course provides a crash course into computer science for non-computer scientists. In one semester students will be exposed to the mostly non-functional principles involved in developing systems software: performance, memory, interaction, concurrency, parallelism, virtualization, and real time. We will revisit all relevant layers of systems software and study their connection: architecture, algorithms, computability, complexity, languages, syntax, semantics, compilers, data structures, memory management, concurrency, kernels, virtual machines, real time, and model-driven development.

Time, Location: Tue and Th 2-3.30 in 544 Davis. First class is on Thursday, August 28 at 2pm. Check schedule (iCal) for updates.

Syllabus

  1. Introduction
  2. Architecture
  3. Algorithms
  4. Computability & Complexity
  5. Languages
  6. Syntax & Semantics
  7. Compilers
  8. Data Structures
  9. Memory Management
  10. Concurrency
  11. Kernels & Virtual Machines
  12. Real Time & Model-driven Development

Content

This course is on principled engineering of concurrent, parallel, embedded, and real-time systems software. We will study all relevant layers of systems software, from the lowest levels of machine architecture via algorithm, programming language, compiler, kernel, and virtual machine design to the highest levels of model-driven development. The goal is to gain a deep understanding of the many development and performance tradeoffs in systems engineering.

Assignments

Teams of 2-3 students will be asked to work on multi-week assignments that mostly involve developing, evaluating, and describing code. There will also be a final exam at the end of the semester. Code is hosted on GitHub and build on drone.io. We thank GitHub and drone.io for their generous support!