Software Design & Development · Evaluation

SDD18 — Evaluation Criteria

📅 Thu 24 Sep 2026 · P3+P4 (double)
~120 minutes
Learning intentions
Success criteria
Warm up — recap from SDD17
Answer all three questions, then check your answers.
Question 1
What is a breakpoint tied to?
Question 2
What is a watchpoint tied to?
Question 3
What is a dry run?

Key vocabulary

Fitness for purpose
Whether a program actually does what it was designed to do, meeting its original functional requirements.
Efficient use of coding constructs
Whether appropriate, economical language features and algorithms were used, rather than unnecessarily wasteful or convoluted code.
Usability
Whether the program is easy for its intended end-user to use, understand, and interact with.
Maintainability
Whether the code is easy for a programmer (possibly not the original author) to read, understand, and safely modify later.
Robustness
Whether the program handles unexpected or invalid situations gracefully, without crashing.

Evaluating a finished program

Why evaluation is its own separate stage

A program that has passed every test in its test plan (SDD16) and has had its bugs found and fixed through debugging (SDD17) is working — but "working" and "good" are not automatically the same thing. Evaluation is the final stage of the analysis→design→implementation→testing→evaluation cycle, and asks a broader question than testing does: not just "does this specific test case pass," but "is this a genuinely well-built program overall?" Higher recognises five distinct, named criteria for answering that question.

Fitness for purpose

Fitness for purpose asks whether the program actually does what it was designed to do, judged directly against the functional requirements identified back in SDD2's analysis stage. This is the most fundamental criterion — a program can be efficient, easy to use, and robust, and still fail this criterion entirely if it simply doesn't do what was originally asked of it.

Efficient use of coding constructs

This criterion asks whether the program uses appropriate, economical language features to solve its problem, rather than unnecessarily wasteful or convoluted alternatives. Using a fully appropriate standard algorithm (SDD13–15) where one exists, rather than reinventing something more complicated, is a direct example of this criterion in practice.

Usability

Usability asks whether the program is easy for its intended end-user — not the programmer — to actually use: clear prompts, sensible input handling, and understandable output and feedback all contribute to this. A program can be perfectly correct internally and still score poorly here if a real user would find it confusing or unclear to interact with.

Maintainability

