We’re in search of a Senior Software Engineer (Backend) who specializes in server-side components. In this role, you’ll primarily bring a depth of knowledge on basic algorithms and data structures. As a Back-End Software Engineer, on any given day you might be architecting new features for our customers, refactoring existing code to be more scalable, and seeing changes through to completion in a live environment.
Our team builds and maintains very critical components & services that keep the SuperApp functional. It takes a lot of effort and attention to detail to make sure our systems work in harmony with other systems within Careem without compromising performance or reliability.
- Use appropriate languages, frameworks, practices, and patterns to build sustainable services. Always think to solve what actually needs solving (YAGNI) and not to create problems down the road.
- Seek understanding of user problems. Users are not only end-users but also other teams and people with various roles and responsibilities within Careem.
- Understand the challenges of distributed systems and why microservices may not be so awesome. Monoliths are not the enemy. Integration is hard. Having to align deployment of services or teams is really bad and is a smell.
- Ability to deal with event-driven microservice architecture. It will likely solve some request-driven pain points, but also introduce new difficulties.
- Collaborate with a multidisciplinary team of Back-End Software Engineers, Project Managers, and System Administrators.
- Be able to work with stakeholders when there are differences of opinion or conflicting information. Ask questions when you do not know.
- Monitoring is not a luxury, keep an eye on performance and preemptive measures. The reliability of our services is critical to Careem’s future success.
- Work with the product and design teams to understand end-user requirements, formulate use cases, and then translate that into a pragmatic and effective technical solution.
- Dive into difficult problems and successfully deliver results on schedule.
- Able to work effectively in vague and ambiguous situations at which engineers need to help coming up with ideas and solutions.
- Proven experience as a backend engineer working on challenging and unusual solutions that require using multiple technologies. We currently use JVM (Java, Kotlin, Scala), Go and bash scripting, but be open to anything popping up. Do not be afraid to learn.
- Ability to work in a remote setup
- Ability to independently own and deliver features from start to finish
- Know how to use Kafka as a publisher or subscriber. How to decide on partition numbers and how that is tied to consuming messages. Nice to know about the Confluent stack, primarily the schema registry.
- Be able to build usable HTTP APIs, understand OpenApi specs. Know how to build code from specs and vice-versa. Be knowledgeable about HTTP, the status codes, and how to use them. The methods, headers, and generally build semantically correct APIs.
- Experience with Linux/Unix and scripting languages like Python
- Knowledge in database systems and NoSQL databases such as DynamoDB
- Know a bit about ETL and Spark, how to do efficient queries, and move data around in an unstructured or semi-structured way.
- Make sure that the tests reflect the intent of the code. Think about all the useful testing approaches: unit, integration, smoke, performance, etc.
- Experience with CI/CD processes and tools (e.g. Jenkins)
- Experience with containerization technologies (e.g. Docker)
- Experience with AWS is a plus (e.g. ECS, EC2, S3, DynamoDB, etc…)