Design Systems at Achievers   ·   2023–now

Stewardship of a design ecology

The Achievers Platform improves employee engagement by centring a sense of belonging to an organisation. Employees who recognize each other and are recognized for their contributions by peers and managers, foster a stronger sense of community and participation at their companies. Our design system then, could aspire to the same ideals.

My role
  • Nurture the design system
  • Transition from a component library to a more cohesive system
Output
  • Figma components
  • Processes to use and improve the design system
Results
  • Fondness for the system
  • Team-wide investment in its success

The challenge:

One product, built by 12 teams

We have 12 teams at Achievers and each works on a different part of the product. To the end-user however, this is generally invisible. A user consumes a product as a whole, jumping across workflows with no concern for team boundaries. And although teams want a singular experience for users, each feature has individual challenges to meet and it isn’t always possible to consult all other teams in that process.

The design system then, is a shared language that keeps the user familiar with their surroundings, even as they switch tasks, abandon carefully constructed journeys, or run multiple tabs concurrently using different features. To use a metaphor, a design system is like a langauge: the grammar is shared, and teams have a unique vocabulary of words to meet their needs. As a design system designer, I help ensure that words mean the same thing everywhere.

Areas of focus

  • The Semantic Layer

    Ensuring everybody has a common language for discussion and production.

  • A Shared Journey

    Bringing everyone along for the ride, so no team gets left behind.

  • Prioritising People

    Systems don’t build products, people do; keep the focus on humans.

The Semantic Layer

Go from “how do I make something” to “what is it that I am making

One key boundary to consider is what part of a flow should be driven by the feature team, and what the design system. Our starting point was to see the system as a set of shared rules, and the feature teams would attempt to follow those rules.

Our core rules tended to be primitive, eg: icons should be 24px, solid. This meant that although our icons shared a visual similarity, they didn’t share meaning. We developed different icons with the same meaning, and also used the same icon to convey different meanings.

An example of icons

Picking icons that mean the right thing

Much like many icon libraries, our icons were named literally. An arrow pointing right was “ArrowRight”, and a chevron pointing right was “ChevronRight”. Error icons included “ExclamationCircle”, “ExclamationDiamond” and “ExclamationTriangle”. This was simple to understand but led to some problems:

  1. How do you know when to use a chevron, and when a triangle arrow?
  2. Which exclamation icon do we use for warnings and which for alerts?
  3. How would we handle switching the arrow to left when displaying a right-to-left language?

We address this by naming icons by their semantic meaning. By collecting all the uses of icons across teams and understanding their intended purpose, we labelled triangle arrows “Expand” and chevrons “Move”. This allows feature designers to focus on the action rather than icon selection. For direction, icons that followed reading direction switched to logical naming (eg. “ExpandForward”) allowing us to flip relevant icons for RTL languages. Similarly exclamation icons were replaced with “Warning” and “Alert” labels, again focussing on intent.

Across the entire library, this moved focus from what icons looked like, to what the user intent was, creating more consistency in different parts of the platform.

Switching to semantic icon names created a shared vocabulary that every team could use. This changes the design problem from the question “how do I make a right arrow” to “what is the icon for expanding forwards”. Conversations across teams then, are not focussed on icon agreement, but on what the user is doing. And this process scales for typography and colour as well.

  • Sans-serif 24px, becomes PageHeader and also includes heading level, colour and accessibility label connections to the parent section
  • Color #f31256, becomes Error/Alert, which can also inform screen reader urgency

Getting abstract

As this semantic layer covered more of the platform, it could include more abstract concepts. These product more complex reusable patterns, that makes the product feel more natural to a user jumping between different parts of the app.

  • an input field focussed on selecting a person could be semantically improved into a PersonSelect with autocomplete that displays avatars and an optional org chart
  • date and time selectors focussed on scheduling can be combined into a higher level pattern with resolution settings like “morning/evening” and “month”… or handy shortcuts like “Tomorrow”, or “First Monday of the quarter”

A shared journey:
Nemawashi (根回し) and Tatakidai (叩き台)

A design system is a community resource. Although there is a team focussed on maintaining and evolving it, its purpose is fulfilled by every other team. It seems counter-productive then, to consider “ownership” and instead I see design system designers as stewards—caring for the property of another. When something needs changing then, it cannot be enforced by its owners alone.

Here, I take two lessons from the Toyota Way. Instead of building consensus all at once in a large meeting, I spend time with each designer likely to be affected by the change — a new component, an update, a core principle — to take questions and feedback. This tests the change in small ways, leaving space to adjust it (tatakidai) and lays the ground work (nemawashi) for the update announcement when it is ready. This way, many people were involved in its creation to a great level of detail, and it has been through many rounds of testing as a part of its development.

The resulting announcement is also a more positive process. Most people are already familiar with details behind the change, and their concerns have either been addressed, or at least noted for future consideration.

In order to improve visibility into the changelog, I also wrote a weekly snippet of an ongoing adventure saga reflecting the journey the design system itself was going through. This added a bit of fun to the release process and got the team used to updates.

Prioritising People

Systems don’t build products, people do

Designing for semantics also has a strong positive benefit on development. Discussions between design and dev teams can be on concept and focus on the objects themselves without concern for their literal construction. A PageHeader component can be assumed to exist, and a feature team can focus entirely on its use to the user without worrying about the size, colour or level it might need to be. To create space for these discussions, we wrote type definitions for proposed components before we started building them.

Example

type PageHeader = { title: string; subTitle?: string; backAction?: { label: string; onClick: () => void; }; }

This creates an agreement between all parties for what information is required to render a PageHeader component. Therefore content, is the primary concern.

Appreciation:
What feature teams have to say

  • Changelog makes it easy to follow what has changed/when (And love the stories we get every week)

  • Meaning to icons (& the like) makes selecting the appropriate one for designs easy

  • We have better awareness of how other domains are using the components

  • I really like the the team is being updated or asked about new things

  • It is a fulfilling feeling to contribute to the design system

  • it's ensured there is a structure/mechanism in place so people know what to do

  • it makes sure the right conversations are happening