CafeBazaar was one of the best companies I worked for. It had an unusual quality: the energy of a startup — fast decisions, genuine ownership, ambitious goals — combined with the scale of a large product. The largest Android app marketplace in Iran, handling millions of daily active users. The problems were actually hard.
The search team
I joined as a software engineer on the search team. Our job was to surface the right apps when users searched — which sounds simple and isn't. Behind it was a Django monolith backed by Elasticsearch, serving over a million daily requests across the search API and word prediction API. Getting relevance right, keeping latency acceptable, and maintaining the system under that load all at once is a non-trivial combination.
The stack was Python/Django with gRPC to the mobile client, Elasticsearch for app indexing, and Nginx + Gunicorn for serving.
Breaking the monolith
The biggest project I led was the migration to microservices. The monolith had grown unwieldy: hard to test, hard to deploy independently, hard to scale specific bottlenecks without scaling everything. We split it into separate services, deployed them on Kubernetes, and wired them back together.
Deciding where to cut was the hardest part. I ran architecture sessions with the team, we consulted senior engineers from other products at the company, and we came to a design everyone could commit to. We shipped it incrementally — replacing one component at a time, validating each step, until the monolith was fully retired.
Alongside the refactor, we redesigned the caching layer: each Kubernetes pod had a sidecar running local Redis, backed by a larger shared instance, with a persistent layer for restart resilience. Cache keys encoded multiple parameters; each layer had a different TTL. The result was a significant reduction in latency and database load during peak traffic.
The process coordinator role
CafeBazaar had a concept called the Process Coordinator — an agile coach embedded in each team. I served as my team's PC while still doing engineering work. It meant running retrospectives, facilitating ceremonies, and meeting regularly with PCs from other teams to share what was working. This is also where I got comfortable with the idea that improving how a team works is genuine engineering work, not a distraction from it.