The University of Waterloo offers a wide range of Computer Science courses.
Click the link below to jump to each category:
General description
This course introduces practical computer programming to students who don’t have previous programming experience. Students learn programming concepts by creating interactive visualizations, simple games, and image processing effects. They also explore fundamental imperative programming language concepts, such as variables, conditionals, loops, functions, events, and arrays. Students learn general skills, such as coding style, modular design, testing, and debugging. In addition, they explore media computation topics, such as two-dimensional graphics drawing, human input, animation, and image processing.
Logistics
Audience
Normally available
Related courses
For official details, see the UW calendar.
Software/hardware used
Typical reference(s)
Required Preparation
At the start of the course, students should be able demonstrate a basic understanding of mathematical concepts. No programming background is expected.
Learning objectives
At the end of the course, students should be able to
Typical syllabus
Introduction (3 hours)
Drawing and attributes (3 hours)
Interaction and variables (3 hours)
Conditionals (3 hours)
Loops (6 hours)
Functions (3 hours)
Arrays (4.5 hours)
Objects and program design (4.5 hours)
Images, video, and libraries (6 hours)
General description
This course, together with its predecessor CS 105, offers a comprehensive introduction to practical computer programming to students who don’t have previous programming experience. While the main theme of CS 105 is to develop basic skills in imperative programming (variable declarations, control flow, defining functions, basic object-oriented programming), in CS 106 we explore more general applications of programming in contexts of interest to visual artists and designers.
Logistics
Audience
Normally available
Related courses
For official details, see the UW calendar.
Software/hardware used
Typical reference(s)
Required preparation
At the start of the course, students should be able to
Learning objectives
At the end of the course, students should be able to
Typical syllabus
Processing recap (3 hours)
Arrays (3 hours)
Strings (3 hours)
Input and output (3 hours)
Advanced shapes (3 hours)
User interfaces (3 hours)
Geometric context (3 hours)
Recursion and fractals (3 hours)
Randomness and noise (3 hours)
Text processing (3 hours)
Structured data processing (3 hours)
General description
Logistics
Audience
Normally available
Related courses
For official details, see the UW calendar.
Software/hardware used
Typical reference(s)
Required preparation
At the start of the course, students should be able to
No programming background is assumed.
Learning objectives
At the end of the course, students should be able to
Typical syllabus
An introduction to functional progamming (24 hours)
Data abstraction (7.5 hours)
Functional abstraction (4.5 hours)
General description
Logistics
Audience
Normally available
Related courses
For official details, see the UW calendar.
Software/hardware used
Typical reference(s)
Required preparation
At the start of the course, students should be able to
Learning objectives
At the end of the course, students should be able to
Typical syllabus
Introduction to imperative programming (15 hours)
More advanced concepts from imperative programming (15 hours)
Issues in Computer Science (6 hours)
This course covers the principles of program design and the fundamentals of computation through functional evaluation.
CS 135 is for students who would prefer a more conceptual treatment of introductory computer science in a simple language that is educationally effective but not commercially relevant. While the course is designed to be taken by those with no prior programming experience, students with prior experience will also find it relevant, due to its unusual focus. It is suitable for both CS majors and non-majors.
Antirequisites: CS 115, 121, 122, 123, 125, 131, 132, 133, 134, 137, 138, 145, CHE 121, CIVE 121, ECE 150, GENE 121, PHYS 139, SYDE 121
Successor: CS 136.
Used in course: Programs are written in subsets of the language Scheme. Student labs are equipped with the DrRacket integrated development environment running on networked personal computers. Versions for Windows, Mac OS, Unix/X and Linux are freely downloadable for use on computers owned by students.
How To Design Programs by Felleisen, Findler, Flatt, and Krishnamurthi, MIT Press, 2003. This book is available in its entirety on the Web, though students are encouraged to purchase a physical copy.
I-Clicker RF Response Remote (Required) .
Three hours of lecture per week, plus a tutorial. Available in Fall and Winter.
Numbers, arithmetic, function definition and composition, design recipes, conditional expressions, symbols.
Structure definitions, constructors, selectors, data definitions, type predicates, functions for mixed data.
Vocabulary and grammar of the beginning student language.
Definition of lists, designing functions to process and produce lists, recursive definition of natural numbers, recursive data definitions.
Multi-clausal recursive data definitions, trees, mutually referential data definitions, design methods for complex data, iterative refinement, multiplexing.
Encapsulation, block structure, binding, functional abstraction, filters, polymorphism, generic functions, parametric data definitions, functions as data, functions that produce functions, anonymous functions, abstract list and tree functions (definition and use).
Generative versus structural recursion, backtracking algorithms, accumulators and accumulative recursion.
Babbage, Hilbert, Godel, Church, Turing. Early development of electronic computers and programming languages. History of concepts covered in this course.
This course examines elementary data structures and algorithms using the functional and imperative paradigms of computation, and discusses issues surrounding the effective use of programming languages in “real-world” environments.
CS 136 is for Mathematics students who have taken CS 135.
Prerequisites: Full-time degree registration in the Faculty of Mathematics; CS 116 or at least 60% in CS 135 or CS 145 taken fall 2011 or later.
Antirequisites: CS 134, 137, 138, 145 taken fall 2010 or earlier.
Programs are to be written in Scheme and C. Student labs are equipped with the DrScheme integrated development environment running on networked personal computers. Versions for Windows, Mac OS, Unix/X and Linux are freely downloadable for use on computers owned by students. C programs will be compiled using Clang/LLVM in the RunC environment. gedit is recommended for use as an editor.
C Programming: A Modern Approach, 2nd edition by K.N. King (W.W. Norton & Company).
How To Design Programs by Felleisen, Findler, Flatt, and Krishnamurthi, MIT Press, 2001. This book is available in its entirety on the Web, though students are encouraged to purchase a physical copy.
Lecture slides will be made available online.
Three hours of lecture per week, plus a one-hour tutorial.
Mutation of identifier-value bindings in Scheme. Sequencing of statements. Basic I/O in Scheme. State encapsulation (primitive objects). Semantics of structure and list mutation in Scheme. Box-and-pointer diagrams.
The memory model. Variable declaration, assignment and infix expressions in C. Basic I/O in C. Compilation. Pointers, addresses, garbage collection, and memory reuse in Scheme. Modelling functions, procedures, and recursion in C. The limits of recursion in C. Loop constructs.
O-notation. Analysis of simple programs in Scheme and C. Logarithmic-time list operations. Vectors/arrays in Scheme and C and their uses. Linear and binary search. Hash tables and their uses. Pointers and strings in C.
Structures in C. Memory allocation and deallocation. Lists and queues in C. Safety and usability issues.
Information hiding in Scheme. A module system. Libraries. Definition and implementation of ADTs. Separate compilation in C. Overview of approaches to abstraction and code reuse in other languages (Java, C++, ML, Haskell).
History of concepts covered in this course.
This course introduces software engineering students to elementary data structures, and to the functional programming paradigm.
Level 1A Software Engineering undergraduates. It is assumed that students have experience developing well-structured, modular programs.
Antirequisites: CS 115, 135, 136, 145, CHE 121, CIVE 121, ECE 150, GENE 121, PHYS 239, SYDE 121
Successor: CS 138.
Used in course: An integrated development environment (IDE) for C++ (such as xCode for Mac OS X).
C Programming: A Modern Approach 2nd ed. Author: K.N. King
Three hours of lecture per week, plus a two-hour lab and a one-hour tutorial. Normally available in Fall only.
Review of hardware and software, problem solving and programming, including declarations, selection and looping constructs, I/O.
Functions. Scoping. Parameter passing, by value and by reference. Top-down design. Programming with stubs.
Arrays. Structures. Arrays of structures. Multidimensional arrays. Appropriate choice of data structures. String processing and tokenization.
Introduction to recursive procedures and functions.
Introduction to O-notation, space and time efficiency, and complexity.
Algorithm design and efficiency, through discussion of of elementary sorting algorithms (insertion sort, selection sort) and advanced sorting algorithms (mergesort, quicksort, heapsort).
Introduction to pointers, memory allocation and deallocation, singly and doubly-linked lists.
Babbage, Hilbert, Godel, Church, Turing. Early development of electronic computers and programming languages. History of concepts covered in this course.
CS 138 Introduction to Data Abstraction and Implementation
Objectives
This course introduces Software Engineering students to elementary data structures and their implementation, and to the object-oriented programming paradigm.
Intended Audience
Software Engineering undergraduates who have taken SE 1A. It is assumed that students have experience programming in an imperative language such as C or C++.
Related Courses
Prerequisite: CS 137
Antirequisites: CS 116, 135, 136, 145, 146
Successor: CS 241.
Hardware and Software
Used in course:
References
Schedule
Three hours of lecture per week, plus a one-hour tutorial. Normally available in Winter only.
Outline
Introduction (3 hours)
Operating system and Unix concepts, programming language concepts.
Introduction to C++ concepts (3 hours)
C++ basics, basic types, IO, use of simply library elements (string, vector).
ADT and their implementations as linked structures (12 hours)
The stack, queue, and priority and queue ADTS; the linked list, sorted linked list; Trees, binary trees, binary search trees; the C/C++ memory model: pointers vs references, stack vs freestore; implementing and travesing linked structures; recursion and stack frams; recursive vs iterative solution to ADTs; space and time complexity of solutions; simple testing and debugging strategies.
Object-based computing (9 hours)
Interface vs implementation; class definitions, instantiation, object construction and destruction; object vs pointers to objects; interface design and abstraction, responsibility allocation; the adapter design pattern.
Introduction to object-oriented programming (9 hours)
Introduction to inheritance and its implementation in C++; introduction to generics, type parameterization, and C++ templates; the template method design pattern; use of generic data containers and the Standard Template Library; design heuristic and strategies for object-oriented programming.
CS 146: Elementary Algorithm Design and Data Abstraction (advanced version)
(Emphasized text represents additional material not found in CS 136.)
Goals
Logistics
Intended for 1B students in the Faculty of Mathematics. Normally available Winter.
Related courses (see calendar for official details)
Predecessors: CS 145 with a grade of at least 75%.
Successors: CS 246, CS 245, CS 251.
Conflicts: CS 116, 136, 137, 138, 145 taken fall 2010 or earlier.
Software used: Racket (dialect of Scheme), Unix-like development environment (Linux, OS X, Cygwin), C compiler.
Typical Reference(s)
C Programming: A Modern Approach (second edition) by K.N. King (W.W. Norton & Company).
The C Programming Language (second edition) by B. Kernighan and D. Ritchie (Prentice-Hall).
Required preparation
A mark of 75% or greater in CS 145. Students who complete CS 145 with a mark of less than 75% may apply for instructor consent to take CS 146. Students who complete CS 135 with an outstanding record may also apply for instructor consent. Prior experience in imperative programming (in particular using C or C++) will be considered in such requests, but will not be the main criterion; aptitude is still of primary importance.
Learning objectives
At the end of the course, students should have the ability to:
Typical syllabus
Introduction to C and elementary mutation in Scheme
Command-line interfaces. The memory model. Variable declaration, assignment and infix expressions in C. Basic I/O in C. Compilation. Mutation of identifier-value bindings in Scheme. Modelling functions, procedures, and recursion in C. Loop constructs. Algorithm analysis in C. File I/O in C and Scheme. Program organization and testing methods.
Memory management
Structures in C. Memory allocation and deallocation. Mutable structures, sharing, and garbage collection in Scheme. Space analysis in C and Scheme.
Mutable ADTs
Mutable lists, queues, deques, and trees in C. Time-space tradeoffs among mutable and immutable ADT implementations.
Low-level abstractions
Pointer arithmetic in C. Arrays in C and vectors in Scheme. Search, sorting, and graph algorithms revisited. Strings in C. Elementary hashing. Bitwise operations. Processing binary data. Libraries in C and Scheme.
Implementing high-level abstractions
Interpreting Scheme in C. Compiling Scheme to C. Compiling to virtual machines.
General description
This course examines important concepts underlying major personal computer application categories and the application of those concepts to problem solving. Students discover how to efficiently use word processing, graphics, and database applications and they develop some basic intra/inter-application scripting skills. The course also covers some basic system administration.
Logistics
Audience
Normally available
Related courses
For official details, see the UW calendar.
Software/hardware used
Typical reference(s)
Required preparation
At the start of the course, students should be able to
Learning objectives
At the end of the course, students should be able to
Typical syllabus
Methodology (3 hours)
System administration (3 hours)
Structured word processing (3 hours)
Vector and pixel graphics (6 hours)
Networking and the internet (3 hours)
Scripting (6 hours)
Relational databases (9 hours)
Social media (3 hours)
General description
This course introduces hardware and software concepts used in computer systems. Specific topics include machine-level programming, memory organization, and basic I/O mechanisms.
Logistics
Audience
Normally available
Related courses
For official details, see the UW calendar.
Software/hardware used
Typical reference(s)
Required preparation
At the start of the course, students should be able to
Learning objectives
At the end of the course, students should be able to
Typical syllabus
Introduction (2 hours)
Assembly language (8 hours)
Data representation and arithmetic (4 hours)
Compiling and linking (4 hours)
Basic processor design (4 hours)
Memory and I/O devices (6 hours)
Multiprocessing (6 hours)
Operating systems (2 hours)
General description
This course introduces various algorithmic and heuristic techniques that can be employed to solve a wide variety of problems using a computer. Students learn both the advantages and the pitfalls of translating a real-world problem into a formal specification, and consider the subsequent steps of choosing one or more paradigms, analyzing the algorithms, and implementing them. Specific paradigms taught include exhaustive search, divide and conquer, greedy, and dynamic programming approaches. Students who successfully complete the course can use these approaches to design and develop efficient programs for a wide variety of applications.
Logistics
Audience
Normally available
Related courses
For official details, see the UW calendar.
Software/hardware used
Typical reference(s)
Required preparation
At the start of the course, students should be able to:
Note: The course uses Python for its programming examples and assignments. Students will be expected to have background in an imperative programming language; materials detailing Python syntax will be provided.
Learning objectives
At the end of the course, students should be able to
Typical syllabus
Basic concepts (7 hours)
General approaches (18 hours)
Hardness (3 hours)
Beyond hardness (5 hours)
CS 234: Data Types and Structures
General description
This course introduces widely used and effective methods of data organization, focusing on data structures, their algorithms, and the performance of these algorithms.
Students learn how the choice of a data structure affects the performance and usability of applications, e.g., in web browsing and searching, computer databases, data analysis, text processing, etc. Specific topics include lists, stacks, queues, sets, maps, priority queues, trees, and graphs, together with general algorithmic techniques, such as sorting, searching, and other transformations on data. Students who successfully complete the course can use these tools to design and develop efficient programs for a wide variety of applications.
Logistics
Audience
Normally available
Related courses
For official details, see the UW calendar.
Software/hardware used
Typical reference(s)
Required preparation
At the start of the course, students should be able to
Note: The course uses Python for its programming examples and assignments. The necessary syntax and idiom will be presented at the start of the course as a review for those who know Python and an explanation for those who don’t. Experience in other common imperative languages, such as C or Java, will suffice.
Learning objectives
At the end of the course, students should be able to
Typical syllabus
Basic concepts (12 hours)
Note: Each student should find some parts of this material as new and some as review depending on their background.
Sorting algorithms (3 hours)
Stacks, queues, and priority queues (4 hours)
Map (or Dictionary) ADT (9 hours)
Graphs (5 hours)
Minimum spanning trees as a case study of algorithms and data structures (3 hours)
General description
This course introduces widely used and effective methods of data organization, focusing on data structures, their algorithms, and the performance of these algorithms. Specific topics include priority queues, sorting, dictionaries, and data structures for text processing.
Students will learn to
Logistics
Audience
Normally available
Related courses
For official details, see the UW calendar.
Software/hardware used
Typical reference(s)
Required preparation
At the start of the course, students should be able to
Analytical:
Computational and algorithmic:
Learning objectives
At the end of the course, students should be able to
In addition to the above language-independent skills, students should be able to apply (code, debug, and test) any of the above structures and algorithms in C++, using appropriate design methodologies and language features. Students should be prepared to transfer these abilities to other languages (once learned).
Typical syllabus
Introduction and review (3 hours)
Stacks, queues, and priority queues (3 hours)
Sorting and analysis of randomized algorithms (5 hours)
Search trees (5 hours)
Hashing (5 hours)
Range search and multidimensional dictionaries (5 hours)
Algorithms and data structures for text processing (8 hours)
General description
This course introduces students to basic UNIX software development tools and object-oriented programming in C++ to facilitate designing, coding, debugging, testing, and documenting medium-sized programs. Students learn to read a specification and design software to implement it. Important skills are selecting appropriate data structures and control structures, writing reusable code, reusing existing code, understanding basic performance issues, developing debugging skills, and learning to test a program.
Logistics
Audience
Normally available
Related courses
For official details, see the UW calendar.
Software/hardware used
Typical reference(s)
Required preparation
At the start of the course, students should be able to:
Learning objectives
At the end of the course, students should be able to:
Typical syllabus
Shell (4 hours)
C++ (16 hours)
Unix tools (8 hours)
Software engineering (8 hours)
CS 247: Software Engineering Principles
General description
This course introduces systematic methods for designing, coding, testing, and documenting medium-sized programs. Major topics include abstraction, modularity, software modeling, object-oriented programming and design, generic programming, and testing and debugging.
Logistics
Audience
Normally available
Related courses
For official details, see the UW calendar.
Software/hardware used
Typical reference(s)
Required preparation
At the start of the course, students should be able to
Learning objectives
At the end of the course, students should be able to
Typical syllabus
Module Design (12 hours)
Object-Oriented Design and Programming (12 hours)
Software Engineering and Tools (5 hours)
Generic Programming (5 hours)
General description
This course enables students to develop an accurate mental model of the architecture and organization of physical computers and it introduces them to theoretical and practical concepts relevant to the structure and design of modern digital computers. The course also helps students understand and predict the behaviour and performance of computer programs executing on real machines.
Logistics
Audience
Normally available
Related courses
For official details, see the UW calendar.
Typical reference(s)
Required preparation
At the start of the course, students should be able to
Learning objectives
At the end of the course, students should be able to
Typical syllabus
Introduction (2 hours)
Digital logic design (6 hours)
Data representation and manipulation (6 hours)
Basic processor design (5 hours)
Pipelining (5 hours)
Input/Output (3 hours)
Memory Hierarchies (3 hours)
Multi-processing (3 hours)
Watch a video introduction to this course on YouTube.
Objectives
To study efficient algorithms, effective algorithm design techniques and approaches to handling situations in which no feasible algorithms are known. The course is intended to give the student experience in program design and to emphasize both pragmatic and mathematical aspects of program efficiency.
Intended Audience
CS 341 is a required course for all CS major academic plans and is normally completed in a student’s 3B term. A course in algorithms and algorithm design is considered essential for all Computer Science graduates. CS 234 is available for students in other plans and covers a subset of the topics of this course and CS 240.
Related Courses
Prerequisites: CS 240 and (MATH 239 or 249); Computer Science students only.
Antirequisites: SE 240, SYDE 423.
Cross-listed as: CM 339
Successors: CS 466.
References
Introduction to Algorithms, 3rd ed., by T. Cormen, C. Leiserson, R. Rivest, and C. Stein, McGraw-Hill, 2009.
Schedule
3 hours of lectures per week. Normally available in Fall, Winter and Spring.
Notes
Outline
Introduction and Analysis of Algorithms (6 hours)
Review of previously encountered algorithm design approaches including divide and conquer. Solution of basic recurrence relations arising in such methods. The notions of average case and worst case behaviours.
Algorithm Design Techniques (15 hours)
A systematic study of design methods including greedy algorithms, dynamic programming, approaches to exploring graphs, backtracking, and branch and bound. Application of these techniques to a variety of problems commonly occurring in practice. Implementation of some examples and discussion of related issues.
Undecidability and Intractability (15 hours)
Algorithmically reducing one problem to another as a means of developing algorithms and proving lower bounds. The undecidability of the halting problem. Proving other problems undecidable via reductions. Reductions between decision and optimization problems. The idea of polynomial time and its independence of many machine models. The classes P and NP and their relationship. Polynomial reducibility and NP-Completeness. A selection of NP-hard problems and proofs of this status.
Watch a video introduction to this course on YouTube.
This course introduces advanced control-structures with an emphasis on concurrency and writing concurrent programs at the programming-language level. Programming techniques and styles are examined to express complex forms of control flow, such as multi-level loop exit, exceptions, coroutines, and concurrency.
Logistics
Audience
Normally available
Related courses
For official details, see the UW calendar.
Software
Typical reference(s)
Required preparation
At the start of the course, students should be able to
Learning objectives
At the end of the course, students should be able to
Typical syllabus
Advanced control flow (3 hours)
Coroutines (4 hours)
Concurrency (3 hours)
Mutual exclusion (4 hours)
Locks (4 hours)
Concurrency errors (3 hours)
High-level concurrency (8 hours)
Other concurrency approaches (3 hours)
Optimization (2 hours)
Distributed environments (2 hours)
Revised March 3, 2015
Watch a video introduction to this course on YouTube.
This course covers the basic concepts and elements of database management by providing a “classic” introduction to the relational data model and its languages. The course also covers database design methodology.
Students gain experience using and building applications on top of a state-of-the-art commercial DMBS by completing several assignments. Students also gain hands-on experience with commercial database management systems (DBMS) by writing application programs using the commercial DBMS query languages. The main course topics are data models, architecture of database systems, data definition and manipulation languages, database design methods, and the theory of data dependencies and relational normalization.
For official details, see the UW calendar.
At the start of the course, students should be able to
At the end of the course, students should be able to
Watch a video introduction to this course on YouTube.
General description
This course introduces contemporary user interfaces, including the basics of human-computer interaction, the user interface design/evaluation process, and the architectures within which user interfaces are developed. Students implement and evaluate portions of typical user interfaces in a series of programming assignments.
Logistics
Audience
Normally available
Related courses
For official details, see the UW calendar.
Software/hardware used
Typical reference(s)
Required preparation
At the start of the course, students should be able to
Learning objectives
At the end of the course, students should be able to
Typical syllabus
Event architecture (4 hours)
Design patterns (4 hours)
Components and interactor trees (4 hours)
Algorithms for user interaction (4 hours)
2D graphics (4 hours)
People and the human-machine interface (6 hours)
UI specification (4 hours)
Special topics (6 hours)
General description
This course introduces operating systems, what they do, how they are used, and how they are implemented.
Logistics
Audience
Normally available
Related courses
For official details, see the UW calendar.
Software/hardware used
Typical reference(s)
Required preparation
At the start of the course, students should be able to
Learning objectives
At the end of the course, students should be able to
Typical syllabus
Operating system introduction (2 hours)
Multi-programming (7 hours)
Concurrency (6 hours)
Memory management (8 hours)
Device management (3 hours)
File systems (5 hours)
Interprocess communication (5 hours)
Watch a video introduction to this course on YouTube.
General description
This course introduces the theoretical foundations of Computer Science.
Logistics
Audience
Normally available
Related courses
For official details, see the UW calendar.
Software/hardware used
Typical reference(s)
Required preparation
At the start of the course, students should be able to
Learning objectives
At the end of the course, students should be able to
Typical syllabus
Finite automata (10 hours)
Context-free grammars (10 hours)
Turing machines (9 hours)
Undecidability (7 hours)
Watch a video introduction to the course on YouTube.
General description
This course introduces students to the basic algorithms, software environments, and applications of scientific computing. Simple but realistic examples are used to motivate the study of numerical methods.
Logistics
Audience
Normally available
Related courses
For official details, see the UW calendar.
Software/hardware used
Typical reference(s)
Required preparation
At the start of the course, students should be able to
Learning objectives
At the end of the course, students should be able to
Typical syllabus
Floating point numbers (3 hours)
Interpolation (6 hours)
Ordinary differential equations (9 hours)
Discrete Fourier analysis (9 hours)
Numerical linear algebra (9 hours)
Watch a video introduction to the course on YouTube.
General description
This course introduces computational mathematics through an in-depth study of the properties of numerical algorithms.
Logistics
Audience
Normally available
Related courses
CS 371 may be substituted for CS 370 in any degree plan or for prerequisite purposes
For official details, see the UW calendar.
Software/hardware used
Typical reference(s)
Required preparation
At the start of the course, students should be able to
Learning objectives
Typical syllabus
Floating point number systems (3 hours)
Polynomial interpolation (4 hours)
Nonlinear equations (4 hours)
Numerical linear algebra (11 hours)
Discrete Fourier analysis (11 hours)
Numerical integration (3 hours)
General Description
An introduction to principles, algorithms, protocols, and technology standards used in computer networks and distributed systems. Specific topics include resource management, naming and routing, and reliability.
Logistics
Intended for 3rd- or 4th-year students with an interest in Computer Science. Not open to Computer Science students. Normally available Winter.
Related courses (see calendar for official details)
Predecessors: One of CS 230, 241, 246 or 251; not open to Computer Science students.
Conflicts: CS 454, 456, ECE 428, 454.
Hardware/Software used: UNIX, any programming language.
Typical References
James F. Kurose and Keith W. Ross, Computer Networking: A Top-Down Approach,Addison-Wesley.
Andrew S. Tanenbaum and Maarten Van Steen. Distributed Systems: Principles and Paradigms, Prentice Hall.
Required preparation
At the start of the course, students should have the ability to
Learning objectives
At the end of the course, students should have the ability to:
Typical syllabus
Physical and data link layer (6 hours)
media types, encoding, error correction, medium access control
Network layer (6 hours)
hierarchical addressing, forwarding, routing algorithms
Transport layer (6 hours)
reliable data transfer, connection management, rate control
Naming and mobility (3 hours)
indirect naming, name resolution, transparency, handover
High-level services (6 hours)
RPC, message queueing, clocks & synchronization, replication
Security and Privacy (3 hours)
confidentiality, integrity, availability
Operations and applications (3 hours)
email, web, multimedia
Watch a video introduction to this course on YouTube.
This course examines foundational issues in contemporary programming languages, including abstraction mechanisms, operational semantics, type systems, and extensibility.
For official details, see the UW calendar.
At the start of the course, students should be able to
At the end of the course, students should be able to
Topics chosen by the instructor to extend and/or complement the above. Possible choices include, but are not limited to:
Watch a video introduction to this course on YouTube.
This course introduces students to the requirements definition phase of software development. It discusses processes, models, and notations, and processes for software requirements elicitation, identification, analysis, modeling, representation, specification, and validation. An important component is a group project: the software requirements specification of a large software system.
For official details, see the UW calendar.
Typical reference(s)
At the start of the course, students should be able to
At the end of the course, students should be able to
Watch a video introduction to this course on YouTube.
To introduce students to the software design process and its models. Representations of design/architecture. Software architectures and design plans. Design methods. Design state assessment. Design quality assurance. Design verification. Group design and implementation of an application.
CS 446 is a course for CS major students and is normally taken in a student’s 4A term. This course is one of three that form the basis for the software engineering option. This option will be for students specializing in the development of large software systems. Students from other plans in Computer Science may elect to enrol in this course.
Prerequisites: CS 350; Computer Science students only.
Antirequisites: CS 430, SE 464.
Related courses: CS 445, CS 447.
Cross-listed as: ECE 452.
Used in Course: C/C++, Tcl/Tk.
Assumed Background: UNIX, SDT, Rose, C/C++. Familiarity with graphical user interface tools would be an asset.
3 lecture hours, 1 tutorial hour, and 1 discussion hour (for project group meetings). Normally available in Winter and Spring.
Why design? Input, output, and constraints of the design process. Types of design. Relationship to software quality and evolution. Design in more mature implementation technologies.
Design as search. Design spaces. Design state, goal structure, generative design operations, early quantitative evaluations, control of design process. Basic models of design (transformational, plan/architecture driven). Relationship to other life-cycle activities.
What should be represented (structure, behaviour)? Informal representations of design, examples of design notations. Formal representation of design. Domain specific architecture descriptions. Role of standards, reference architectures. Design documentation.
Review of small/medium scale plans (data structures, programming language structures, concurrency). Plans/architectures for common types of software systems (translators, embedded, real-time, user interface).
Design strategies. Selected methods: object modeling technique, structured design, real-time, user interfaces. Methods for design with off-the-shelf components.
Assessment dimensions and factors affecting their relative importance. Design tradeoffs. Evolvability/understandability criteria. Design complexity metrics. Assessment strategies (analytical, simulation, rapid prototyping), example: response time/throughput estimation.
Design reviews, scenarios and test cases, testing of executable design representations. Verification of properties.
To introduce students to systematic testing of software systems, software verification, symbolic execution, software debugging, quality assurance, measurement and prediction of software reliability, project management, software maintenance, software reuse, reverse engineering.
CS 447 is a course for CS major students, and is normally taken in a student’s 4B term. This course is one of three that form the basis for the software engineering option. Students from other plans in Computer Science may elect to enrol in this course.
Prerequisites: CS 350; Computer Science students only.
Antirequisites: SE 465.
Related courses: CS 445, CS 447.
Cross-listed as: ECE 453.
Used in Course: Rational Rose, SDL, X-Runner, ITEX.
Assumed Background: Strong familiarity with UNIX, C/C++ and Tcl/Tk.
Software Testing, by Paul C. Jorgensen, CRC Press, 1995. Course notes.
3 lecture hours, 1 tutorial hour, and 1 discussion hour (for project group meetings). Normally available in Winter.
Overview of the maintenance and testing activities within the software life cycle. Brief introduction to project related CASE tools and necessary background.
Major maintenance activities. Estimating maintenance costs and productivity. Predicting maintainability with software quality metrics. Economics and expectations of software reengineering. Principles of software reuse and reverse engineering techniques.
Cost estimation. Project scheduling. Specification of work units.
Introduction, examination of various quality/complexity metrics. Software availability. Measurement and prediction of software reliability.
Software verification, correctness proofs, symbolic execution, walkthroughs, inspections.
Testing strategies, including unit level, path and dataflow testing, domain testing, decision tables, and state-based testing. Coverage metrics. Impact of object-oriented testing. Effort, efficiency, and effectiveness concerns.
Integration (decomposition based, bottom-up, top-down, call graph based, path based, MM paths and atomic system functions). Validation and system testing (data, action, port, event and thread testing, structural and functional approaches, operational profiles). TTCN test suites.
Watch a video introduction to this course on YouTube.
The objective of this course is to introduce students to fundamentals of building a database management system (DBMS), in particular a relational one. It focuses on the database engine core technology by studying topics such as storage systems (data layout, disk-based data structures), indexing, query processing algorithms, query optimization, transactional concurrency control, logging and recovery. It complements CS348 by looking at the internals of relational DBMSs.
This is a second course on databases that focuses on DBMS internals. It is a project-oriented course that will provide the students, upon successful completion, with an appreciation of the intricacies and complexities of a DBMS and enable them to be able to design and implement the major components of it. The course objective will be achieved by focusing on three fundamental sub-objectives:
Complementary to the above objectives, the course has a training component where the students will gain experience, within the context of a number of assignments, in building components of a DBMS and incorporating them into an open source system such as MySQL or PostgreSQL. The lectures may be complemented by guest lectures on real-life DBMS implementation issues given by colleagues from industry (Sybase, IBM Canada, Microsoft and others).
CS 448 is a course for CS major students, and is normally taken in a student’s fourth year. This course will be of interest to students whose area of expertise includes large software systems. CS 338 is available for students in other plans.
Prerequisites: CS 348 and (CS 350 or SE 350). Computer Science students only.
Database Management Systems, 3rd ed., by R. Ramakrishnan and J. Gehrke, McGraw-Hill, 2003. Course notes are required (may be made available via the web).
3 hours of lectures per week. Normally available in Winter.
Fundamentals of relational databases, relational calculus, relational algebra, integrity issues.
Data layout, buffer systems, file management, indexing techniques (tree-based and hashing).
Query processing methodology, view expansion, query translation, implementation of relational operators, external sorting, cost-based query optimization.
Transaction models, concurrency control algorithms, database recovery.
Implementation of catalogs and integrity constraints.
Watch a video introduction to this course on YouTube.
Goals
Human-Computer Interaction teaches the fundamental issues that underlie the creation and evaluation of usable and useful computational artifacts. Over the term, students will learn how to design novel computational artifacts that enable a well-defined user group to achieve specific goals more effectively than via current means. More specifically, students will learn and directly apply:
Students will also be introduced to major threads of HCI research.
Logistics
Related courses
Prerequisites: CS 240 241; Level at least 3B; Computer Science students only.
Successors: CS 349
Conflicts: SYDE 348
Calendar description
Hardware/software used: N/A.
Typical references:
Contextual Design, by Beyer and Holtzblatt
Interaction Design, by Preece, Rogers, and Sharp
Human-Computer Interaction, by Dix, Finley, Abowd and Beale
Designing the User Interface: Strategies for Effective Human-Computer Interaction, by Shneiderman and Plaisant
Required Preparation
The primary requirement for this course is experience in school, managing projects, and working. In particular, time management and communication skills (written, oral, and visual) are essential for success in this course. Thus, students with 3+ years of experience with courses at Waterloo (especially project-based courses), and experience with co-op positions, should fare well.
Learning Objectives
By the end of the course, students should have the ability to:
Typical Syllabus
Watch a video introduction to this course on YouTube.
This course provides students with an appreciation of modern computer design and its relation to system architecture, compiler technology, and operating system functionality. The course focuses on design that is based on the measurement of performance and its dependency on parallelism, efficiency, latency, and resource utilization.
For official details, see the UW calendar.
At the start of the course, students should be able to
At the end of the course, students should be able to
Multiprocessors, synchronization, cache coherency, memory consistency, chip multiprocessors, simultaneous multithreading, transactional memory
Watch a video introduction to this course on YouTube.
Students design and implement a real-time multi-tasking operating system using the tools and techniques of real-time programming for embedded systems. Implementation uses cross-compilation for an ARM-based system-on-chip. The operating system then supports an application program involving process control, data acquisition, and communication.
*Enrollment may be limited due to lab room capacity.
For official details, see the UW calendar.
At the start of the course, students should be able to
*Students develop programs to run on an Intel microcomputer system. Programs are written and cross-compiled on a host computer running UNIX and downloaded for execution on the microcomputer system. No prior knowledge of the Intel architecture is assumed and documentation is provided.
At the end of the course, students should be able to
Students design and implement an application, running on their operating system, that controls several trains doing independent tasks while sharing a single track. Students gain knowledge of the following:
This course provides an introduction to the fundamentals of distributed computer systems, assuming the availability of facilities for data transmission. The structure of distributed systems using multiple levels of software is emphasized.
CS 454 is a course for CS major students and is normally completed in the fourth year.
Prerequisites: CS 350 or SE 350; Computer Science students only. CS 456 is not a prerequisite, but it is useful to be familiar with the information it provides about the underlying facilities assumed in this course.
Distributed Systems – Principles and Paradigms,2nd Edition, by A.S. Tanenbaum and M. van Steen, Prentice Hall, 2002. (Required)
Distributed Systems – Concepts and Design, 4rd ed., G. Coulouris, J. Dollimore, and T. Kindberg, Addison Wesley, 2001.(Optional)
3 hours of lectures per week. Normally available in Winter, and Spring.
Clock synchronization, partial order of events, election algorithms, agreement algorithms, distributed shared memory, process synchronization.
Naming and name resolution; name, directory, and file servers; caching.
Locking and concurrency control, deadlock handling, stable storage, two-phase commit.
Encryption, public and private keys, authentication, privacy.
File transfer, electronic mail, World-Wide Web.
Some of: Mach, Amoeba, OSF DCE, CORBA, DCOM.
This course introduces the fundamentals of network architectures and protocols and focuses on protocols used in the Internet.
At the start of the course, students should be able to:
At the end of the course, students should have the ability to:
Watch a video introduction to the course on YouTube.
To provide an in-depth understanding of the basic techniques for system performance evaluation. Emphasis will be placed on the application of these techniques to computer systems and networks.
This course is for CS majors.
Prerequisites: (CS 246 or 247) and (STAT 206 or 231/ 241); Computer Science students only.
The Art of Computer Systems Performance Analysis, by R. Jain, John Wiley & Sons, 1991. Course notes are required.
3 hours of lectures per week.
Performance metrics. Steps in a performance study. Evaluation techniques: analytic modeling, simulation, and measurement.
Workload characterization. Performance monitors. Benchmarking.
Queuing and non-queuing models. Event scheduling approach. Random number generators. Generation of random variates.
Fundamental results in queuing systems. Model validation technique.
Input parameter estimation. Steady state and transient results. Replication. Statistical analysis of output data.
Single server queue. Network of queues. Scheduling disciplines. Resource utilization. Response time analysis.
Examples from computer systems and networks.
Watch a video introduction to this course on YouTube.
This course introduces students to security and privacy issues that affect various aspects of computing, including programs, operating systems, networks, databases, and Internet applications. The course examines the causes of security and privacy breaches and provides methods to help prevent them.
For official details, see the UW calendar.
At the start of the course, students should be able to
At the end of the course, students should be able to
Watch a video introduction to this course on YouTube.
Building on CS 360, this course discusses more advanced topics in formal languages and automata theory, including applications, compiler writing, and parsing methods.
For official details, see the UW calendar.
At the start of the course, students should be able to
At the end of the course, students should be able to
Watch a video introduction to this course on YouTube.
This course continues the discussion of algorithms started in CS 341. Whereas CS 341 focuses on worst-case behaviour of deterministic algorithms, in this course students are exposed to algorithmic approaches and methods for assessment that reflect a broad spectrum of criteria.
The particular problems and algorithms studied will be chosen by the instructor from application areas such as computational geometry, algebraic algorithms, distributed and parallel algorithms, machine learning, and other areas of active research.
CS 466 is normally taken in a student’s fourth year. Those interested in the more mathematical aspects of writing good programs will find this course to be of value.
Prerequisites: CS 341; Computer Science students only.
Successors: Graduate courses in algorithms and computational complexity.
Introduction to Algorithms, 3rd ed., by Thomas Cormen, C. Leiserson, R. Rivest, C. Stein, MIT Press, 2009.
3 hours of lectures per week. Normally available in Fall and Spring.
Algorithms that rely on random bits; Las Vegas and Monte Carlo algorithms.
Analyzing sequences of operations whose individual costs differ widely; the accounting and potential methods. Possible topics: Fibonacci heaps; The “union-find” data structure.
Decision trees. Information theory lower bounds. Adversary arguments.
Techniques for creating approximation algorithms. Problems for which good approximations cannot be obtained.
Algorithms in which each request must be serviced before the subsequent request is received. The k-server problem.
May include specialized models of computation, Kolmogorov complexity, derandomization, and other tools to support the application areas chosen by the instructor.
Watch a video introduction to this course on YouTube.
CS 475 covers four major topics: solving special linear systems, least squares problems, eigenvalue problems, and singular value decomposition. The course introduces students to mathematical concepts and numerical methods used for solving mathematical problems and to the implementation of algorithms in a high-level programming language framework.
For official details, see the UW calendar.
At the start of the course, students should be able to
At the end of the course, students should be able to
Watch a video introduction to this course on YouTube.
The course introduces students to the design of algorithms that enable machines to “learn”. In contrast to the classic paradigm where machines are programmed by specifying a set of instructions that dictate what exactly a machine should do, a new paradigm is developed whereby machines are presented with examples from which they learn what to do. This is especially useful in complex tasks such as natural language processing, information retrieval, data mining, computer vision and robotics where it is not practical for a programmer to enumerate all possible situations in order to specify suitable instructions for all situations. Instead, a machine is fed with large datasets of examples from which it automatically learns suitable rules to follow. The course will introduce the basics of machine learning and data analysis.
For official details, see the UW calendar.
At the start of the course, students should be able to
At the end of the course, students should be able to
This course introduces the most well known bioinformatics problems and the algorithms behind their solutions. These problems include sequence alignment, large-scale sequence database search, evolutionary tree reconstruction, gene prediction, and protein sequencing. Students explore the underlying computational techniques and skills to solve similar problems.
For official details, see the UW calendar.
At the start of the course, students should be able to
At the end of the course, students should be able to
Required Background
Assessment
Typical course offerings will have four or five assignments (60% of grade) and a final project (40% of the grade).
Each assignment will each contain a written and a programming component. The programming components will be small (eg., completing an existing program), but will require significant exploration of the algorithms presented in lectures. In particular, students will be expected to explore a wide range of input data and paramater settings to determine where algorithms succeed and where they fail.
The final project will allow the student to explore a topic of their own choosing in detail. The scope is wide, ranging from image processing to artificial intelligence, but students will be required to implement specific algorithm(s) on their own and perform a detailed evaluation of their performance. They will also be required to perform their own research and write a comprehensive report. The students may elect to present their material for partial credit towards the report requirement. Students may choose a project related to their interest (hobby or work term) and/or research area (graduate students). A list of topics and past projects will be provided to students on request. Graduate students will typically do the same assignments but will be expected to produce a project with a substantial research component.
Overall goals
General guidelines
This course will generally have the same core material (see Outline below) but problems and applications may be specialized to the instructor or students’ interests.
Resources
Most classes will be lectures, involving blackboard work for mathematical derivations, slide presentations to show graphical concepts, and in-class demonstrations using Matlab. Some time will be devoted to students presenting their projects at the end of term.
The course may use the following textbooks (in order of importantce, with relevant topics listed in italics):
Finally, there are a number of online resourses, including research papers, data sets and sample code. A good starting point is the “Computer Vision Homepage” at www.cs.cmu.edu/~cil/vision.html.
Outline Topics
Core Material (required)
Some typical topics (vary with instructor/class)
Watch a video introduction to this course on YouTube.
Machine learning is a fast growing topic for both commercial applications and academic research. It addresses the issue of how computers can “learn”, that is, how the process of drawing useful conclusions from massive data sets can be automated. Machine learning plays a central role in a wide range of applications emerging from the need to process data sets whose sizes and complexities are beyond the ability of humans to handle. The course will cover the theoretical foundations and the design of algorithms for machine learning. It draws from several established mathematical areas including statistics, geometry, combinatorics, and computational complexity.
CS 485 is a course for Computer Science, Software Engineering and Math major students, and is normally completed in a student’s fourth year. The course should be relevant for all students who are interested in computational statistics, data mining, information retrieval, artificial intelligence, natural language processing, computer vision, computation finance, bioinformatics and health informatics where it is common to analyze massive data sets or it is desirable to design adaptive algorithms.
Related courses (see calendar for official details)
Predecessors: CS 341 and (STAT 206 or 230 or 240).
Typical Reference(s)
Christopher Bishop, Pattern Recognition and Machine Learning (2006) Shai Ben-David & Shai Shalev-Shwartz, Machine Learning: From Theoretical Principles to Practical Algorithms (in preparation)
Introduction to machine learning
Theoretical foundation
e.g. learning theory and Bayesian learning
Classification
Regression
Dimensionality reduction
Specific models/algorithms
e.g., naive Bayes, decision trees, neural networks, kernel methods, support vector machines, ensemble learning
Watch a video introduction to this course on YouTube.
This course introduces students to the fundamental problems of artificial intelligence and the basic models and algorithms used to tackle these problems. Students examine frontier areas of computer science and gain knowledge that will allow them to further their studies in artificial intelligence.
For official details, see the UW calendar.
At the start of the course, students should be able to
At the end of the course, students should be able to
Watch a video introduction to the course on YouTube.
This course is an introduction to the use of computers for symbolic mathematical computation, which involves such traditional algebraic (as opposed to numerical) computations as solving linear equations (exactly), analytic differentiation and integration of functions, and analytic solution of differential equations. The course is designed to expose students to the programming languages and data structures used for symbolic computation, the concepts from modern algebra which are applied to the development of algorithms for symbolic computation, and various applications of symbolic computation.
CS 487 is normally completed in a student’s fourth year.
Prerequisites: CS 234 or 240 or SE 240; Honours Mathematics or Software Engineering students only.
Cross-listed: CM 433
Algorithms for Computer Algebra, by K. Geddes, S. Czapor and G. Labahn, Kluwer Academic Publishers, 1992.
3 hours of lectures per week. Normally available in Winter.
Symbolic versus numeric computation. History of systems for symbolic computation.
Rings, integral domains, Euclidean domains, fields, quotient fields, finite fields.
The need for simplification. Normal forms for polynomials. Data structures for integers and polynomials. Rational functions and power series.
Homomorphisms. Chinese remainder algorithm and interpolation. The Hensel construction.
Generalizations of the Euclidean algorithm for multivariate polynomials. Modular algorithms. Hensel techniques. Heuristic techniques.
Berlekamps method. Hensel techniques. Heuristic techniques.
Variations of Gaussian elimination. Modular techniques. Systems of polynomial equations.
Hermite/Rothstein method for rational functions. The Risch algorithm for transcendental and algebraic functions.
Watch a video introduction to this course on YouTube.
This course gives students a solid background in 3-D graphics techniques for use as a tool in more advanced applications. A major part of the course involves hands-on activities using an interactive graphics workstation.
Enrolment may be limited due to availability of graphics equipment.
For official details, see the UW calendar.
At the start of the course, students should be able to
At the end of the course, students should be able to