profile-pic

Aakash Maurya

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

    Technical Co-founder

  • Years of Experience

    11.3 years

  • Professional Portfolio

    View here

Skillsets

  • LLM evaluation
  • LangSmith
  • Prompt Engineering
  • Redis
  • SQL
  • System Design
  • TypeScript
  • agentic systems
  • AI Agents
  • AI observability
  • Cloudflare Workers
  • Generative AI
  • GuardRails
  • Knowledge graphs
  • High availability
  • Machine Learning
  • Microservices
  • Model context protocol
  • Supabase
  • Tool calling
  • vector search
  • Amazon Web Services
  • Human-in-the-loop
  • Large Language Models
  • Microsoft Azure
  • rest api design
  • Retrieval-Augmented Generation
  • Test-driven development
  • Terraform
  • Java - 08 Years
  • Spring Boot - 6 Years
  • Jenkins
  • Kubernetes - 3 Years
  • Docker - 4 Years
  • New Relic
  • Splunk
  • CosmosDB
  • MongoDB
  • PostgreSQL
  • Cucumber
  • Grafana
  • PACT
  • Java - 7.96 Years
  • Python
  • function calling
  • LangChain
  • LangGraph
  • Contract Testing
  • Apache Kafka
  • blue-green deployment
  • CI/CD
  • Distributed Systems
  • embeddings
  • event-driven architecture
  • GitHub Actions

Professional Summary

11.3Years
  • Jan, 2026 - Present 8 months

    AI Engineer (Contract)

    Mercor
  • Jul, 2025 - Present1 yr 2 months

    Technical Co-founder

    Flowhi
  • 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

11.3Years

AI Engineer (Contract)

Mercor
Jan, 2026 - Present 8 months
    LLM training, evaluation and agentic workflow design for a frontier AI lab. Design multi-step coding and reasoning tasks used to train and evaluate frontier language models across six task domains, including ML infrastructure, data processing, build systems and formal reasoning. Audit AI-generated code for architectural correctness, security and engineering practice, and engineer agentic workflows using advanced prompt engineering and tool-use patterns. Improved model reasoning depth and code generation accuracy against internal benchmarks.

Technical Co-founder

Flowhi
Jul, 2025 - Present1 yr 2 months
    OVVE is a proactive personal AI assistant, live at ovve.flowhi.ai and in beta on Google Play with 20 active testers in its first month. I own engineering and technical direction across a three-person team; co-founders lead product, design and go-to-market. 2,000+ commits across five repositories. Own end-to-end technical direction: architecture, technology selection, scope, security posture and release strategy. Flutter clients across Android, iOS, macOS and Linux, TypeScript backend on Cloudflare Workers, Supabase, React admin console. Architected the agentic engine with intent routing across 16 tools and two execution modes over streaming WebSocket and REST. Deterministic routing for simple requests reduced both latency and token cost per interaction. Designed a three-layer memory architecture: structured records for exact state, a typed entity and edge graph for relationships, semantic retrieval for fuzzy recall. Queries resolve against the store capable of answering them. Built an LLM evaluation harness with persona-based scenarios and a semantic judge. The first full run surfaced memory-recall and context-isolation defects that months of manual testing had not detected. Designed a confidence gate governing every autonomous write: high confidence acts, medium confirms with the user, low takes no action. Primary safety control for a system that creates tasks and calendar entries on a user's behalf. Instrumented token cost and latency through LangSmith tracing, and produced an operating cost model at 10,000 users to validate pricing ahead of launch. Evaluated a real-time voice agent architecture and selected on-device speech-to-text on cost and reliability grounds. Deferred meeting transcription from v1 to protect the release date. Completed a security audit and CASA Tier 2 preparation covering authentication resilience, access gating and third-party data handling.

Technical Lead

Avalara Technologies
Sep, 2024 - Jul, 2025 10 months
    Returns Console, an enterprise tax compliance platform. Avalara files 6M+ returns annually for 43,000+ customers, where a late or incorrect filing carries legal and financial penalties. Built backend services for Returns Console, covering transaction-to-form mapping, return generation and validation across US jurisdictions on a platform processing 10,000+ enterprise filings monthly. Debugged a month-end production filing failure with customer deadlines at risk: traced Kafka consumer lag through dead-letter queues to a validation gap in the aggregation pipeline, then added stricter input validation, event tracing and circuit breakers. Deployed blue-green with no customer impact. Introduced contract testing into the CI pipeline and raised automated coverage above 80%, with quality gates failing builds on regression.

Senior Software Engineer

Thoughtworks
Feb, 2020 - Sep, 20244 yr 7 months
    Architecture, modernization and platform engineering for Fortune 500 clients. GAP Inc. Customer Profile Platform, monolith to microservices (Azure): Modernized the legacy customer profile monolith into event-driven microservices on Azure, serving a loyalty program of approximately 40 million active members across four retail brands. Services scale elastically to 80-100 instances each through peak holiday traffic. Engineered a Kafka-based bi-directional synchronization pipeline migrating 10 million+ customer and credit card records with zero downtime, including cleansing, transformation, validation and reprocessing of malformed records. Cutover proceeded incrementally with no interruption to live customers. Cut CI pipeline duration from 90 minutes to 20 by splitting the monolithic build into per-service pipelines on Jenkins and PCF, moving deployment from a scheduled event to a daily capability. Established observability across New Relic, Grafana and Splunk with alerting on memory, latency and database failover, and defined the disaster recovery strategy including database failover. Drove Cucumber and Pact contract testing into build pipelines. Apple Inc. Ad Platforms, Dependency Manager Portal (AWS): Architected a dependency management portal covering 750+ services, 1,500+ libraries and 150+ base images, consolidating versions, health checks and deployment state into a single view. Reduced the engineering feedback loop from hours to minutes and caught breaking dependency changes before propagation. Java, Spring Boot, React, JFrog Artifactory, AWS S3.

Senior Research Engineer

Hyundai Mobis
Feb, 2016 - Feb, 20204 yr
    Gen-4 Android automotive infotainment platform, shipped across Hyundai and Kia production vehicles. Led a five-engineer team building core Android applications shipped in multiple production vehicle models, where post-release defects require dealer intervention rather than an application update. Cut Android OS build time by 50% through module dependency re-architecture, and resolved requirement ambiguity on-site at Hyundai headquarters in South Korea. Received the 2019 Tech Day Award for a face-recognition driver profile system.

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

Memantic, Citation-Grounded Knowledge Engine

    Local-first RAG system organizing knowledge by idea rather than document. Overlapping claims from different sources merge into a single node with multiple citations, so retrieval returns concepts rather than near-duplicate passages.

Education

  • PG Diploma, System Software Development

    Centre for Development of Advanced Computing (2016)
  • B.Tech, Electronics & Communication Engineering

    Shri Mata Vaishno Devi University (2015)

Interests

  • Drawing
  • Graphic Design
  • Watching Movies
  • Listening Music
  • Travelling
  • Exercise
  • A Few Screening Questions Before You Begin

    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.