This repository contains the final project for the course DM571: Software Engineering at the University of Southern Denmark (SDU). The task was to develop a receipt-submission and approval system built as an MVP for a fictional company (Gravia Moribundas).
Note: This project's main focus was the software engineering process, not the code. The code here is the output of that process - the bulk of the actual work was reasoning about, applying and discussing core activities of the software development process in a written report. This README summarizes the main things we worked with.
- Requirements classification - based on a stakeholder interview we classified functional and non-functional requirements and translated it into a product backlog using user stories, organized with a story map.
- Stakeholder analysis - classified stakeholders as internal/external and mapped them using the Salience Model (Power / Legitimacy / Urgency).
- System design - modeled system flows with UML sequence diagrams (per user role) and a UML class diagram, and documented the architecture with C4 diagrams (context, container, component levels).
- API design - designed a REST API (OpenAPI 3.1.0 spec) for receipt submission and retrieval, including schema reuse and file-upload handling.
- Implementation - built the MVP as a Flask (Python) web app with a pragmatic MVC structure, SQLite storage, role-based access control (Flask-Login, Flask-Principal), and form handling/validation (WTForms).
- Architecture trade-offs - analyzed the current monolithic layered architecture's limitations and designed a migration path toward a three-tier and eventually microservices architecture.
- UX evaluation - ran a heuristic evaluation of the interface against Jakob Nielsen's 10 usability heuristics.
- Testing strategy - wrote a unit/integration test suite (pytest, Arrange-Act-Assert pattern, fixtures for test isolation) reaching 99% coverage, plus a critical discussion of what coverage and cyclomatic complexity metrics do and don't actually prove.
- Third-party integration - integrated the system with an external bank API for automated reimbursement, including designing the status-mapping and data-ownership assumptions between the two systems.
This course taught me a lot about the software development process and the many pros and cons of different processes and tools. The project gave me practical experience with:
- Agile & Scrum - running an iterative development process instead of a big-upfront-design (Waterfall) approach
- Users and requirements - turning a stakeholder interview into concrete requirements
- Estimation and planning - reasoning about backlog items using the INVEST criteria
- Sprints - treating the backlog as a living document
- Architectures - designing and documenting system architecture and reasoning through a concrete evolution path from monolith → three-tier → microservices
- Design patterns - applying MVC to structure the codebase, plus Distribution Patterns (Remote User Interface, Remote Database) for the planned architecture evolution
- Test - writing an isolated unit test suite and discussing what metrics like code coverage and cyclomatic complexity can and can't tell you about software quality
- UI - designing and evaluating a working prototype using UX heuristics (Nielsen's 10 usability heuristics)