UX Case study

A design system is only living if it is used as code

This one is a position more than a project. Four goes at the same thing, at four companies, between 2017 and 2020, and one difference decided which of them was still in use after I left: whether the library was compiled into the product or filed as a document to be consulted. The method barely changed across the four. What follows is how the last of them was built, and what the earlier ones taught me by stopping short.

4
Companies, one method, 2017 to 2020
9
Rules a component had to pass before publishing
6
People on the last team, four of them developers
Clients
Role UX Designer, and the system's product owner by default
Team 4 front end developers, one from each product team, and 2 designers, on a kanban board with no product owner
Timeline Coolblue 2017, Floorplanner 2018, Maersk 2019, Findhotel 2020, and since then Zimmer Biomet 2021 and TrackBee
Platform Component libraries behind web products, on desktop and mobile
Tools Sketch, Figma, Zeplin, InVision, Abstract, Storybook, Chromatic
A page of the style guide showing single line text fields in every state, primary and secondary buttons, sliders and an icon row

Sample of Floorplanner's design system. A text field can have multiple variants depending on its state.

Problem

Nobody decides to build four different buttons

Design in a company of any size is decentralised, and it is decentralised for good reasons: a designer sits with a team, learns that team's problem, and ships against that team's roadmap. The cost arrives later and somewhere else. Put two of those teams' screens side by side and the differences are immediate, and none of them was ever chosen.

They run at every scale. At the small end it is a font style that is one step off, or a shade of grey that exists because somebody sampled it from a screenshot. At the large end it is a whole flow that did not need to exist, built because the team that needed it had no way of knowing another team had already solved it.

What makes this hard to fix is that it is not a quality problem. Every one of those screens was made carefully by somebody competent. The inconsistency is a side effect of the structure, so the fix has to be structural too, and a document telling designers to be consistent is not a structure. It is a request.

So the thing to build is not a style guide. It is a place where designers and the front end developers who are inclined to care about design can codify a language together, and a route by which what they agree lands in the product without anyone retyping it.

Goals

What a system has to do to be worth the sprint

I have never fully hit all three of these, and I will say that before saying anything else. They are the bar, and how far short an attempt fell is the most useful thing about it.

Consistency the customer feels
The person who benefits never opens the library. They benefit by not having to relearn what a button looks like between one page and the next, which is a cost that is invisible when it is paid and invisible when it stops being paid.
Open enough to be edited
Not a designer's document. Developers, copywriters and product owners all have a claim on how a component behaves, and a system only they are allowed to read is one they will route around the first time it is inconvenient.
Compiled, not consulted
Change the style guide and the products change. If the guide has to be read by a person and then typed again by another person, the two will drift apart, and the drift is the exact problem the guide was built to end.

Team & audience

One sprint in four, and no product owner

The arrangement that has worked best for me is a borrowed team rather than a standing one. One designer and one front end developer from each product team, meeting on a fixed schedule, and on the last attempt that schedule was one sprint in every four.

The gap is doing real work there. Three sprints of ordinary product delivery is how the team finds out what the library is actually missing, so the fourth arrives with a queue somebody has already felt the need for rather than a list of improvements imagined in a room.

It was six people: four front end developers, one from each team, and two designers. We ran a kanban board and we had no product owner, which is less a boast than an explanation of the next paragraph.

Without one, the ticket writing fell to me. Most of it was small and specific, one component's states or one component's naming. Occasionally it was not: bringing every colour and type token up to W3C contrast guidance was one ticket in the sense that it had one title.

Every component variant carries the name it will be called by in code, which makes design match the implementation.

Audience

Who actually opens it

Worth separating the two, because a system built for the wrong one of them fails in a way that is hard to see. The beneficiary is the customer. The users are four groups inside the building, and if any of them cannot get what they need out of it, that group starts keeping its own version.

Front end developers
The group that decides whether any of it is real. They need a component they can import, not a specification they have to interpret.
Designers
They need to be able to take a component off the shelf and trust it, including trusting that somebody else can edit their work without it falling apart.
Copywriters
The most consistently forgotten. Word length, tone and sentence shape are component properties, and a component drawn only in English at a comfortable length is a component that breaks.
Product owners
They need to see what already exists before they scope something that does not need building, which is the cheapest saving in the whole exercise.

Scope and constraints

What did not need an experiment

Almost none of this work was tested, and that was the correct call rather than a corner cut. Two kinds of change made up nearly all of it, and neither is the kind of question an experiment can answer.

The first is removing a variation nobody chose. If a product has three greys where two teams each invented one and nobody can say what the third is for, collapsing them is not a hypothesis. There is no version of the result that argues for keeping an accident.

