This course will enrich the participants on how functional programming can reduce unintended complexity and create code bases that are simpler to maintain and reason about. Functional programming is a paradigm, which focuses on values and pure functions rather than mutable objects and imperative statements. Since good code design is intersubjective, we need to be open-minded and continuously reflect upon the decisions we make. Together we will reflect on the design choices made and the dilemmas that will arise. We will learn that there are often multiple solutions, each often having their benefits and drawbacks. By gaining experience, we will acquire empirical knowledge, intuition and sensors for avoiding unintended complexity, creating appropriate abstractions and a sustainable code base. Class will consist of a lot of live coding, code-reviews and a dialog on how we can improve our architectural design and knowledge.
Topics include code quality, readability, maintainability, collaboration, version control system (git), global state, dependencies, pure functions, persistent data structures, data consistency, single source of truth (SSOT), reactive programming, web development, functional programming and comparison with object oriented programming, designing for testability, documentation, state management, atomic updates, concurrency, dynamic types, DSLs, lisp and REPL. The concepts are not limited to a specific programming language. We will use Clojure and ClojureScript to realize the ideas in the specific project. Hence, also rigorous abilities in lisp, repl workflow and Clojure/ClojureScript will be an outcome of the course. For each week there will be a video talk from programming conferences that will serve as inspiration and give us the opportunity to reflect. The videos will be posted when the course starts.
Grading: no pass/fail option,
no fifth course option
a semester-long programming project, and midterm and final presentations
CSCI 136, and at least one of CSCI 237, 256, or 334
current or expected Computer Science majors
The course will involve a programming project that emphasizes quantitative/formal reasoning skills.