The situation
ForCamping is a large ecommerce business — over a billion crowns in turnover today, selling into Czechia, Slovakia, Hungary, Romania and Ukraine while I was there, and into more countries since.
Underneath all of it sits an internal WMS that aggregates orders from several ecommerce sites and runs the warehouses that fulfil them. It had grown up on Nette and PHP 7.2, and the plan I joined for was to rewrite it into Symfony — gradually, with the business running the whole time.
What I did
Five years, and most of them with two systems live at once. We rewrote it piece by piece, which meant the old and the new both had to hold current data, and the new one became the source of truth as more of the work moved across. That went on for four years. In my last year we switched the old system off and rewrote the warehouse processes from scratch for a new warehouse in Pardubice.
I was one of four or five developers under an experienced lead, which is exactly what I joined for. I wanted to learn Symfony properly and to be led by somebody who knew more than I did.
The work split roughly in half. One half was integration: connecting services that talk to each other over APIs, low tens of third-party ones by the end — dispatch through Balíkobot, an external warehouse at Mailstep for temporary storage, invoicing, translations for the internal team.
Order sync is a fair example of how that half grew up. It started as a scheduler polling for new orders, which worked until it didn’t — it wasn’t fast enough any more. We moved to webhooks, and a webhook has to be handled asynchronously if you want to answer it quickly, so RabbitMQ went in as the queue behind them.
Around all of it: Jenkins for CI/CD, application logs into Elasticsearch and read through Kibana, production on DigitalOcean. It’s also where I met Docker for the first time and started working my way into it properly.
The other half was the warehouse, and all of that was built in house: goods receipt, picking, restocking the shops, packing, dispatch. At one point we ran three warehouses — two feeding stock onwards, the central one packing and shipping orders. I also worked on the interface the physical shops use for handing an order over quickly, taking goods in and starting a return.
The part I remember best isn’t code. In the run-up to Christmas, when the warehouse couldn’t keep up, I’d go and pick orders with them. And I’d go out to the shops and ask the people behind the counter what was making their day harder. Both were the fastest way I’ve found to understand a domain, and both changed what I built afterwards.
How it went
The old system went off. Symfony was on 6.4 and PHP on 8.2 by the time I left, and the work was in a state colleagues could carry on with rather than one they’d have to unpick first. It’s the longest I’ve spent on a single system and the closest I’ve worked to a business that physically moves things.
What I’d do differently
We tried to run weekly sprints and never had the person those sprints needed — somebody doing the planning, breaking the work down, deciding what mattered most. Developers absorbed that job in the gaps between writing code, which means it got done badly by people who were also doing something else.
I’d argue much harder for that role now. It’s most of the reason I do the analysis myself these days.