The second is applying guidance that already exists and is better evidenced than anything we could run ourselves. Contrast ratios are the clearest case: W3C has done the work, at a sample size no single company reaches, and rerunning it locally to see whether our users also prefer being able to read things would be theatre.

When a change genuinely was a question, it left this team. It went down to the product team that owned that surface, where there was a product owner to prioritise it and a data scientist to design the test, which is also the only place the traffic to answer it lived. A design system team running its own experiments is a design system team competing with the roadmap it depends on.

Process

Six steps, and the first three are politics

The order matters more than the contents. Three of these six happen before a single component is drawn, and skipping them is how a design system becomes a folder somebody made once.

01

Mapping what is already there

An inventory before a proposal. Colours, text fields, font families, toggles, sliders, popups, buttons, split buttons, galleries, and every variation of each that the product turned out to contain.

The list is not the deliverable. The deliverable is the visual version of the list, because a count of thirteen button styles is a number somebody can dispute and thirteen buttons laid out across three slides is not. This is the artefact that makes the next step possible, and it is worth the days it takes.

The catalogue turned out to be its own best exhibit, which I only found rebuilding this page from it. The primary button is in there three times in three different blues: #3979F5 on the buttons slide, #0074F8 in the header, #4476FB in the dialogues. The gap between the first and the last is sixty-eight points of red. Nobody picked three. Sampled off the deck's own slides, five years after it was made.

Form

13
First name *
Empty input with placeholder
Taipei City
Text input completed with clear option
Empty text input with button
e.g. city, region or hotel
Taipei CityTaiwanDec 15 - Dec 16, 2 GuestsCity
Taipei CityTaiwanNov 24 - Nov 25, 2 GuestsCity
Autocomplete text input
Taipei City
Taipei CityTaiwanDec 15 - Dec 16, 2 GuestsCity
Taipei CityTaiwanNov 24 - Nov 25, 4 GuestsCity
Autocomplete filled input
Choose a bed type1 double bed2 single beds1 double bed and 1 sofa bed2 double beds1 king bed1 twin bed
Select field
Tue, Jan 21January 2020 MoTuWeThFrSaSu1314151617181920212223242526
Date field
Telephone number *This does not look like a valid phone number
Error message on an empty input
Requests (optional)
Textarea
Hotel
Checkbox
Expiration MM/YY *12/19
Input with mask
Telephone country code *Netherlands +31
Complete input with validation
Telephone number *0654331553You may be reached at: +31 654331553
Empty input with info

Buttons

13
Search
Primary button
Filter by
Secondary button
Reset
Quiet button
Go back to search
Link button
Unlock Deal
Private deal button
Field icon button
Show details
Accordion button
EN
Button row
English
List icon text button
Delft
Anchor button
Icon button
9+
Toggle button
Best match
Radio button

Display

9
The price for this hotel has dropped today
Tooltip
Private deal unlocked8.3Efficient check-in/check-out
Chips
Stars
Couples50%
Progress bar
Spinner
Searching all the best travel sites
Toaster
We use cookies. Continue browsing if you are okay with that.
Overlay banner
Unfortunately the price has changed.The price raised from €181.72 to €182.00Secure bookingIt takes only 2 minutesThe deal you chose is no longer availableWe found you these other great deals
Inline banner
Property TypeHotel854Apartment212Guest house63Hostel29Bed and breakfast11Inn4Show more
Filter options

Containers

8
Movenpick Hotel AmsterdamOostelijk Havengebied8.8FabulousBooking.com€111View DealACCOR€111€105View Deal
Card
Check in/Check outCheck in from 15:00Check out prior to 12:00GeneralPaymentHouse rules
Expansion panel
Booking.com€141View Deal
Clickable row with hover
Option 1Free cancellation↑ Before Mon, Jan 20€123Reserve
Row
Booking.com€92View DealExpedia€94View DealHotels.com€94View Deal
Row list
Divider
FINDHOTELEN
Header section
Footer section

Images

5
Avatar
Image thumbnail
Image, one round corner
Image with round corners
1/49
Image

Menus

3
FINDHOTELENEnglishEspañolFrançaisPortuguêsItalianoDeutschNederlandsPolskiTürkçeSvenskaDanskNorskSuomiČeštinaMagyarRomânăHrvatskiSlovenščinaEestiLatviešuLietuviųFilipinoMelayuSlovak
Dropdown menu
PreferencesEnglish (en)Euro (€)About UsPrivacy PolicyHotels FAQContact
Burger menu
AmsterdamCheck InTue, Jan 212 Guests, 1 RoomCloseSearch
Expansion menu

Navigation

3
View on Google Maps
Link
Link list
PhotosDetailsLocationReviewsDeals
Tabs

Overlays

