Senior Software Engineer & Architect

I build distributed systems that are meant to last.

My work sits at the intersection of architecture and hands-on engineering. I care about domain boundaries, observable systems, and code that teams can safely evolve over time. I enjoy turning complexity into systems that are practical to build and resilient to change.

Portrait of Mohamed Elmedany

Pragmatic by nature. Quietly raising the bar.

Good software is mostly about clarity. Clear boundaries, clear intent, clear ownership. I've spent enough time in broken codebases to know the opposite is expensive. When the code doesn't reflect how the business actually works, you patch the gap forever. Domain-Driven Design isn't methodology theatre to me. It's the most honest answer I've found to the problem of keeping systems understandable as they grow.

That's not a new idea. But it matters more than most people think, and I've built my approach to architecture around it. CPSA-F certification confirmed what I already knew from practice, but it also sharpened how I think and talk about it. System boundaries need to match business boundaries. Services need names that the business understands. Code needs to say what it does without requiring a wiki.

I use AI-assisted development daily. I've introduced tools like Junie and GitHub Copilot into teams as part of their everyday workflow, working within whatever organisational rules applied around data handling and tooling governance. In practice that meant Spring Boot and Kotlin codebases, using Junie for code generation and review cycles, and Claude Code for heavier refactoring and exploratory work.

Twelve years in and I still find the hard problems interesting. Moving between Java and Kotlin. Monoliths to bounded contexts. Build systems that teams can safely evolve. Make the implicit explicit. Raise the bar quietly.

Systems I've architected and shipped.

Not every project — just the ones where architecture decisions made the difference.

From Blind Spots to Production Resilience
Kuehne+Nagel
Application-Level Observability

OpenTelemetry Collector, Prometheus, and Jaeger already existed in the infrastructure. But application-level monitoring was missing. The team had infrastructure visibility but no sense of what the system was actually doing at the business logic level.

Incident response was expensive because it started with guesswork about which service was misbehaving, then digging into traces. No dashboard to see KPIs or health at a glance.

I worked with the team to instrument services with business-relevant metrics. What does a successful flow look like. Where do things drop off. Which integrations are failing, or taking more time than expected. Visualizing these metrics using dashboards on GCP and applying the right Alert Policies, integrating critical alerts into MS Teams so incidents surface immediately.

The focus was making the business visible through numbers. Not just infrastructure metrics, but the actual work the system does.

  • Application-level metrics and KPIs now tracked across all services
  • Production investigations start from evidence instead of assumptions
  • Alerts integrated to MS Teams for real-time incident awareness
OpenTelemetry Prometheus Jaeger GCP Alert Policies Kotlin Axon Framework
Aligning Code with Business Reality
Kuehne+Nagel
Domain-Centric Monorepo Redesign

The codebase was a scattered monorepo with multi-module services. Domain logic was spread across modules. No clear boundaries between core domain and supporting concerns. When the business changed how they worked, engineers didn't know which modules to change.

The code didn't reflect how the business described the work. Every change felt risky because coupling was implicit.

I co-led the redesign to extract the domain into a domain-centric model. Identified bounded contexts. Reorganized modules around these boundaries, not technical layers. Applied hexagonal architecture pattern so the domain stayed pure and communication with the outside world was explicit.

The work was mostly refactoring and restructuring. Moving code to the right place. Naming things to match how the business talks about the work. Making implicit coupling explicit so it could be managed.

  • Domain logic extracted and modeled to match current business processes
  • Boundaries now enforced through hexagonal architecture
  • Engineers can evolve domain without fear of hidden coupling
Domain-Driven Design Hexagonal Architecture Kotlin Axon Framework PostgreSQL
Scaling Customer Conversations
Bol.
Chat Architecture Redesign

Billie, the customer chatbot, was built on an aging in-house platform. Maintaining it was expensive. The content and flows were tightly coupled to the platform.

We needed to migrate to a proven solution without losing chat history or breaking customer experience.

