Software Process Engineering
Unit 1: Software Processes & Lifecycle Models
What is a Software Process?
A software process is an ordered set of activities aimed at producing a software product.
Key components:
- Activities — what is done (requirements, design, coding, testing)
- Roles — who does it
- Artefacts — what is produced
- Tools — what supports the work
Classic Lifecycle Models
- Waterfall — sequential phases; each phase finishes before the next begins
- Incremental — core product first, then added in increments
- Spiral — risk-driven; each loop refines requirements and design
- Unified Process (UP) — iterative, use-case driven, architecture-centric
The V-Model
The V-Model maps development phases to corresponding test phases:
- Unit Tests ↔ Component Design
- Integration Tests ↔ System Architecture
- System Tests ↔ Requirements Specification
- Acceptance Tests ↔ Business Requirements
Unit 2: Agile Development & Scrum
The Agile Manifesto (2001)
Individuals and interactions over processes and tools
Working software over comprehensive documentation
Customer collaboration over contract negotiation
Responding to change over following a plan
Scrum Framework
Scrum is the most widely used Agile framework.
Roles: Product Owner · Scrum Master · Development Team
Events: Sprint · Sprint Planning · Daily Scrum · Sprint Review · Retrospective
Artefacts: Product Backlog · Sprint Backlog · Increment
Lab 1: Git & Version Control View on GitHub
Introduction
Git is the de facto standard version control system. In this lab you will learn the core workflow used in professional teams:
- Commit — snapshot of your changes
- Branch — isolated line of development
- Merge / Rebase — integrate changes
- Pull Request — propose and review changes
Core Git workflow
# Initialise and make first commit
git init my-project
cd my-project
echo "# My Project" > README.md
git add README.md
git commit -m "Initial commit"
# Create and switch to a feature branch
git checkout -b feature/login-page
# After making changes...
git add .
git commit -m "Add login page HTML"
# Push branch and open a Pull Request
git push -u origin feature/login-page
Exercise 1.1 — Collaborative Workflow
Working in pairs:
- Fork the provided repository on GitHub
- Each person creates a different feature branch
- Make a small change on your branch and push it
- Open a Pull Request targeting
main - Review and approve your partner’s PR, then merge it
- Pull
mainand verify both changes are present
Lab 2: CI/CD with GitHub Actions View on GitHub
Continuous Integration
CI automatically builds and tests your code on every push, catching integration problems early.
A GitHub Actions workflow is defined in YAML and lives in .github/workflows/.
Simple CI workflow (.github/workflows/ci.yml)
name: CI
on:
push:
branches: [main, develop]
pull_request:
branches: [main]
jobs:
build-and-test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 22
cache: npm
- run: npm ci
- run: npm test
Exercise 2.1 — Add a Linting Step
Extend the provided workflow to:
- Run
npm run lintas an additional step after the tests - Configure the workflow to cache
node_modulesto speed up builds - Add a status badge to the project README that shows the current CI status
Verify the badge updates after you push a commit that passes CI.
Seminar 1: Code Quality & Technical Debt
What is Technical Debt?
Technical debt is the implied cost of future rework caused by choosing an easy solution now instead of a better approach.
Types of technical debt:
- Intentional — deliberate shortcuts to meet a deadline
- Unintentional — poor practices; lack of knowledge
- Bit rot — code that decays as its environment evolves
Code Quality Metrics
Key metrics for measuring code quality:
- Cyclomatic Complexity — number of independent paths through code
- Code Coverage — percentage of code exercised by tests
- Code Duplication — repeated logic (DRY principle)
- Coupling & Cohesion — how modules depend on each other
Activity: Refactoring Kata
You are given the Gilded Rose kata.
- Run the existing tests — they all pass
- Analyse the code: identify code smells and complexity issues
- Refactor the
updateQuality()method without changing behaviour - Add at least 5 new test cases to cover edge cases
- Measure cyclomatic complexity before and after using a static analysis tool