Discover → Define → Develop → Deliver
EdTech · Developer Skills Platform · 2026Concept Project

4.0 GPA.
Day-one panic.

A Double Diamond case study on designing Foundry, a hands-on coding platform built around one gap: computer science graduates can ace an exam and still freeze in front of a real, messy codebase — because nothing in a four-year degree ever put one in front of them.

Role

Solo Product Designer — research to UI

Timeline

8 weeks, end‑to‑end

Platform

Web app, browser‑based IDE

Tools

Figma · FigJam · Maze

Try the flow yourself ↓
Field research · Technical readiness test

Grades vs. real debugging

40 graduating CS seniors, self-reported confidence vs. an unmoderated debugging task with no clear error message

GPA of 3.5 or higher
78%
"I can debug real code"
81%
Actually fixed the bug, unaided
34%
Confidence Reality

The gap wasn't intelligence — it was exposure. None of the failing students had ever debugged code they hadn't written themselves.

What is Foundry?

Foundry is a web platform that drops computer science students into real, intentionally messy codebases with real tickets — ambiguous requirements, legacy code, failing tests with no clear message — instead of clean, isolated practice problems. Students file a "PR," get review feedback modeled on real senior-engineer critique, and build a visible skill record employers can actually trust.

The real problem

It's not that computer science curricula skip practical skills entirely — most include a capstone project or two. It's that the other 90% of a degree is lecture-and-exam based, and the practice problems that do exist are almost always clean, isolated, and already correctly scaffolded. Real engineering work is none of those things: the code is someone else's, the bug report is vague, and the tests were written by a person who has since left the company.

The goal

Give students hundreds of small, low-stakes reps at the actual skill hiring managers say new grads lack — reading unfamiliar code, debugging without a clear error, and responding to real review feedback — before their first day on the job, not during it.

Why Double Diamond, not a straight build

Two different open questions sat on top of each other here: first, why strong students still arrive underprepared when practice tools already exist (a discovery problem), and only once that was answered, what a genuinely realistic practice environment would need to include without becoming overwhelming (a design problem). Double Diamond's two diverge‑then‑converge cycles kept those separate, instead of jumping straight from "students need practice" to "here's another algorithm-drill app."

One person, every hat

This was a solo project end to end — no separate research team to hand off to, no PM to arbitrate scope. Every trade-off documented below (what got cut, what got kept, what got argued with a hiring manager) is one I made myself, moving between roles as the work needed:

Researcher Product strategist UX designer UI designer Prototyper Usability moderator

That's a scope statement, not a boast — a real team changes this. The codebase-sanitization pipeline and grading-rubric calibration below are exactly the kind of calls I'd bring in a senior engineer and a curriculum designer for, rather than resolve alone; I've flagged those seams throughout instead of pretending they aren't there.

66%

of hiring managers surveyed said new-grad hires couldn't debug unfamiliar code without heavy guidance

34%

of graduating seniors could fix a real, unfamiliar bug unaided in a timed technical task

14 wks

average time a new hire takes to become independently productive, per surveyed engineering managers

Fig. 1 — The double diamond, mapped to this project

DISCOVER DEFINE DEVELOP DELIVER THE PIVOT: MESSY CODE TEACHES WHAT CLEAN CODE CAN'T
Diverge

Discover

Question why capable, well-taught students still arrive unprepared, without assuming the fix yet.

Converge

Define

Narrow to one insight and one problem statement worth solving.

Diverge

Develop

Sketch multiple, genuinely different ways to simulate real engineering conditions.

Converge

Deliver

Build, test, and refine the direction the evidence actually supported.

Where This Lands

Before the process, here's the destination

Four phases of research and iteration follow below before this screen gets earned, line by line. If you'd rather see the full flow first and backfill the reasoning after, it's waiting in Deliver.

Jump to the full walkthrough ↓
foundry.dev/tickets/inventory-sync
Ticket #482
Inventory count drifts after a refund · reported by QA
Reproduce & isolateBug
No stack trace attached — starts silent
Legacy refund serviceUndocumented
Last touched 3 years ago
DivergePhase 01

Discover: why does the gap survive good teaching?

