Summary
Interviewed for SSE role at MoEngage with a focus on designing a notification system. The interview covered system design, scalability, and performance optimization challenges.
Full Experience
I got interviewed at MoEngage for the SSE role. With 2.5 years of experience, I was asked to design a notification sending system that sends notifications based on user preferences. The interview involved a detailed discussion on system architecture, data modeling, and performance considerations. I approached the problem by designing a hybrid model combining event-driven architecture with a user-channel mapping system. The interview also included a BOTEC analysis to estimate storage requirements and scalability solutions for handling large-scale notification delivery.
Interview Questions (2)
Design a notification sending system that sends notifications to users based on their preferences. For example, in Slack, users can specify the types of notifications they want to receive (e.g., mentions, all notifications, etc.).
Estimate the ephemeral storage required for a notification system handling a high volume of messages and users. Given parameters include message posting throughput, average channel size, and user ID size.
Summary
I recently interviewed at MoEngage, which included an in-depth discussion on Kafka internals and a challenging machine coding round focused on designing a Stock Price Volatility Monitor using a sliding window.
Full Experience
I recently had an interview at MoEngage. The initial phase delved into a comprehensive discussion about Kafka, covering essential topics such as producers, consumers, consumer groups, offset management, partitions, message ordering, backpressure handling, and ensuring Kafka's exactly-once semantics. We also explored Kafka internals in detail, including log compaction, retry mechanisms, and idempotency. Following this in-depth technical discussion, I proceeded to a machine coding round.
Interview Questions (1)
You are given a continuous stream of stock price changes (both positive and negative).
Your task is to design a VolatilityMonitor class that keeps track of the maximum volatility within the last N trades.
👉 Volatility = absolute value of price change
You must implement two methods:
recordTrade(int priceChange)- Adds a new trade.
- Only the last N trades are stored — so this forms a sliding window.
getMaxVolatility() → int- Returns the maximum absolute price change in the current sliding window.
📘 Example
Let tradeWindow = 3
Operation Window Max Volatility recordTrade(5) [5] 5 recordTrade(-3) [5, -3] 5 recordTrade(8) [5, -3, 8] 8 recordTrade(2) [-3, 8, 2] 8
The window always slides to keep only the last N price changes.
Summary
I interviewed for an SDE-2 Frontend role at MoEngage, going through three rounds that covered JavaScript fundamentals, deep React concepts, and a Hiring Manager discussion. Despite strong performance in the technical rounds, I was ultimately rejected due to perceived fitment issues in the final round.
Full Experience
My interview journey for the SDE-2 Frontend position at MoEngage involved three distinct rounds.
Round 1: Javascript Basics
This round started with a brief introduction, then quickly moved into coding challenges. I was asked to implement debouncing on a button using pure HTML, CSS, and JavaScript. Following that, I had to write aclassNames utility function, similar to popular libraries, that could handle various input types like strings and objects. Finally, I was challenged to create a polyfill for Array.prototype.reduce.Round 2: Deep Dive into React
After successfully clearing the first round, the second round, which focused on React, was rescheduled multiple times before finally taking place. This round delved deep into React concepts. We discussed the differences between React 16 and React 19 and the considerations for migrating a codebase. I explained why React is chosen over other libraries and its potential drawbacks. Other core topics included what JSX is and its necessity, various ways to implement conditional rendering, the workings of the Virtual DOM, and the reconciliation process in depth. I also had to enumerate all the reasons why React components re-render. We then discussed Higher-Order Components (HOCs) and I provided a real-time example. The round concluded with a coding task to create an Accordion component using React.Round 3: Hiring Manager
This round was primarily a technical fitment discussion. We extensively talked about my past projects, the kind of environment and team structures I had previously worked in, and some other general hiring manager questions. At the end of this round, the Hiring Manager informed me that there were many candidates selected for the final round with only four openings, and they would debrief and let me know the outcome.Verdict
Two to three days later, HR informed me that I was not moving forward. The feedback was that while I had a strong 'yes' in both technical rounds, the Hiring Manager felt I was lagging slightly in the fitment round. Consequently, I was rejected for the position.Interview Questions (12)
Create a button and implement debouncing on it using pure HTML, CSS, and Javascript.
Implement a utility function classNames that concatenates CSS class names based on various input types (strings, objects with boolean values). Examples:
console.log(classNames('foo', 'bar')); // "foo bar"
console.log(classNames({ 'foo-bar': true })); // "foo-bar"
console.log(classNames({ foo: true, bar: false, qux: true })); // "foo qux"
Implement a polyfill for the native JavaScript Array.prototype.reduce method.
Discuss the key differences between React 16 and React 19, and what aspects need to be considered when migrating a codebase from React 16 to React 19.
Explain the reasons and advantages of choosing React over other frontend libraries or frameworks.
Discuss the potential drawbacks and limitations of using React.
Describe what JSX is and why it is an essential part of React development.
Explain various methods and techniques for performing conditional rendering in React.
Explain the concept of the Virtual DOM and describe in detail how React's reconciliation process works.
List and explain all the common reasons why a React component might re-render.
Explain what Higher-Order Components (HOCs) are in React and provide a real-time example of their usage.
Implement an Accordion component using React.
Summary
I recently interviewed for a Data Engineer position at MoEngage, which included a DSA round where I was asked to implement the 'Shuffle an Array' problem. Despite discussing several approaches for the solution, my candidacy was ultimately rejected.
Full Experience
I received a call from MoEngage HR regarding a Data Engineer opening. The interview process was described as having one DSA round, one System Design round, and one HR round. My first round was the DSA round. The interviewer provided a link to the LeetCode problem 'Shuffle an Array' and asked me to explain my approach and write code while discussing it. Initially, I proposed a brute-force idea of generating all permutations, but after discussing its time complexity, we agreed it wouldn't be an optimal solution. I then proceeded to explain multiple other approaches:
- Approach 1: Generate two random indices (using a random function) in the range [1, n], swap the elements at those indices, and then return the array.
- Approach 2: Iterate through the array. For each current index i, generate a random index j (typically within the range of elements not yet processed, e.g., [i, n-1]) and swap the elements at nums[i] and nums[j].
- Approach 3: Insert all elements into a HashSet (as in Java) and then randomly remove elements one by one to form the shuffled array. I did mention that this approach might not guarantee equal likelihood of all permutations.
Interview Questions (1)
The interviewer shared a link to the LeetCode problem 'Shuffle an Array'. The task was to design an algorithm to randomly shuffle an integer array, ensuring that all permutations of the array are equally likely. I needed to implement the Solution class with the following methods:
Solution(int[] nums): Initializes the object with the integer arraynums.int[] reset(): Resets the array to its original configuration and returns it.int[] shuffle(): Returns a random shuffling of the array.
Summary
I participated in a coding round for the Senior Software Engineer position at MoEngage, where I was tasked with solving a complex data processing problem involving log files to identify and count unique drivers for specific city visit triples.
Full Experience
During my Senior Software Engineer interview at MoEngage, the focus of the round was a challenging coding problem. I was given a scenario involving a large log file that tracked driver movements across various cities with timestamps. The core task was to extract 'triples' – sequences of three consecutive cities visited by a driver, ordered by timestamp – and then count the number of unique drivers associated with each distinct triple. This required careful parsing, grouping, sorting, and aggregation of data from the log file. The problem presented a good test of my data processing and algorithmic skills.
Interview Questions (1)
Suppose you have a big text log file and there are three columns:
NameCityTimestamp
Example log data:
Name City Timestamp
John city1 t4
Bob city1 t3
John city2 t1
John city3 t3
Bob city3 t2
John city4 t2
Bob city4 t1
The first column is a driver name, the second is a city name, and the final is a timestamp (32-bit integer).
This log file maintains a history of drivers.
We define a "triple" as a tuple of three consecutive cities a driver has been to that are ordered by timestamp.
Suppose t1 < t2 < t3 < t4, then we will have the following triples:
- for John, we have: (city2, city4, city3), (city4, city3, city1)
- for Bob, we have: (city4, city3, city1)
Write a program to output all the triples in the file and for each triple, output the count of unique drivers that have been to that triple.
For the example input, the output would be
(city2, city4, city3) 1
(city4, city3, city1) 2
Summary
I interviewed for a Senior Software Engineer role at MoEngage, going through DSA, LLD, and a Hiring Manager round. After a confusing and drawn-out hiring process, I was offered a Software Engineer position with a significantly reduced compensation package, which I ultimately declined.
Full Experience
I was contacted by a recruiter regarding an application I don't recall submitting. They wanted to schedule an interview immediately, but I had prior commitments. After some negotiation regarding their hybrid work model (interviews only on Thursdays/Fridays when employees work from home), I agreed to proceed with the interviews.
Round 1 | DSA
I was asked to implement an LRU cache. I presented my approach and then coded it. Initially, I faced some issues, but I was able to refine it and code the correct solution as the discussion progressed.
This round concluded, and they immediately requested a second round just 30 minutes later. I asked for more time to prepare, which they eventually granted, and I rescheduled the second round for the following week.
Round 2 | LLD
For the low-level design round, I was tasked with designing an on-call management support tool similar to OpsGenie. The tool needed to handle multiple projects and employees, each with varying levels of responsibility for incident response. I began by outlining the necessary classes and methods. Once the interviewer was satisfied with the class structure, I started coding. Although I only managed to implement 4-5 out of the 5-7 requested functionalities, the interviewer seemed pleased with my overall performance.
Round 3 | HM Round
During this round, the hiring manager inquired about my current projects and my contributions to them. I was then given a high-level design (HLD) question that I struggled to fully solve.
The HLD problem involved handling a stream of categories coming into an API or server. The goal was to extract unique categories from this stream and update the current user view with these new categories. This was a novel problem for me, and despite proposing several solutions, none quite met the interviewer's expectations. Consequently, this round did not go well.
A few days later, HR called to inform me that while the hiring manager couldn't consider me for the Senior Software Engineer role, they would consider me for a Software Engineer position. Given my current role and the potential learning opportunities at MoEngage, I initially agreed and promptly sent all requested documents. However, the HR contact became unresponsive. After contacting another HR representative, I learned the original HR was on vacation and would release the offer upon return. After two weeks of waiting and numerous follow-ups, I was told the offer was in the approval process. Another week passed, and I was informed the position was on hold. Eventually, they reached out again, confirming the position was open and asking if I was still interested. I agreed, but when the offer finally arrived, the base package (21LPA) was lower than initially discussed (25LPA), with no variable pay, no stock options, and only a 1L signing bonus. Given my current remote work situation, accepting this would mean a pay cut, so I ultimately declined the offer.
Interview Questions (3)
I was asked to implement an LRU cache. I provided my approach and proceeded to code it. Initially, I had some difficulties, but I was able to refine and implement the correct solution during the interview.
I was asked to provide a low-level design for an on-call management support tool similar to OpsGenie. The tool needed to support multiple projects and employees, with various levels of responsibility for responding to incidents.
The high-level design question involved handling a stream of categories coming to an API or server. The objective was to efficiently extract unique categories from this incoming stream and then display these new unique categories to the user in their current view.
Summary
I was shortlisted for an interview at Moengage after participating in a GFG monthly challenge and successfully navigated technical and HR rounds, ultimately receiving an internship offer with a performance-based PPO in Bangalore.
Full Experience
My journey with Moengage began after I was shortlisted from a GeeksforGeeks monthly challenge. Following this, HR promptly scheduled my interview within a week with a senior software engineer.
Round 1 (Technical)
This round started with a standard introduction. We then had a good discussion centered around the projects I had mentioned in my resume, diving deep into their specifics. The interviewer also asked several database-related questions, focusing on the differences and use cases of SQL versus NoSQL databases. Towards the end of this round, I was given one Data Structures and Algorithms question, which was related to strings.
Round 2 (HR)
The HR round focused on behavioral aspects and my fit for the company. I was asked a few key questions:
- "What do you know about Moengage?" - This question assessed my research and understanding of the company's mission and products.
- "Tell me your strengths and weaknesses." - A common behavioral question to understand my self-awareness and how I approach personal development.
- "How soon will you be able to join us?" - This question was about my availability and commitment to the role.
The interview process concluded smoothly.
Interview Questions (3)
What do you know about Moengage?
Tell me your strengths and weaknesses.
How soon will you be able to join us?