profile-pic
Vetted Talent

Aakash Maurya

Vetted Talent

I am a Senior Consultant, Application Developer at Thoughtworks with more than 7 years of experience in building highly efficient and scalable applications using agile methodologies, clean coding and best practices for large enterprises. I develop applications using micro-services and event driven architecture, consult companies on OO Design, patterns, testing techniques and development methodologies. Passionate about XP and agile 

  • Role

    AI Software Engineer (Contract)

  • Years of Experience

    10.3 years

  • Professional Portfolio

    View here

Skillsets

  • GitHub Actions
  • low latency
  • LLMs
  • LangSmith
  • JUnit
  • Incident Response
  • IAC
  • High availability
  • Go
  • MCP
  • event-driven architecture
  • embeddings
  • Distributed Systems
  • DevOps
  • Code Review
  • Cloud Computing
  • CI/CD
  • blue-green deployment
  • Redis
  • Vector databases
  • TypeScript
  • System Design
  • SQL
  • Schema Design
  • Scalability
  • Rest APIs
  • Release Engineering
  • Backend Development
  • rag
  • Query Optimization
  • Prompt Engineering
  • Performance Optimization
  • NoSQL
  • Model evaluation
  • Microsoft Azure
  • New Relic
  • BDD
  • PostgreSQL
  • MongoDB
  • TDD - 6 Years
  • CosmosDB
  • Splunk
  • Maven
  • Gradle
  • Cucumber
  • Docker - 4 Years
  • Kubernetes - 3 Years
  • Jenkins
  • MySQL
  • Spring Boot - 6 Years
  • AWS - 3 Years
  • Java - 08 Years
  • AWS
  • Python
  • Automated Testing
  • APM
  • API Design
  • Apache Kafka
  • Contract Testing
  • LangGraph
  • LangChain
  • function calling
  • Java - 7.96 Years
  • Prometheus
  • Golang
  • Terraform
  • PACT
  • Opensearch
  • Microservices
  • Grafana

Vetted For

10Skills
  • Roles & Skills
  • Results
  • Details
  • icon-skill_image
    Sr. Software EngineerAI Screening
  • 88%
    icon-arrow-down
  • Skills assessed :Databricks, Snowflakes, Kubernets, Microservices Architecture, Mongo DB, Springboot, AWS, Docker, Java, Kafka
  • Score: 70/80

Professional Summary

10.3Years
  • Jan, 2026 - Present 5 months

    AI Software Engineer (Contract)

    Mercor
  • Jul, 2025 - Dec, 2025 5 months

    Applied AI Learning & Projects

    Independent
  • Sep, 2024 - Jul, 2025 10 months

    Technical Lead

    Avalara Technologies
  • Feb, 2016 - Feb, 20204 yr

    Senior Research Engineer

    Hyundai Mobis
  • Feb, 2020 - Sep, 20244 yr 7 months

    Senior Software Engineer

    Thoughtworks

Applications & Tools Known

  • icon-tool

    PostgreSQL

  • icon-tool

    AWS (Amazon Web Services)

  • icon-tool

    Java

  • icon-tool

    Apache Kafka

  • icon-tool

    Azure Cosmos DB

  • icon-tool

    Docker

  • icon-tool

    Java 11

  • icon-tool

    Java 8

  • icon-tool

    Spring Cloud

  • icon-tool

    Spring Boot

  • icon-tool

    Azure Pipelines

  • icon-tool

    GitHub

  • icon-tool

    IntelliJ IDEA

  • icon-tool

    Azure Active Directory

  • icon-tool

    New Relic

  • icon-tool

    Grafana

  • icon-tool

    Splunk

  • icon-tool

    Cucumber

  • icon-tool

    Jenkins

  • icon-tool

    REST API

  • icon-tool

    Web API

  • icon-tool

    AWS

  • icon-tool

    Azure

  • icon-tool

    MySQL

  • icon-tool

    Restful API

  • icon-tool

    Kafka

  • icon-tool

    Kubernetes

  • icon-tool

    Gradle

  • icon-tool

    Maven

  • icon-tool

    Postgres

  • icon-tool

    MongoDB

  • icon-tool

    CosmosDB

  • icon-tool

    Nomad

  • icon-tool

    Rio

  • icon-tool

    Amazon EKS

  • icon-tool

    PCF

  • icon-tool

    Maven

  • icon-tool

    Azure DevOps

  • icon-tool

    Azure Cloud

  • icon-tool

    AWS Cloud

  • icon-tool

    Consul

  • icon-tool

    Datadog

  • icon-tool

    Github