Maintainability asks whether the code itself is easy for a programmer — possibly not the original author, and possibly the same programmer returning to it much later — to read, understand, and safely change. Meaningful variable and function names, sensible use of comments, and a clear modular structure (SDD7's functions and procedures) all directly support this criterion.

Robustness

Robustness asks whether the program continues to behave sensibly when faced with unexpected, invalid, or edge-case situations, rather than crashing outright. This connects directly back to SDD16's erroneous test data and SDD15's edge-case discussion (an empty array, a boundary value) — a robust program anticipates these situations rather than being caught out by them.

Fitness for purpose
Does it do what it was designed to do? Judged against SDD2's functional requirements.
Efficient constructs
Are appropriate, economical language features and algorithms used?
Usability
Is it easy for the intended end-user to use and understand?
Maintainability
Is the code easy for a programmer to read and safely modify later?
Robustness
Does it handle unexpected or invalid situations without crashing?

Worked examples

Example 1 — Fitness for purpose
1
SDD14's original functional requirement was: findMinimum should return the smallest value in a given array.
2
The corrected version, initialising smallest to array[0], was confirmed in SDD14 to correctly return 15 for stockLevels. The originally-buggy version (initialising to 0) does not meet this requirement — SDD16/17 confirmed it incorrectly returns 0.
The corrected version is fit for purpose; the buggy version is not, despite running without crashing — fitness for purpose is about correctness against the requirement, not just "does it run".
Example 2 — Efficient use of coding constructs
1
Two ways to find the minimum of stockLevels:
def findMinimum(array):
    smallest = array[0]
    for i in range(1, len(array)):
        if array[i] < smallest:
            smallest = array[i]
    return smallest

def findMinimumInefficient(array):
    sortedArray = sorted(array)
    return sortedArray[0]
2
Both are confirmed by an actual Python run to return 15 for stockLevels — both are fit for purpose. But findMinimumInefficient sorts the entire array just to read off its first element, doing far more work than necessary to answer a question that only ever needed a single pass through the data.
findMinimum is the more efficient use of coding constructs — it solves the problem with the minimum necessary work, using the standard algorithm designed specifically for this task (SDD14), rather than a more roundabout, comparatively wasteful alternative.
Example 3 — Usability and maintainability
1
Two versions of SDD7's printItemDetails procedure:
Weaker usability & maintainability
def f(r):
    print(r.n)
    print(r.p)
    print(r.s)
Stronger usability & maintainability
# Prints a tuck shop item's
# details clearly for the end-user
def printItemDetails(item):
    print("Name:", item.name)
    print("Price:", item.price, "p")
    print("Stock:", item.stock)
Both versions produce broadly similar output and are equally fit for purpose. But the left version's single-letter names (f, r, n) and unlabelled output are poor for maintainability (unclear to any programmer other than perhaps the one who just wrote it) and poor for usability (an end-user sees three unlabelled numbers with no indication what each one means). The right version's descriptive names, comment, and labelled output score much better on both criteria.
Example 4 — A full five-criteria evaluation of calculateChange()
1
Evaluating SDD8's calculateChange(amountPaid, price) against all five criteria at once:
CriterionJudgement
Fitness for purposeMet — correctly returns 25 for calculateChange(100, 75), confirmed by an actual Python run.
Efficient use of coding constructsMet — a single subtraction is the minimal, appropriate operation for this task.
UsabilityPartial — the function itself has no direct user interaction; usability would depend on how its result is displayed to a till operator.
MaintainabilityMet — clearly named parameters (amountPaid, price) make its purpose immediately obvious.
RobustnessPartial — calculateChange(50, 75) returns -25 without crashing (confirmed by an actual Python run), but whether negative change should be specifically handled depends on unstated functional requirements (SDD16).
Now you try
findMinimum crashes with an IndexError if given an empty array, since array[0] doesn't exist. Which evaluation criterion does this most directly affect, and why?
⚠️ Common mistakes — examiner feedback
📝 Exam tip

When evaluating a program, always name the specific criterion being addressed and tie the judgement to concrete evidence from the code or its behaviour — a generic comment about code "being good" or "working well" earns little credit. If a question gives you a piece of code, look for evidence relevant to all five criteria, not just the one or two that seem most obvious at first glance.

Task Set A — Core questions

Task Set A — Core questions
Work through all questions, then check your answers.
Question 1
What term describes whether a program actually does what it was designed to do, judged against its functional requirements?
Question 2
What term describes whether code is easy for a programmer to read, understand, and safely modify later?
Question 3
What term describes whether a program handles unexpected or invalid situations without crashing?
Question 4
findMinimumBuggy runs without crashing but returns the wrong result (0 instead of 15). Which criterion does it fail most directly?
Question 5
A function uses single-letter variable names and has no comments. Which criterion does this most directly affect?
Question 6
What term describes whether a program is easy for its intended end-user to use and understand?
Question 7
Explain why findMinimumInefficient (which sorts the array first) is a weaker example of "efficient use of coding constructs" than findMinimum, even though both return the correct result. (3 marks)
Question 8
calculateChange(50, 75) returns -25 without crashing. Which of the five criteria is this result relevant to?
Question 9
Suggest one specific change that would improve findMinimum's robustness, and explain which criterion it targets. (3 marks)
Question 10
Explain why a complete evaluation of a program needs to address all five criteria separately, rather than giving one overall judgement. (4 marks)

Task Set B — Extension

Task Set B — Extension · Beyond the specification
Longer written answers — no auto-check. Discuss your answers with your teacher.
Extension 1
Suggest a situation where "efficient use of coding constructs" and "maintainability" might pull in different directions, and how a programmer might balance the two.
Extension 2
SDD19 and SDD20 will each build a complete mini-project including a full evaluation stage. Suggest what this means for how much work the evaluation stage of those projects will actually involve.
Extension 3
Suggest why usability might be harder to evaluate with confidence than the other four criteria, and what a more rigorous usability evaluation might involve.
📁 File this in OneNote under:
Higher Computing Science → Software Design & Development → SDD18
📌 Teacher notes — not for pupils

Single period. Final lesson before the two mini-projects (SDD19/20) — this is the last purely "content" lesson of the whole SDD unit; everything from here on applies what's already been taught.

Suggested timing: 5 min warm-up + vocab · 15 min notes + criteria-grid walkthrough · 20 min examples 1–4 (Example 4's full checklist table is the pedagogical centrepiece — consider working through it live as a class rather than just reading it) · 5 min "now you try" · remainder Task Set A; Task Set B as homework/extension.

Key misconception: pupils very reliably conflate usability and maintainability, since both sound like generic "good code" qualities — Example 3's side-by-side comparison exists specifically to make the distinction concrete (one is about the end-user, the other about a future programmer).

Deliberately reuses functions and bugs already established across the whole course (SDD7's printItemDetails, SDD8's calculateChange, SDD14/16/17's findMinimum) rather than introducing new code — the point of this lesson is applying a new lens to already-familiar material, not learning new syntax.

SQA command words covered: define, explain, evaluate, justify.