EPAM Interview Preparation and Recruitment Process


About EPAM


EPAM Systems, Inc. is a global technology company specializing in software engineering, digital platform engineering, and digital product design. Founded in 1993 by Arkadiy Dobkin and Leo Lozner in New Jersey, USA, and Minsk, Belarus, it’s headquartered in Newtown, Pennsylvania. EPAM operates in over 55 countries, serving industries like financial services, healthcare, retail, and hi-tech with services including software development, cloud transformation, AI, data analytics, and cybersecurity. It’s a founding member of the MACH Alliance and was listed on the NYSE in 2012.

EPAM Interview Questions


Key points:


* Growth: EPAM has grown rapidly, with over 150 clients and 900+ active projects in India alone, where it employs over 9,600 people across five locations (Bengaluru, Chennai, Gurugram, Hyderabad, Pune). Globally, it serves customers across six continents.

* Acquisitions: Expanded through acquisitions like Fathom Technology (2004), Continuum (2018), and S4N (2021), enhancing its capabilities in consulting, digital design, and Latin American presence.

* AI and Innovation: Launched products like InfoNgen® and TelescopeAI® for AI-driven analytics and workforce management, and EPAM DIAL for AI innovation.

* Recognition: Ranked among the top IT services companies by Fortune, named a Glassdoor Best Workplace (2023, 2024), and recognized in Gartner’s Magic Quadrant for Custom Software Development.

* Work Culture: Rated 4.1/5 on Glassdoor, with 80% employee recommendation, though some cite high workloads and communication challenges. AmbitionBox rates it 3.7/5, with mixed reviews on management and appraisal policies.

* Social Responsibility: Committed to ethical operations, environmental protection, and community support, including the EPAM Ukraine Assistance Fund and a $100M humanitarian aid pledge during the 2022 Ukraine crisis.

Recent sentiment on X shows EPAM’s focus on AI-driven supply chain solutions and expansion in India, though some posts mention past controversies, like layoffs via Zoom, and recent stock downgrades by analysts.



EPAM Recruitment Process


EPAM Systems follows a structured recruitment process designed to assess both technical and soft skills. While exact steps may vary by role and location, here is the typical EPAM recruitment process:


1. Application / Online Submission

  • You apply through the EPAM careers portal or via referral.

  • Submit your resume/CV and any required documents.



2. Initial HR Screening

  • A recruiter contacts you to discuss:

    • Your background and experience.

    • Role fit and expectations.

    • Notice period and salary expectations.

    • Basic communication skills.



3. Technical Interviews (1–2 Rounds)

  • Format: Virtual or in-person.

  • Focus: Depends on the role but typically includes:

    • Data Structures and Algorithms.

    • System Design (for senior roles).

    • Programming language knowledge (Java, Python, etc.).

    • Problem-solving and coding challenges.

  • May involve a live coding round or an assignment.



4. Managerial/Project Interview

  • Conducted by a project or delivery manager.

  • Assesses:

    • Real-world problem-solving.

    • Decision-making.

    • Collaboration and communication.

    • Cultural and team fit.



5. Client Interview (if applicable)

  • Required for client-facing roles.

  • May involve technical and domain-related discussions.

  • Sometimes includes behavioral questions.



6. HR Interview Round


Having a good academic record and technical knowledge alone will not be sufficient to gain employment. The HR round is usually the final round in a company's recruitment process. Though the HR round may seem easy, it is most critical and essential. At this stage, the hiring manager will look at candidates' personalities, strengths, and weaknesses, along with their communication and reasoning skills. The interviewer will also ask a few behavioural questions to get acquainted with you and determine if your personality and behaviour are a good match for the position. Below you will find some common Epam HR interview questions.

* What does EPAM mean?

* Tell me a little bit about yourself and your family background.

* What makes you confident you are eligible to apply for EPAM?

* How do you envision yourself five years from now?

* How did Epam catch your attention?

* Are you aware of EPAM systems?

* What are your hobbies?

* When a crisis strikes, how well do you cope?

* What makes you a good hire?

* What are your greatest assets and greatest weaknesses?

* Would you like to share your take on the COVID situation??

* Would you like to learn any new technologies in the future besides the ones you already know?

* ave you ever felt like you couldn't overcome a situation? What helped you get through it?

* Would you like to ask us anything?

* Can you manage pressure well?