Work History

10.3Years

AI Software Engineer (Contract)

Mercor
Jan, 2026 - Present 5 months
    LLM training, evaluation, and agentic workflow design for frontier AI models. Design complex multi-step coding and reasoning tasks to train and evaluate frontier LLMs (Grok family), directly improving model performance on real-world software engineering scenarios. Audit AI-generated code for architectural correctness, security vulnerabilities, and adherence to modern engineering practices (SOLID, clean architecture, secure coding, test hygiene). Engineer agentic workflows using advanced prompt engineering and tool-use patterns, improving model reasoning depth and code generation accuracy on internal benchmarks.

Applied AI Learning & Projects

Independent
Jul, 2025 - Dec, 2025 5 months
    Intentional 6-month career block to expand from backend into Applied AI engineering. Dedicated focused time to learning Applied AI engineering, ahead of the industry shift toward AI-native software teams. Completed IBM AI Engineering Professional Certificate (V3) and Anthropic's Model Context Protocol course through hands-on applied work, not passive consumption. Built working knowledge of LLM application development: RAG pipelines, agent workflows using LangGraph, function calling, vector databases, embeddings, and prompt engineering. Actively building and open-sourcing AI engineering projects on GitHub (github.com/aakash16) repositories and technical writeups in progress.

Technical Lead

Avalara Technologies
Sep, 2024 - Jul, 2025 10 months
    Returns Console Enterprise tax compliance automation platform. Led full-stack development of Returns Console, orchestrating 10,000+ tax filings per month across returns, cycles, filing calendars, and notice workflows for enterprise customers. Architected clean service boundaries between Spring Boot microservices and React/TypeScript front-end; drove 80%+ automated test coverage and CI/CD quality gates, eliminating regressions during quarterly filing peaks. Led 3 distributed teams across time zones and mentored 5+ engineers on TDD, contract testing, and distributed system design measurably raising team code-quality standards.

Senior Software Engineer

Thoughtworks
Feb, 2020 - Sep, 20244 yr 7 months
    4+ years across two flagship clients (GAP Inc., Apple Inc.) architecture, modernization, and platform engineering at scale. Client: GAP Inc. Customer Profile Platform (Monolith Microservices Modernization): Architected and led modernization of GAP's legacy monolith into a microservices architecture on AWS; cut API failure rate by 90% and scaled the platform to 500K+ requests per second during peak retail traffic. Designed and built a Kafka-based bi-directional data synchronization pipeline for 10M+ customer records with zero downtime enabling gradual, risk-free migration from legacy to modern systems across multiple release trains. Optimized CI/CD pipeline, reducing deployment rollout time from 150 minutes to 5 minutes unblocking daily production deployments for 50+ engineers across the platform. Rolled out a unified observability stack (New Relic, Grafana, Splunk), cutting mean time to detection (MTTD) of production incidents by 30% and reducing incident-response stress during peak seasons. Introduced contract testing (Pact) and TDD practices across services, catching integration defects before merge and materially improving release confidence across teams. Client: Apple Inc. Ad Platforms (Dependency Manager Portal): Architected a Dependency Manager Portal tracking 750+ services and 1,500+ libraries, giving platform teams single-pane visibility into versions, health checks, and deployment state. Built the backend with Java, Spring Boot, and AWS integrated with React UIs enabling engineers to detect failing services within minutes instead of hours. Coordinated across infrastructure, backend, and ad-serving teams, preventing breaking dependency changes from propagating across 20+ engineering teams. Championed SOLID design principles and TDD practices, reducing onboarding time for new engineers and measurably cutting technical debt across the platform.

Senior Research Engineer

Hyundai Mobis
Feb, 2016 - Feb, 20204 yr
    Gen-4 Automotive Infotainment System (Android-based). Led a 5-engineer team building core Android applications for Hyundai's 4th-generation infotainment platform, shipped across multiple production vehicle models. Reduced technical debt by 70% through systematic refactoring of legacy applications and enforcement of clean code standards. Improved Android OS build time by 50% by re-architecting module dependencies and enabling artifact reuse across teams. Accelerated feature delivery by 40% through on-site collaboration with Korean stakeholders at Hyundai HQ, resolving requirement ambiguities early in the cycle.

