At SadaPay, our engineers love trying new things 😄 We’ve been building the SadaPay app for more than a year now and have assessed, trialed and adopted a number of tools and technologies. While some turned out to be more trouble than they were worth, there were a few that we immediately fell in love with 😍Some of our engineers were keen to share their thoughts on the tech they’ve been working with, so we’ve put together this post to collect and share their thoughts.
NextJS allows us to build super fast and user-friendly sites for our internal users, including our CX team. It’s also used by other tech companies like Netflix, Uber and Twitch. It’s a great ecosystem with ready-to-use modules for many common functions. It’s the most extreme example of convention-over-configuration I can think of – for example, you can declare the path of a route and its parameters just by naming the JS file that renders it a certain way.Saad Pasta – Full Stack Engineer
AWS-managed Kubernetes allows us to easily deploy and scale our services. We’re massively scalable, with more efficient use of hardware and less infrastructure overhead than managing our own EC2 instances or traditional servers.
In general, containerisation allows our development teams to fully control the environment in which their services operate, without having to be experts in Kubernetes. That means we can centralise the most complex part of our infrastructure without undermining the autonomy of our development teams.Jon Sheppard – Chief Technology Officer
Our native Android app is written in Kotlin – it’s a lovely language to work in.
I’m really excited about how we’re starting to write back-end SpringBoot microservices in Kotlin, too. The more we do that, the easier it will be for our engineers to work full stack, owning the delivery of value end-to-end without having to hand off the work to mobile or back-end specialists.Eli Mydlarz – Head of Engineering
ArgoCD is a GitOps continuous delivery tool that we use to declaratively define the applications and resources required in our Kubernetes cluster. It’s configuration is a Git repository, so everything in the cluster is version-controlled. It’s an example of the operator pattern – ArgoCD runs in our cluster and ensures that the state declared in our special Git repository is maintained. For example, if we increment the declared version of some service, ArgoCD will execute a blue/green service deployment automatically.Pasquale Damiani – Infrastructure and Back-End Engineer
We are building our iOS app in Swift. It’s modern, safe, fast and open source. Forward-thinking concepts like generics and protocol extensions make Swift fun and easy to use. I love how – by default – Swift objects can never be nil.
We use AWS Aurora to provide scalable access to PostgreSQL, one of the longest running and most popular relational databases. Aurora gives us automatic failover across multiple availability zones, helping to ensure that our back-end services are highly available.JON SHEPPARD – CHIEF TECHNOLOGY OFFICER
We use GitHub Actions and it’s almost my dream CI tool – a friend and I were actually building something like it when it was first announced! It’s Docker first, which makes it easy to reproduce CI behavior on your local machine so you can figure things out on a tight feedback loop if you are having a CI problem. The actions themselves are shareable, so we don’t have to reinvent the wheel and duplicate heaps of CI configuration when doing something that other teams are already doing.ELI MYDLARZ – HEAD OF ENGINEERING
We use GitHub Packages as an artifact repository for our private Maven libraries, NPM packages etc. By leveraging GitHub Packages, we don’t have to manually maintain and secure our own self-hosted artifact repository.Pasquale Damiani – Infrastructure and Back-End Engineer
SpringBoot is a nice ecosystem to work in. We get easy access to great testing infrastructure, simple configuration management, thorough documentation and a big community of people that have turned most issues into solved problems. We have based all our back-end microservices in SpringBoot, initially in Java and now in Kotlin.Łukasz Chrystowicz – Back-End Engineer
Dynatrace is an AI driven monitoring and observability platform. We’re aggregating many inputs and metrics from all of our infrastructure, services and clients so that we have a unified and comprehensive view of how our many systems are behaving in real-time.
We love how it automatically detects unusual changes and patterns – not just failures – so that we can proactively address problems before they impact customers.JON SHEPPARD – CHIEF TECHNOLOGY OFFICER
OpenAPI specifications and code generation are a big part of our test strategy.
Many companies maintain multiple pre-production environments and align test data across every system – including with external partners – so that they can do extensive end-to-end testing. In our experience this ends up taking an enormous amount of time and energy and producing a test suite that is slow and unreliable.
At SadaPay our consumer client code and provider controller code are generated automatically by a shared API specification. We don’t need to wait until runtime to know if our integration is working – we just generate a working integration and use it. It’s one of my favourite things that we do.ELI MYDLARZ – HEAD OF ENGINEERING
We use an AWS managed ELK stack to aggregate logs and we’ve put heaps of effort into setting up detailed, searchable and well-indexed logging so that we can investigate production issues quickly and effectively. We try to plan for what we will want the experience to be like if we are urgently investigating a problem at 3am – that’s when you really find out if your logging is good enough.Pasquale Damiani – Infrastructure and Back-End Engineer
We use SonarCloud in all our CI pipelines to monitor code quality (including test coverage, code smells and security issues) on every commit, ensuring our code stays clean and meets our quality standards.
SonarCloud saves us a lot of time debating small issues by having a strong opinion about how things should be done and enforcing it. When we have a different idea, we can configure it differently to avoid having to repeat the same discussions as new people join the team.JON SHEPPARD – CHIEF TECHNOLOGY OFFICER
Kafka is a big part of our move to event-driven architecture. By using Protobuf for our Kafka messages, we give ourselves a versioning mechanism that allows us to change message producers and consumers in a decoupled way. We also use automatic generation of Java classes, which helps us guarantee correctness at compile-time and reduces the need for end-to-end testing.ELI MYDLARZ – HEAD OF ENGINEERING
We rely heavily on Terraform as we follow Infrastructure as Code (IaC) principles. Pretty much all our infrastructure (e.g. AWS services, Kubernetes) is managed declaratively by defining our desired state in version-controlled Terraform files and letting Terraform get us there via GitHub Actions. It’s great how we can see and approve the impact of proposed changes before we make them, go back easily if we change our mind or redeploy our infrastructure if there is an emergency.Pasquale Damiani – Infrastructure and Back-End Engineer
Thanks to our amazing engineers for contributing to this post. People often say “there are a lot of ways to build software” but at SadaPay, every engineer is part of our ongoing search for the best way. If you’re interested in joining us, check out our open engineering roles here.
SadaPay is registered in Pakistan as SadaTech Pakistan Pvt Ltd with the Securities and Exchange Commission of Pakistan (No. 0136598), and is a wholly owned subsidiary of SadaPay Technologies Ltd., registered in Dubai International Financial Center under commercial fintech license #3263
SadaPay Mastercard debit cards issued pursuant to a license by Mastercard Asia/Pacific Pte. Ltd.