* What interested you in picking Java as your primary language or is it simply because of EPAM?

* What would you do if a coworker consistently arrived late to a weekly meeting?



7. Background Verification & Onboarding

  • Background check by a third-party vendor.

  • Onboarding process begins upon clearance.

EPAM Interview Questions :

1 .
What is the difference between an Interface and an abstract class?
* Interface is a contract that defines the methods a class must implement, while abstract class can have both abstract and concrete methods.

* Interface cannot have any implementation, while abstract class can have both abstract and concrete methods.

* A class can implement multiple interfaces but can only inherit from one abstract class.

* Interfaces are used to achieve multiple inheritance in Java, while abstract classes are used to provide a common base for subclasses.

* Interfaces are implicitly abstract and public, while abstract classes can have different access modifiers.
2 .
What is the requirement traceability matrix?
As the name suggests, the RTM (Requirement Traceability Matrix) is a document, in the form of a table, which connects and traces user requirements with test cases to make sure that all requirements are covered during testing. RTM was designed in order to verify that all test cases had been covered and that no functionality had been missed during testing. In addition, it assists with identifying and maintaining project requirements and deliverables. Simply put, it is a way of tracking project requirements and ensuring they have been met.

Advantages:

* Ensure 100% test coverage.

* It makes it easy to identify missing functionality.

* Aids you in finding defects related to vital requirements, along with defect severity and priority.

* When requirements change, it is possible to identify test cases that should be updated.

* The overall status of test execution can be tracked easily.
3 .
State the difference between quick sort and merge sort.
Both Quicksort and Mergesort are sorting algorithms that allow array elements to be arranged in sequence order, thereby, facilitating a faster and easier search for array elements. Both are based on the divide and conquer approach.

Quicksort Mergesort
In Quicksort, each element of the array is compared with a pivot element. Mergesort repeatedly divides the array into two subarrays (n/2) until only one element remains.
Quicksort is ideal for small arrays. Merge sort is suitable for any array size, whether small or large.
The worst time complexity of Quicksort is O(n^2). The worst time complexity of Mergesort is O(n log n).
It doesn't take up any more space to perform the quick sort. To merge two subarrays takes additional space as a temporary array.
For small data sets, it will be faster than other sorting algorithms. With this algorithm, all data sets are sorted at the same speed.
4 .
Could you explain how the stack can be implemented using the array?
Stack is a type of linear data structure that follows the LIFO (Last In First Out) principle. Insert and delete operations on the stack are performed from one end (top) only.  Inserting a data element on top of the stack is called a push operation, and removing a data element from the top is called a pop operation.

Implementation of stack using Array

Using push(): To insert data into the stack, we use the Push() function, but before we do so, we have to check if the stack is full. The push operation cannot be performed if the stack is full, a condition that is sometimes called stack overflow. But, if there is space, the push() function inserts the element and increments the top pointer.
//Program to implement stack using Array
//x is element to be added and n is size of the stack
void push (int x, int n)          
{  
   if (top == n )   
   printf("Overflow");   
   else   
   {  
   top = top +1;   
   stack[top] = x;   
   }   
}​
 
Using pop(): To delete data from the stack, we use the Pop() function, but before we do so, we have to check if the stack is empty. If the stack is empty, the push() operation cannot be performed; otherwise, the pop() function decrements the value at the top of the stack.
//Program to implement stack using Array
int pop ()  
{   
   if(top == -1)   
   {  
       printf("Underflow");  
       return 0;  
   }  
   else  
   {  
       return stack[top - - ];   
   }    
} ​
5 .
What are constructors? Write its types.
Constructors can be defined as a special member function of a class that is responsible for initializing a newly created object of the class. Constructors are automatically called when we create an instance (object) of a class. Unlike other functions, constructors have no return type, and their name should be the same as that of the class they are declared in.

Syntax:
class Scaler
{
  Scaler() {
   // constructor body
  }
}​


Types of Constructors:

* Default Constructors: When there is no constructor defined, the Java compiler automatically creates a no-arg constructor at runtime, known as the default constructor.

* No-Arg Constructors: Like methods, a Java constructor may or may not contain any arguments (parameters). Constructors without any parameters are known as no-argument constructors.

* Parameterized Constructors: Constructors with one or more parameters are known as parameterized constructors.
6 .
Write the binary search algorithm?
A binary search algorithm is used to determine an element's position within a sorted array. This algorithm is based on the divide and conquers approach. A binary search looks for the target element by comparing it with the middlemost element in the array.