Achievements

  • Awarded for developing working software prototype for Face Recognition based Driver Profile System for Tech Day at Hyundai Mobis
  • Co-founded and Developed WAVEMAXX an App based Dynamic Indoor Party Lighting System.
  • Secured 2nd Rank in PG-Diploma course at CDAC Hyderabad, 2016
  • Won Tech Day Award for developing Face Recognition based Driver Profile System in Hyundai Mobis - May, 2019
  • Co-found and developed Wavemaxx an app based dynamic indoor party lighting system - July 2018
  • Secured 2nd Rank in DSSD batch in PG-Diploma course, CDAC Hyderabad, 2016

Major Projects

1Projects

Wavemaxx

Jan, 2018 - Dec, 2018 11 months
    Indoor party lighting app built and launched end-to-end, including product design, development, and release.

Education

  • PG Diploma in System Software Development

    CDAC (2016)
  • B.Tech, Electronics & Communication Engineering

    Shri Mata Vaishno Devi University (2015)

Interests

  • Drawing
  • Graphic Design
  • Watching Movies
  • Listening Music
  • Travelling
  • Exercise
  • AI-interview Questions & Answers

    Hi, all. I'm Akash. I have nine plus years of professional experience. I'm currently working as a senior software engineer at Avaya Technologies, and previously I worked with Okta as a senior consultant. I'm primarily a back-end engineer who likes to work on Java-related technologies. And, I've been working on domains like e-commerce, banking, healthcare, etcetera.

    The so the difference between primary key and unique key is that primary keys are unique keys, but all unique keys are not primary keys. The purpose of primary key is to uniquely identify a record whenever new records are inserted in a table. A unique key, on the other hand, is a key which can be used, which is unique across all the records. So, basically, all primary keys are unique keys, but all unique keys are not primary keys. Primary keys can be auto-generated or manually generated during insertion, whereas unique keys have to be always generated from the user side.

    Both arrays and stacks are data structures, basically, which store the data in a linear fashion. But the difference is arrays are something which you can access the elements via indexes. They are stored contiguously. I mean, they're stored in a contiguous memory, and they have one access time. Once you create an array, you initialize an array, you cannot change its size. Whereas the stack is an abstract data structure, implemented over other primitive data structures. Their size can grow after initialization. And they store data linearly, but the access way of accessing is different. So, basically, in arrays, you can access any of the elements. But whereas in a stack, you cannot access any random element. You can only access the top element. And they follow LIFO structure, basically. So the last inserted element can only be extracted out. It's basically last in, first out. And they serve from different purposes, basically. In what scenario? Basically, whenever you want to store the state of any events, you push in the stack. For example, if you visit a website and you have a track of web pages, then stacks are used to store when you go back and forward from the web pages, their order is stored in a stack. So the last page which you have visited, if you press the back button, you go to the previous page from where you came. So you cannot access the random pages when you use forward and back buttons. But whereas some arrays are something where you just store, let's say, a list of records or a list of objects, and you just want to access it randomly in one time. So they both serve different purposes, and stacks, as an abstract data structure, can be implemented over arrays, lists, etc.

    So the difference between Java seven and twenty one and twenty two are a lot. Basically, Java seven is the oldest stable Java version. And, after that, there are a lot of many versions, LTE versions introduced. In older Java seven versions, there was no functional style of programming. They were plain, the objects and the collections were used as simple collections. There were no lambdas and streams. So a lot of memory improvement happened after Java seven. In latest versions, like twenty two, they also use heavily functional style of programming. They have, like, variables, vars, where you don't need to declare the type of the variable. Also, from a memory point of view, there are a lot of JVM improvements, AOT and JIT compiler improvements, memory model improvements. Earlier in Java seven, you did not have virtual threads. Now in Java twenty one twenty two, you have virtual threads which help you efficiently manage memory and resources in multi programming or multithreading. Also, in latest Java, like twenty one and twenty two, you have sealed classes where you can prevent inheritance of those classes. You can control the inheritance. You can create specific records and tightly control them in a tightly controlled manner. Also, you have flexible switches where you can call different functions of different types. Switch cases are now more flexible. They are not tied to a particular data type. And a lot of coding style and syntax improvements are there. Now the code focus in Java twenty one twenty two is more on the declarative style of programming rather than imperative. So you spend less time on writing syntax and telling how to do it rather than the focus is on what to do.

    So the problems in this particular code I see is, there is no error handling, in the current design. And, if messages processor throws an exception, Kafka may repeatedly deliver the messages in an infinity loop or commit offsets prematurely. Also, there is no idempotency. In the first message, it is reprocessed due to retries and consumer restarts. Side effects like DB writes or API calls may execute multiple times. Also, there is no acknowledgment of control. So by default, Spring Kafka commits offsets automatically, like in batch or record mode, depending on the config. So if the processing fails, basically, after committing the offset, the messages are lost. And, also, there is no dead letter queue, so failing messages stay in the topic indefinitely and block the partition preventing other messages from being processed. There is no logging present, like silent failures. You cannot know what has gone wrong. There is no back pressure handling control. So, if messages read a spike, the consumer may overload or crash down. So, I think these are some of the issues in this current code of implementation.

    So the potential issues with the very large input strings for this particular type of program is that there is high memory usage when on the spin space time complexity, and each opening bracket pushes into a new stack for extremely large inputs, like millions of characters. This consumes a lot of heap memory. Possible consequences could be out of memory errors, or heavy garbage collection pressure because in the JVM, they constantly need to monitor and then remove those data. There also will be performance overhead of the stack class, because Java's little dot stack is basically synchronized, which adds unnecessary locking overhead and in single-threaded methods. So for large inputs, this slows down processing. There is boxing overhead also because stack is using character. If the stack uses the wrapper character class, then converting from primitive to non-primitive and non-primitive to primitive could be an extra overhead and too much load on the GC. So to optimize this, basically, we can use array dequeues, which are non-synchronized and memory efficient, to avoid synchronization overhead. And further optimizations can be the data can be streamed, processed the stream chunks by chunks, and from the reader, or a stream, instead of loading the entire stream. Early exit optimizations, like if you know how the input is open brackets with no chance of matching, then imbalance already visible, we can abort the program early. You can have custom primitive stacks like a primitive char array stack to completely avoid object boxing or an unboxing.

    So the important design considerations, what in this we can make is, can the caller realistically recover from the error? Yes. So if you use a checked exception like IO exceptions, for example, file not found, a missing config file, or temporary network issue, then the caller might retry showing that error message or prompt via a valid path. If there are no such opportunities, that means the program cannot or should not recover, so use an unchecked exception. For example, misconfiguration, developer bugs, or logical error. Sorry. So the second point is, near responsibility and abstraction boundary. So, lower level libraries, infra or I/O DB networking should throw checked exceptions. They expose the real world expected failures. The caller decides what to do. Then higher level business logic or service can wrap checked exceptions into domain specific unchecked exceptions. This hides low level details and simplifies upper layer handling. Then, the third point is, API usability versus robustness trade off. Checked exceptions encourage robust error handling, but can make APIs verbose and hard to use. Unchecked exceptions make code cleaner, but risk runtime crashes. So, basically, the rule of thumb is library or infrastructure code, we should prefer checked exceptions. We should inform the caller early. And application or domain layer, we should prefer unchecked exceptions. For the fourth point, we should have consistency, whatever we choose, be consistent across the code base or library. If some methods are thrown checked exceptions and another wrap them, it leads to confusion and improper handling. And so, basically, in summary, the key design decisions depend on who can handle the error and how recoverable it is. If the caller has recovered, like, retrying or provide a new file path through a checked exception, such as IO exception. If the error is unrecoverable or you want to abstract away from low level details, wrap it in an unchecked exception, ideally domain specific ones, not something raw like runtime exception.

    In one of my back-end projects, I applied the factory pattern in combination with the singleton pattern for a notification service that supported multiple channels, including emails, WhatsApp, and SMS. So each channel had a different integration provider like SMTP, Twilio, Meta APIs, etc. And I needed a clean way to instantiate the correct sender without cluttering the business logic with if-else or switch statements. So I created a notification factory class responsible for returning the right implementation of the notification center and interface based on the channel type. The factory pattern helps centralize object creation logic. So adding new channels like Slack or push notification required no change in existing service logic, just a new class implementing the interface. A single method ensured that only one factory instance existed across the application, reducing unnecessary object creation and improving performance. Overall, these patterns made the design more maintainable and scalable as a system design.