Introducing Design System Into Mature Codebase

Rate this content
Bookmark

Introducing design system into mature codebase. Let me walk you through our challenges, very useful tools to understand your current situation, tools to measure the impact of design system work, tools to make it happen.

This talk has been presented at React Advanced 2024, check out the latest edition of this React Conference.

FAQ

Clio ensures collaboration by engaging teams through surveys, running office hours for open discussions, and maintaining comprehensive documentation to enable team members to contribute effectively.

Documentation is crucial in Clio's design system as it provides guidelines on collaboration, updating, and deprecating components, maintains the single source of truth, and ensures all team members are aligned and informed.

Clio faced challenges such as inconsistent component designs, multiple styling systems, difficult maintenance, slow onboarding, and a disjointed user experience due to siloed squad work and fast feature delivery.

Clio's design system team takes an iterative approach to implement changes, focusing on small initiatives and step-by-step improvements to avoid disrupting ongoing work and to adapt to the fast-paced environment.

The goal of Clio's design system team is to achieve more than 60% adoption of their design system, ensuring widespread use and consistency across the codebase.

Clio uses Zero Height to maintain its design system documentation, integrating tools like Storybook and Figma, and storing information on components, style guides, patterns, and design tokens.

A design system is important for Clio's mature codebase because it provides a structured approach to manage the complexity that arises from fast-paced development, ensuring consistency in components and styling, and improving overall user experience.

Clio uses a React scanner to crawl the codebase, gathers data using technologies like GitHub Actions, Redshift, and the Count platform, and uses this data to understand component usage and track trends.

The purpose is to create a shared language and process that speeds up teamwork, keeps everyone aligned, and addresses challenges like inconsistent design patterns, difficult maintenance, slow onboarding, and disjointed user experience.

Kasia Jastrzebska
Kasia Jastrzebska
13 min
28 Oct, 2024

Comments

Sign in or register to post your comment.
Video Summary and Transcription
Let me walk you through introducing design system into mature codebase loosely based on Clio. Mature codebase challenges: inconsistent components and styling, multiple color palettes, and inconsistent design patterns. Working in siloed squads led to difficult maintenance, slow onboarding, and disjointed user experience. Design system squad realized the need for a plan and data to guide them. We need data to guide us. A React scanner library enabled us to crawl through the code base and understand the components used. Technologies like GitHub Actions, Redshift, and Count were used to store and query the data. The script involved running a scanner, configuring it, and sending the data to Redshift via Fivetran. ReaRscanner provided the pattern for processing data. We collected and sorted data on component usage and imports to identify pain points and track trends. Collaboration was a challenge, so we engaged teams through surveys, office hours, and extensive documentation. Our goal is to achieve over 60% adoption of the design system. We worked on keeping a single source of truth in our design system. Zero Height is our platform for storing component documentation, integrating tools like storybook and Figma, and ensuring alignment across design and code. Design systems are more than components and tokens; they create a shared language and process that facilitate teamwork and alignment.

1. Introducing Design System into Mature Codebase

Short description:

Let me walk you through introducing design system into mature codebase loosely based on Clio. Mature codebase challenges: inconsistent components and styling, multiple color palettes, and inconsistent design patterns. Working in siloed squads led to difficult maintenance, slow onboarding, and disjointed user experience. Design system squad realized the need for a plan and data to guide them.

Hello everyone. Let me walk you through introducing design system into mature codebase loosely based on Clio. But before we'll go into the more details, let me introduce myself properly. I'm Kasia Strzymska, design tech lead at Clio. I'm based in Poland, Gdańsk, but Clio is pretty much based in London. So I'm a full remote Clio employee.

So mature codebase, what exactly it is based in Clio? So if we think about a project, when we're starting a project, we are thinking about something pretty much meeting requirements, meeting expectations. We are gathering these requirements and then we'll be building something which is good enough to meet all requirements, deliver all the features. So in an analogy of a house, it has windows, it has doors, walls, a roof, hopefully some rooms inside, a bed. And this is like a final product.

But over years, over many years, for example, eight years, this house starts to grow and sometimes it starts to grow in a very weird direction. So this is what can a mature codebase become if developed at a very, very fast pace, as was the Clio example, where we are a startup, we're considering ourselves as a very fast moving, fast paced startup. And we've been trying multiple different features with our users. And because of that, our codebase grew a lot over these years. And because of that, we've met loads of challenges on the way, one of them being the fact that we introduced loads of components, many of which looked differently, behave differently. Even though they were about to have the same function or similar function, they all looked not the same. And same with styling. So over these years, we introduced many different styling. There was a rebrand going on on the way. So we had a couple of different color palettes living in the codebase, token sets, some colors or spacing being used as magic values. And over the years, we introduced plenty of inconsistent design patterns as well.