Before designing anything, the goal was to understand why this problem persists despite plenty of existing "learn to code" tools, without assuming the fix yet.

Competitive & market audit

Practice tools already exist in abundance. The question was why none of them close the gap hiring managers actually describe. Six tools (and one real-but-scarce alternative) were audited.

ProductWhat it doesWhere it falls short
LeetCode / HackerRankAlgorithm-puzzle practice, widely used for interview prep.Isolated, pre-scaffolded problems with one correct function signature — nothing like reading someone else's codebase.
Codecademy / freeCodeCampGuided, structured lessons for learning to code from scratch.Great for syntax and fundamentals, but every exercise is clean, small, and already set up to succeed.
University capstone projectOne larger, more open-ended project near the end of a degree.Usually one shot, late in the timeline, and built from scratch — never inherited, legacy, or someone else's mess.
InternshipsThe real thing: real codebases, real tickets, real review.Scarce, competitive, and often the first exposure a student gets — which is exactly the problem.
Open-source contributionReal codebases, real maintainers, real review culture.Genuinely valuable, but unstructured and intimidating for a beginner with no on-ramp.
Coding bootcampsProject-based weeks mixed into an intensive curriculum.Still mostly greenfield, guided projects — rarely inherited or intentionally messy codebases.

Opportunity

Every practice tool audited optimizes for a student succeeding quickly and cleanly. None of them simulate the actual conditions of professional engineering work — unfamiliar code, ambiguous tickets, and real critique — which is precisely the skill hiring managers say is missing.

How students cope with this today

"What best describes your coding practice outside class?"

Algorithm-puzzle sites
68%
Guided tutorials
41%
Personal greenfield projects
33%
Contributing to someone else's code
9%

180-student survey, graduating CS & bootcamp seniors.

What hiring managers say new hires actually lack

Debugging unfamiliar code
71%
Reading large existing codebases
58%
Responding to code review
44%
Working from ambiguous requirements
39%

32 engineering managers surveyed.

Survey & interviews

A 180-student survey and 16 moderated interviews (12 graduating seniors, 4 engineering managers) ran in parallel with the secondary research.

"Before this internship or job, had you ever worked in a codebase you didn't write?"
No, never
57%
Once, briefly
29%
Yes, regularly
14%
"When you get a bug with no clear error message, what do you do first?"
Not sure / freeze up
48%
Search for the exact error online
35%
Add print statements and narrow it down
17%

"I had a 3.9 GPA and I couldn't find a bug in my own team's code for two days. Nobody ever taught me how to even start."

Graduate interview · G04, first engineering job

"We stopped asking for GPA years ago. I need to know if someone can survive their first sprint, and I can't tell that from a transcript."

Engineering manager interview · M02, hires 6–8 new grads a year

"LeetCode got me the interview. It did not prepare me for a 40,000-line Rails app with no comments."

Graduate interview · G09, three months into first job
ConvergePhase 02

Define: narrowing to one insight

Discovery surfaced a lot — confidence gaps, review anxiety, scarce internships. Define was about resisting the urge to solve all of it at once.

The insight

Students weren't lacking knowledge — they were lacking reps at applying it under realistic conditions. Every practice tool they'd used optimized away the exact discomfort (unfamiliar code, ambiguity, critique) that professional engineering actually runs on. The fix wasn't more content. It was safe, repeated exposure to mess.

Two people this had to work for

AN

Ananya Nair

22 · CS senior, 3.8 GPA · Graduating in 3 months
"I can prove I know Big-O notation. I have no idea if I can actually do the job."
Context
  • Strong grades, several LeetCode-style practice hours a week
  • Has never worked inside a codebase she didn't start herself
  • Anxious specifically about technical onboarding, not the interview
Needs
  • Low-stakes practice at debugging code that isn't hers
  • A way to show, not just claim, she's ready
MR

Marcus Reyes

41 · Engineering Manager · Hires 6–8 new grads a year
"I need to know if someone can survive their first sprint, and a transcript can't tell me that."
Context
  • Budgets roughly 14 weeks for a new grad to become independently productive
  • Distrusts GPA and take-home coding tests equally
  • Wants evidence of debugging and review behavior, not just correctness
