Computer ScienceCore20 min read

Introduction to Software Development

The stages between an idea and working software, and why skipping one is expensive

This topic appears in:

01

Why software needs a process at all

A program written by one student over a weekend needs no process. A system built by twenty people over two years, which a hospital will depend on, needs one — because the expensive mistakes are made long before any code is written.

The software development life cycle is the sequence of stages a project passes through. Different models arrange them differently, but the stages themselves are common to all of them.

StageWhat happensWhat goes wrong if skipped
Requirementsfind out what is actually neededyou build the wrong thing perfectly
Analysiswork out what the system must dorequirements stay vague and untestable
Designdecide the structure before codingthe code grows unmanageable
Implementationwrite the code
Testingfind the faultsthe customer finds them instead
Deploymentput it into real useit works only on the developer's machine
Maintenancefix, adapt and improvethe system decays and is abandoned

The cost of a fault multiplies at every stage

A misunderstood requirement caught during the requirements stage costs a conversation. Caught during testing, it costs rewriting the affected code. Caught after deployment, it costs an emergency release, retraining users and repairing whatever the fault did in the meantime. The estimates vary but the shape never does: the later a fault is found, the more it costs to fix, and that is the entire argument for the earlier stages.

02

Gathering requirements

This is the stage students find least interesting and the one that decides whether the project succeeds. The developer is rarely the person who will use the software, and what a user asks for is often not what they need.

The techniques are the same as in data gathering: interviews with the people who will use it, observation of how the work is done now, questionnaires for a large group, and examining existing documents such as the forms currently filled in by hand.

  • Functional requirements — what the system must do. "The system shall calculate each student's attendance percentage."
  • Non-functional requirements — how well it must do it. Speed, reliability, security, usability. "The report shall be produced within five seconds."
  • Requirements must be testable. "The system should be fast" cannot be checked; "each page loads within two seconds" can.
  • They must be agreed in writing, or the argument about what was promised happens after the work is done.

Watch what people do, not only what they say

Ask a clerk how they process an application and you get the official procedure. Watch them and you find the sticky note listing the four exceptions, and the second spreadsheet nobody mentioned. Observation catches the parts of the job people have stopped noticing they do — and those are exactly the parts a new system breaks.

03

Waterfall and iterative models

The waterfall model runs the stages strictly in order: each is completed and signed off before the next begins. It is simple to manage and produces thorough documentation, and it works when the requirements genuinely are known in advance and will not change — a system replacing a well-understood manual process, or one with legal requirements fixed by statute.

Its weakness is that the customer sees nothing working until the end. If the requirements were misunderstood, that becomes apparent at the point where change is most expensive.

Iterative and agile models instead build a small working version, show it to the customer, and repeat. Each cycle produces something usable, so misunderstandings surface within weeks. The cost is less predictability about the final scope and lighter documentation, which some projects cannot accept.

WaterfallIterative / agile
Order of stagesstrictly sequentialrepeated in short cycles
Customer sees working softwareat the endevery cycle
Handles changing requirementsbadlywell
Documentationextensivelighter
Suitsstable, well-understood requirementsuncertain or evolving requirements
04

Testing, and what "tested" means

Testing does not prove software correct — it finds faults. A program can pass every test and still contain one, which is why the choice of tests matters more than their number.

Test at several levels. Unit testing checks one function in isolation. Integration testing checks that units work together, which is where most faults actually appear. System testing checks the whole thing against the requirements. Acceptance testing is done by the customer, who decides whether it does what they asked for.

For each test, choose data deliberately: normal values, boundary values at the edges of what is allowed, and erroneous values that must be rejected cleanly rather than crashing.

Worked example

A field accepts a student's age, which must be between 11 and 19. Give suitable test data and explain each choice.

  1. Normal: 15. Should be accepted.Confirms the ordinary case works before testing anything clever.
  2. Boundary: 11 and 19. Both should be accepted.The limits themselves are inside the allowed range, and off-by-one errors show up here.
  3. Boundary: 10 and 20. Both should be rejected.The values just outside catch a condition written with > instead of >=.
  4. Erroneous: "fifteen", −5, and an empty field.Each must produce a clear message rather than a crash. An empty field is the one most often forgotten.

Normal 15; boundary 11, 19, 10, 20; erroneous text, negative and empty.

Before you leave this chapter

  1. Requirements, analysis, design, implementation, testing, deployment, maintenance.
  2. The later a fault is found, the more it costs — which is the argument for the early stages.
  3. Functional = what it does; non-functional = how well. Both must be testable.
  4. Waterfall suits stable requirements; iterative suits uncertain ones.
  5. Testing finds faults, it does not prove correctness. Test normal, boundary and erroneous data.
05

What "fix it early" actually costs

Every argument for spending time on requirements and design rests on one claim: a fault gets more expensive the longer it survives. It is worth seeing the shape of that, because the growth is not gradual.

