The biggest problem in the development and maintenance of large-scale software systems is complexity — large systems are hard to understand. [Out of the Tar Pit, by Moseley and Marks, 2006]. A major part of this complexity is accidentally created when we introduce and manage state. 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. In a functional language, state management is typically pushed to the boundary of the program. Since well design of code is intersubjective we need to have a good dialogue together in the course. We need to be open-minded, share our perspectives and experiences, and continuously reflect upon our own and others experiences. By gaining experience, we will acquire empirical knowledge, intuition and sensors for avoiding unintended complexity, creating appropriate abstractions and a sustainable code base. We will use the principle of single source of truth with atomic updates. On the course web, you can see what the library re-frame states upon those concepts.
Choose semester and course offering
Choose semester and course offering to see current information and more about the course, such as course syllabus, study period, and application information.
Content and learning outcomes
The lectures consist of much live coding, practical guidance, code-review and dialogue around how we can improve the architecture and design of the program code. This requires an active participation and an open positive atmosphere during the lectures. The idea of the lectures is to enthuse and broaden the perspectives around large-scale software development.
The lectures are compulsory, since the course is based on our joint dialogue and the active participation that is included in it.
Main contents: functional programming, code quality, readability, maintainability, cooperation, version management (git), global state, dependencies, mathematical functions, persistent data structures, handling of the state of applications, reactive programming, web development, testability, test as documentation, comparison with object-oriented programming, atomic updating of state, concurrency, DSL, LISP and REPL.
The programming languages Clojure and ClojureScript are used to realize the course content in a project. Thereby, the course will also give solid knowledge in LISP Clojure, Clojure Special and REPL workflow.
Every week, the students will be shown a video with a conference presentation. The idea is that it should give inspiration and open new doors. During the lectures, we will reflect on the contents.
Intended learning outcomes
After passing the course, the student shall be able to
- design, using functional programming, large systems so that they become easier to test, understand and manage
- model information in a program using only immutable data
- reflect on and discuss how architecture and design can be improved
- reflect on the concepts identity, state and value
- design entities and components so that they become easy to test and write tests for them
- protect internal design of a program at integration with other systems
- develop a program in collaboration with other developers
- review and reflect on given source code,
- maintain given source code
in order to
- understand and master the parameters in software development that make source code sustainable, re-usable and flexible during changing requirements.
The course consists of lectures (with requirements of at least 80 percent attendance) and work in project groups of three students.
Literature and preparations
Knowledge in software development technology, 6 higher education credits, equivalent to completed course DD2480/DD1367/DD1369/DD1392/DD1393/DD1346/DD1387/DD1388/DD2387/IV1303/H I1027/HI1201/DD1385/DD2385. Active participation in a course offering where the final examination is not yet reported in LADOK is considered equivalent to completion of the course. Being registered for a course counts as active participation. The term 'final examination' encompasses both the regular examination and the first re-examination.
Examination and completion
If the course is discontinued, students may request to be examined during the following two academic years.
- PRO1 - Software Engineering Project, 7.5 credits, grading scale: P, F
Based on recommendation from KTH’s coordinator for disabilities, the examiner will decide how to adapt an examination for students with documented disability.
The examiner may apply another examination format when re-examining individual students.
Opportunity to complete the requirements via supplementary examination
Opportunity to raise an approved grade via renewed examination
- All members of a group are responsible for the group's work.
- In any assessment, every student shall honestly disclose any help received and sources used.
- In an oral assessment, every student shall be able to present and answer questions about the entire assignment and solution.
Further information about the course can be found on the Course web at the link below. Information on the Course web will later be moved to this site.Course web DD2489
Main field of study
The course is replacing DD2487 and cannot be combined with it.
In this course, the EECS code of honor applies, see:
This course contains a group project. Course registration after the official registration period is therefore not possible, since we need to create the groups in the beginning of the course.