Needs
  • A signal that's faster to trust than a resume line
  • Confidence a new hire won't freeze on their first real ticket

How might we

01

Make "messy" the default, not the exception

So the first time a student meets undocumented, inherited code isn't also their first day of paid work.

02

Give feedback that feels like a real senior engineer, not a test runner

Pass/fail tells a student whether the code works. It doesn't teach them how a reviewer would actually respond to it.

03

Turn practice into a signal employers can trust

So Marcus can see evidence of debugging and review behavior, not just another certificate.

Design principles

Three rules, pulled straight from the HMWs above, that every decision from here on had to answer to.

PRINCIPLE 01

Realistic mess, bounded scope

Codebases are real and imperfect, but every ticket has a findable resolution — frustration with a floor, not a bottomless pit.

PRINCIPLE 02

Feedback reads like a person, not a grader

Every review comment explains the "why," the way a good senior engineer would, not just pass or fail.

PRINCIPLE 03

Progress is legible to someone else

A skill record has to be scannable by a hiring manager in under a minute, or it won't get used as a signal.

Success, defined before design started

METRIC 01

Debugging task success rises

Students who complete a track can debug unfamiliar code noticeably better than before starting.

METRIC 02

Review feedback gets acted on

Students revise based on review comments, not just resubmit until tests pass.

METRIC 03

Hiring managers find it credible

The skill record changes how a hiring manager would evaluate a candidate, not just how they feel about the résumé.

DivergePhase 03

Develop: three genuinely different directions

The insight was narrow. The solution space still wasn't — three structurally different ways to act on it were sketched and concept-tested with 6 CS seniors before committing engineering time to any of them.

Cut

A. Harder algorithm puzzles

Extend the LeetCode model with more advanced, closer-to-real-world coding challenges.

Still isolated, still pre-scaffolded — testers correctly guessed this wouldn't transfer to reading someone else's code.
Cut

B. University capstone marketplace

Match students with real company codebases for a semester-long capstone-style engagement.

Too slow and too scarce — one project a semester can't deliver the repeated reps students actually need.
Chosen

C. Simulated codebase & ticket queue

Real, sanitized codebases with a queue of realistic tickets and review-style feedback on every submission.

Delivered the exact discomfort research pointed to — repeatedly, safely, and on a student's own schedule.

Foundry, structured around one job

Foundry
Account
  • Track selection
  • Skill baseline
Ticket queueCore
  • Real, sanitized codebases
  • Difficulty & mess signals
Workspace
  • Embedded editor
  • File tree & terminal
Review & record
  • PR-style feedback
  • Shareable skill record

The new flow

Student picks a track and pulls a ticket
↓
Opens a real, sanitized codebase with the bug or feature request attached
↓
Is the requirement clear enough to start?
↓
Yes
Student debugs and edits in the embedded workspace
No
Student asks a clarifying question, mirroring a real ticket thread
↓
Student submits a "PR" for review
↓
Review feedback lands, ticket resolves, and the skill record updates

Wireframe evolution

Sketch
Grayscale mid-fi
Final hi-fi
#482 Inventory driftBug
No stack trace attached
Legacy refund serviceUndocumented
Last touched 3 years ago

Constraints I designed around

A concept project skips real employer partnerships and licensing — it doesn't skip the constraints they'd create. These shaped decisions throughout, not just at the end.

Real codebases can't be used as-is

Company code carries IP and security concerns Foundry can't absorb. The design assumes a sanitization pipeline — stripped secrets, scrubbed proprietary logic, licensed or donated legacy codebases — run by engineers, not something a solo designer resolves alone.

"Messy" has to stay bounded, not punishing

Realism that turns into hopeless frustration teaches nothing. Every ticket is calibrated to have a findable resolution within the codebase provided, even when the path there isn't obvious.

How it would actually make money

Freemium for students — the ticket queue and skill record are always free to build. Revenue comes from a B2B tier: companies and bootcamps sponsoring tracks, or paying to source directly from verified skill records. That distinction shaped the design, not just the business plan: a student's practice history can never be paywalled after the fact.

What got cut, and why

Three decisions that mattered most

Before the screens, the reasoning behind them — the calls that shaped everything downstream, and what each one cost.

