Phase 6 · PortfolioModule 30

Modern C++ Capstone Projects

Combine the course in six portfolio projects that grow from a validated CLI into a tested, portable, performance-aware C++ product.

What you'll learn

A strong portfolio demonstrates decisions, contracts, tests, measurement, and delivery—not only source volume. These six graduated projects revisit the full course while raising expectations from one reliable command-line tool to a portable, released C++ product.

By the end, you'll be able to:

  • Scope six portfolio projects around verifiable user outcomes
  • Plan ownership, error, testing, performance, and portability before implementation
  • Deliver CMake builds, documentation, CI, sanitizer evidence, and release artifacts
  • Present tradeoffs and measurements clearly in a technical portfolio

Capstone workflow

Build each project as a sequence of vertical milestones. Start with a one-page brief naming the user, problem, non-goals, inputs, outputs, constraints, and acceptance tests. Draw the ownership map and identify untrusted boundaries before choosing classes or libraries.

project-brief.md
# Project brief
User outcome: What can a real user accomplish?
Inputs/trust: Which arguments, files, network data, or callbacks are untrusted?
Core contracts: What must always be true?
Non-goals: What will this version deliberately not do?
Ownership map: Who owns each long-lived resource and task?
Failure policy: Which errors are recoverable and how are they reported?
Acceptance: Which automated and manual scenarios prove completion?
Evidence: Which benchmark, sanitizer, portability, or release artifact will be published?

Key idea

A capstone is finished when its acceptance evidence is reproducible by another person—not when the author feels the code is “basically done.”

Projects 1–2: reliable values and objects

Project 1: validated command-line application. Build an expense tracker, unit converter, habit log, or text analyzer. Parse every argument, model units with types, persist data through safe replacement, and return meaningful process exit codes.

Project 2: object-oriented simulation or management system. Build a transit simulation, reservation system, library manager, or board game. Center the design on invariants and behavior; use composition by default and runtime polymorphism only for a real open extension point.

ProjectRequired evidence
1 — CLIBoundary tests, invalid-input transcript, versioned file format, clean sanitizer run
2 — Object modelClass invariant notes, scenario tests, ownership diagram, rejected invalid transitions
  • No raw owning pointers
  • No silent input fallback
  • One command builds and runs tests
  • README includes example workflows and limitations

Projects 3–4: STL and generic design

Project 3: data-processing and filesystem utility. Create a duplicate finder, log analyzer, photo organizer, or source metrics tool. Traverse paths safely, stream large inputs, use algorithms and ranges, and produce deterministic machine-readable and human-readable output.

Project 4: reusable generic library. Implement a small algorithms library, fixed-capacity collection, graph traversal toolkit, units type, or validated result utilities. Constrain templates with concepts and test multiple types, boundary sizes, iterator categories, exception safety, and compile-time use where relevant.

library-layout.txt
project/
  CMakeLists.txt
  cmake/
  include/project/        # public headers
  src/                    # non-template implementation
  tests/                  # unit, property, regression
  examples/               # minimal consumer programs
  benchmarks/             # measured questions, not demos
  docs/                    # contracts and design decisions

Tip

For the generic library, add a clean downstream consumer test. It exposes missing includes, accidental transitive dependencies, and install/export mistakes that in-tree tests can hide.

Project 5: concurrent or asynchronous system

Build a task processor, parallel indexer, thumbnail pipeline, chat relay, or asynchronous downloader using an established library where networking is involved. Document thread and task ownership, queue backpressure, shutdown order, cancellation, error propagation, and the synchronization protecting each invariant.

concurrency-contract.txt
Producer owns input enumeration.
Queue owns pending Job values and has a maximum capacity.
Workers are scoped jthreads owned by Processor.
Each Job owns its input path and output destination.
Stop request closes intake, wakes waiters, and lets in-flight jobs reach a safe point.
First fatal error is stored; shutdown joins all workers before resources die.
Metrics are atomic counters only; multi-field state remains mutex-protected.
  • Compare one-thread and multi-thread throughput on representative work
  • Test empty input, saturation, worker failure, cancellation, and shutdown races
  • Run ThreadSanitizer on supported configurations
  • Report speedup, p95 latency, CPU use, and contention—not only average throughput

