HyreCar, based in Los Angeles, matches people who are interested in driving for Uber, Lyft or other rideshare services to car owners who have extra vehicles giving them both the ability to earn additional income. By tapping into an emerging and fast-growing market HyreCar has grown more than 400% since early 2017 and has connected almost 400,000 drivers to cars. HyreCar’s explosive growth was both a blessing and a curse. To keep up with their app’s high demand, HyreCar outsourced their development work to many different offshore teams. This led to an unstable software platform that was hard to improve and impossible for new developers to familiarize themselves with. The app had constant outages and disorganization caused the development speed to be extremely slow. Despite these technical issues, HyreCar was still growing and continued to invest in sales and operational infrastructure. In early 2017, the HyreCar leadership became overwhelmed with the problems and technical debt caused by their technology stack. The company asked us, Novvum, to build a sustainable platform that could keep up with the high demands of their customers.
At the start of the project, we faced a monumental set of challenges. We found that HyreCar’s original technology and infrastructure had been created by over twenty different developers in multiple countries who had little to no communication. The stack was outdated, undocumented, and unscalable. To top it all off, HyreCar had an IPO fast approaching. We needed to migrate an entire user base from a stack with an unfinished front end and unstable back end without losing data or causing major outages. This all needed to happen during a critical stretch in HyreCar’s journey without any internal developers that had prior knowledge about the codebase or business domain experience.
Here are a few metrics that outline HyreCar's state when we started:
- 2 in-house developers
- 1 monolithic application written by 20+ developers
- 1 EC2 instance serving everything
- No CI / CD or development process
- Uptime - 80%
We kicked off the project by working with HyreCar to prioritize a lengthy feature list, identifying high-risk items, and test assumptions. As a user-centric design and development team, we honed in on gathering quantitative and qualitative feedback from HyreCar’s users. Equipped with this data, our team came to the conclusion that HyreCar needed a full rebuild of their infrastructure in order to handle their user requirements, scaling demands, administrative features requests, and to set a strong foundation.
Here is a high-level summary of our development roadmap:
- Redesign & rebuild the customer-facing front-end web client
- Implement a CI / CD process
- Redesign & rebuild the API and core business logic
- Redesign & rebuild the admin-facing front-end web client
- Migrate all historical data and user information to a newly
- Establish and document a development process for future developers
In order to accomplish these requirements in such a short timeframe, our team focused on utilizing modern technologies that emphasize flexibility, speed, scalability, stability and lower costs for our clients. The stack included:
React | Typescript | GraphQL | Prisma | Apollo | Algolia | Auth0 | Serverless | SegmentIO
USER FOCUSED APPROACH
Our team decided to first focus on the user experience and rebuild the front end of the app. This would provide the most value to users while equipping our team with valuable domain knowledge and a grasp on how the HyreCar business worked.
Through a series of weeklong design sprints, the business leads at HyreCar worked with our team of UI/UX, business analysts, and developers to create a prototype for a new app. The prototype was developed iteratively based on feedback from users and HyreCar's business experts and addressed many of the customers' concerns that were uncovered during the initial discovery phase. It prioritized simplicity and intuitive user experience. For example, renting a car on the site originally required 7 steps; with the new design, it only took 3.
With the new prototype in hand, we were equipped with a fresh understanding of the business requirements and a strategic plan for building the first version of the product web client. The next steps were to build a React web application that would power both the driver and car owner user experiences. As development proceeded, we quickly realized the limitations of the legacy REST API. The undocumented routes and complex data structures meant a creative and fresh user experience was unrealistic in the current state.
In order to enable frontend development, our team incrementally engineered a GraphQL wrapper around the legacy REST infrastructure. The wrapper made the API more consumable and our new features more manageable to develop. The incremental adoption of GraphQL is a powerful way to access the improvements GraphQL provides without the need for a major overhaul. Of course, the wrapper was only acting as a temporary solution, but it did provide our team with just enough flexibility to make adequate improvements to the frontend user experience.
GRAPHQL SUPERCHARGED BACKEND
Once the React web client was successfully released, our team had a strong understanding of HyreCar's business requirements, user tendencies, and critical business logic. With this knowledge, we were prepared to confidently and efficiently rebuild the back end of the HyreCar platform.
One of the first roadblocks with the legacy system was the MySQL database. It was unclear how or why most of the tables and columns were used. It was evident that the database had evolved with the business and the majority of changes were no longer necessary. To address this, we broke apart the database into multiple service-based databases for example users, cars, rentals, payments, etc. This isolated the data to a specific context. If one of the databases becomes too large or no longer necessary, it would not affect the rest of the system. This also allowed us the freedom to use different types of databases for different services.
To bind all of these different databases together into one coherent API for clients, we used GraphQL. The GraphQL paradigm enabled us to iterate on our API without having to worry about breaking the functionality of existing apps which are using it. It allowed us to provide a frontend product to the users right away while using the old backend. The GraphQL wrapper wrapped the old backend providing stability and developer flexibility while the new backend was being built. It acted as a great buffer during the two phases and much of it was reusable.
Another big issue with Hyrecar’s REST API was that third-party integrations like analytics tracking, CRM, and notifications were collocated with their core business logic. This often led to the server crashing or core operations failing because one of the integrations broke. For the new build, we implemented an event-based system where functions would run independently in response to an event that gets triggered by the core API. For example, if a driver requests to book a car, the core API would trigger an event called “driver.requestedBooking” and a number of functions would subscribe to this event and send a notification to the requested car owner, update the CRM for the sales agents to follow up and so forth. Now, if any one of those functions fails, the core transaction will still go through and the other functions will still work.
Through our work with HyreCar we created a product that delivered a seamless user experience and improved HyreCar’s ability to deliver new products faster. Perhaps most importantly, this product was built on a technical foundation that could scale with HyreCar’s continued growth. Since working with us, HyreCar has grown their development team to twenty members, and most importantly, customer complaints about critical business transactions have decreased dramatically. Additionally, the delivery of new features has become exciting, not nerve-wracking.
With our help as a technology partner, HyreCar has successfully IPO'd, continued to surpass critical growth milestones and can now feel proud of their technology stack and development process.
Here are a few metrics that outline HyreCar's state today:
- 1 successful IPO
- 4 new frontend clients (Web, Admin, IOS, Android)
- New Database & GraphQL powered API
- New Event driven Serverless infrastructure
- 20+ development team size following a robust process
- Fully documented codebase
- CI / CD on all servers and clients
- Uptime - 99.99%