Resources
🛠️ Course Tools & Specifications 🔄 SDLC Guide 📖 Glossary
Year 12
🔒 Secure Software Architecture 🌐 Programming for the Web ⚙️ Software Automation 📋 Software Engineering Project
Year 11
📐 Programming Fundamentals 🧩 Object-Oriented Paradigm 🤖 Programming Mechatronics

📋 Software Engineering Project

Applying the software development lifecycle to address an identified real-world problem. Emphasising project-management, software design, and client collaboration.

📘 Year 12 — HSC 🕐 Major Project Outcomes: SE-12-01 to 09
Phase 1 🎯 Identifying and Defining

🎯 Identifying and Defining

🎯 (SE-12-01, SE-12-06)

📌 Define and analyse the requirements of a problem to ensure the software engineering solution is viable and purposeful.

📋 Problem Requirements

Before coding begins, a software engineer must define the core requirements (Outcome SE-12-01):

  • 🎯 Demonstrating needs or opportunities: Clearly identifying the real-world problem the software solves for the client.
  • 💰 Assessing scheduling and financial feasibility: Determining if the project can be completed within the allocated timeframe and budget.
  • 📝 Generating requirements: Defining functionality (what the system must do) and performance (how well/fast it must do it).
  • 🗄️ Defining data structures and types: Specifying how information will be securely collected and stored.
  • 🚧 Defining boundaries: Establishing the scope to prevent "scope creep" during development.

🛠️ Tools for Idea Generation & Solution Development

Explore the tools used to develop ideas and guide the project lifecycle (Outcome SE-12-06):

💡 Idea GenerationBrainstorming, mind-mapping, and Storyboards (Course Spec p. 9) to visualise user interfaces.
📋 Data DefinitionUtilising Data dictionaries (Course Spec p. 8) to select appropriate data types and formats.
💻 DevelopmentAlgorithm design (flowcharts/pseudocode), code generation, and rigorous testing and debugging.
🚀 Post-DevelopmentInstallation and ongoing maintenance procedures.

📐 Project Structure Chart

A structure chart breaks the software solution into its major components before coding begins. It shows how the top-level system is decomposed into modules, and how those modules relate to each other. The chart below illustrates a typical school library management system.

📐 Structure Chart — Library Management System

Top-down decomposition of the student project

The structure chart below shows how the Library Management System is decomposed into functional modules. Each module represents a separate responsibility, allowing the engineer to plan which functions to build first and how they interact.

Structure Chart: Library Management System
==========================================
                [Main Program]
               /        |       \
    [Book Module]  [Member Module]  [Report Module]
      /    |   \       /    \          |       \
[Add] [Search] [Return] [Register] [Update] [Loans] [Overdue]
  |       |        |
[Validate] [DB Lookup] [Fine Calc]

Purpose: Plan the modular breakdown of the project before writing any code.
Syllabus Link: SE-12-02, SE-12-06
Tip: Each box in the structure chart typically becomes a Python function or class method in your implementation.

🔍 Requirements Analysis

Requirements must be clearly categorised before development starts. ⚙️ Functional requirements describe what the system must do; ⚡ Non-functional requirements describe how well it must do it (quality attributes). Documenting both types ensures the solution is both complete and fit for purpose.

Type Requirement Example (Library System) Priority
Functional User registration A member must be able to create an account with their name, email, and student ID. Must Have
Functional Book search Users can search the catalogue by title, author, or ISBN and view availability. Must Have
Functional Loan management Staff can issue a loan, record a return, and calculate overdue fines automatically. Must Have
Functional Reporting Generate a report of all overdue books, sortable by due date or member name. Should Have
Non-Functional Performance Search results must return within 2 seconds for a catalogue of up to 10,000 books. Must Have
Non-Functional Security All passwords must be stored as bcrypt hashes; no plaintext credentials in the database. Must Have
Non-Functional Usability The interface must be operable by a new staff member with no training within 15 minutes. Should Have
Non-Functional Maintainability Code must include docstrings for all functions and follow PEP 8 style guidelines. Should Have

📝 User Stories and Acceptance Criteria

User stories capture requirements from the end-user's perspective in plain language. They follow the format: "As a [role], I want [feature], so that [benefit]." Each user story is accompanied by acceptance criteria — specific, testable conditions that confirm the story has been implemented correctly.

User Story Acceptance Criteria
As a library member, I want to search for books by title so that I can quickly check if a book is available.
  • Search returns results within 2 seconds
  • Results display title, author, and availability status
  • Partial title matches are returned (e.g., "Harry" returns all Harry Potter books)
  • A "no results found" message displays for unmatched queries
As a staff member, I want to issue a loan so that the member can borrow the book and a return date is recorded.
  • System prevents issuing a loan if member already has 5 active loans
  • Due date is automatically set to 14 days from issue date
  • Book availability status changes to "On Loan" immediately
  • A confirmation message is displayed on success
As an administrator, I want to generate an overdue report so that I can contact members with outstanding returns.
  • Report lists all loans where current date exceeds the due date
  • Report can be filtered by member name or overdue duration
  • Report can be exported as a CSV file
What Assessors Look for in Phase 1:
  • Clear problem statement: You must demonstrate a genuine real-world need that your software addresses — not just "I made an app because it's interesting."
  • Both requirement types: Assessors expect both functional AND non-functional requirements to be documented. Missing non-functional requirements is a very common mistake.
  • Client involvement evidence: Include meeting minutes, interview notes, or a survey summary showing you consulted a real or simulated client when gathering requirements.
  • Feasibility analysis: Address scheduling feasibility (can it be done in time?) and resource feasibility (do you have the tools and skills?) explicitly.
  • SMART requirements: Requirements should be Specific, Measurable, Achievable, Realistic, and Time-bound — avoid vague language like "the system should be fast."

Phase 2 🔬 Research and Planning

🚀 Software Implementation Methods

🎯 (SE-12-01)

📌 Investigate types of software implementation methods used when transitioning a client from an old system to a new solution (Outcome SE-12-01).

Method Investigation & Analysis
Direct (Big Bang) The old system is completely shut down and replaced by the new system instantly. High risk, but cost-effective if successful.
Phased The new system is introduced in stages or modules. Lower risk, as issues can be resolved per module, but implementation takes longer.
Parallel Both the old and new systems run simultaneously until the new system is proven stable. Safest method, but highly resource-intensive and costly.
Pilot The new system is trialled by a small subset of users (e.g., one department). Once refined, it is rolled out to the rest of the enterprise.

🧩 Case Study Matcher: Justifying Your Method

NESA highly values your ability to justify the method chosen for a specific scenario. Use the interactive examples below to match the scenario to the best implementation method.