Watch out

Do not choose concurrency only to make the project look advanced. A clear measured reason, correct shutdown, and evidence under stress are more impressive than a larger thread count.

Project 6: professional C++ product

Combine the course in a substantial multi-file product: an offline search engine, asset pipeline, package inspector, embedded simulator, database-like store, or cross-platform desktop core. Publish a stable domain API, isolate platform detail, and include at least one externally consumed library target plus a real application.

AreaMinimum bar
BuildTarget-based CMake, presets, install/export, clean consumer
CorrectnessUnit + integration + regression tests and strict warnings
SafetyASan/UBSan; TSan if concurrent; static analysis; fuzz one parser
PerformanceOne documented benchmark and profile-guided improvement
PortabilityAt least two compiler families and two target environments when available
DeliveryVersioned changelog, license, documentation, CI, packaged release
CMakeLists.txt
cmake_minimum_required(VERSION 3.24)
project(portfolio_product VERSION 1.0.0 LANGUAGES CXX)

option(PRODUCT_BUILD_TESTS "Build tests" ON)
option(PRODUCT_BUILD_BENCHMARKS "Build benchmarks" OFF)

add_subdirectory(src/core)
add_subdirectory(apps/cli)

if(PRODUCT_BUILD_TESTS)
  enable_testing()
  add_subdirectory(tests)
endif()

if(PRODUCT_BUILD_BENCHMARKS)
  add_subdirectory(benchmarks)
endif()

Review rubric and presentation

Review each milestone as if you were maintaining it for two years. Score contracts, ownership, tests, errors, readability, build reproducibility, security, performance evidence, portability, and documentation. A polished portfolio page explains the problem, constraints, architecture, hard decisions, measured result, and what you would change next.

DimensionStrong evidence
Problem framingSpecific user and acceptance outcomes; explicit non-goals
C++ designValues by default, clear owners/borrows, defined behavior, small APIs
ReliabilityBoundary cases, failure injection, sanitizers, minimized regressions
EngineeringReproducible builds, CI matrix, installable targets, release notes
PerformanceBaseline, method, profile, change, and quantified result
CommunicationReadable README, diagrams where useful, honest limitations and tradeoffs
release-checklist.md
- [ ] Clean clone configures with documented prerequisites
- [ ] Strict-warning build passes on the compiler matrix
- [ ] Unit, integration, and regression tests pass
- [ ] Sanitizer and static-analysis jobs pass
- [ ] Package installs and a clean consumer links against it
- [ ] Benchmarks include method and baseline
- [ ] README examples match the released command line/API
- [ ] Changelog, version, license, checksums, and known limitations are present

Note

Keep scope small enough to polish. One released project with explicit tradeoffs, tests, and evidence teaches reviewers more than six unfinished repositories.

Recap & quick check

Key takeaways

  • Every capstone starts with a user outcome, non-goals, trust boundaries, ownership, and acceptance evidence.
  • The six projects progress through validated values, object models, STL processing, generic libraries, concurrency, and full product delivery.
  • Professional C++ evidence includes warnings, tests, sanitizers, analysis, benchmarks, portability, packaging, and CI.
  • Measurements and design notes make tradeoffs reviewable instead of merely asserted.
  • A finished, reproducible, well-explained project is stronger than a larger unfinished codebase.

Quick check

1. What defines capstone completion?

2. What should the concurrent project document before implementation?

3. What does a clean consumer test verify?

4. Which portfolio explanation is most useful?

Course complete. You now have the language model, standard-library fluency, systems knowledge, professional workflow, and project plan to build demonstrable Modern C++ software.