Example: Assume that the array to be searched is 1234567. Suppose x = 5 is the element to be searched. 1 is the leftmost element (low) and 7 is the rightmost element (high) element in the array. Find the middle element (mid) of the array using the formula [(low + high)/2]. In this case, the middle element is (1+7)/2=4.

* If x==mid, it will return mid.
* If x>mid, x will be compared against the middle element of the subarray to the right of mid.
* If x<mid, x will be compared against the middle element of the subarray to the left of mid.

Code:

// Binary Search in Java
import java.util.Scanner;
public class Main
{
   int binarySearch(int array[], int x, int low, int high)
   {
       // Repeat until the pointers low and high meet each other
       while (low <= high)
       {
       int mid = low + (high - low) / 2;
       if (array[mid] == x)
       return mid;
       if (array[mid] < x)
       low = mid + 1;
       else
       high = mid - 1;
       }
       
       return -1;
   }
public static void main(String args[])
 {
   Main obj = new Main();
   int array[] = { 1, 2, 3, 4, 5, 6, 7 };
   int n = array.length;
   Scanner s= new Scanner(System.in);
   System.out.print("Enter a target element: ");  
   int x=s.nextInt();
           
   int result = obj.binarySearch(array, x, 0, n - 1);
   if (result == -1)
     System.out.println("Not found");
   else
     System.out.println("Element found at index " + result);
 }
}​

Output:
Enter a target element: 7
Element found at index 6​
7 .
What is the best case and worst case time complexity for the quick sort?
Quicksort can be applied in several different ways based on the position of the pivot in the array:

* Selecting the first or last element in the array as a pivot element
* Selecting a median element of an array as a pivot element

Best Case: Quicksort performs the best if we divide arrays and subarrays into two equal partitions, i.e., when we select the median element of the array as a pivot element. The partition positions for each element happen to be in the middle of the array, resulting in a balanced binary tree of height log(n). Therefore, the total complexity becomes O(n log n).

Worst Case: Worst case is when we select the left-most or right-most element of an array as a pivot element. The partition positions for each element happen to be at the edge of the array (left or right), resulting in a skew tree having height n. Therefore, the total complexity becomes O(n^2).
8 .
Can you explain the concept of a 'is-a' and 'has-a' relationship in Java?
In Java, the 'is-a' relationship refers to inheritance, where a class extends another class to inherit its properties and methods. For example, if we have a class 'Animal' and a class 'Dog' that extends 'Animal', we can say 'Dog is a type of Animal'. This allows the 'Dog' class to inherit the characteristics of the 'Animal' class, such as methods like 'eat()' or 'sleep()'. Through inheritance, we can create a hierarchy of classes to promote code reusability.

On the other hand, the 'has-a' relationship is implemented through composition, where a class contains an instance of another class. For instance, a 'Car' class may have a 'Wheel' class as one of its attributes. This relationship allows for better flexibility and modularity in the codebase, as the 'Car' class can utilize the functionalities of the 'Wheel' class without being tightly coupled to it.

As a Software Engineer with experience in Java development, I have implemented these relationships in various projects. For instance, in a previous project, I utilized the 'is-a' relationship by creating a base 'Employee' class and extending it with specific employee types like 'Manager' and 'Engineer'. This approach streamlined the codebase and allowed for efficient code maintenance. Additionally, I leveraged the 'has-a' relationship by integrating external libraries into our system, enabling us to extend functionality without modifying existing code extensively.
9 .
Could you tell me how many data structures you are familiar with?
Data Structures are specialized ways to store and organize data in computer systems in order to perform operations on the data more efficiently. Data structures are used across a wide range of fields in computer science and software engineering. You should choose the appropriate data structure based on your requirements and project. In the case of storing data sequentially in memory, the Array data structure is recommended. In general, data structures can be divided into two categories:

Linear data structure: In the linear data structure, elements are arranged one after another in sequence. As the elements are organized in a specific order, they are easily implemented. A few examples of linear data structures are as follows:

* Array: In an array, elements are sequentially stored one after another in memory. They all have the same data type.

* Stack: Data elements in the stack are arranged based on the LIFO (Last in First Out) principle. In other words, the last element stored in a stack will be removed first.