Decision 01

Real, sanitized codebases — not synthetic ones

ConsideredPurpose-built "messy" codebases written to simulate real-world conditions
CostFar more work to source, license, and sanitize than authoring content from scratch
Why it won: testers could tell the difference within minutes — synthetic mess felt like a puzzle, real inherited code felt like the actual job.
Decision 02

Every ticket allows a clarifying question

ConsideredFully specified tickets, so grading stays unambiguous
CostHarder to grade consistently once requirements can be legitimately interpreted two ways
Why it won: working from ambiguity was one of the top four skills hiring managers said new grads lacked — removing it would have removed the point.
Decision 03

The skill record shows behavior, not just scores

ConsideredA single aggregate score or badge per completed track
CostA richer record is slower for a hiring manager to parse than one number
Why it won: Marcus and other hiring-manager interviewees said a bare score was exactly as untrustworthy as a GPA — they wanted to see how a student responded to review.
ConvergePhase 04

Deliver: build, test, refine, ship

The chosen direction went through three rounds of hi-fi design and usability testing before this was considered ready to hand to engineering.

The screens

foundry.dev/tickets
Your ticket queue
Backend track · Week 3
#482 Inventory drift after refundBug
Legacy service · no stack trace
#503 Add pagination to orders APIFeature
Ambiguous page-size requirement
#511 Flaky checkout testUndocumented
Fails ~1 in 5 runs

01 — Tickets carry real signals: bug vs. feature, and how messy the surrounding code is.

foundry.dev/workspace/482
src/
  inventory/
    refund.rb
    sync.rb
  orders/
spec/
def process_refund(order)
  # TODO: fix before Q3 (2019)
  inventory.qty += order.count
  order.status = :refunded
end
FAIL spec/inventory/refund_spec.rb
expected 42, got 44 (line 3)

02 — A real file tree, a failing test, and no comment explaining why the old code did what it did.

foundry.dev/tickets/482
Ticket #482
Reported by QA · priority: medium
Reporter
"Counts look wrong after some refunds. Not sure which ones yet."
Your question
"Does this happen on partial refunds too, or full only?"
Reporter replied
"Good question — only saw it on partial ones so far."

03 — Ambiguous by design — asking a clarifying question is part of the ticket, not a shortcut around it.

foundry.dev/review/482
Review feedback
3 comments · 1 change requested
SR
Senior reviewer
You fixed the partial-refund case, but full refunds will double-count again — check line 3 against the original order total.
SR
Senior reviewer
Good instinct asking about partial vs. full before writing code — that's exactly the right first move.

04 — Feedback explains the reasoning, the way a real senior engineer's review would.

foundry.dev/profile/skills
Your skill record
Backend track · 14 tickets resolved
Debugging unfamiliar codeStrong
Responding to reviewDeveloping
Working from ambiguityDeveloping

05 — A skill record built from behavior across real tickets, not a single test score.

foundry.dev/tickets/511
Ticket #511
Flaky test · no clear repro steps
Fails ~1 in 5 runsUndocumented
No owner listed — original author has left
SR
Hint unlocked
Flaky tests are almost always about timing or shared state. What runs right before this one?

06 — Edge case: when a ticket has no clean answer, a scoped hint keeps frustration from becoming the point.

Desktop & browser notes

The embedded editor supports standard IDE keybindings (not a custom scheme), and every action reachable by mouse is reachable by keyboard, since debugging is naturally a keyboard-heavy task.

Low-bandwidth notes

The workspace runs against a remote sandbox, not a local install, so it was tested and tuned on a throttled connection to stay usable on campus wifi, not just fast home broadband.

Try it — interactive walkthrough

A simplified click-through of the same flow. Pick a ticket, see the reasoning, get review feedback.

foundry.dev
Your ticket queue
Tap a ticket to see the reasoning behind it
#482 Inventory drift after refundBug
Legacy service · no stack trace
#503 Add pagination to orders APIFeature
Ambiguous page-size requirement
Ticket #482
Reported by QA · priority: medium
Reporter
"Counts look wrong after some refunds. Not sure which ones yet."
Your question
"Does this happen on partial refunds too, or full only?"
Review feedback
3 comments · 1 change requested
SR
Senior reviewer
You fixed the partial-refund case, but full refunds will double-count again — check line 3.

