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 multithreaded programming in Java.

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. A recursive descent parser will be discussed to understand the concepts of parsing and to put recursion to good use.

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 continutations. A 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 multithreaded 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:

Mon-Thu 12:30-1pm, 9-120A

Aynoor Saleem, TA
Office Hours:

Mon 3-4pm, CS Student Lounge

Habiba Farrukh, TA
Office Hours:

Wed 1-2pm, CS Student Lounge

Huma Sibghat Siddiqui, TA
Office Hours:

Tue 4-5pm, CS Student Lounge

Sameed Ali, TA
Office Hours:

Fri 11am-12pm, CS Student Lounge

Course Information

Class meetings

Tue/Thu 11AM–12:15PM in SSE 9-B2


CS 200 / EE 201

Required text



30%Assignments (6 x 5%, tentative)
60%Lab examinations (4 x 15% lab exams)
10%Attendance (-2 for each class missed. Arriving late and leaving early is equivalent to missing.)


Academic dishonesty

You must not turn in work that is not yours. You must not enable someone else to turn in work that is not his or hers. Do not share your work with anyone else and adequately protect all your files. You must not allow someone to openly violate this policy because it diminishes your effort as well as that of your honest classmates.

Changing your exam answers after they have been graded, copying answers during exams, or plagiarizing the work of others will be considered academic dishonesty and will be subject to disciplinary penalties, including the possibility of failure in the course and/or dismissal from the University. Plagiarism detection software will be used on the programs submitted in this class.

Attendance & class decorum

Attendance is required and two marks will be deducted for every class missed. As per Computer Science Department policy, no one will be allowed in class after 5 minutes of scheduled start time. If you do not attend, do not expect me or any TA to repeat the material for you. Missing more than five classes will result in an F in the course.

Your behavior should not be disruptive during class and should not hinder in other students’ learning. In particular do not chat with your neighbors. Keep your cell phones turned off in class. You can use laptops to take notes but make sure they do not disturb anyone in your surroundings.

Late submissions & missed exams

All work must be turned in by electronic submission before the deadline (no e-mailed submissions). Do not submit at the last moment. If you submit your assignment late even by a second, it will not be considered.

Under exceptional situations (e.g. emergency medical), I may give extra days but under no circumstance, the extra days will be awarded after the deadline has already passed.

Petitions for missed examinations approved by the Office of Student Affairs will most likely receive an average score after a deduction according to their semester performance.

Tentative Schedule

1Tue 19 Jan

Stack & Heap

2Thu 21 Jan


3Tue 26 Jan

Functional Programming in Haskell

4Thu 28 Jan

Higher order functions

5Tue 2 Feb

Types and Lambdas

6Thu 4 Feb

Type classes

Exam 1 syllabus ends here.

7Tue 9 Feb


8Thu 11 Feb

Functional I/O

9Tue 16 Feb

Parsing and Lexical Analysis

10Thu 18 Feb

Recursive descent parsers

Last day to drop this course is Feb 19.

11Sun 21 Feb

Exam 1 (10am–4pm tentatively)

Tue 23 Feb

No class in lieu of Exam 1

12Thu 25 Feb

Graph problems

Exam 2 syllabus ends here.

13Tue 1 Mar

Asynchronous Event-driven programming

14Thu 3 Mar

Javascript and nodeJS

Last day to withdraw from this course is Mar 4.

15Sun 6 Mar

Exam 2 (10am–4pm tentatively)

16Tue 8 Mar

Asynchronous web server

Thu 10 Mar

No Class in lieu of Exam 2.

Tue 15 Mar

Mid-Semester Break

Thu 17 Mar

Mid-Semester Break

17Tue 22 Mar

Asynchronous client server programming

18Thu 24 Mar

Asynchronous file operations

19Tue 29 Mar

Variable capturing in closures

Exam 3 syllabus ends here.

20Thu 31 Mar

Multithreading and Parallelism

21Tue 5 Apr

Parallel algorithms

22Thu 7 Apr

More parallel algorithms

Tue 12 Apr

No class (Tentative)

Thu 14 Apr

No class in lieu of Exam 3

23Sun 17 Apr

Exam 3 (10am–4pm tentatively)

24Tue 19 Apr

Concurrency and Mutual Exclusion

25Thu 21 Apr

Locks and Monitors

26Tue 26 Apr

Functional Programming in Java

27Thu 28 Apr

Defensive programming

28Tue 3 May

Object oriented design

Thu 5 May

No class (Tentative)

29Fri 13 May

Exam 4 (TBD)