Working with JUXT was a delight. They demonstrated flexibility as the requirements flexed and used their technical know-how not only to deliver a solution that meets our immediate needs and but also will scale as our business grows.
– Adrian Ulisse (CEO & Founder Better Cities)
Better Cities delivers solutions to urban challenges to make life better for people, creating new opportunities for businesses and help governments do more with less. JUXT helped them launch MoreForMe, a pioneering digital platform and mobile app where shoppers can cover their parking costs as they shop in the high street.
In less than 10 weeks we delivered the entire stack needed to support this project, including:
- Native mobile applications used by consumers to redeem discounts, browse news and collect rewards.
- A private web portal used by merchants to track discount statistics and publish news and offers.
- An administrative website used to batch import and onboard merchants and export any relevant data regarding app usages, discount revenues and conversion rate.
- An API server used by the above applications to integrate with third party services to provide a open data about high-streets.
Here's how we achieved it.
Nail down the 'Minimal Viable Product' (MVP)
Defining the scope of any MVP is a crucial step. Especially on mobile screens, every button and every line of text adds cognitive overload. JUXT helped to make sure the app was working flawlessly and intuitively for the main use case.
Each additional feature was discussed, evaluated, and prioritised, taking into account the business requirements, the user experience, and the development effort required for implementation. The business had the ultimate decision of what should make it into the MVP and what should go in a later version.
Being clear about the business value and development cost of each feature ensured we did not incur feature creep.
A prototype is worth 1000 meetings
Our first goal was to put up in place a system for continuous delivery. Being able to build and distribute projects using a single command is the key to gathering feedback in the early phases of a project.
A clickable prototype is the perfect tool to get a feeling of what the product will look like, even with hard-coded data and minimal design. Changes to an early prototype are much more cost effective compared to a matured product.
Continuously referencing a live, working prototype aligns the mental model of all the people involved in the project; you can interact with it, you can refer to it, you can snapshot and annotate it. Seeing the newly implemented features as soon as possible helps steer the project in the right direction.
Model domain across the stack
In a project where independent teams each develop an app (web portal, server, mobile, etc.) contracts and interfaces between boundaries are key.
Tackling the problem holistically without silos allowed us to place the right responsibilities in the appropriate part of the stack without any friction and to make changes faster.
Better Cities and JUXT together developed a consistent ubiquitous language that fed into every user scenario, understanding the needs of consumers (the mobile app users), clients (sponsors, local authorities and merchants providing discounts) and administrative users.
For products that need to get-to-market as soon as possible, it's important to find tactical approaches that save both time and cost.
In order to allow our client to manage the data in the system, we built a simple ETL process which loaded CSV files via a Swagger interface. Our client could then maintain their data in spreadsheets, and upload changes directly without requiring us to build graphical data maintenance screens. Almost invariably, any new business idea needs to be tested in the market before scaling up. It's important that as programmers we strive to keep initial development costs to a minimum.
Push button to scale
Our Clojure stack includes technologies like core.async, React, Datomic, Pedestal and has been hosted using a variety of AWS services (EBS on Docker, S3, Route53 and EC2).
Clojure's 'get-it-done' attitude, combined with its powerful data manipulation abstractions, let us implement each feature rapidly whilst keeping the codebase small and compact.
Similar setups have been used on other JUXT projects to tackle business domains with greater complexity. Every piece in our stack has been designed to solve difficult problems, and that gives us a tremendous amount of confidence that we can evolve the stack to meet future needs, rather than re-arming from scratch.