Course description

This course teaches fundamental concepts in the design of computer programs, emphasizing the crucial role of abstraction. The goal of the course is to give students insight into the difference between programming and programming well. The same problem can be solved in different ways, and the different solutions can vary along multiple dimensions including correctness, efficiency, readability, scalability, and elegance. To emphasize the differing approaches to expressing programming solutions, students learn to program in a variety of paradigms—including imperative (familiar from CSCI E-50 but seen here in a more elemental form), functional, and object-oriented. The elegant multi-paradigm programming language OCaml is the ideal language for manifesting these ideas. Important ideas from software engineering and models of computation inform these different views of programming. Students should come out of the course better programmers in any language, but also better computational thinkers, with a much broader range of tools at their disposal and ability to analyze the quality of programs.

Instructors

You may also like