Mostly, but probably not only because of that, we've been working in siloed squads, we still work in squads, product squads, which are very focused on the features and delivering features in the scope of their domain. They are very much prioritizing fast delivery of a feature over consistency. And because of that, we've had to face more than these, but also these challenges of difficult maintenance, slow onboarding and disjointed user experience, which is, you know, for a company as Clio's very, very user focused, user oriented, disjointed user experience is super painful to watch, to see. We realized as a design system squad that there is one thing we need. So coming back to our house analogy, we need a plan. We need architectural plan of this huge house. We need to understand where we are, how many windows we have, how many doors, what shapes, all of this information. We basically needed data to guide us, which is also very Clio connected because we use data all the time. So design system was not any different.

2. Gathering Data and Utilizing React Scanner

Short description:

We need data to guide us. A React scanner library enabled us to crawl through the code base and understand the components used. Technologies like GitHub Actions, Redshift, and Count were used to store and query the data. The script involved running a scanner, configuring it, and sending the data to Redshift via Fivetran. The config provided options for crawling, returning or saving the data, and using mapping functions. The count processor counted component instances and props, while the custom instance import info processor provided import information.

We basically need to have data to guide us. And in order to gather some data, obviously, we need to investigate what are our options. We could write all of the solution by ourselves. But luckily, there was a React scanner, which is a very great library enabling React engineers to crawl through the code base to understand what components are being used. I will show you a little bit of code later on. Besides that, I've used technologies from our portfolio, like Clio portfolio, alongside GitHub Actions, Redshift, to store data and Count platform to query the data.

So if you like to see visualization of this, it was a GitHub Actions triggering the script, the node script living in the repo next to the repo. Then the script was using Webhook provided us through Fivetran and the Webhook was just getting the data and sending them over to Redshift. And from Redshift, data was available on Count. So our analytics and our engineers could query the data to understand where we are. So a little bit about the code itself, the script. So it's pretty straightforward. There was a scanner. We had to run it and wait for the results. The config I will show you later on. Then the stringification of the data. There's a little bit of mapping going on and the mapping is very simple. It's just moving from HashMap towards Array and then the Webhook I've mentioned before. So sending all this data via Fivetran in our case to Redshift.

So the config, also pretty straightforward. There's a crawl from. So we pretty much want to inform ReaRscanner where it's supposed to start the crawling. The method. So what ReaRscanner should do with the data? Should it return the script directly or maybe should it save somewhere to the file? There's also an option to return. It gives us an option to just get the data and maybe do some mapping with the data and then do something else about it. Also, it's possible to just save the data directly into JSON file and maybe do something with this file as well. The next option processors is basically all of the mapping functions provided by ReaRscanner by default, but also a possibility to create some custom ones as I've created. So the count, components and props is pretty much a ReaRscanner processor to go through all of these components and instances of these components and count the instances and props used and return this information in a form of a map. And then the second one, the custom one, I will show you. So the instance import info processor is a very simple one.

Check out more articles and videos

We constantly think of articles and videos that might spark Git people interest / skill us up or help building a stellar career

Design Systems: Walking the Line Between Flexibility and Consistency
React Advanced 2021React Advanced 2021
47 min
Design Systems: Walking the Line Between Flexibility and Consistency
Top Content
The Talk discusses the balance between flexibility and consistency in design systems. It explores the API design of the ActionList component and the customization options it offers. The use of component-based APIs and composability is emphasized for flexibility and customization. The Talk also touches on the ActionMenu component and the concept of building for people. The Q&A session covers topics such as component inclusion in design systems, API complexity, and the decision between creating a custom design system or using a component library.
Debugging JS
React Summit 2023React Summit 2023
24 min
Debugging JS
Top Content
Watch video: Debugging JS
Debugging JavaScript is a crucial skill that is often overlooked in the industry. It is important to understand the problem, reproduce the issue, and identify the root cause. Having a variety of debugging tools and techniques, such as console methods and graphical debuggers, is beneficial. Replay is a time-traveling debugger for JavaScript that allows users to record and inspect bugs. It works with Redux, plain React, and even minified code with the help of source maps.
A Framework for Managing Technical Debt
TechLead Conference 2023TechLead Conference 2023
35 min
A Framework for Managing Technical Debt
Top Content
Today's Talk discusses the importance of managing technical debt through refactoring practices, prioritization, and planning. Successful refactoring requires establishing guidelines, maintaining an inventory, and implementing a process. Celebrating success and ensuring resilience are key to building a strong refactoring culture. Visibility, support, and transparent communication are crucial for addressing technical debt effectively. The team's responsibilities, operating style, and availability should be transparent to product managers.
Building a Voice-Enabled AI Assistant With Javascript
JSNation 2023JSNation 2023
21 min
Building a Voice-Enabled AI Assistant With Javascript
Top Content
This Talk discusses building a voice-activated AI assistant using web APIs and JavaScript. It covers using the Web Speech API for speech recognition and the speech synthesis API for text to speech. The speaker demonstrates how to communicate with the Open AI API and handle the response. The Talk also explores enabling speech recognition and addressing the user. The speaker concludes by mentioning the possibility of creating a product out of the project and using Tauri for native desktop-like experiences.
A Practical Guide for Migrating to Server Components
React Advanced 2023React Advanced 2023
28 min
A Practical Guide for Migrating to Server Components
Top Content
Watch video: A Practical Guide for Migrating to Server Components
React query version five is live and we'll be discussing the migration process to server components using Next.js and React Query. The process involves planning, preparing, and setting up server components, migrating pages, adding layouts, and moving components to the server. We'll also explore the benefits of server components such as reducing JavaScript shipping, enabling powerful caching, and leveraging the features of the app router. Additionally, we'll cover topics like handling authentication, rendering in server components, and the impact on server load and costs.
Power Fixing React Performance Woes
React Advanced 2023React Advanced 2023
22 min
Power Fixing React Performance Woes
Top Content
Watch video: Power Fixing React Performance Woes
This Talk discusses various strategies to improve React performance, including lazy loading iframes, analyzing and optimizing bundles, fixing barrel exports and tree shaking, removing dead code, and caching expensive computations. The speaker shares their experience in identifying and addressing performance issues in a real-world application. They also highlight the importance of regularly auditing webpack and bundle analyzers, using tools like Knip to find unused code, and contributing improvements to open source libraries.

