How to build a performance culture at scale

Here at Farfetch, we are always striving to be at the top of our game. In a web application where everything counts to provide the best possible experience, we understand that performance is a crucial factor to engage our users and boost conversion rates.
We felt in the last few years that we needed to take a step forward. We were not trying to simply improve the site speed. Our objective was far more ambitious. We wanted to gather everyone, not only engineering, around performance. We wanted to hear the term performance on a daily basis. We wanted a performance culture.
In order to achieve this, we realized that it couldn’t be a single person’s effort. We had to gather expertise from different areas. Hence we created a team of experts from four different areas in the company: engineering, infrastructure, architecture and product.
We called this team "Performance Matters”. We wouldn’t centralize performance concerns within this team, but it would drive our performance culture and push it forward.
As with any new team, we had questions that we wanted to answer in order to elevate our game. Our three main questions were:
- Which performance metrics should we use?
- How to prevent performance regressions?
- How to create awareness around performance across the company?
We had a rationale behind them. We first needed a way to track progress, hence the metrics. Afterwards, even before we started to improve, we wanted to understand how we could spot regressions because we didn’t want to backslide to the same place six months later. These two questions were like the groundwork for the third one where we would be engaging with the community and spreading performance as part of our lifestyle.
Which performance metrics should we use?
We started tracking these metrics with Synthetic and Real User Monitoring (RUM). Unfortunately, not all metrics are available in RUM. We have fewer options in RUM because we can only rely on javascript and DOM APIs to extract data. Our current set up monitors the following metrics:
- Start Render (Synthetic)
- Speed Index (Synthetic)
- Page Load Time (Synthetic and RUM)
- Time To Interactive (Synthetic and RUM) - The RUM version is not as rich as the Synthetic one because javascript simply does not have access to the number of in-flight network requests available to a synthetic testing tool.


How to prevent performance regressions?

- Local environment - the most convenient environment to do a quick test even during development.
- CI/CD - the most critical place where not to miss performance budgets.
- WebPageTest (private instances)
- Lighthouse
- Live - validate if internal tests prevented any live regression.
- Time-based metrics (ex: Time To First Byte, Load time, Start Render, TTI)
- Easier to understand
- Easier to monitor
- Quantity-based metrics (ex: Total number of requests, Overall page weight, Total image weight)
- Easier to understand the impact
- Can be a lot more stable
- They lack a direct, causative link to the user experience
- Rule-based metrics (ex: WebPageTest score, Lighthouse score)
- Drive us towards best practices
- Can summarize the technical quality of pages
- No direct relationship with the user experience
Besides these metrics, we also need informed estimates about the audience of the site including which devices and networks are the most representative. Let’s consider that our typical user uses a powerful device with a fast connection. This can establish a baseline for a performance budget. However, we also want to look into the long tail of performance where we test worst-case scenarios. Efforts to improve slower scenarios would also improve faster ones as well. We can have budgets for both cases, or more, as long as they provide value.
- "The server must respond under 300 milliseconds” - time-based
- "Our product page must load under 3 seconds using an iPhone 8 with a 4G connection” - time-based
- "Our listing page should load no more than 3 MB” - quantity-based
- "Our homepage needs a minimum of 90 points on Lighthouse” - rule-based


How to create awareness around performance across the company?
We created the above image a long time ago. It still reflects our ideals and all the different areas that we needed to work on. One of these areas is our Performance culture. This requires a lot of socialization and connecting many individuals to their contributions toward our overall performance goals. This is definitely the hardest part because there are often many interests and objectives at odds with each other, and performance is just one of them. How do we connect the dots and engage a true culture of performance?
Simply talk with people
A culture is made of people, and people will always be the key. We wanted to break the cycle of performance being a "tech only” concern, something that is only owned by the engineering team to deal with and fix. This mindset needs to change in order for a true performance culture to set in.
Breaking this mindset takes time, as with everything else in performance. We need to sit down with a lot of people, repeat a lot of things and persevere. Not everyone understands the impact of implementing a certain feature. Would it be acceptable if that slows down the site by half a second?
Connecting performance metrics with business metrics is mandatory for a mature performance culture. Business drives the company and connecting its success to speed metrics encourages a broader set of stakeholders to understand and navigate the trade-offs.
- Product owners drive the functional evolution of the product, often represented by roadmaps of features to implement. Not every product owner understands that a certain feature may have a negative impact on performance. If they don’t, the engineering team should highlight the risks as soon as possible. Product owners must be aware of any impacts to make more holistic product decisions informed by any tradeoffs. This way they become part of the solution and not the problem. Performance budgets help guide them in understanding if a certain feature is worth it or not.
- Designers may not understand how the bootstrap of an application works, and they shouldn’t need to. But they can design the application with a performance mindset by understanding that not all bytes are created equal. This is particularly true for mobile device experiences. The designs should consider the user journey of loading the application. A designer that understands the critical rendering path will design better user experiences.
- Marketing can be busy trying to bring more traffic to the site and configuring ad campaigns, for example. Third-party providers may also claim that they bring no performance overhead. Engineering should work closely with marketing to verify these claims. Creating a strong governance process for third parties can protect many of the standards that are important for the company, such as performance.

Be accountable

As mentioned above, we also create weekly performance reports to show progress on our metrics. Every two months we create a deck containing all the highlights of our progress in addition to our next planned actions. There’s always something to look forward to.
Be global
We need to reach a lot of people that work on our site, people that may be working in different offices around the world. It is impossible to sit down with everyone and provide insight on everything that matters. This is why we have a dedicated online space for performance. There we share all of the completed work, goals, reports, and resources such as guidelines and best practices.
We also present tech talks internally, and externally, to keep the rhythm going.
Celebrate wins
By being a multidisciplinary team, we can create momentum in different areas that contribute to an improved overall performance and experience. As we accumulate new performance wins, we’ve identified the need to celebrate our shared successes. This encourages our culture to recognize our progress, sustain our motivation, and reinforce our momentum.
Thus we bring a strong performance culture to life by creating this loop:

We aren’t yet at the maturity level we want, but we are making efforts to get there. We know that a performance culture is not something that is created from night to day; it takes time. But we believe the investment of time and energy is completely worth it.
It’s like performance itself: it’s never truly done. Which is another reason why we should enjoy the ride while we are at it.