About This Role
This senior individual contributor role in a cross-functional engineering squad involves designing and building services that move money for thousands of informal-market merchants daily. The role focuses on a functional codebase where the type system enforces business rules at compile time and ZIO handles concurrency and resource safety. You will own features end to end, contribute to technical strategy, mentor other engineers, and help set backend standards.
Responsibilities
- Design, develop, and maintain scalable, high-throughput backend services and APIs with Scala as the primary language
- Build and evolve microservices in our AWS cloud-native, Kubernetes-native service environment
- Contribute actively to architecture and technical design discussions, including system design, API contracts, and data model decisions
- Optimise application performance, scalability, and reliability across high-volume transaction processing workloads
- Troubleshoot and resolve production issues in mission-critical financial systems with urgency, rigour, and clear communication
- Apply functional programming principles including referential transparency, effect systems, type safety, and composability
- Build with ZIO for asynchronous, concurrent, and resource-safe service development
- Design robust domain models that use Scala’s type system to enforce business invariants at compile time
- Contribute to shared libraries, internal frameworks, and reusable components that raise engineering quality across all teams
- Design and implement data access layers against AWS RDS PostgreSQL, covering query optimisation, schema design, connection pooling, and migrations
- Build reliable event-driven integrations using Kafka for high-throughput streaming and RabbitMQ for queue-based workflows
- Develop and consume RESTful APIs and internal service interfaces, applying contract-first design and versioning discipline
- Integrate with third-party payment gateways, core banking systems, and financial data providers using resilience patterns such as retry, circuit breaker, and bulkhead
- Integrate AI development tooling such as AWS Bedrock, GitHub Copilot, or Claude into your daily workflow to improve productivity and code quality
- Apply critical evaluation to AI-generated code, reviewing for correctness, security, performance, and alignment with our architectural standards
- Share learnings and effective AI-assisted patterns with the broader engineering team
- Write clean, well-tested, peer-reviewable code, using unit, integration, and property-based tests as the risk level warrants
- Implement secure coding practices aligned to PCI DSS, including input validation, secrets management, encryption, and audit logging
- Ensure services meet POPIA, NCA, and FSCA requirements at the application layer through data minimisation, access controls, and audit trail design
- Participate in security reviews, threat modelling sessions, and vulnerability remediation for backend services
- Contribute to and maintain CI/CD pipelines covering build, test, scan, and deploy stages for Scala services
- Work within a GitOps delivery model targeting AWS EKS, with a working understanding of Kubernetes deployment manifests, resource configuration, and health probes
- Collaborate with DevOps on container image design, Helm chart configuration, and service mesh integration
- Champion automated testing, code quality gates, and observability instrumentation as first-class delivery requirements
- Mentor mid-level and junior developers through code review, pairing sessions, and knowledge-sharing forums
- Contribute to engineering guild sessions, architecture decision records, and internal tech talks
- Help grow Scala capability across the team, including engineers converting from other JVM languages
- Stay current with the Scala ecosystem, JVM performance tooling, and emerging distributed systems patterns, bringing relevant insights back to the team
- Embrace continuous learning and stay curious about your craft
- Seek feedback and reflect on both successes and setbacks
- Set personal development goals and take ownership of your growth
- Support others in their growth journeys through knowledge sharing and collaboration
- Stay open to change and adapt quickly in a fast-paced environment
Requirements
- Strong backend engineering judgement and the functional programming discipline to write Scala that is readable, testable, and built to last
- Ability to build and operate resilient microservices in a cloud-native environment
- Strong system design skills, with the judgement to weigh performance, reliability, security, and scalability trade-offs
- Ability to work independently and contribute as a senior member of a cross-functional engineering squad
- Practical approach to AI-assisted development, with critical review of generated code
- Ability to mentor developers and communicate technical decisions clearly
- Languages: advanced Scala with production experience, or equivalent depth in another JVM or functional language. Java or Kotlin advantageous; Python for scripting or tooling
- Scala ecosystem: ZIO, Cats Effect, or Akka; Tapir or http4s for API definition; Circe or uPickle for JSON; Doobie or Slick for database access; ScalaTest or MUnit for testing
- Databases: AWS RDS PostgreSQL, including advanced SQL, schema design, indexing, and migrations using Flyway or Liquibase; Redis for caching
- Messaging: Apache Kafka, including producer and consumer design, topic partitioning, and consumer group management; RabbitMQ for queue-based workflows
- Cloud and infrastructure: AWS including EC2, ECS or EKS, Lambda, S3, RDS, and Secrets Manager; APISIX Gateway; Docker; Kubernetes
- CI/CD and tooling: GitHub Actions or GitLab CI; Git and advanced branching strategies; SBT build tooling; code quality tools such as Scalafmt, Scalafix, and WartRemover
- Observability: structured logging and metrics instrumentation using Prometheus and Grafana
- Security: secrets management using AWS Secrets Manager; OWASP secure coding principles; JWT and API authentication
- 5+ years of professional software development experience with a strong backend engineering background
- Production experience in Scala, or equivalent functional programming depth in another language with a track record of picking up new ones quickly
- Demonstrable experience building and operating microservices in a cloud-native environment, AWS preferred
- Strong SQL and relational database design, including schema design, indexing, and migrations
- Proven ability to work independently and contribute as a senior member of a cross-functional engineering squad
- Bachelor’s degree in Computer Science, Software Engineering, or a related technical field. Equivalent professional experience will be considered
Nice to have:
- 3+ years of hands-on production Scala development
- Experience in fintech, banking, payments, lending, or another regulated high-transaction environment
- Experience with financial payment workflows, agent-banking integrations, or Southern African fintech platforms
- Familiarity with event sourcing, CQRS, or Domain-Driven Design in a Scala context
- Exposure to real-time data streaming with tools such as Kafka Streams
- Experience with property-based testing (ScalaCheck) and contract testing (Pact)
- AWS Developer or Solutions Architect certification
Important Details
- Work model: Hybrid working model with regular in-office presence in Stellenbosch based on team rhythms, collaboration needs, and business requirements
- Availability: Ability to be available for key planning sessions, stakeholder workshops, and in-person team collaboration when required
- Remote setup: Reliable connectivity and a suitable remote working setup for work-from-home days
About the Company
Shop2Shop is on a mission to help entrepreneurs participate and prosper in the digital economy by solving their payment challenges. They aim to provide quick and low-cost payment solutions, which are an underestimated bedrock of the South African economy. The company is driven by a shared purpose and fosters a collaborative environment for its talented team.