Most of my work keeps a business running. Some of it starts with “wouldn't it be funny if…?” I take both seriously.
01 / SELECTED WORK
Three problems worth solving.
Short case studies from the day job, kept generic on purpose: no internal systems, just the problem, the decision and what it cost.
2024 — 2026 · TELECOM ACQUISITIONS
Making supplier onboarding repeatable.
AZURE · SERVICE BUS · EVENT-DRIVEN · DOMAIN MODELLING · MENTORING
Problem
Every supplier had its own API, data formats, rules and failure modes. Each new one meant custom work spread across sales journeys and back-office systems.
Decision
A supplier-agnostic integration layer: one internal domain model, an adapter per supplier, and business events on a message bus instead of point-to-point calls. I designed it and owned it from domain modelling through deployment, monitoring and production support.
Trade-off
More design up front, and eventual consistency to handle between services, in exchange for a core that doesn't change every time a supplier does.
Result
Adding a supplier became repeatable work instead of a project, coupling between systems dropped, and high-volume sales stayed reliable and observable. I also mentored two developers on the team.
Business-critical wealth-management systems needed to move from PHP 7.4 to 8.2 and from MySQL 5 to 8. The code quietly relied on behaviour the new versions no longer tolerate: stricter SQL grouping, invalid dates, warnings that become errors.
Decision
Build a regression-test baseline first, then fix compatibility issues incrementally across applications and databases, instead of rewriting.
Trade-off
Time spent on tests before any visible progress, in exchange for releases everyone could trust.
Result
Migration and release risk went down without sacrificing stability for the people who depended on the platform.
2019 — 2021 · DEKO
Replacing a monolith without stopping the business.
A long-running lending platform had grown into a legacy monolith, and the lending operations it supported couldn't stop while it was replaced.
Decision
Domain-driven design and event storming to find the real business boundaries, then the Strangler Pattern: move one capability at a time into Java services, with Go and Python components, connected by asynchronous messaging on AWS SQS.
Trade-off
A slower, staged migration with old and new running side by side, instead of a big-bang rewrite and a risky cut-over.
Result
Business-critical lending kept running throughout, while capabilities moved to the new platform step by step.
02 / BEHIND THE SCENES
Make the pieces work together.
The best integration is one the person using it never has to think about.
A SIMPLIFIED PICTURE OF THE KIND OF PLATFORM I DESIGN AND RUN