2
FINDHOTELENSold out on your datesLooks like there are no longer any rooms available for the dates you selected.Back to previous page
Page overlay
Payment failedSorry, we could not process your payment. Please try again.Back to formCustomer Support
Dialog
  • #3979F5Buttons slide, Search
  • #0074F8Header section, Search
  • #4476FBDialog, Back to form

One primary button, three blues, no decision. This is the inventory arguing its own case.

02

Buying the time

With the inventory in hand, a lead developer and I put a presentation in front of the people who sign off on where sprints go. The audience picked itself. The people who had been complaining that the product does not look like itself in different places were the ones who would make this real, because they had already noticed the problem and had no name for it.

That is the whole trick of this step, and it is not a trick. Nobody funds a design system as an abstraction. They fund it once they have seen the thirteen buttons, at which point the argument is no longer that consistency is good in principle.

The deck itself is ten slides and hardly any of it is about buttons. It asks what the problems are and answers with the plain ones: features ship slowly, nobody is sure which components already exist or how to use them, small bugs in components never get fixed, accessibility is missing across the application. Then it spends two slides on consistency, efficiency, scale and quality, and one on what to avoid, which was getting rigid enough that the library starts deciding what can be designed. Read on its own it is the case that could be made at any company, and that is what it is for. The specific case was the board above. The deck is the general one you write down afterwards so that there is something to approve.

03

Composing the team from every team

One designer and one developer out of each product team, rather than the two or three people most enthusiastic about design systems. The enthusiasm is easier to find and produces a worse result.

A team drawn from everywhere has a representative in every room where the library will later be either used or ignored. That is what turns adoption from a rollout into something that has already happened, and it is the difference between a library the company uses and a library its authors use.

Four product teams, and the six people who put their strengths together: four front-end developers and two UX designers.

04

Choosing tools, mostly by not choosing

On the design side this came down to two decisions: what to draw in, and where to publish. At Maersk in 2019, InVision was already licensed and widely used. At Findhotel a year later it was Zeplin. Both companies had Sketch seats. In each case the answer was the tool already in the building, and going the other way would have spent the project's early credibility on a migration nobody had asked for.

On the development side there was a real requirement rather than an inherited one: as much of the path from a published component to a usable component as possible had to be automatic, because every manual step in that path is a place where the two copies start to differ.

Zeplin Zeplin The source of truth both sides looked at. Everything below is arranged around keeping this one honest.
Sketch Sketch Where the components were drawn, and the seat both companies had already paid for.
Figma Figma The online alternative, and in 2020 the challenger. It is the default now, and Sketch is the one that gets argued for.
Storybook Storybook The other end of the same shelf. A component that exists here exists in the product.
Chromatic Chromatic What made a pull request something a designer could review, by turning a diff into a picture.
05

Drawing components, and agreeing what one is

Divided among the designers, one component at a time, and the unit of work is the component in all of its states rather than the component. A field is not finished when it looks right empty.

Two designers dividing that work will produce two incompatible halves unless somebody writes down what finished means, so I did. Nine conditions, and a component met all nine or it did not go on the shelf.

  • Flexible to resizing
  • Using the official list of font styles and families
  • Using the official list of colours
  • Fitting exactly within the 8px grid, or the 4px one
  • Carrying a mobile and a desktop version, where that applies
  • Exposing the fewest editing permissions that still make it useful
  • Properly named, including every sublayer
  • Tested on a canvas for resizing and for permissions
  • Published to the official platform

Four of them are worth seeing rather than reading, because each is a rule about a shape.

06

Publishing, which is where the argument is settled

This is the step my earlier attempts got wrong, and getting it wrong does not look like failure at the time. With InVision I published to designers. Designers used it. The results were fine and the products drifted anyway, because a design silo and a development silo produce the same drift as no system at all, one handover later.

Design becomes code eventually or it does not ship. So the last attempt went straight at the developers instead: components mapped one to one between the design side and the build side, each with a URL indexed in a file the front end could read.

Below is one component, the star rating, in the three places it exists. It is the same object in all three, and that is the entire argument of this page reduced to something checkable.

What shipped

Pages that came out of the shelf

None of these is a design I would put forward as a piece of work on its own. They are here as the other kind of evidence: pages assembled almost entirely out of parts somebody else could also have used.

In the order the systems happened, which for the first four is the order of the marks under the header. Two of those have screens here, one has a slot held for it, and Coolblue in 2017 has nothing left that I can show. The fifth is later than everything else on this page, and what it can show is a different kind of thing.

Floorplanner, 2018

The earliest one with anything left to show, and a different kind of product: a drawing tool rather than a funnel. The two marketing pages at the end are the interesting ones, because a marketing page assembled from the product's own components is the case where the guide reached past the product it was built for.

Maersk, 2019