We split the work into content and engineering. The content team migrated all chat flows to a 3rd party provider. On the engineering side, I worked with the team to design a new architecture. A routing and enriching gateway connects the UI to an adapter service. The adapter abstracts away the 3rd party provider details. If we ever switch providers, only the adapter changes. A fallback channel routes conversations to human customer service when the provider is unavailable.

The pattern was explicit. UI doesn't know about the 3rd party. 3rd party doesn't know about our domain. The gateway and adapter manage the translation.

  • Chat flows migrated to proven 3rd party provider without interruption
  • New routing and enriching gateway handles all chat traffic with graceful fallbacks
  • Adapter pattern separates our logic from 3rd party implementation details
Kotlin Java Event-Driven Architecture Adapter Pattern Kubernetes GCP

I write to clarify my thinking.

These are ideas that have shaped how I build systems.

Where I've left marks.

Senior Software Engineer / JVM Chapter Lead Aug 2024 — Present
iO Digital

At iO Digital I work as a consultant engineer across client engagements while also serving as JVM Chapter Lead, a role built to connect engineers across projects, drive technical alignment, and raise the collective bar. I authored articles on the iO tech hub and helped define what good engineering looked like inside the company. The consulting model sharpened my ability to onboard fast, earn trust quickly, and deliver in unfamiliar Kotlin and Java codebases.

Senior Software Engineer (via iO Digital) Aug 2024 — Jun 2026
Kuehne+Nagel

At Kuehne+Nagel I designed and implemented observability architecture using OpenTelemetry, establishing metrics, alerting, and dashboards with Grafana and Prometheus that improved production resilience. I also led domain model redesign efforts, removing technical debt and aligning code with current business rules. I worked in a DevOps manner, taking ownership of deployments, monitoring, and production stability and I bring test-first practices and a habit of raising engineering quality across the team.

Senior Software Developer Nov 2018 — Mar 2024
Bol.

My time at Bol. gave me deep familiarity with high-availability systems operating at scale. Event-driven architectures using Google Pub/Sub. Containerized workloads on Kubernetes. CI/CD pipelines through GitLab. I was hands-on across backend and supporting interfaces in Kotlin and Java. As part of the Architecture Circle I reviewed service designs across domains and guided teams toward consistent patterns. I shaped the onboarding process and set the engineering bar for the team.

Moved to the Netherlands
2018
Relocated from Cairo to the Netherlands to join bol.

How I got here.

I got into software engineering because I love building things. The same instinct that made me take apart toys as a kid eventually led to Computer Science and then to a career where I get to design systems from scratch, make hard decisions, and watch them hold up under real load.

Java was my first professional language. I started using it during my early college years, it shaped how I think about type safety, verbosity as clarity, and the JVM as a long-term investment. Over time Kotlin became my second language, not because Java isn't good, but because Kotlin removes friction without hiding the model. I've been building production systems in both for over a decade and they still interest me.

Starting my career at a startup exposed me to the full cycle. Requirements to customer training. That foundation shaped how I think about ownership and delivery. From there I moved through individual contributor work to focusing on technical impact, from single-team work to cross-domain architecture, from building features to building the conditions that let teams build well.

Egypt to the Netherlands in 2018 was a turning point. Work scaled differently at Bol.. High-availability systems and event-driven architecture at scale is a different discipline. The consulting model sharpened how I onboard fast, earn trust in unfamiliar codebases, and build connections with teams quickly.

Language-wise, I'm native Arabic, fluent in English (my working language for the past decade), and learning Dutch since moving to the Netherlands. Most of my writing and thinking happens in English. I write about engineering because writing clarifies thinking.

Curious about how AI-assisted development fits into real workflows, not the hype. I believe good architecture is mostly about clarity and honesty. The rest follows.

Let's build something that lasts.

If you want to think out loud about distributed systems, domain design, or how AI fits into a real engineering workflow, I am genuinely here for that. I have opinions about bounded contexts, strong feelings about observability, and a possibly unhealthy interest in why monoliths keep winning. If you have an interesting problem or just want to compare notes, reach out.