Scenario 1: A hospital is upgrading its critical patient records database. The system cannot afford any downtime or lost data. Click to reveal method & justification
Method: Parallel
Justification: Parallel runs both systems simultaneously. This is the only acceptable method for critical life-safety systems, as it provides a fully operational fallback if the new system fails.
Scenario 2: A fast-food chain is rolling out new digital touchscreen ordering kiosks across 500 stores nationwide. Click to reveal method & justification
Method: Phased or Pilot
Justification: Pilot would involve testing in one store to catch bugs before a nationwide rollout. Phased would roll it out region by region to manage training and installation resources safely.
Scenario 3: A small local bakery is moving from a paper-based ledger to a simple iPad point-of-sale system on Monday morning. Click to reveal method & justification
Method: Direct
Justification: The size and complexity of the business are low. Direct implementation avoids the confusion of running two separate systems, and is the most cost-effective.

🏗️ Research and Planning: Development Approaches

🎯 (SE-12-01)

📌 Research and use standard software development approaches to structure the engineering lifecycle.

🌊 Waterfall Approach

A sequential model with a logical progression of steps. Stages flow downwards like 'falling water' (Requirements → Design → Implementation → Testing → Maintenance).

Pros: Highly documented, clear milestones.
Cons: Inflexible to changing requirements.
Scale: Best for massive, stable developments (e.g., government infrastructure).

🏃 Agile Approach

An iterative workflow focusing on the rapid rate of developing a final solution. Allows for method tailoring to adapt to evolving client needs.

Scale: Ideal for dynamic, medium-scale developments (e.g., commercial web apps) where requirements frequently shift.

🧬 WAgile Approach & Intervention

Research WAgile, understanding it is a hybrid model. It combines Waterfall's rigorous upfront planning with Agile's iterative coding.

Intervention: NESA requires you to analyze when and how intervention is applied. In WAgile, intervention is applied 'when' regulatory compliance requires strict phase-gate reviews (Waterfall style), but 'how' the code is written between these gates remains agile.
Scale: Complex enterprise developments.

WAgile Timeline: Agile sprints with Waterfall interventions

gantt title WAgile Development Timeline dateFormat YYYY-MM-DD axisFormat %m-%d section Waterfall Planning Requirements Doc (Intervention) :crit, req1, 2026-05-01, 7d Design Sign-off (Intervention) :crit, des1, after req1, 5d section Agile Sprints Sprint 1 (Frontend UI) :active, sp1, after des1, 10d Sprint 1 Review :milestone, m1, after sp1, 0d Sprint 2 (Backend API) :active, sp2, after sp1, 10d Sprint 2 Review :milestone, m2, after sp2, 0d Sprint 3 (Integration) :active, sp3, after sp2, 10d section Waterfall Deploy Final Security Audit (Intervention) :crit, aud1, after sp3, 5d Live Deployment :milestone, live, after aud1, 0d

📅 Project Management & Communication

🎯 (SE-12-05, SE-12-09)

📅 Project Management

Apply project management to plan and conduct the development of a software solution. This involves scheduling and tracking using software tools, notably 🛠️ Gantt charts (Course Spec p. 11), to allocate time to tasks, and using collaborative tools (e.g., GitHub, Jira) to track team progress (Outcome SE-12-09).

💬 Communication & Social Issues

Explore communication issues associated with project work. Engineers must prioritise involving and empowering the client through constant dialogue, enabling feedback during Agile iterations, and negotiating realistic deadlines and features (Outcome SE-12-09).

Furthermore, engineers must explore social and ethical issues, such as equitably dividing work when collaborating, acting professionally when working individually, and transparently responding to stakeholder concerns regarding data security (Outcome SE-12-05).

📊 Gantt Chart — Project Schedule

A Gantt chart is a horizontal bar chart that maps project tasks against a timeline. It visually shows the start date, duration, and end date of each task, and can indicate task dependencies (where one task must complete before another begins). In the SEP, your Gantt chart must cover all four project phases.

📅 Gantt Chart — Library Management System (10-Week Schedule)

Task scheduling across the four project phases

The Gantt chart below maps each project phase to a weekly timeline. Tasks are shown with their allocated week ranges. Critical dependencies (such as requirements being completed before design can begin) are reflected in the sequencing.

Gantt Chart: Library Management System — 10-Week Schedule
=============================================================
Task                          | Wk1 | Wk2 | Wk3 | Wk4 | Wk5 | Wk6 | Wk7 | Wk8 | Wk9 | Wk10
------------------------------|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----
PHASE 1 — Identifying & Defining
  Requirements gathering       | ███ | ███ |     |     |     |     |     |     |     |
  Problem definition           | ███ | ███ |     |     |     |     |     |     |     |
  Client consultation          |     | ███ | ███ |     |     |     |     |     |     |
PHASE 2 — Research & Planning
  System design (structure)    |     |     | ███ | ███ |     |     |     |     |     |
  Algorithm design (pseudocode)|     |     |     | ███ | ███ |     |     |     |     |
  Gantt & risk planning        |     |     | ███ | ███ |     |     |     |     |     |
PHASE 3 — Producing & Implementing
  Core module development      |     |     |     |     | ███ | ███ | ███ |     |     |
  UI/front-end implementation  |     |     |     |     |     | ███ | ███ |     |     |
  Integration & version control|     |     |     |     |     |     | ███ | ███ |     |
PHASE 4 — Testing & Evaluating
  Testing & bug fixing         |     |     |     |     |     |     |     | ███ | ███ |
  Client review & feedback     |     |     |     |     |     |     |     |     | ███ |
  Final report & submission    |     |     |     |     |     |     |     |     | ███ | ███
=============================================================
Key: ███ = Task active during this week

Purpose: Demonstrate realistic time allocation across all four project phases.
Syllabus Link: SE-12-05, SE-12-09
Tip: Tools like GanttProject (free) or the Table feature in Microsoft Word can be used to produce a professional Gantt chart for your project documentation.

⚠️ Risk Management

Risk management involves identifying potential threats to project success, assessing their likelihood and impact, and planning mitigation strategies in advance. A risk register is maintained throughout the project and updated as new risks emerge or existing risks are resolved.

