Build productive designer-developer relationships with clear communication channels, shared vocabulary, and collaboration workflows that reduce friction and rework.
Design and development are two disciplines with different mental models, different toolchains, and different definitions of 'done'. When they collaborate well, products ship faster and with higher quality. When they do not, teams waste 20-30% of sprint capacity on rework, misimplementation, and miscommunication. This lesson gives you the concrete practices that make designer-developer collaboration productive.
Friction pattern 1: Late design changes. Developer implements a feature, then receives significant design changes because the designer was still iterating. Root cause: no clear 'design-ready' criteria. Fix: written definition of handoff-ready including all states and responsive frames. Friction pattern 2: Ambiguous specs. Developer makes implementation decisions that differ from designer intent. Root cause: vocabulary gap or missing edge cases in spec. Fix: shared vocabulary glossary and edge-case annotation protocol. Friction pattern 3: Slow feedback loops. Implementation question asked, no response for 2 days, developer unblocks themselves incorrectly. Root cause: no agreed SLA for design responses. Fix: collaboration agreement with response time commitments. Friction pattern 4: Scope creep via 'while you're in there' requests. Root cause: no change control for in-flight features. Fix: any design change during development goes through a ticket. Friction pattern 5: Pixel-perfect expectations on dynamic content. Designer designed with ideal content; developer implemented correctly but it looks broken with real data. Root cause: designs with placeholder content instead of realistic data. Fix: design with real or representative content from the start.
The spacing vocabulary gap causes more implementation rework than any other vocabulary mismatch. Designers measure 'the space between these two elements' — in CSS this might be a margin, a gap (in flex/grid), or padding on a containing element. The correct implementation depends on the layout context. Establish upfront: spaces inside a component are padding; spaces between sibling components are gap (flex/grid) or margin; spaces between unrelated sections are usually padding on the section. Also establish units: if the design system uses an 8px grid, tokens should map directly (spacing-1 = 8px, spacing-2 = 16px). When a spec says '24px spacing', the developer should ask: inside a component (padding) or between components (gap/margin)?
1/* Shared spacing token system (8px base grid) */
2:root {
3 --space-1: 0.5rem; /* 8px */
4 --space-2: 1rem; /* 16px */
5 --space-3: 1.5rem; /* 24px */
6 --space-4: 2rem; /* 32px */
7 --space-6: 3rem; /* 48px */
8 --space-8: 4rem; /* 64px */
9}
10
11/* 'Space inside card' = padding */
12.card { padding: var(--space-3); }
13
14/* 'Space between cards' = gap on parent */
15.card-grid { display: grid; gap: var(--space-3); }
16
17/* 'Section margin' = padding on section */
18.section { padding-block: var(--space-8); }Regular synchronisation prevents divergence between what is being designed and what is being built. Two lightweight sync patterns work well for most agile teams. Design review before sprint start (30 min): designer walks through upcoming sprint designs, developer identifies technical concerns, open questions are resolved before coding starts. This is the highest-value meeting in the collaboration cycle — problems caught here cost 10 minutes; the same problem caught in QA costs 2 hours. Mid-sprint check-in (15 min): developer shares in-progress implementation, designer validates intent, minor deviations corrected immediately. These two meetings — 45 minutes per sprint total — can eliminate 80% of rework. Outside of these, use async channels (Figma comments, PR comments) to keep the synchronous meeting time lean.
1/* Sprint sync agenda templates */
2
3Pre-sprint Design Review (30 min):
41. Designer: walk through ready frames (15 min)
5 - Point out non-obvious interactions
6 - Flag edge cases that need handling
72. Developer: technical concerns (10 min)
8 - Performance implications
9 - State management complexity
10 - API availability
113. Resolve open questions → add to design ticket (5 min)
12
13Mid-sprint Check-in (15 min):
141. Developer: screen share in-progress implementation
152. Designer: note deviations from intent
163. Agree: fix now vs note for post-launch polishDevelopers often avoid giving design feedback because they worry about overstepping. But developer feedback on designs is uniquely valuable — you know the performance implications, the data constraints, the edge cases, and the technical complexity. The key is framing feedback as technical constraints, not aesthetic preferences. Useful developer feedback: 'This animation requires loading a 200KB GSAP library — is there a CSS-only alternative we could use?' 'This list can have 0-500 items — the current design only shows 5; what should happen with 500?' 'The gradient on this button will be difficult to achieve while meeting AA contrast on all background colours.' Unhelpful developer feedback: 'I don't like this font.' 'This looks too complicated.' Frame every piece of feedback with: the technical constraint or concern, its impact (performance, accessibility, data), and a proposed alternative if you have one.
1/* Developer feedback template */
2
3[Technical Concern]
4Location: [Figma link / component name]
5Constraint: [The technical fact]
6Impact: [What breaks or degrades if implemented as designed]
7Proposed alternative: [What would work within the constraint]
8
9Example:
10[Technical Concern]
11Location: /dashboard, notifications panel
12Constraint: Real notification lists can contain 200+ items
13Impact: Current design shows 5 items with no scroll —
14 renders as a 2000px tall panel in production
15Proposed alternative: Add max-height + overflow-y: auto
16 with a 'View all' link to a dedicated pageYou cannot improve what you do not measure. Two proxy metrics for collaboration quality: Rework rate: the percentage of implemented features that require significant rework (visual, functional, or both) before final QA. A healthy team has under 15% rework; over 30% indicates systemic collaboration problems. Handoff-to-ship time: the elapsed time from 'design handed off' to 'feature shipped to production'. Long handoff-to-ship times often indicate unclear specs requiring back-and-forth clarification during development. Track these per sprint in a shared retro document. When rework rate spikes, trace it to the root cause (which of the five friction patterns triggered it?) and update the collaboration agreement accordingly.
1/* Collaboration metrics tracking (monthly retro) */
2
3Sprint 12 Review:
4 Features implemented: 8
5 Features requiring visual rework: 2 (25%) — high
6 Features requiring functional rework: 1 (12.5%)
7 Avg handoff-to-ship: 6 days
8
9Root cause analysis:
10 Both visual rework items: missing hover states in spec
11 Action: add hover states to handoff-ready checklist
12 Owner: Designer
13 Target: 0 missing-hover-state issues next sprint
14
15Sprint 13 Target:
16 Visual rework rate: <15%
17 Handoff-to-ship: <5 daysA structured runsheet for the 30-minute pre-sprint design review that catches technical issues before coding starts.
Next lesson covers Figma Dev Mode — how to extract CSS values, read design specs accurately, and understand what the inspect panel is and isn't telling you.
Your progress is saved in this browser, on this device only.