Workshops on related topic

Build Modern Applications Using GraphQL and Javascript
Node Congress 2024Node Congress 2024
152 min
Build Modern Applications Using GraphQL and Javascript
Featured Workshop
Emanuel Scirlet
Miguel Henriques
2 authors
Come and learn how you can supercharge your modern and secure applications using GraphQL and Javascript. In this workshop we will build a GraphQL API and we will demonstrate the benefits of the query language for APIs and what use cases that are fit for it. Basic Javascript knowledge required.
Building a Shopify App with React & Node
React Summit Remote Edition 2021React Summit Remote Edition 2021
87 min
Building a Shopify App with React & Node
Top Content
WorkshopFree
Jennifer Gray
Hanna Chen
2 authors
Shopify merchants have a diverse set of needs, and developers have a unique opportunity to meet those needs building apps. Building an app can be tough work but Shopify has created a set of tools and resources to help you build out a seamless app experience as quickly as possible. Get hands on experience building an embedded Shopify app using the Shopify App CLI, Polaris and Shopify App Bridge.We’ll show you how to create an app that accesses information from a development store and can run in your local environment.
Build a chat room with Appwrite and React
JSNation 2022JSNation 2022
41 min
Build a chat room with Appwrite and React
WorkshopFree
Wess Cope
Wess Cope
API's/Backends are difficult and we need websockets. You will be using VS Code as your editor, Parcel.js, Chakra-ui, React, React Icons, and Appwrite. By the end of this workshop, you will have the knowledge to build a real-time app using Appwrite and zero API development. Follow along and you'll have an awesome chat app to show off!
Hard GraphQL Problems at Shopify
GraphQL Galaxy 2021GraphQL Galaxy 2021
164 min
Hard GraphQL Problems at Shopify
WorkshopFree
Rebecca Friedman
Jonathan Baker
Alex Ackerman
Théo Ben Hassen
 Greg MacWilliam
5 authors
At Shopify scale, we solve some pretty hard problems. In this workshop, five different speakers will outline some of the challenges we’ve faced, and how we’ve overcome them.

Table of contents:
1 - The infamous "N+1" problem: Jonathan Baker - Let's talk about what it is, why it is a problem, and how Shopify handles it at scale across several GraphQL APIs.
2 - Contextualizing GraphQL APIs: Alex Ackerman - How and why we decided to use directives. I’ll share what directives are, which directives are available out of the box, and how to create custom directives.
3 - Faster GraphQL queries for mobile clients: Theo Ben Hassen - As your mobile app grows, so will your GraphQL queries. In this talk, I will go over diverse strategies to make your queries faster and more effective.
4 - Building tomorrow’s product today: Greg MacWilliam - How Shopify adopts future features in today’s code.
5 - Managing large APIs effectively: Rebecca Friedman - We have thousands of developers at Shopify. Let’s take a look at how we’re ensuring the quality and consistency of our GraphQL APIs with so many contributors.
0 To Auth In An Hour For Your JavaScript App
JSNation 2023JSNation 2023
57 min
0 To Auth In An Hour For Your JavaScript App
WorkshopFree
Asaf Shen
Asaf Shen
Passwordless authentication may seem complex, but it is simple to add it to any app using the right tool.
We will enhance a full-stack JS application (Node.js backend + Vanilla JS frontend) to authenticate users with One Time Passwords (email) and OAuth, including:
- User authentication – Managing user interactions, returning session / refresh JWTs- Session management and validation – Storing the session securely for subsequent client requests, validating / refreshing sessions
At the end of the workshop, we will also touch on another approach to code authentication using frontend Descope Flows (drag-and-drop workflows), while keeping only session validation in the backend. With this, we will also show how easy it is to enable biometrics and other passwordless authentication methods.