I interviewed for a Senior Software Engineer (SSE-II) position at Uber in March . I have 7.5 years of experience and was working as a Senior Architect at a robotics company with 600-800 employees. The interview process consisted of 8 rounds:
I cleared the design rounds and solved all the coding problems, but the company felt that I wasn't fast enough at programming. As a result, I was not offered the position. My recruiter indicated that if I had more time to improve my coding speed, I would have been successful.
I allocated one month to prepare for software engineering positions, specifically focusing on senior roles at large companies. I was looking for opportunities to solve large-scale challenges.
I prepared a comprehensive list of topics that required revision or practice:
| Category | Topics | |---|---| | Data structures | Arrays, LinkedList, Queues, Stack, HashTable, Graph, Bloom filters, Binary tree, Binary search tree, B-trees, Red-black trees, Disjoin sets, Heaps, Van emde boas trees, Fenwick trees, Steiner tree | | Maths | Basic probability and statistics, common mathematical series (such as geometric series) | | Algorithmic concepts | Time & space complexities, recurrence relations and master theorem | | Algorithms | All sortation algorithms (quick sort, merge sort, heap sort, insertion sort, bubble sort, counting sort, radix sort), Divide & conquer algorithms, Dynamic programming (top-down, 1-D and 2-D memoization), approximation algorithms, Greedy algorithms, Pattern matching, Recursion and backtracking, NP complexity classes, Game theory related algorithms, Linear programming, basics of randomized algorithms | | Operating systems | Process scheduling, process synchronization and deadlocks, memory management, file system management, user-space processes and threading etc. | | Databases | Relation algebra, Functional decomposition, ER schema design etc. | | Database usage | Concepts (such as ACID, BASE, CAP theorem etc.), Databases access patterns, Partitioning, Sharding, NoSQL databases (deep diving into one), Database locking and strategies, Concurrency controls, Database isolation levels, Databases transactions, Indexing, full-text search, time series databases, Views / materalized views, replication (WAN replication) etc. | | Networks | OSI model, HTTP/1.1 and HTTP/2 protocol, web-socket communication, TCP/IP internals, SSL/TLS, Checksums and error-correcting mechanisms | | Distributed systems | Two-general's problem, Byzantine failures, Consensus protocols (such as Paxos, Raft etc.), Distributed transactions (2-phase commit, SAGA etc.), Distributed locking, Leader election, Partition tolerance, Distributed state machines, Distributed file systems, Distributed hash-table etc. | | Compilers | Compilation lifecycle, AST, JIT compilation, Key optimizations (such as Tail call optimization) | | OOPS | Key design patterns (factory, abstract factory, visitor, singleton, strategy, command etc.), heavy practice on OOPS modelling | | Programming language | Erlang, Erlang BEAM VM internals, Python deep-dive, functional programming vs OOPS vs imperative, niche concepts such as (futures, closures, referential transparency etc.), Garbage collection | | Architecture | Microservices, n-tier (details of MVC, MVVM etc.) | | Microservice Architecture | Orchestration, Choreography, Distributed tracing, reporting, instrumentation, Service discovery and service mesh, API gateways, authentication, Eventing, Common anti-patterns, Security | | System design | Requirement collection (functional and non-functional), performance and load budgeting, Caching, Load-balancing, Deployment, Instrumentation, API and message communication, message queues, Logging, Infrastructure management | | Caching | Caching types (L1 cache, in-memory caches, distributed caches, CDN), caching strategies (write-through, write-back etc.), cache boot strategies, Eviction strategies (LRU, MRU etc.), manual management of caches in production | | Load balancing | L3, L4, L7 load balancing, API gateway and authentication, SSL termination, request forwarding vs reverse proxy, Load balancing strategies, Direct server return, DNS load balancing, Rate limiting | | Machine learning | Basic statistical machine learning algorithms (supervised / unsupervised), basic neural networks, high level concepts of deep learning networks | | Miscellaneous | Finite state automata, Performance numbers (disk IOPS, network bandwidth, database transaction benchmarks, HTTP server benchmarks), MapReduce, Serialization/Marshalling, Concurrency controls (mutex, semaphores), Lockless data structures, Operational transformation algorithms |
I also prepared for experience-related questions (past projects, hard problems solved) and personality-related questions (working style, leadership, conflict resolution).
I prioritized algorithms and system design, as these are crucial for senior roles. I used the Feynman learning technique, which involves:
For algorithms and system design, I practiced extensively on LeetCode and HackerRank. I also practiced end-to-end system design for various software applications.
I found the Uber interview process to be engaging and helpful. The interviewers, recruitment panel, and recruiters were all supportive. In the interest of their privacy, I will not disclose the specific questions asked.
Overall, I learned a lot from the experience and gained valuable insights into the interview process at large-scale companies.