* Queue: Data elements in Queue are arranged based on the FIFO (First in First out) principle. In other words, the first element stored in a queue will be removed first.

* Linked List: The elements of a linked list are stored as nodes. Each node contains the data items and the address to the next node. Generally, a node is made up of two parts, one storing the data element, and the other storing the link to the next node.

Non-linear data structure: In non-linear data structures, elements are not in any particular order. Rather, they are organized in a hierarchical manner in which one element is linked to another or more elements. A few examples of non-linear data structures are:

* Graph: Graphs are collections of edges and vertices. Graphs consist of nodes called vertices, and vertices are connected to each other by edges.

* Trees: Trees are also made up of vertices and edges, just like graphs. Tree data structures allow only one edge to exist between two vertices.
10 .
Is Java a pass-by-value or reference? Prove it.
Java strictly enforces pass-by-value. Passing the parameters by using pass-by-values does not affect/alter the original variable. In the following program, we have initialized a variable called 'x' with some value and used the pass-by-value technique to demonstrate how the value of the variable remains unchanged.

Code:
public class Main
{    
   public static void main(String[] args)
   {
       //Original value of 'x' will remain unchanged
       // in case of call-by-value        
       int x = 5;
       System.out.println( "Value of x before call-by-value: " + x);
   
       processData(x);
       System.out.println("Value of x after call-by-value: " + x);
   }
   public static void processData(int x)
   {
       x=x+10;          
   }
}​

Output:
Value of x before call-by-value: 5
Value of x after call-by-value: 5​
11 .
Can you explain the difference between ArrayList and Vector?
ArrayList and Vector are both dynamic arrays (resizable arrays) used in Java to implement the list interface.

ArrayList Vector
By default, ArrayList is not synchronized. This means that ArrayList can be used by multiple threads simultaneously.  It is synchronized. This means that Vector can be used by only one thread at a  time.
ArrayList increases its size by 50% if the number of elements exceeds its maximum capacity. Vector increases its size by 100% if the number of elements exceeds its maximum capacity.
Since ArrayLists are unsynchronized, they are faster as compared to vectors. Since Vectors are unsynchronized, they are slower as compared to ArrayLists.
The iterator interface can be used to traverse the elements of the ArrayList. Both the Enumeration interface and Iterator interface can be used to traverse the elements of Vector.
12 .
Explain abstract class and abstract method.
Abstract class: This class can never be instantiated i.e., objects of abstract classes cannot be created. There can be both regular and abstract methods in an abstract class. Abstract classes are declared using the abstract keyword. It is necessary to extend (inherit) the abstract class. The subclass of an abstract class, i.e., the class inherited from it, usually implements all of the abstract methods of the parent class (abstract class).

Abstract method: Abstract methods can only be used in abstract classes, and they do not have bodies. The body of the abstract method is provided by the subclass. The abstract keyword is also used for abstract methods.

Example:
// Abstract class
abstract class FreeTimeLearning
{
   // Abstract method (does not have a body)
   abstract void Products();
    
   // regular method
   void method();
    {
      ...
    }
}​
13 .
State the difference between HashMap and HashTable.
Both HashMaps and Hashtables store data in the key-value form. Each store's unique keys use hashing techniques.

HashMap HashTable
It is non-synchronized. As a result, two or more threads can access the HashMap data at the same time. It is synchronized. As a result, only one thread can access the Hashtable data at a time.
This is not thread-safe, so it cannot be shared among many threads without proper synchronization. It is thread-safe, so it can be shared among many threads.
In a hashmap, there can be one null key and any number of null values. Hashtables do not allow null keys or null values.
HashMap values are iterated by using an iterator. A HashTable, however, also includes an Enumerator along with Iterator for traversing/iterating the value stored in it.
Since HashMaps are unsynchronized, they are faster and use less memory than Hashtables.  Since Hashtables are synchronized, they are slow and use more memory than HashMaps. But, it eliminates the need to write extra code for synchronization.
14 .
What is the purpose of the final, finally, and finalize keyword?
* Final: Final is a reserved keyword in Java that can be used in multiple contexts to define an entity. Final variables have fixed values, i.e. they cannot be changed after they have been assigned. Depending on whether it is used for a variable, a class, or a method, the final keyword has different meanings.

* Final Variable: Once a final variable has been initialized, its value cannot be changed.

* Final Method: A subclass cannot override the final method. Declaring a method final means that it cannot be overridden.