↑ Click through it

1

Pick a ticket

Every ticket shows how messy and how clear the surrounding code and requirements are.

2

Ask, then submit

Clarify the ambiguous parts before writing code — same as a real ticket thread.

3

Get real review

Feedback explains the reasoning, not just pass or fail, and updates the skill record.

Usability testing

Method

9 participants (6 graduating CS seniors, 3 recent bootcamp grads), testing three tasks: triaging a ticket queue, debugging an unfamiliar failing test, and responding to review feedback.

01

Students didn't know where to start reading unfamiliar code

5 of 9 participants opened the failing test first, then bounced between files with no clear strategy.

Added a "start here" pointer on each ticket, pointing to the one file most relevant to the reported symptom — a hint, not the answer.
02

The clarifying-question step felt like it might be graded against them

Testers hesitated to ask questions, assuming it signaled they couldn't figure it out alone.

Reframed the prompt explicitly: "Real engineers ask this. Asking is part of the ticket, not a shortcut around it."
03

Review feedback with only one comment felt like a pass/fail in disguise

Participants trusted multi-comment reviews far more than single-verdict ones, even when the verdict was positive.

Every review now includes at least one comment on something done well, not only what needs to change.

Unfamiliar-bug task success

Before iteration
52%
After iteration
87%

System Usability Scale (SUS)

Before iteration
61
After iteration
80

Accessibility

CODE CONTRAST IS CHECKED LIKE ANY OTHER UI TEXT: Pass Borderline Fail
  • Full keyboard operabilityEvery workspace action — opening a file, running tests, submitting a PR — has a keyboard path, tested with a screen-reader user navigating the editor by keyboard alone.
  • Syntax color isn't the only signalErrors in the code pane pair color with an inline marker and message, so a colorblind or grayscale-mode user doesn't lose the failing line.
  • No timed pressure by defaultTickets don't carry a countdown timer — timed challenge modes are opt-in, since anxiety was already a barrier research surfaced repeatedly.

Code editor contrast, checked against WCAG AA

7.1:1
Body text
6.4:1
Keywords
6.8:1
Functions

Every syntax-highlight color was checked against the dark editor background, not just the page's own light/dark theme.

Style guide

Color

Brand deep

#2B3550

Brand

#4C5C7A

Accent

#C4602E

Bug tag

#0C9A4C

Messy tag

#B9791E

Blocking

#C43A3A

Ticket tags

BugA real failing test or reported defect to reproduce and fix
FeatureA new capability to add inside existing, unfamiliar code
UndocumentedLegacy code with no comments and an author who's moved on

Elevation

sm
rows, tags
md
cards
lg
browser windows

Type scale

StyleFamily / weightSize / line
DisplayNewsreader, italic 50032–72px / 1.0
H2 / H3Newsreader, 56020–40px / 1.2
BodyInter, 40014–18px / 1.65
LabelIBM Plex Mono, 600–70010–12px / 1.3
CodeIBM Plex Mono, 400–5008.5–11px / 1.7
Display / Newsreader italic 32px

Day-one panic

Code / IBM Plex Mono 11px

expected 42, got 44 (line 3)

Icons

So Far

Impact & what's next

Validated through iterative usability testing ahead of a planned engineering handoff.

87%
Unfamiliar-bug task success after iteration, up from 52%
80
SUS score, up from 61 before the fixes above
14
Realistic tickets resolved per student across the tested track
8/9
Participants said the skill record felt more credible than a GPA

What I learned

Realism mattered less as difficulty and more as trust. Students didn't disengage because the code was hard — they disengaged when a "messy" scenario felt fabricated. The moment testers recognized the mess as genuinely real (an actual old comment, an actual abandoned TODO), their patience for struggling through it went up, not down.

What's next

Next steps include piloting the sanitization pipeline with a real engineering team to validate it holds up outside a solo-designer mockup, testing whether hiring managers actually change shortlisting decisions when shown a skill record versus a resume, and extending tracks beyond backend Ruby/Rails into frontend and data engineering codebases.