[an error occurred while processing this directive] Software Engineering at Oxford | Domain Driven Design ( DDD ) [an error occurred while processing this directive]
DDD

Domain-Driven Design

Domain-Driven Design ("DDD") is a software design approach that focuses on the domain of the system rather than technology. There is an emphasis on building a shared mental model and representing that domain model in code in the simplest way possible. Technical details such as database storage, frameworks, etc., are considered to be secondary aspects of the design. The module will focus on DDD and design in general and related topics, such as documentation and some aspects of software architecture. This course uses basic functional programming concepts to express the domain and design: types as documentation, and functions (and composition of functions) for implementation. Object-oriented equivalents and OO design patterns may also be introduced when appropriate.

Frequency

This course will run once a year.

Course dates

20th October 2025Oxford University Department of Computer Science - Held in the Department 0 places remaining.

Objectives

On completing the class, attendees will:

Contents

Understanding a domain:
the software development process; requirements, analysis, design; communication and feedback; use-cases, stories, workflows
Modelling a domain:
algebraic types and function types; inheritance, interfaces; request/response vs. input/output
Refining the domain:
using types to capture constraints; optional and sum types; identity, entities, value objects; refactoring
Modelling state and time:
state machines; invariants; commands and events; event sourcing; temporal interactions
Designing for errors:
total functions; “honest” function signatures; domain errors; modelling and composing error-generating functions; validation
Purity, I/O , and testing:
database-centric vs. domain-centric architectures; stateful vs. stateless designs; determinacy and unit testing; moving IO to the edge; error recovery, transactions, compensation; immutable data, ledgers
Domain-driven designs and databases:
persistence to database or document-store; command-query separation; storing state machines in databases; snapshot storage, temporal databases, event sourcing; reporting
Partitioning and architecting a domain-driven design:
bounded contexts; context maps, the “reverse Conway manoeuvre”; public domain events vs. internal events; serializing domain objects; deployment (modular monolith, SOA/microservices, serverless)
Putting it all together:
review of all techniques; building a complete app, including requirements gathering, design, implementation, error handling, and database storage

Assessment criteria

The assignment is intended to determine, in order of decreasing importance:

Requirements

The course will require basic programming skills, such as use of an editor, use of git, etc. No prior knowledge of DDD or functional programming is required - all concepts will be introduced as needed within the course. It is not intended to cover functional programming in any depth; it is independent of but complementary to FPR.

The programming language used in this course is F#, as it supports both object-oriented and functional styles of programming. No prior experience of F# is needed.


[an error occurred while processing this directive]