Move the slider to After release. The same misunderstanding now costs roughly a hundred times the conversation that would have prevented it — and that multiplier is the entire justification for the stages before coding.

Why the last step is so much worse

After release the repair is not just a code change. The fault must be diagnosed from a user's description rather than a test result, an emergency release must be prepared and distributed, users retrained, and any data the fault corrupted repaired. Each of those is work that simply does not exist when the same mistake is caught in a design meeting.

Practice questions

6 questions · 20 marks · full working on every one

Try each one on paper first, then open the working. The marks are shown where they are actually awarded, because that is where they are actually lost.

Short questions

3 · 6 marks

Two marks each, in the style of the short-question section of the paper. Answer in two or three lines.

SQ1[2 marks]
Name the stages of the software development life cycle.
Model answer

Requirements gathering, analysis, design, implementation, testing, deployment and maintenance. Different models order or repeat them differently, but these are the stages every project passes through.

Examiner tip. Maintenance is the stage most often omitted, and it is usually the longest and most expensive part of a system's life.

SQ2[2 marks]
Differentiate between functional and non-functional requirements, with an example of each.
Model answer

A functional requirement states what the system must do — "the system shall calculate each student's attendance percentage". A non-functional requirement states how well it must do it — "each report shall be produced within five seconds".

Examiner tip. Both examples should be written as testable statements. "It must be user-friendly" is a non-functional requirement written badly, because nothing can be checked against it.

SQ3[2 marks]
Why is a fault found after deployment more expensive than one found during design?
Model answer

By deployment the fault is embedded in written code that other parts depend on, users have been trained on the incorrect behaviour, and any damage it caused must also be repaired. During design it costs only a change to a document before anything was built on it.

Examiner tip. Name at least two of the additional costs. "Because it is harder to fix later" restates the question without explaining it.

Solved numericals

2 · 8 marks

Full working, one step per line, with the marks shown where they are awarded.

N1[4 marks]
Compare the waterfall and iterative models, giving one situation in which each is preferable.
Full working
  1. Waterfall completes each stage fully and signs it off before the next begins; iterative repeats the stages in short cycles[1]
  2. In waterfall the customer sees working software only at the end; in an iterative model they see something usable every cycle[1]
  3. Waterfall suits a project whose requirements are fully known and stable — replacing a well-understood manual process, or a system whose rules are set by law[1]
  4. Iterative suits a project whose requirements are uncertain or likely to change, since misunderstandings surface within weeks rather than at the end[1]

Sequential and documented against cyclic and adaptable; waterfall for stable requirements, iterative for uncertain ones.

Examiner tip. Neither model is simply better. The mark is for matching the model to the situation, so always give the condition under which each wins.

N2[4 marks]
A login field accepts a password of 8 to 16 characters. State four items of test data, naming the type of each.
Full working
  1. Normal: a 12-character password — acceptedcomfortably inside the range[1]
  2. Boundary: 8 characters and 16 characters — both acceptedthe limits are inside the allowed range[1]
  3. Boundary: 7 characters and 17 characters — both rejectedcatches > written instead of >=[1]
  4. Erroneous: an empty field — rejected with a clear message rather than a crashthe empty case is the one most often missed[1]

Normal 12; boundary 8, 16, 7, 17; erroneous empty.

Examiner tip. Boundary testing means the values immediately either side of the limit, and the limits themselves. Testing only 12 and 100 misses every off-by-one error there is.

Long questions

1 · 6 marks

Theory and numerical together, as they appear in the long-question section.

LQ1[6 marks]
A school asks a developer to build a system to record and report student attendance.
  1. Describe two techniques for gathering the requirements, and what each would reveal.
  2. Give one functional and one non-functional requirement for this system.
  3. Explain why acceptance testing must be carried out by the school rather than the developer.
Mark scheme
  1. Interviews with teachers and office staff, revealing what information they need and what the current process cannot do[1]
  2. Observation of the register being taken, revealing the exceptions and workarounds people no longer notice they use — late arrivals, half days, tripsobservation catches what interviews miss[1]
  3. Functional: "the system shall calculate each student's attendance percentage for a chosen date range"a specific, testable action[1]
  4. Non-functional: "a monthly report for a class of 40 shall be produced within five seconds"measurable, so it can be tested[1]
  5. Acceptance testing decides whether the system does what the customer actually asked for, so only the customer can judge it[1]
  6. The developer tests against their own understanding of the requirements — which is precisely what may have been wrong from the startthe circularity is the point[1]

(a) interviews for needs, observation for the unspoken exceptions (b) attendance percentage; report within five seconds (c) only the customer can say whether it does what they meant

Examiner tip. The reason acceptance testing belongs to the customer is that a developer testing their own understanding cannot detect a misunderstanding. Saying that explicitly earns the final mark.