Experience
Sep 2025 — Sep 2026Toronto, ON

Software Engineer

BMO Capital Markets

Highlights
  • Owned a payment flow end to end

    Architecture discussions, backend design, implementation, testing, deployment and production support for the MHub integration, as the primary developer on it. Payments that used to be keyed in by hand through a UI now flow through automatically.

  • Non-blocking enrichment from CRD

    Settlement instructions arrive asynchronously over Kafka, so payments wait in a correlation cache keyed by instruction id while the pipeline keeps processing everything else.

  • Legacy and ISO 20022, both directions

    Outbound, MT-era payment data becomes a pacs.008. Inbound, pacs.002 and pacs.004 responses become the CDMMT representation the upstream system can actually read.

  • One image, several runtimes

    The same ECR artifact deployed as separate ECS services, each resolving its Kafka topics, source systems and CRD behaviour from DynamoDB configuration at startup.

  • Alerting for silence, not just errors

    Lambda-backed alerts for a payment nobody answered: no Digital Core response in ten minutes, no SWIFT response in thirty, routed to the team that owns the failure.

  • Lifecycle you can actually query

    Every meaningful transition persisted to DynamoDB and propagated back through GMTC, so a payment's position in a distributed flow is a fact rather than a guess.

Stack
JavaSpring BootWebFluxKafkaAWSDynamoDBDockerGitHub ActionsJUnit