The middle one, and the gap in this page. Maersk is named three times above this line, and again in the conclusion, where it is one half of the counter-example the whole argument turns on. Until something of it is shown here, that half rests on my word. The slot is held rather than quietly left out.

Material being selected

Findhotel, 2020

The whole funnel, on both devices. The mobile captures are full page exports and one of them is twelve times as tall as it is wide, so what is shown here is the top of each; opening one gives the page whole.

Zimmer Biomet, 2021

This one sits outside the run above. A surgical planner, built over eighteen months, and the only medical product of the five.

The screens first. Then the parts they are made of, which is what this page is about: most of the dialogues in this product are one component with different content inside it. Change the component once and every dialogue changes with it.

The parts. The first four are the same dialogue with something different in the middle. The next two were kept out of it on purpose, and deciding what is not one component is the same job as deciding what is. The last two are components as they appear in the product, with the button that opens them.

Conclusion

One of the four was still compiling when I left

Used in every product

By the time I left Findhotel it was a live library, imported by every product in the portfolio rather than referred to by them. What has become of it since, I have no way of knowing.

Colour fixed in one pass

Bringing every token up to W3C contrast guidance changed every product at once, which is a thing a document cannot do at any speed.

20

Atoms listed in the published library, counted off the sidebar of the star rating screenshot in step six, where the list runs off the bottom of the screen.

No speed data, ever

Nobody measured what any of this did to how fast things got built. That gap is the last thing this page has to say, at the bottom of it.

The contrast with two of the earlier three is the reason this page exists. At Coolblue in 2017 and at Maersk in 2019 what I built was aimed at designers, with little developer involvement, and both were left at the mercy of whoever was sitting in a given team: it was that designer's job to reach for the components, to keep them current, and to apply them properly. That is too much to hang on one person's diligence, and it is not a criticism of any of the designers involved. A system whose enforcement mechanism is somebody remembering is a system that degrades on the first busy sprint.

The same six steps since

Everything above stops in 2020, which is when it was written. The method did not stop there. It has been used twice more since, in two fields with little in common with a booking funnel, or with each other.

Most of it carried over. The inventory still comes before the proposal, and publishing is still the step that decides whether the library gets used. What changes is how much a mistake costs. Where that cost is high, the nine rules get stricter rather than different.

Zimmer Biomet, 2021

A surgical planner, eighteen months, one designer on the product.

Step three did not happen. There was no designer and developer from every product team, because there was one designer and one product owner. So the library was used because the person who drew it was also the person using it. That is a much smaller test than the four projects above gave the method, and I would not read more into it than that.

The other steps ran as before. The tools were the ones already in use, Figma and Zeplin. Components were still drawn one at a time, in every state, and a component still was not finished when it only looked right empty.

What the medical setting added was a second level. Tokens first, then components built from those tokens. The reason is the paperwork. Every change to this product needed four things on the record: what success meant, the risk to the patient, what else the change touched, and evidence that it worked. When a change costs that much to write up, changing one token is far cheaper than changing forty components. That is the whole argument for the second level.

So the ninth rule grows. Publishing used to be where a component was finished. Here it is where its paperwork starts. The other eight are unchanged.

Whether two levels is the right answer for the next one, I do not know yet. It is the answer this project needed.

TrackBee

The second of the two, and the current one. The same slot as Maersk further up, held for the same reason and on the same terms.

Material being selected

Lessons

A silo on either side does the same damage
I spent three goes at this believing the problem was designers not agreeing with each other. The design side agreeing perfectly and handing over to a development side that reimplements from a picture produces exactly the same drift, one step later, and it is harder to see because both halves look tidy.
One source of truth, and mean it
The principle that has done the most work for me, and the one that is easiest to break by accident. Every second place a component is described is a place it will be described slightly differently, and the copy nobody is maintaining is the one somebody is reading.
Make improving cheaper than starting over
Designers and developers will keep making things; that is the job. A system does not stop that and should not try. It wins by making the existing component the path of least resistance, so the next screen improves what is there instead of adding a fourth version of it.

There is a fourth and it is the uncomfortable one. Nothing here has a number attached to it. I can show that the library was built, that it was imported, that dozens of components were standardised and duplicates removed, and I cannot tell you what any of it did to delivery speed, because nobody instrumented it and I did not push hard enough for somebody to.

The cost of that is not academic. Every design system I have worked on has had to be argued for again, from the beginning, in front of people who were entitled to ask what the last one returned. An answer to that question is the single most valuable artefact this work could have produced, and it is the one artefact I do not have. If I were starting the next one on Monday, the measurement would go in the first sprint, not the eventual one.

Looking for me on LinkedIn?

Let's connect. I'm always happy to talk about UX, travel booking, or anything in between.

Go to profile