An in-depth programming course for individuals with prior programming experience. Through extensive programming exercises, we will cover many computer science concepts and their applications to large problems. Since programming exercises can and will take a significant amount of time, plan your workload/signups on other demanding courses accordingly.

The goal of the course is to build the ability to construct large and complex software. One of repeated themes in the course is top-down design or its more sophisticated forms of contract-driven and test-driven development. The course covers functional programming in Haskell, proceeds with asynchronous programming in NodeJS and Typescript, and concurrent and parallel programming in Go.

In functional programming, the focus of the course is 1) top-down design and how to break problems, 2) how to avoid unnecessary variables, 3) how to treat and pass around computation like data, and 4) how to solve complicated problems using recursion.

In asynchronous programming, the focus of the course is 1) to understand fundamentals of event-driven systems, 2) designing programs around events, and 3) building an event-driven system using lambdas, closures, and continuations. Web applications will be discussed to understand the concepts of client-server application design and to see a real example of an event-driven system.

In concurrent programming, the focus of the course is 1) to understand the necessity to write multithreaded programs and the intrinsics of modern multithreaded computers, 2) to design applications around threads and to convert simple algorithms to parallel algorithms, 3) to be able to understand and fix multithreading issues, and 4) combining event-driven and functional features with multithreaded programming.
Office Hours:

Tue/Thu 12:15–1:15pm SSE G-120A

Sameed Ali, TA
Office Hours:

Friday 11am–12pm, CS Student Lounge

Jehangir Kazi, TA
Office Hours:

TBD, CS Student Lounge

Fatima Tariq, TA
Office Hours:

TBD, CS Student Lounge

Course Information

Class meetings

Tue/Thu 11am–12:15pm, SSE 9-B2 and 4–5:15pm, SSE 10-201


CS 200 / EE 201

Required text



20%Assignments (There will be bonuses but total assignment marks cannot be more than 20. Plagiarism will be forward to DC. No late submissions accepted at all.)
70%Lab examinations (3 lab exams)
10%Attendance (Excluding the first 2 classes, you get 2/10 for attending 20 classes, 4/10 for 21, 6/10 for 22, 8/10 for 23, and 10/10 for attending all 24 classes. Attending a class means you are present from start of class to end of class.)

Tentative Schedule


Stack & Heap


Functional Programming in Haskell

Higher order functions

Types and Lambdas


Type classes


Functional I/O

No class in lieu of Exam 1.

Last day to drop this course is Feb 24 (Tentative).


Overview of Networks and protocols

Overview of web development

Asynchronous Event-driven programming

Javascript, Typescript, and nodeJS

Last day to withdraw from this course is Mar 10 (Tentative).

Asynchronous web server

Asynchronous client server programming

Mid-Semester Break

Mid-Semester Break

Asynchronous file operations

Variable capturing in closures

No class

No class in lieu of Exam 2.


Parallel architecture

Parallelism and Concurrency

Introduction to Go

Parallel Algorithms

Concurrency and Mutual Exclusion

Threads, Locks, Monitors, and Channels

Communicating Sequential Processes

Overview and Future directions

Debugging, Performance, etc.

No class (Tentative)