Skip to main content
Explore
Log in
Get started
Someone wanted to learn this too, so Grasp built them a personal learning path.
Create your own
Remote Software Engineering Careers
Module 1
Advanced Algorithmic Patterns: Arrays and Lists
1
Sliding Window Technique for Arrays and Strings
Identify problems suitable for the Sliding Window pattern and apply it to string and array problems.
2
Two Pointers: Sorted Arrays & Linked Lists
Solve algorithmic challenges using the Two Pointers technique for sorted arrays and linked lists.
3
Detecting Cycles with Fast and Slow Pointers
Apply the Fast and Slow Pointers (Tortoise and Hare) pattern to detect cycles in linked lists.
4
Merging Overlapping Intervals
Implement the Merge Intervals pattern to solve overlapping interval problems.
5
Cyclic Sort for Missing and Duplicate Numbers
Utilize the Cyclic Sort pattern to find missing or duplicate numbers in a contiguous array.
Module 2
Advanced Algorithmic Patterns: Heaps and Searching
6
Top K Elements with Heaps
Apply the Top K Elements pattern using Heaps (Priority Queues) to solve frequency and selection problems.
7
K-way Merge: Combining Sorted Lists
Implement the K-way Merge pattern to combine multiple sorted lists.
8
Two Heaps: Solving Data Stream Problems
Solve problems using the Two Heaps pattern, such as finding the median of a data stream.
9
Modified Binary Search for Rotated Arrays
Implement Modified Binary Search for searching in rotated or almost-sorted arrays.
10
Recursive Subset Generation with Backtracking
Solve subset generation problems using recursion and backtracking.
Module 3
Advanced Algorithmic Patterns: Graphs and Trees
11
DFS for Tree Traversal: Recursive & Iterative Approaches
Implement recursive and iterative Depth-First Search (DFS) for tree pathfinding and validation problems.
12
BFS for Traversal and Shortest Path
Apply Breadth-First Search (BFS) for level-order traversal and finding the shortest path in unweighted graphs/trees.
13
Solving Graph Problems with DFS
Apply Depth-First Search (DFS) to solve graph problems like finding connected components and cycle detection.
14
Topological Sort for Scheduling and Dependencies
Implement the Topological Sort pattern to solve scheduling and dependency graph problems.
15
Recognizing DP Problems: Optimal Substructure & Overlapping Subproblems
Identify problems with optimal substructure and overlapping subproblems suitable for Dynamic Programming.
Module 4
Dynamic Programming and Interview Communication
16
Solving 1D DP: Memoization & Tabulation
Solve 1D Dynamic Programming problems using both memoization (top-down) and tabulation (bottom-up) approaches.
17
2D Dynamic Programming for Optimization
Apply Dynamic Programming techniques to solve common 2D optimization problems (e.g., Longest Common Subsequence).
18
Algorithmic Problem-Solving with UMPIRE
Structure and communicate algorithmic solutions using the UMPIRE (Understand, Match, Plan, Implement, Review, Evaluate) framework.
Module 5
Foundations of Scalable Systems
19
Latency vs. Throughput: Impact on System Performance
Distinguish between latency and throughput and their impact on system performance.
20
Scaling Up vs. Scaling Out
Compare and contrast vertical scaling (scaling up) and horizontal scaling (scaling out).
21
Estimating System Capacity
Perform back-of-the-envelope calculations for capacity estimation (QPS, storage, bandwidth).
22
Understanding the CAP Theorem
Analyze the CAP theorem (Consistency, Availability, Partition tolerance) and its trade-offs in distributed data stores.
23
PACELC Theorem: Beyond CAP
Explain how the PACELC theorem extends the CAP theorem by considering latency and consistency trade-offs during normal operation.
Module 6
Scaling Databases
24
Async vs. Sync Replication: Trade-offs
Describe the trade-offs between asynchronous and synchronous database replication.
25
Read Replicas for Database Scaling
Implement a read-heavy traffic strategy using read replicas with PostgreSQL or MySQL.
26
Sharding Relational Databases: Implementation & Complexities
Apply horizontal partitioning (sharding) to a relational database table and analyze its complexities.
27
MongoDB Sharding for Horizontal Scalability
Implement sharding in a MongoDB cluster to enable horizontal scaling.
28
Distributed Transactions & 2PC
Explain the challenges of distributed transactions and the role of the Two-Phase Commit (2PC) protocol.
Module 7
High-Performance Caching Strategies
29
Distributed Caching for Database Optimization
Explain the role of a distributed cache in reducing database load and improving latency.
30
Cache-Aside Pattern for Reads
Implement the cache-aside caching pattern to manage cache and database reads.
31
Caching Patterns: Read-Through, Write-Through, and Write-Back
Compare and contrast read-through, write-through, and write-back caching patterns and their trade-offs.
32
Memory Eviction Policies Explained
Compare memory eviction policies (LRU, LFU, FIFO) for different data access patterns.
33
Consistent Hashing for Fault-Tolerant Caching
Design a caching layer using consistent hashing to minimize cache invalidation when nodes are added or removed.
Module 8
Asynchronous Processing and Event-Driven Architectures
34
Synchronous vs. Asynchronous: Resilience & Consistency
Analyze trade-offs of synchronous vs. asynchronous processing, focusing on system resilience and eventual consistency.
35
Message Queues vs. Distributed Logs
Explain the difference between a message queue (e.g., RabbitMQ) and a distributed log (e.g., Kafka).
36
RabbitMQ Producer-Consumer Pattern
Implement a producer-consumer pattern using RabbitMQ (AMQP).
37
Building Kafka Producers and Consumers in Go
Implement a basic Kafka producer and consumer in Go to publish and read messages from a topic.
38
Message Delivery Semantics
Compare message delivery semantics: at-most-once, at-least-once, and exactly-once.
Module 9
Microservices, API Gateways, and Resilience
39
Decompose Monoliths with Bounded Contexts
Identify domain boundaries to conceptually decompose a monolithic application into bounded contexts.
40
REST, GraphQL, and gRPC Comparison
Compare REST, GraphQL, and gRPC for inter-service communication.
41
Building gRPC Services in Go
Implement a gRPC service and client in Go using Protocol Buffers.
42
API Gateway Configuration for Routing, Auth, and Rate Limiting
Configure an API Gateway for request routing, authentication (e.g., JWT), and rate limiting.
43
Rate Limiting Algorithms: A Comparative Analysis
Compare rate limiting algorithms (e.g., Token Bucket, Leaky Bucket, Sliding Window Log).
44
Circuit Breaker Pattern for Microservices
Implement the Circuit Breaker pattern to prevent cascading failures in a microservice architecture.
Module 10
Infrastructure and Observability
45
Layer 4 vs. Layer 7 Load Balancing
Differentiate between Layer 4 (Transport) and Layer 7 (Application) load balancing.
46
Nginx Reverse Proxy and Load Balancer
Configure Nginx as a reverse proxy and load balancer for a cluster of backend services.
47
SLIs and SLOs: Defining and Tracking Service Levels
Define and track Service Level Indicators (SLIs) and Service Level Objectives (SLOs) for a service.
48
Prometheus Metrics for Go Applications
Instrument a Go application to expose metrics for a Prometheus monitoring system.
49
Distributed Tracing with OpenTelemetry
Implement distributed tracing using OpenTelemetry to trace a request across microservices.
50
Centralized Logging with ELK Stack
Aggregate and analyze structured logs from multiple services using the ELK (Elasticsearch, Logstash, Kibana) stack.
Module 11
Advanced Distributed Concepts
51
Understanding Raft: Distributed Consensus Explained
Explain the need for distributed consensus and the basic mechanics of the Raft algorithm.
52
DNS for Multi-Region Deployments
Explain the role of DNS load balancing and GeoDNS in multi-region deployments.
53
Snowflake ID Generation
Implement a distributed unique ID generator based on the Snowflake algorithm.
54
Preventing Cache Stampede: Locking & Probabilistic Recomputation
Diagnose and mitigate cache stampede (thundering herd) using techniques like locking or probabilistic recomputation.
55
Cache Penetration: Diagnosis & Mitigation with Bloom Filters
Diagnose and mitigate cache penetration using techniques like bloom filters.
Module 12
Practical System Design Interviews
56
Distributed Rate Limiting with Redis and Token Bucket
Design a distributed rate limiter using Redis and the Token Bucket algorithm.
57
Designing a High-Throughput URL Shortener
Design a high-throughput URL shortener service, focusing on read performance and storage optimization.
58
Real-time Communication Protocols: Comparison and Use Cases
Compare real-time communication protocols (WebSockets, long-polling) and their use cases.
59
Building a Scalable Chat App with WebSockets & Pub/Sub
Design a scalable chat application utilizing WebSockets and a Pub/Sub backend.
60
Fan-out Architecture for News Feed Systems
Design a news feed system employing a fan-out architecture for message distribution.
61
Mastering System Design Interviews: The PEDALS Framework
Synthesize and articulate system designs using a structured interview framework (e.g., PEDALS).