One Source of Truth for Our Frontend
We all have the same problems; what sets us apart is how we solve them. At Freshly, a problem we chose to solve last year was how to ship complex user-facing features across three platforms simultaneously, free of defects.
Historically, the answer was "with difficulty." We would make extensive use of feature flags, deploy platforms "as they were ready," and then coordinate a launch. Sometimes, iOS might be ready a month before the web, or vice versa. Obviously this can lead to a host of issues. What if UAT reveals an issue in a lagging platform that requires a fix across them all? What if marketing suddenly requests an analytics improvement, or a change to how an experiment is run? Maintaining a responsive engineering organization while coordinating a web application, a native Android app and a native iOS app is a consistent challenge.
There are many solutions to this problem, each with different advantages and drawbacks. One of the most popular is to use a so-called multi-platform framework. We all know the drawbacks of this choice ” apps feel clunky, you may not be able to hook into a platforms native strengths, and speed is often slow. This may be a good choice for your organization if budgets are tight, but we would not recommend it for a long-term approach. At Freshly, we were lucky enough to have full engineering teams for each platform, so building natively was an easy decision.
We decided to investigate what the best of both worlds would look like. What if there were a framework that allows a platform to use all of its native interfaces, but was built programmatically, from the same centralized configuration? What if our servers could present the basic definition of a page,from copy, to buttons, to form elements, and then the native application could apply its own interface to that description?
After a year of work, we launched CoreUI, which at its heart is a combination of GraphQL, and a custom UI description syntax (component library). Want to update some copy? Deploy a single commit to a translation file, and all three platforms will see the update on supported pages. Want to change the data in an analytics event? One more deploy. Fully redesign a page from the ground up? Perhaps some QA time is warranted here, but a single deploy to our central repository can contain all of the code necessary. This has effectively doubled the productivity in our mobile teams ” allowing our engineers to focus on performance, squashing rare bugs and entirely new features, instead of the basic structure of new experiences and the block and tackle of new events.
The lesson here is that engineering teams, when allowed to think creatively, can solve nearly any problem, even ones the industry tells us are intractable. At Freshly, we are proud to have sold millions of meals on our software – 90 percent of which was built in-house. We formed our engineering team on the premise of daring to tackle complex problems, and are determined to push that ethos forward. We hope your engineering teams do the same.