Meet5 is an app for organizing and joining group activities to meet new people and make friends offline. It was founded in 2017 and has, as of now, over 2 million users, mostly in Germany, Benelux and France.
I am working there as a Senior Backend Engineer in a small team of 4 people.
When I joined Meet5, the entire backend was in a really poor state. We had no working unit tests, no integration tests, and no logging, tracing, or any good observability. Releases were manual and large, since testing was difficult, so they always posed a high risk. Additionally, the general code quality was not very good: lots of duplicate logic that had been copied and pasted over time, no proper service layer to keep the business logic in one place, and no good separation between the database layer and the API layer. On top of that, most of the code was in static functions, making it really hard to test since there was no form of dependency injection.
Together with an old–new colleague from Komoot, we implemented a whole series of quick improvements in the first month:
- We made the defunct suite of unit tests work again.
- We set up the capability to have proper staging deployments that are not connected to the production database.
- We set up a CI pipeline to build and deploy the app to App Engine.
- We integrated an existing, manually executed set of Postman-based API tests into the pipeline.
- We removed the vaguely Gitflow-based branching setup in favor of a trunk-based development style with automatic deployment from the main branch.
After that basic setup, we also tried to include major refactorings in every feature development. We moved logic from the servlets into testable services with added unit tests.
We also started working on longer-term initiatives for future improvements:
- Better observability, monitoring, and alerting
- How to move away from the not well-testable codebase to a modern one, including a migration away from App Engine
Based on those plans, we also added further improvements:
- Added proper logging throughout the entire codebase (replacing a whole bunch of println logs)
- Added OpenTelemetry-based tracing to most of the application
- Added monitors and alerts for endpoint health