* Final Class: When a class is final, it cannot be subclassed. Declaring a class final means that we cannot extend or make a subclass of it in any way.

* Finally: Finally is a keyword that is used in conjunction with a try/catch block and ensures that a section of code will be executed, regardless of whether an exception is handled or not. It executes important code such as resource cleanup or releasing memory usage.

* Finalize: A garbage collector always calls the finalize method just before it deletes or destroys an object to perform cleanup activities. The clean-up activity means closing resources associated with that object, such as databases and network connections, or de-allocating resources. It is defined in the Object class.
15 .
What happens when a method or variable contains the static keyword?
Static keywords are mainly used for memory management in Java, and can be used with blocks, methods, variables, and nested classes.  When you use a static keyword with a method or variable within a class, those static members will remain constant (you cannot change or modify them) for every instance you create of that particular class.
16 .
What is the use of unsubscribe in Angular, and what are the practical benefits of using onDestroy?
Unsubscribe in Angular is used to clean up resources and prevent memory leaks. ngOnDestroy is a lifecycle hook that is called when a component is destroyed.

* Unsubscribe is used to prevent memory leaks by unsubscribing from observables when a component is destroyed.

* onDestroy is a lifecycle hook in Angular that is called when a component is destroyed, allowing for cleanup tasks to be performed.

* Practical benefit of using onDestroy is to release resources, such as unsubscribing from observables, closing connections, or cleaning up any other resources used by the component.
17 .
How does Spark process data in parallel?
* Spark processes data in parallel using its distributed computing framework.

* Spark divides data into partitions and processes each partition independently.

* Tasks are executed in parallel across multiple nodes in a cluster.

* Spark uses in-memory processing to speed up data processing.

* Data is processed lazily, allowing for optimizations like pipelining.

* Spark DAG (Directed Acyclic Graph) scheduler optimizes task execution.

* Example: Spark can read data from HDFS in parallel by splitting files into chunks for processing.
18 .
Different senarios on different gcp services
Different scenarios on different GCP services

* Scenario 1: Using Cloud Storage for storing and accessing large amounts of data

* Scenario 2: Utilizing Cloud Functions for serverless computing and event-driven applications

* Scenario 3: Implementing Cloud SQL for managing relational databases in the cloud
19 .
How do you secure a web application?
Securing a web app involves implementing various security measures to protect against threats and vulnerabilities.

* Use HTTPS to encrypt data transmitted between the client and server

* Implement input validation to prevent SQL injection and XSS attacks

* Use strong authentication mechanisms like multi-factor authentication

* Regularly update software and patches to fix security vulnerabilities

* Implement security headers like Content Security Policy to prevent attacks
20 .
What is a window function in SQL?
Window function in SQL is used to perform calculations across a set of table rows related to the current row.

* Window functions are applied to a set of rows related to the current row, known as a window frame.

* They can be used to calculate running totals, ranks, averages, and more.

vExamples of window functions include ROW_NUMBER(), RANK(), SUM(), AVG(), and LEAD().
21 .
What is dependency injection?
Dependency injection is a design pattern in which components are given their dependencies rather than creating them internally.

* Allows for easier testing by providing mock dependencies

* Promotes loose coupling between components

* Improves code reusability and maintainability

* Examples: Constructor injection, Setter injection, Interface injection
22 .
Explain the SOLID principles.
SOLID is a set of five design principles to make software designs more understandable, flexible, and maintainable.

S - Single Responsibility Principle: A class should have only one reason to change.

O - Open/Closed Principle: Software entities should be open for extension but closed for modification.

L - Liskov Substitution Principle: Objects of a superclass should be replaceable with objects of its subclasses without affecting the program's correctness.

I - Interface Segregation Principle: Clients should not be forced to depend on interfaces they do not use.

D - Dependency Inversion Principle: High-level modules should not depend on low-level modules. Both should depend on abstractions.
23 .
What are the differences between finally and finalize?
finally is used in exception handling to define a block of code that will always be executed, while finalize is a method in Java used for cleanup operations before an object is destroyed.

* finally is used in try-catch blocks to define a block of code that will always be executed, regardless of whether an exception is thrown or not.

* finalize is a method in Java that is called by the garbage collector before an object is destroyed.

* Example: try { // code that may throw an exception } catch(Exception e) { // handle exception } finally { // cleanup code that will always be executed }