Risk Likelihood Impact Risk Level Mitigation Strategy
Data loss due to hardware failure or accidental deletion Medium High High Use Git version control with daily commits; maintain an automated backup script to a secondary drive.
Scope creep — client requests additional features mid-project High Medium High Formalise requirements in a signed document at Phase 1; use a change request log to evaluate new features.
Technical skill gap — unfamiliarity with a required library Medium Medium Medium Allocate one week for research and prototyping; consult official documentation and tutorial resources early.
Time underestimation — tasks take longer than planned High Medium High Build a 1-week buffer into the schedule; prioritise core features using MoSCoW (Must, Should, Could, Won't) method.
Security vulnerability — SQL injection or authentication bypass Low High Medium Use parameterised queries for all database operations; implement input validation on all user-facing forms.
Client unavailability for feedback sessions Medium Low Low Schedule client meetings at least one week in advance; use asynchronous feedback methods (e.g., email surveys) as a fallback.

🎨 Storyboards and Wireframes

A storyboard visually maps the sequence of screens a user encounters when completing a task. A wireframe is a low-fidelity layout sketch of a single screen, showing the placement of UI elements without colour or detailed styling. Together, they allow client feedback on the interface before any front-end code is written.

Storyboard vs Wireframe — Key Differences:
  • Storyboard: Shows a sequence of interactions — e.g., the steps a user takes from the login screen to completing a book search. Think of it as a comic strip of your application's workflow.
  • Wireframe: Shows the layout of a single screen — where headers, navigation, input fields, and buttons are positioned. It does not include colour, fonts, or images.
  • Prototype: A clickable, interactive mock-up of the interface, often built in a tool like Figma or Canva. It simulates real user interaction without any back-end code.
  • Why include them: They demonstrate to assessors that you consulted the client about the UI before coding, which is a hallmark of professional software engineering practice.

📈 Data Flow Diagram (DFD)

A Data Flow Diagram (DFD) models how data moves through a system. It shows external entities (users or other systems), processes that transform data, data stores (databases or files), and the data flows connecting them. A Level 0 DFD (Context Diagram) shows the entire system as a single process with all external entities. A Level 1 DFD expands the main process into its sub-processes.

📊 DFD Notation — Level 0 Context Diagram (Library System)

External entities and the core system boundary

A Level 0 DFD (Context Diagram) shows the entire system as a single circle (process), with all external entities and the data flows between them and the system. It defines the system boundary — what is inside and outside the scope of the software.

Level 0 DFD — Library Management System (Context Diagram)
===========================================================

  [Library Member] ----search request---→ (Library Management System)
  [Library Member] ←---search results---- (Library Management System)
  [Library Member] ----loan request------→ (Library Management System)
  [Library Member] ←---loan confirmation- (Library Management System)

  [Staff Member]   ----return record----→ (Library Management System)
  [Staff Member]   ←---fine calculation-- (Library Management System)
  [Staff Member]   ----report request---→ (Library Management System)
  [Staff Member]   ←---overdue report---- (Library Management System)

  [Admin]          ----manage books-----→ (Library Management System)
  [Admin]          ←---system reports---- (Library Management System)

Key:
  [ ] = External Entity (outside the system boundary)
  ( ) = Process (the system itself)
  ----→ = Data Flow (direction of data movement)

Purpose: Define the system boundary and identify all external entities and data flows at the highest level.
Syllabus Link: SE-12-06
Next Step: A Level 1 DFD would expand the central process into sub-processes (e.g., Search Books, Issue Loan, Generate Report) with data stores (e.g., Books DB, Members DB).

Process Diary Tips — Phase 2:
  • Date every entry: Your process diary must show the chronological development of your project. Undated entries will not receive credit for demonstrating ongoing engagement.
  • Record decisions and reasoning: Don't just state what you did — explain why you chose one approach over another (e.g., "I chose a phased implementation because..."). This demonstrates higher-order thinking.
  • Include annotated screenshots: Annotate wireframes, Gantt charts, and planning documents to show your understanding of their purpose. A screenshot without annotation adds little evidence.
  • Record client feedback: Summarise every client interaction. Include what feedback was given and how you responded to it in your planning and design.
  • Reflect on setbacks: Note when tasks took longer than expected and how you adjusted the schedule. This demonstrates project management competency.

🛡️ Quality Assurance & Back-End Engineering

🎯 (SE-12-01, SE-12-06, SE-12-07)

🛡️ Quality Assurance (QA)

Investigate how software engineering solutions are quality assured. QA involves defining clear criteria on which quality will be judged (e.g., load times, error rates). It requires a continual checking process to ensure requirements are met, whilst strictly addressing compliance and legislative requirements (e.g., Australian Privacy Principles) (Outcome SE-12-01).

📐 Modelling Tools

Demonstrate the use of 🛠️ modelling tools to map out software logic. This includes Data Flow Diagrams (DFDs), Structure Charts, and Decision Trees (Course Spec p. 5-10) (Outcome SE-12-06).

⚙️ Back-End Engineering Contribution

Explain the contribution of back-end engineering to the success and ease of software development (Outcome SE-12-07):

🖥️ Technology Used

The selection of server-side frameworks and database technologies fundamentally determines a project's performance, scalability, and long-term maintainability. For example, a Django (Python) framework provides a built-in ORM, authentication system, and admin panel — dramatically reducing development time for data-driven applications. Alternatively, Node.js enables non-blocking I/O suited to high-concurrency environments, such as real-time chat applications. Database choice is equally critical: a relational database such as PostgreSQL enforces data integrity through foreign keys and ACID transactions, whereas a NoSQL database such as MongoDB offers flexible document schemas suited to rapidly evolving data models.

⚠️ Error Handling

Robust error handling ensures the server remains stable and informative when unexpected inputs or system failures occur. Without it, an unhandled exception could crash the entire server process — making the application unavailable to all users simultaneously. For example, a try/except block in Python can catch a database connection timeout and return a user-friendly 503 Service Unavailable HTTP response, rather than exposing a raw stack trace to the client. Additionally, structured logging (e.g., Python's logging module) records error details for post-mortem debugging, without leaking sensitive system information to end-users.

🔗 Interfacing with Front End

Back-end engineers design Application Programming Interfaces (APIs) that define precisely how the front-end client requests and receives data. A RESTful API uses standard HTTP methods (GET, POST, PUT, DELETE) with JSON payloads, allowing any front-end technology — React, Angular, or a mobile app — to consume the same endpoints without modification. For example, a GET request to /api/students/42 would return a JSON object containing that student's profile. Efficient API design minimises data transfer by returning only required fields, and uses HTTP status codes correctly (200 OK, 404 Not Found, 401 Unauthorised) so the front end can respond appropriately to every outcome.

🔐 Security Engineering

The back end is the primary line of defence against malicious attacks. Password security is implemented through cryptographic hashing algorithms such as bcrypt, which store a one-way hash rather than plaintext — meaning a complete database breach still cannot reveal user credentials. Input sanitisation and parameterised SQL queries prevent SQL injection attacks, where an attacker might otherwise embed SQL commands in a form field to manipulate or delete database records. Additionally, implementing HTTPS with TLS certificates encrypts all data in transit, protecting against man-in-the-middle attacks on public networks.


Phase 3 💻 Producing and Implementing

💻 Producing and Implementing

🎯 (SE-12-02, SE-12-04, SE-12-06, SE-12-09)

📌 Design, construct and implement a solution to a software problem using appropriate development approaches. Engineers must develop, construct and document algorithms and allocate appropriate resources to support development (Outcome SE-12-02).

💾 Programmed Data Backup & Version Control

Demonstrate the use of programmed data backup to ensure data integrity during development. Additionally, implement version control (e.g., Git) to safely track code changes, manage collaborative merges, and document the project's evolution (Outcome SE-12-04, SE-12-09).

Python — Programmed Data Backup Script
import shutil
from datetime import datetime

def programmed_backup(db_filepath, backup_directory):
    """Automates the backup of the project database with a timestamp."""
    timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
    backup_file = f"{backup_directory}/db_backup_{timestamp}.sqlite3"
    
    try:
        shutil.copy2(db_filepath, backup_file)
        print(f"✅ Backup successful: {backup_file}")
    except IOError as e:
        print(f"❌ Backup failed: {e}")

# Execute backup before deploying a new feature
programmed_backup('app_data.sqlite3', './backups')

💡 Strategies for Difficulties & Outsourcing

Explore strategies to respond to difficulties when developing. This includes searching for solutions online (e.g., official documentation, StackOverflow), seeking collaboration with peers for code reviews, or outsourcing specific technical components (e.g., paying for an external API service rather than building it from scratch) (Outcome SE-12-09).

⚖️ "Buy vs. Build" Decision Guide

NESA highly regards students who can justify their development strategies. If you face a complex difficulty (e.g., implementing secure logins), use this logic to justify outsourcing:

FactorBuild (In-House)Buy / Outsource (Third-Party)
TimeTakes weeks to code and test.Instant integration via API.
CostHigh developer salary cost.Ongoing subscription / per-use cost.
RiskHigh risk of bugs / security flaws.Low risk (tested by provider).
Justification"I built the search algorithm because it's my core intellectual property.""I outsourced authentication to Auth0 because rolling my own crypto was an unacceptable security risk."

✨ Innovative UI Solutions

Propose an additional innovative solution using a prototype and a user interface (UI) design. Prototyping allows clients to interact with a mock-up of the system, providing early validation of the UI layout before heavy backend coding commences (Outcome SE-12-06).

🌿 Version Control Workflow

Version control is a fundamental professional practice. Git allows engineers to track every change made to the codebase, revert to earlier versions if bugs are introduced, and collaborate without overwriting each other's work. The workflow below demonstrates the standard Git feature-branch workflow used in professional software engineering.

Bash — Git Feature-Branch Workflow
# ── INITIAL SETUP ──────────────────────────────────────────
# Initialise a new repository and make the first commit
git init library-management-system
cd library-management-system
git add README.md
git commit -m "Initial commit: project structure"

# ── FEATURE DEVELOPMENT ────────────────────────────────────
# Always create a new branch for each feature
git checkout -b feature/book-search

# After writing code, stage and commit your changes
git add src/search.py tests/test_search.py
git commit -m "Add book search by title and ISBN with unit tests"

# ── MERGING A FEATURE ──────────────────────────────────────
# Switch back to main and merge the completed feature
git checkout main
git merge feature/book-search --no-ff -m "Merge feature/book-search into main"

# ── USEFUL COMMANDS ────────────────────────────────────────
git log --oneline --graph    # View commit history as a graph
git diff HEAD~1 HEAD         # See changes since the last commit
git status                   # Check which files are staged/unstaged
git stash                    # Temporarily save uncommitted changes

# ── TAGGING A RELEASE ──────────────────────────────────────
git tag -a v1.0 -m "Version 1.0 — submitted for client review"
git push origin main --tags
Version Control Best Practices for the SEP:
  • Commit frequently: Commit after every logical unit of work (e.g., after implementing one function). Small commits are far easier to review and revert than large, multi-feature commits.
  • Write meaningful commit messages: Use the imperative mood and describe what the commit does: "Add login form validation" not "fixed stuff" or "wip".
  • Use branches for features: Never code a new feature directly on main. Always create a feature branch (git checkout -b feature/my-feature) so the main branch stays stable.
  • Link to your process diary: Your commit history in GitHub serves as timestamped evidence of ongoing development — reference it in your process diary entries.

🧩 Modular Design — Python Example

A well-engineered solution separates concerns into distinct modules and classes. The example below shows how the Library Management System is implemented using modular Python, with each class responsible for a single aspect of the system.

Python — Modular Design: Library System
"""
Library Management System — Modular Python Design
Demonstrates separation of concerns across classes.
"""

# ── DATA LAYER ─────────────────────────────────────────────
class Book:
    """Represents a single book in the library catalogue."""
    def __init__(self, isbn: str, title: str, author: str):
        self.isbn = isbn
        self.title = title
        self.author = author
        self.available = True

    def __repr__(self):
        status = "Available" if self.available else "On Loan"
        return f"Book({self.title!r} by {self.author} — {status})"


class Member:
    """Represents a library member."""
    MAX_LOANS = 5

    def __init__(self, member_id: str, name: str, email: str):
        self.member_id = member_id
        self.name = name
        self.email = email
        self.active_loans = []

    def can_borrow(self) -> bool:
        return len(self.active_loans) < self.MAX_LOANS


# ── SERVICE LAYER ──────────────────────────────────────────
class LoanService:
    """Handles all business logic for issuing and returning loans."""

    def __init__(self):
        self.loans = []  # In a real system, this would query a database

    def issue_loan(self, book: Book, member: Member) -> str:
        """Issue a loan if the book is available and member can borrow."""
        if not book.available:
            return f"Error: '{book.title}' is currently on loan."
        if not member.can_borrow():
            return f"Error: {member.name} has reached the maximum loan limit."

        book.available = False
        member.active_loans.append(book.isbn)
        self.loans.append({"isbn": book.isbn, "member_id": member.member_id})
        return f"Success: '{book.title}' issued to {member.name}."

    def return_book(self, book: Book, member: Member) -> str:
        """Process a book return."""
        if book.isbn not in member.active_loans:
            return f"Error: No active loan found for '{book.title}'."
        book.available = True
        member.active_loans.remove(book.isbn)
        return f"Success: '{book.title}' returned by {member.name}."


# ── SEARCH MODULE ──────────────────────────────────────────
class Catalogue:
    """Manages the book catalogue and provides search functionality."""

    def __init__(self):
        self.books: list[Book] = []

    def add_book(self, book: Book):
        self.books.append(book)

    def search_by_title(self, query: str) -> list[Book]:
        """Case-insensitive partial title search."""
        query = query.lower()
        return [b for b in self.books if query in b.title.lower()]

    def search_by_isbn(self, isbn: str) -> Book | None:
        """Return the book matching the given ISBN, or None."""
        return next((b for b in self.books if b.isbn == isbn), None)


# ── MAIN PROGRAM ───────────────────────────────────────────
if __name__ == "__main__":
    catalogue = Catalogue()
    loan_service = LoanService()

    book1 = Book("978-0-7432-7356-5", "The Great Gatsby", "F. Scott Fitzgerald")
    member1 = Member("S001", "Alice Chen", "alice@school.edu.au")

    catalogue.add_book(book1)
    print(catalogue.search_by_title("gatsby"))
    print(loan_service.issue_loan(book1, member1))

✅ Code Review Checklist

A code review is the systematic examination of code by a peer before it is merged into the main branch. It catches bugs, ensures style consistency, and improves overall code quality. The checklist below should be applied during every code review in a collaborative project.

Category Checklist Item Status
Functionality Does the code correctly implement the specified requirements? ☐ Pass / ☐ Fail
Functionality Are all edge cases and error conditions handled appropriately? ☐ Pass / ☐ Fail
Readability Are variable and function names clear and descriptive? ☐ Pass / ☐ Fail
Readability Does the code follow PEP 8 style conventions (Python)? ☐ Pass / ☐ Fail
Documentation Do all functions and classes have docstrings explaining purpose, parameters, and return values? ☐ Pass / ☐ Fail
Testing Are unit tests provided for all new functions, covering normal, boundary, and invalid inputs? ☐ Pass / ☐ Fail
Security Is all user input validated and sanitised before processing or storing? ☐ Pass / ☐ Fail
Security Are there any hardcoded passwords, API keys, or sensitive credentials in the code? ☐ Pass / ☐ Fail
Performance Are there any obviously inefficient algorithms (e.g., nested loops on large datasets) that should be refactored? ☐ Pass / ☐ Fail
Version Control Is the commit message clear and descriptive? Does the branch name follow the naming convention? ☐ Pass / ☐ Fail

🐛 Debugging Process

Debugging is the systematic process of identifying, isolating, and fixing defects in code. A structured debugging process is faster and more reliable than randomly changing code and hoping for improvement.

🐛 Debugging Process Flowchart

Systematic approach to identifying and resolving defects

The flowchart below shows the structured debugging process. It begins with observing the bug and ends with verifying the fix has not introduced any new defects (regression testing).

flowchart TD A([🔴 Bug Observed]) --> B[Reproduce the bug reliably\nwith a minimal test case] B --> C{Can you reproduce\nconsistently?} C -- No --> D[Add logging/print statements\nto narrow down occurrence] D --> C C -- Yes --> E[Isolate the affected\nmodule or function] E --> F[Form a hypothesis\nabout the root cause] F --> G[Test the hypothesis\nusing a debugger or print statements] G --> H{Hypothesis\ncorrect?} H -- No --> F H -- Yes --> I[Implement the fix] I --> J[Run the original\nfailing test case] J --> K{Test passes?} K -- No --> F K -- Yes --> L[Run the full test suite\nto check for regressions] L --> M{All tests\npass?} M -- No --> N[Address new regressions\nintroduced by the fix] N --> F M -- Yes --> O([✅ Bug Fixed & Verified])

Purpose: Apply a methodical, evidence-based approach to debugging rather than making random code changes.
Syllabus Link: SE-12-02, SE-12-08
Python Tools: Use the built-in pdb debugger (python -m pdb script.py), VS Code's integrated debugger, or add print() statements to trace variable values at key points.


Phase 4 🧪 Testing and Evaluating

🧪 Testing and Evaluating

🎯 (SE-12-08, SE-12-09)

📌 Apply methodologies to test and evaluate code, and Analyse and respond to client feedback. Evaluating the effectiveness of a solution ensures it meets the initial problem requirements.

🎯 Effectiveness & Testing Data

Evaluation involves generating a test plan and executing it using rigorous testing data based on path testing (ensuring every line of code executes) and boundary testing (testing the extreme limits of input constraints). Engineers evaluate success by comparing actual output with expected output, and develop a final report to synthesise client feedback (Outcome SE-12-08, SE-12-09).

⚡ Language-Dependent Code Optimisation

Use language-dependent code optimisation techniques to refine execution speed and readability. In Python, this often involves using list comprehensions instead of standard loops, or utilising built-in C-optimised functions (Outcome SE-12-08).

Python — Code Optimisation & Boundary Testing
import unittest

# OPTIMISED CODE: Using list comprehension instead of a slow for-loop
def get_valid_ages(age_list):
    """Returns ages between 18 and 65 (inclusive) using fast list comprehension."""
    return[age for age in age_list if 18 <= age <= 65]

# TESTING: Applying boundary testing methodology
class TestAgeValidation(unittest.TestCase):
    def test_boundaries(self):
        # Boundary data: 17 (invalid), 18 (valid), 65 (valid), 66 (invalid)
        test_data =[17, 18, 40, 65, 66]
        expected_output =[18, 40, 65]
        actual_output = get_valid_ages(test_data)

        # Comparing actual output with expected output
        self.assertEqual(actual_output, expected_output)

if __name__ == '__main__':
    unittest.main()

Test Data Table

A comprehensive test plan uses three categories of test data to verify correctness across all scenarios. Normal data tests typical valid inputs; boundary data tests values at the exact edges of valid ranges; invalid (erroneous) data tests inputs that should be rejected.

# Test Case Input Data Category Expected Output Actual Output Pass/Fail
1 Valid book search — title exists query = "gatsby" Normal Returns list containing "The Great Gatsby" [Book('The Great Gatsby'...)] ✅ Pass
2 Valid book search — case insensitive query = "GATSBY" Normal Returns same result as lowercase query [Book('The Great Gatsby'...)] ✅ Pass
3 Loan issued — exactly at loan limit (boundary) member has 4 active loans; issue 1 more Boundary Loan issued successfully (5th loan allowed) "Success: book issued to Alice Chen." ✅ Pass
4 Loan refused — one over limit (boundary) member has 5 active loans; attempt 6th Boundary Error: maximum loan limit reached "Error: Alice Chen has reached the maximum loan limit." ✅ Pass
5 Empty search query query = "" Boundary Returns all books in catalogue (empty query matches all) All 12 books returned ✅ Pass
6 Search for non-existent book query = "xyznotabook" Invalid Returns empty list [] [] ✅ Pass
7 Issue loan for already-loaned book book.available = False; attempt issue Invalid Error: book is currently on loan "Error: 'The Great Gatsby' is currently on loan." ✅ Pass
8 Return a book not borrowed by that member member_id does not match loan record Invalid Error: no active loan found for this member "Error: No active loan found for 'The Great Gatsby'." ✅ Pass

Test Plan Template

A test plan is a document that outlines the testing strategy, scope, resources, schedule, and exit criteria for a software project. It is prepared before testing begins to ensure testing is systematic and complete.

Section Content
Project Name Library Management System v1.0
Test Objectives Verify all functional requirements are met; confirm boundary conditions are correctly enforced; ensure invalid inputs are gracefully handled.
Scope — In Scope Book search, loan issuance, loan return, overdue fine calculation, member registration, report generation.
Scope — Out of Scope Payment processing (deferred to v2.0), email notification system.
Testing Types Unit testing (individual functions), integration testing (modules working together), system testing (end-to-end user workflows), user acceptance testing (client feedback session).
Test Data Categories Normal (valid expected inputs), Boundary (values at the edge of valid ranges), Invalid/Erroneous (inputs that should be rejected).
Tools Python unittest framework, VS Code debugger, manual testing via the application UI.
Entry Criteria All Phase 3 code is complete and committed to the main branch.
Exit Criteria All test cases pass; no critical or high-severity defects remain open; client has signed off on UAT results.
Schedule Unit testing: Weeks 8–9. Integration testing: Week 9. UAT: Week 10.

Defect Log

A defect log (also called a bug tracker or issue log) records every defect discovered during testing. Each entry includes enough information for the developer to reproduce and fix the defect. The defect log demonstrates to assessors that you conducted genuine testing and responded to the results.

ID Defect Description Severity Steps to Reproduce Expected Actual Status
BUG-001 Search returns no results when query contains trailing whitespace Medium Enter "gatsby " (with trailing space) in search box The Great Gatsby returned Empty list returned ✅ Fixed — added query.strip() in search function
BUG-002 Loan limit not enforced — member can borrow 6 books High Issue loans until member has 5; attempt a 6th loan Error: maximum loan limit reached 6th loan issued without error ✅ Fixed — off-by-one error in can_borrow() condition corrected
BUG-003 Overdue report includes books returned today as overdue Medium Return a book on the exact due date; generate overdue report Book not included in report Book incorrectly listed as overdue ✅ Fixed — changed > to >= in date comparison
BUG-004 Application crashes with unhandled exception when ISBN contains letters Critical Enter "ABC123" as ISBN in the add-book form Validation error message displayed ValueError: invalid literal for int() with base 10 ✅ Fixed — added try/except ValueError block in ISBN validation

Evaluation Criteria Checklist

The final evaluation assesses whether the solution meets the original requirements. Evaluation must address every requirement documented in Phase 1, referencing specific test results and client feedback as evidence.

Evaluation Criterion Evidence Met?
All functional requirements implemented and verified by testing All 8 test cases in the test data table pass; no open critical defects ✅ Yes
Search returns results within 2 seconds (performance requirement) Timed 10 searches on a 10,000-book catalogue; average response time was 0.3 seconds ✅ Yes
Passwords stored as bcrypt hashes (security requirement) Inspected the database — only hashes are stored, no plaintext passwords visible ✅ Yes
Interface usable by new staff within 15 minutes (usability requirement) Client representative completed a new-user walkthrough in 11 minutes with no assistance ✅ Yes
Code follows PEP 8 and all functions have docstrings (maintainability) Ran pylint — score 9.2/10; all public functions and classes have docstrings ✅ Yes
CSV export feature implemented (should-have requirement) Report module includes export_to_csv() function; tested with 50-record export ✅ Yes
Solution meets client's overall expectations (UAT sign-off) Client feedback: "The system is easy to use and covers all our needs. Minor improvement: add a print function for loan receipts (deferred to v2.0)." ✅ Mostly — 1 enhancement deferred
Exam Tip — Evaluation vs Testing: Many students confuse testing with evaluation. Testing verifies that the software works correctly (does it match expected outputs?). Evaluation assesses whether the completed solution meets the original client requirements and broader criteria such as usability, security, and maintainability. Your evaluation must explicitly reference the requirements from Phase 1 — this demonstrates the full SDLC has been applied.

HSC Guidance 📝 HSC Assessment Guidance

📝 HSC Assessment Guidance

🎯 (All Outcomes: SE-12-01 to SE-12-09)

📌 Understanding what assessors are looking for in each phase will help you maximise marks and avoid common pitfalls.

Common Student Mistakes — Avoid These:
  • Starting to code in Phase 1: The most common mistake. Phase 1 must be completed (requirements gathered, feasibility assessed, client consulted) before any code is written. Evidence of planning is required.
  • Missing non-functional requirements: Functional requirements alone are insufficient. Assessors expect performance, security, usability, and maintainability requirements to be explicitly documented.
  • No client consultation evidence: Simply stating "I consulted a client" is not enough. You must include dated meeting minutes, a signed requirements document, survey results, or email evidence.
  • Test data with only normal cases: A test table that only tests valid inputs misses the point of testing. You must include boundary and invalid test cases and demonstrate that your code handles them correctly.
  • Evaluation that does not reference Phase 1 requirements: Your evaluation must explicitly go back to each requirement from Phase 1 and assess whether it was met. An evaluation that says "I think the project went well" without referencing requirements receives minimal marks.
  • Process diary written retrospectively: The process diary must be written throughout the project. Assessors can tell when it was written all at once at the end — dated entries over several weeks are essential.
  • No version control history: An empty or near-empty GitHub commit history suggests the project was completed in one sitting. Regular commits with meaningful messages are expected.

What Markers Look for in Each Phase

🎯 Phase 1 — Identifying & Defining

  • Clear, genuine real-world problem statement
  • Evidence of client consultation (meeting minutes, survey)
  • Both functional AND non-functional requirements listed
  • Feasibility analysis (scheduling and resources)
  • Defined scope with explicit boundaries
  • User stories with acceptance criteria

🔬 Phase 2 — Research & Planning

  • Justified choice of development approach (Agile/Waterfall)
  • Complete Gantt chart covering all phases
  • Risk register with mitigation strategies
  • Structure charts and/or DFDs
  • Storyboards or wireframes with annotations
  • Justified choice of implementation method

💻 Phase 3 — Producing & Implementing

  • Code that matches the planned design
  • Regular Git commits with meaningful messages
  • Modular, well-documented code (docstrings, PEP 8)
  • Evidence of iterative development (multiple versions)
  • Process diary entries describing decisions made
  • Prototype or UI screenshots

🧪 Phase 4 — Testing & Evaluating

  • Functional Testing: Checking workflows against the functional requirements.
  • Acceptance Testing: Client confirms the software solves their original problem (UAT).
  • Live Data / Simulated Data Testing: Using real-world scale data OR generated datasets to trigger edge cases.
  • Beta / Volume Testing: User trials before public release, and testing system limits under mass concurrent usage.
  • Test data table (normal, boundary, invalid) & Defect log.
  • Evaluation against every Phase 1 requirement & documented client feedback.
Python — Volume / Stress Test Script
# NESA testing methods require proof of Volume Testing.
# Use scripts like this in your project to flood your system with simulated data
# and produce a performance graph for your marking portfolio.

import time
import random

# E.g., simulate a library database with 10,000 dummy records
print("Generating 10,000 dummy library records for Volume Testing...")
library_db = {f"ISBN-{i}": f"Book Title {i}" for i in range(10000)}

def search_book(isbn):
    return library_db.get(isbn, "Not Found")

# Stress Test
start_time = time.time()
print("\nExecuting stress test: 50,000 simultaneous searches...")

for _ in range(50000):
    random_isbn = f"ISBN-{random.randint(0, 15000)}"
    search_book(random_isbn)

end_time = time.time()
print(f"✅ Volume Testing Complete.")
print(f"Time taken to process 50,000 queries over 10K records: {end_time - start_time:.4f} seconds")

Process Diary Example Excerpt

The process diary is a chronological record of your development journey. It should demonstrate ongoing reflection, problem-solving, and client engagement throughout the project — not just a summary of what was done.

Date Activities Completed Decisions Made & Reasoning Challenges & Responses Next Steps
Week 1
Mon 3 Feb
Initial client meeting with the school librarian (Mrs Chen). Discussed current paper-based system and pain points. Identified loan tracking and overdue reporting as the two highest-priority problems. Decided to focus the project scope on these areas. Client had difficulty articulating technical requirements — used guided questions: "What does a typical day look like?" and "What is most frustrating about the current process?" Draft functional and non-functional requirements for client review by Week 2.
Week 3
Wed 12 Feb
Completed structure chart and Level 0 DFD. Began algorithm design for the book search module using pseudocode. Chose Agile approach over Waterfall because requirements may evolve as the client sees prototypes. This will allow me to adapt designs based on feedback each iteration. Initially designed the search as a sequential scan — after research, switched to a dictionary-based lookup for O(1) ISBN lookups, significantly improving efficiency on large catalogues. Build the search and loan modules in Phase 3 Week 5–6.
Week 7
Tue 4 Mar
Implemented LoanService class. Discovered BUG-002 (loan limit not enforced) during manual testing. Fixed the off-by-one error in can_borrow() — changed < to <= in the comparison. Added a unit test to prevent regression. The bug was caused by incorrect operator choice. Added this case to the test data table as a boundary test to ensure the limit is correctly enforced on future changes. Complete UI implementation; schedule Phase 4 UAT session with Mrs Chen for Week 10.

Submission Checklist

Before submitting your Software Engineering Project, use this checklist to ensure your documentation package is complete:

Item Required Completed?
Signed client requirements documentEssential
Functional and non-functional requirements tableEssential
User stories with acceptance criteriaEssential
Feasibility analysis (scheduling and resources)Essential
Gantt chart (all 4 phases)Essential
Risk register with mitigation strategiesEssential
Structure chart or DFD (or both)Essential
Storyboard and/or wireframesEssential
Development approach justificationEssential
Well-commented, PEP 8 compliant source codeEssential
Git repository with regular commit historyEssential
Test plan documentEssential
Test data table (normal, boundary, invalid)Essential
Defect logEssential
Evaluation against all Phase 1 requirementsEssential
Client feedback and UAT sign-offEssential
Process diary (dated, throughout project)Essential
Change request log (if requirements changed)Recommended
Data dictionaryRecommended
Meeting minutes (all client meetings)Recommended

Documentation 📁 Project Documentation Examples

📁 Project Documentation Examples

🎯 (SE-12-05, SE-12-09)

📌 Professional software engineering projects maintain comprehensive documentation throughout the development lifecycle. The examples below illustrate the standard and format expected in HSC submissions.

Meeting Minutes Template

Meeting minutes are an official record of what was discussed and decided at each client meeting. They provide evidence of ongoing client consultation and demonstrate that requirements were gathered systematically.

CLIENT MEETING MINUTES
Project Name Library Management System
Meeting Number Meeting #1 of 3
Date & Time Monday, 3 February 2026 — 3:30 pm
Location School Library — Resource Room
Attendees Alex Tran (developer), Mrs Chen (client — school librarian)
Agenda Items
  1. Overview of the current paper-based system
  2. Identification of pain points and priorities
  3. Initial discussion of system scope and features
Discussion Summary Mrs Chen described the current process: loans are recorded in a paper ledger; overdue books are identified manually each Friday. The main pain points are: (1) time spent checking for overdue books, (2) no way to check availability without physically walking to the shelf, (3) no record of a member's loan history.
Decisions Made Priority features agreed: digital loan tracking, automated overdue detection, and a searchable catalogue. Payment processing for fines deferred to a future version.
Action Items Developer: Draft functional requirements by Week 2 for client review. Client: Provide a sample of current loan records to inform data structure design.
Next Meeting Monday, 17 February 2026 — review drafted requirements and wireframes.
Client Signature _______________________ (Mrs Chen)

📝 Change Request Log

A change request log records any modifications to the original requirements after the requirements document has been signed. It prevents scope creep by requiring formal approval for each change, and ensures all parties agree on the updated scope.

CR# Date Requested Requested By Change Description Impact Assessment Decision Date Resolved
CR-001 18 Feb 2026 Client (Mrs Chen) Add ability to reserve a book that is currently on loan Medium — requires a new Reservations table, updated UI, and notification logic. Estimated additional 5 hours development time. Approved — prioritised as "Should Have" for v1.0 5 Mar 2026
CR-002 3 Mar 2026 Client (Mrs Chen) Add online payment processing for overdue fines High — requires third-party payment API integration, significant additional development, and security testing. Estimated additional 15 hours. Not feasible within current schedule. Deferred to v2.0 — outside current scope and timeline 4 Mar 2026
CR-003 10 Mar 2026 Developer Switch from SQLite to PostgreSQL for the database backend Low — database access is already abstracted through the service layer. SQLite is adequate for single-user deployment; PostgreSQL only needed for multi-user concurrent access. Rejected — SQLite meets current requirements; PostgreSQL migration deferred until multi-user version is planned 10 Mar 2026

📖 Data Dictionary

A data dictionary formally defines every data item used in the system — its name, data type, size, valid range, and description. It ensures consistency between the design documents, database schema, and code. In Python, field sizes and types translate directly to database column definitions and validation logic.

Field Name Table / Class Data Type Size / Range Required? Description & Validation Rules
member_id Member String (VARCHAR) 8 characters Yes Unique identifier for each member. Format: "S" followed by 7 digits (e.g., "S0012345"). Generated automatically on registration.
name Member String (VARCHAR) 1–100 characters Yes Member's full name. Must not be blank. Stored as entered; displayed with title case.
email Member String (VARCHAR) 5–254 characters Yes Member's email address. Must match the pattern x@x.x (validated using regex). Must be unique in the Members table.
isbn Book String (VARCHAR) 13 characters Yes International Standard Book Number (ISBN-13). Must be exactly 13 digits. Unique in the Books table. Validated using ISBN-13 checksum algorithm.
title Book String (VARCHAR) 1–300 characters Yes Full title of the book. Must not be blank. Stored as entered; searched case-insensitively.
available Book Boolean True / False Yes Whether the book is available for loan. Default: True on creation. Set to False when a loan is issued; reset to True when the book is returned.
issue_date Loan Date Valid calendar date Yes The date the loan was issued. Set automatically to today's date using datetime.date.today(). Cannot be a future date.
due_date Loan Date Valid calendar date Yes The date the book must be returned. Automatically calculated as issue_date + 14 days. Must be after issue_date.
fine_amount Loan Float (DECIMAL) 0.00 to 99.99 No Overdue fine in Australian dollars. Default: 0.00. Calculated as $0.20 per day overdue. Null if the book is not yet overdue.
Data Dictionary — Why It Matters for the HSC:
  • The data dictionary bridges your Phase 1 requirements (what data you need) with your Phase 3 implementation (how it is stored and validated in code).
  • Including a data dictionary demonstrates that you applied a systematic, professional approach to data design — a key marker of higher-band performance.
  • It also makes it easy to verify that your database schema, Python classes, and validation code are all consistent with each other.
  • Reference your data dictionary in your process diary when you make implementation decisions (e.g., "I chose VARCHAR(13) for ISBN because the data dictionary specifies a fixed 13-character format").

👥 Team Roles & Dynamics

🎯 (SE-12-01, SE-12-07)

📌 Describe team roles in a software project and apply Agile ceremonies to manage communication and progress effectively.

👥 Common Software Project Roles

RoleResponsibilitiesKey Skills
Project ManagerPlan timeline, manage risks, coordinate stakeholders, track progress against scopeLeadership, communication, risk management
Business AnalystGather and document requirements, bridge between client and technical team, validate deliverablesRequirements elicitation, documentation, domain knowledge
Software DeveloperDesign, code, debug, and unit-test features according to specificationsProgramming, algorithms, debugging, version control
UI/UX DesignerDesign wireframes, prototypes, and visual assets; conduct usability testingFigma/Sketch, user research, accessibility
QA TesterWrite test plans, execute manual and automated tests, report bugs with reproduction stepsTest design, attention to detail, tool automation
DevOps EngineerManage CI/CD pipelines, deployment infrastructure, monitoring, and incident responseLinux, Docker, cloud platforms, scripting
Database AdministratorDesign schemas, optimise queries, manage backups, enforce data integritySQL, indexing, normalisation, backup strategies
Technical LeadMake architecture decisions, conduct code reviews, mentor junior developers, set coding standardsSystem design, broad technical knowledge, communication

📅 Agile Ceremonies

Sprint PlanningAt the start of each sprint (1–4 weeks): the team selects user stories from the backlog to complete in this sprint. Output: a sprint backlog with estimated tasks. Duration: typically 2–4 hours for a 2-week sprint.
Daily Stand-up15-minute daily meeting. Each team member answers: (1) What did I do yesterday? (2) What will I do today? (3) Do I have any blockers? Duration: maximum 15 minutes — stand up to keep it short.
Sprint ReviewAt the end of each sprint: the team demonstrates completed work to stakeholders. Stakeholders provide feedback that may update the product backlog. Duration: 1–2 hours.
Sprint RetrospectiveAfter the sprint review: the team reflects internally. What went well? What should improve? What will we commit to changing next sprint? Duration: 1 hour. Output: actionable improvement items.
Team Dynamics — Key Tips for HSC Projects:
Document all major decisions (why you chose one approach over another) in your process diary.
Communicate blockers immediately — a small problem caught early is much cheaper to fix than a large one discovered late.
Use Git branches for parallel work — never both edit the same file simultaneously without a merge plan.

🚀 Deployment & DevOps

🎯 (SE-12-02, SE-12-07)

📌 Describe the deployment pipeline and apply deployment concepts to ensure software is reliably released to users.

🚀 Deployment Environments

Deployment Pipeline
──────────────────────────────────────────────────────────────
Development   →   Staging         →   UAT          →   Production
(your laptop)     (mirrors prod)      (client tests)   (live users)

Each environment serves a purpose:
• Development : fast iteration, may have debug tools enabled
• Staging     : identical to production — final integration testing
• UAT         : User Acceptance Testing — client validates requirements
• Production  : live system — must be stable, monitored, backed up
──────────────────────────────────────────────────────────────

🌐 Hosting Options

=
PlatformBest ForCostComplexity
GitHub PagesStatic HTML/CSS/JS sitesFreeVery low
VercelFrontend frameworks (React, Vue), serverless functionsFree tier availableLow
HerokuPython/Flask/Django web apps with databaseFree tier removed; paid plansLow-Medium
AWS / AzureScalable enterprise applicationsPay per useHigh
PythonAnywherePython web apps — ideal for HSC Flask projectsFree tier availableLow

✅ Pre-Deployment Checklist

#CheckWhy
1All tests passCatch regressions before users see them
2No secrets in source codePrevent credential leaks
3Debug mode disabledDebug mode exposes stack traces to users
4Database migrations appliedSchema must match the new code
5Dependencies pinned in requirements.txtReproducible builds across environments
6Error logging configuredKnow when errors occur in production
7Git tag created for this releaseEasy rollback point if issues arise
8Backup taken before deployLast resort recovery if deploy fails

📊 Post-Project Evaluation

🎯 (SE-12-07, SE-12-08, SE-12-09)

📌 Evaluate the completed software project against original requirements and reflect on lessons learned to improve future practice.

📊 Evaluation Framework

A thorough evaluation compares what you built against what you planned from Phase 1. For each functional and non-functional requirement, ask:

  • Was this requirement fully met? Partially? Not met?
  • What evidence demonstrates it is met? (test results, screenshots, user feedback)
  • If not fully met, what limited the implementation?

📝 Post-Mortem Report Structure

SectionContent
Executive Summary1-paragraph overview of what was built, whether goals were achieved, and overall outcome
TimelinePlanned vs actual dates for key milestones — what slipped and why
What Went WellSpecific practices, decisions, or tools that worked better than expected
What Went WrongHonest account of failures, delays, scope creep, technical issues
Root CausesUnderlying reasons for problems (not just symptoms) — over-scoping, poor estimation, unclear requirements
Action ItemsSpecific, measurable improvements for the next project
HSC Evaluation Report Tips:
Be specific — don't write "the project was successful." Write "Requirement 3 (search by author) was fully implemented and passed all 4 test cases in the test table."
Acknowledge limitations honestly — markers reward self-awareness. If something didn't work, explain why and what you'd do differently.
Link back to your original requirements document. Use the same requirement numbers to show systematic coverage.

🛠️ Tech Stack Selection Guide

🎯 (SE-12-02, SE-12-07)

📌 Evaluate and select appropriate technologies for different HSC project types based on requirements, constraints, and team capability.

📊 Recommended Stacks for Common HSC Project Types

Project TypeRecommended StackKey Libraries
Desktop GUI AppPython + tkinter or PyQt5tkinter (built-in), PyQt5, sqlite3
Web AppPython Flask + SQLite + HTML/CSS/JSFlask, Jinja2, sqlite3, Bootstrap
Data Analysis ToolPython + pandas + matplotlibpandas, matplotlib, numpy, seaborn
GamePython + pygamepygame, math, random
MechatronicsMicroPython + Raspberry Pi Picomachine, utime, ujson

⚖️ Technology Selection Criteria

Requirements fitDoes the technology support the features you need? (e.g., a web framework needs routing; a game needs a render loop).
Team skill levelCan you learn this in time? A familiar technology done well beats an unfamiliar one done poorly.
Community & documentationIs there good documentation and Stack Overflow coverage? You will hit problems — good resources reduce debugging time.
Deployment constraintsWhere will this run? A web app needs hosting. A desktop app needs to run on school computers (no admin rights to install dependencies?).
Scope Management: Build your MVP (Minimum Viable Product) first, then add features. The most common HSC project failure is over-scoping — committing to 20 features and delivering 8 poorly. Three features that all work reliably and are well-tested score better than ten features half-implemented. Write the core functionality first, then enhance.