Em 2018, a Stripe publicou uma análise interna sobre seu processo de entrevistas técnicas. Um padrão recorrente: engenheiros com experiência real em sistemas de larga escala frequentemente performavam abaixo de candidatos com menos experiência mas com mais prática no formato específico da entrevista. A causa era estrutural — engenheiros experientes tendiam a mergulhar em detalhes de implementação que conheciam bem, pulando passos que o entrevistador precisava ver para avaliar senioridade. O conhecimento estava lá; a comunicação do processo de raciocínio não estava.
Este conceito trata de um problema específico: você sabe design sistemas (Conceito 01 a 12 cobriram isso). O problema que resta é performar esse conhecimento num formato de 45 minutos, com uma pessoa observando, num contexto de avaliação. Isso é uma habilidade separada — e como qualquer habilidade, melhora com prática deliberada, não só com estudo.
O que é diferente na entrevista versus o trabalho real
No trabalho, você tem dias ou semanas para explorar um problema antes de propor uma arquitetura. Você pode pedir contexto adicional, fazer spikes, consultar colegas, e iterar. Na entrevista, você tem 45 minutos, uma pessoa observando, e o problema é apresentado com ambiguidade intencional.
As diferenças que mais afetam o desempenho:
- Tempo comprimido: o que no trabalho seria uma semana de exploração precisa ser condensado em 45 minutos. Isso força priorização agressiva — você não vai cobrir tudo, e a escolha do que cobrir é parte do que está sendo avaliado.
- Raciocínio externalizado: no trabalho, você pode pensar em silêncio e apresentar o resultado. Na entrevista, o processo de pensamento é o produto — o entrevistador precisa ver como você chega às conclusões, não só as conclusões. Um candidato que pensa 10 minutos em silêncio e apresenta uma arquitetura perfeita está sendo avaliado como se não soubesse fazer o design.
- Ambiguidade deliberada: o enunciado do problema é propositalmente incompleto. "Design um sistema de chat" não especifica escala, tipo de mensagem, requisitos de entrega, ou retenção. Isso é intencional — clarificar requisitos é parte do que está sendo avaliado, não um obstáculo ao design.
- Objeções como sondagem: quando o entrevistador levanta uma objeção ("e se o banco ficar cheio?"), na maioria dos casos está testando como você reage, não genuinamente preocupado com aquele cenário específico. A resposta certa é explorar a objeção com seriedade, não descartá-la nem defender o design como correto.
O que entrevistadores realmente avaliam
Entrevistadores experientes de system design avaliam um conjunto de sinais que vão além do conhecimento técnico:
Clareza de pensamento sob ambiguidade: o candidato reconhece que há múltiplas interpretações válidas e faz as perguntas certas para reduzir a ambiguidade? Ou assume a primeira interpretação e começa a design sem clarificar? O segundo comportamento é visto como falta de experiência — porque engenheiros experientes sabem que requisitos mal entendidos levam a retrabalho.
Capacidade de priorizar: 45 minutos é insuficiente para design completo de qualquer sistema real. O que o candidato escolhe cobrir — e o que deixa de lado — revela seu modelo mental de onde estão os problemas importantes. Candidatos que gastam 15 minutos na geração de ID de URL shortener e ficam sem tempo para discutir cache e CDN priorizaram incorretamente.
Articulação explícita de trade-offs: "eu usaria Kafka" é uma escolha; "eu usaria Kafka porque precisamos de retenção de mensagens e múltiplos consumidores independentes — se o requisito fosse só entrega em tempo real sem replay, RabbitMQ seria mais simples e barato" é um trade-off articulado. O segundo demonstra que a escolha foi consciente e que o candidato entende as implicações.
Comportamento sob feedback: quando o entrevistador questiona uma escolha, o candidato defende rigidamente ou explora o questionamento? Engenheiros sênior que trabalham bem em time são aqueles que tratam objeções como informação, não como ataque. Na entrevista, esse comportamento é explicitamente observado.
Sinais de experiência real: perguntas e observações que só surgem de quem operou sistemas em produção. "Como lidamos com cache stampede quando um item popular expira?" ou "o que acontece com mensagens em trânsito durante o failover do banco de dados?" não são decoração — indicam que o candidato já viu esses problemas e pensa neles naturalmente.
O que entrevistadores não avaliam primariamente: memorização de arquiteturas específicas, conhecimento de tecnologias específicas (você pode fazer um excelente design sem ter usado Cassandra), ou velocidade de resposta. Candidatos que começam a falar imediatamente sem fazer perguntas são avaliados negativamente — não positivamente.
Gestão de tempo em 45 minutos
A distribuição de tempo é uma das coisas que mais diferencia candidatos bem-preparados dos que sabem o conteúdo mas não performam bem. A armadilha mais comum: gastar demais na arquitetura de alto nível e não ter tempo para o deep dive — que é onde o entrevistador vê profundidade técnica real.
Minutos 00–08: Clarificação de requisitos
— funcionais: 3-4 perguntas
— não-funcionais: escala, latência, disponibilidade, consistência
— documentar as suposições que você está fazendo
Minutos 08–15: Estimation + API
— ordem de magnitude de QPS, storage, banda
— 2-3 endpoints principais com request/response
— o resultado da estimation informa a próxima etapa
Minutos 15–27: Arquitetura de alto nível
— componentes principais e fluxo de dados
— não entrar em detalhes de nenhum componente ainda
— checkpoint com o entrevistador antes de continuar
Minutos 27–40: Deep dive (2 componentes, ~6-7 min cada)
— escolher onde estão os requisitos mais exigentes
— alternativas, casos edge, failure modes
Minutos 40–45: Trade-offs e limitações
— o que o design sacrificou conscientemente
— onde precisaria evoluir com crescimento
— perguntas abertas para o entrevistador
Sinais de que você está perdendo tempo:
- Você está discutindo detalhes de implementação antes de ter a arquitetura de alto nível completa
- Você passou do minuto 15 sem ainda ter os componentes principais esboçados
- Você está justificando uma escolha por mais de 2 minutos sem o entrevistador pedir mais detalhes
- Você não fez checkpoint com o entrevistador antes de aprofundar em qualquer componente
Técnicas de comunicação sob pressão
Pensar em voz alta — narrar o processo, não só o resultado: a diferença entre "vou usar Redis aqui" e "estou avaliando se usar Redis ou Memcached — o padrão de acesso é leitura por chave simples, o que favorece os dois, mas se precisarmos de estruturas de dados mais complexas para analytics no futuro, Redis dá mais flexibilidade. Vou com Redis". O entrevistador quer ver o processo de decisão.
Checkpoint regularmente: antes de aprofundar qualquer componente, confirmar com o entrevistador. "Antes de entrar nos detalhes do fan-out, o fluxo de alto nível faz sentido? Tem algo que você quer mudar antes de prosseguir?" Isso evita investir 10 minutos numa direção que o entrevistador já descartou — e demonstra comportamento colaborativo.
Nomear o trade-off explicitamente: não esconder as limitações do design. "Essa abordagem de fan-out on write funciona bem para usuários com menos de 10k seguidores; para celebridades com 1M+ seguidores, haveria um problema de latência de escrita que precisaria de tratamento específico — não cobri isso aqui mas posso se quiser." Nomear a limitação antes que o entrevistador pergunte demonstra que você entende o design profundamente o suficiente para saber onde ele falha.
Admitir incerteza com elegância: "Nunca usei Cassandra em produção, mas pelo modelo de dados baseado em queries com partition key pelo user_id, deveria funcionar bem aqui — o trade-off seria a ausência de joins nativos, que não é problema neste caso porque os padrões de acesso são bem definidos." Demonstrar raciocínio sólido mesmo sem experiência direta é melhor do que afirmar certeza sobre algo que você não conhece intimamente.
Receber objeções como informação: quando o entrevistador levanta um problema ("e se dois usuários criarem o mesmo alias simultaneamente?"), a resposta certa é explorar, não defender. "Boa observação — é uma condição de corrida. A solução mais simples é uma constraint de unique no banco e retry na aplicação; se o volume de colisões for alto, posso pré-computar aliases em background e servir de uma pool. Qual você quer que eu explore?" Isso demonstra que você tem mais de uma solução e sabe como escolher entre elas.
Erros que eliminam candidatos sênior
Esses erros são mais graves em candidatos sênior do que júnior porque o entrevistador espera mais maturidade:
Mergulhar sem clarificar: começar a design sem fazer perguntas de requisitos. Isso demonstra que o candidato tem uma solução favorita e quer usá-la independente do problema. É o oposto de senioridade — senioridade é reconhecer que o mesmo problema com escala diferente tem solução diferente.
Over-engineering não motivado: propor Kubernetes com service mesh, Kafka com 50 partições, e multi-region active-active para um sistema que vai ter 1.000 usuários. Engenheiros sênior dimensionam para a escala real, não para a escala imaginária. Um sistema simples que funciona é melhor que um sistema complexo que também funciona — porque o simples é mais fácil de operar, debugar, e evoluir.
Não justificar escolhas: "eu usaria DynamoDB" sem explicar por que. Para o entrevistador, isso é indistinguível de escolha aleatória. Toda escolha de tecnologia deve vir com justificativa explícita ("o padrão de acesso é por chave simples com escala de leitura imprevisível — DynamoDB com provisionamento automático evita o problema de capacity planning que teríamos com Postgres") e pelo menos uma alternativa considerada.
Defender o design quando questionado: engenheiros que trabalham bem em time exploram objeções — não as descartam. Na entrevista, defender rigidamente uma escolha quando o entrevistador levanta uma preocupação legítima é um sinal negativo forte. O comportamento correto: "você está certo — não considerei esse caso. Se o volume de writes for 10x maior, precisaria mudar a estratégia de replicação para..."
Ignorar failure modes: um design que funciona perfeitamente em happy path mas não menciona o que acontece quando componentes falham é incompleto. Sistemas de produção falham. O entrevistador sabe disso. Candidatos sênior design pensando em falhas — e mencionam proativamente os failure modes mais importantes sem esperar ser perguntados.
Como praticar de forma que transfira
Ler sobre system design é diferente de praticar system design. O conhecimento que vem da leitura não transfere automaticamente para a performance sob pressão — é necessária prática deliberada no formato específico da entrevista.
Mock interviews com parceiro: a forma mais eficaz de praticar. O parceiro propõe o problema e observa — sem ajudar. Ao final, feedback específico: onde o tempo foi mal gerido, onde uma escolha não foi justificada, onde o candidato ficou preso. Sem observador, você não sabe o que não está externalizado.
Gravar sessões solo: fazer a sessão completa em voz alta, gravado, com timer. Ouvir a gravação é desconfortável mas revela problemas que você não percebe ao vivo: silêncios longos onde deveria estar pensando em voz alta, escolhas não justificadas, tempo mal alocado.
Praticar os componentes isoladamente: antes de praticar a sessão completa, praticar cada parte separadamente. Só a fase de clarificação de requisitos (8 minutos de perguntas, sem design). Só a fase de estimation (números de referência internalizados, derivação em tempo real). Só um deep dive (10 minutos num único componente, com alternativas e failure modes).
Estudar postmortems e arquiteturas reais: ler sobre como Twitter resolveu o celebrity problem, como Discord migrou de MongoDB para Cassandra, como Stripe processa pagamentos com consistência. Esse conhecimento aparece nos detalhes — os casos edge que você menciona proativamente, os trade-offs que você nomeia sem ser perguntado. Candidatos que só estudaram livros de entrevista têm designs corretos mas genéricos; candidatos que estudaram arquiteturas reais têm designs que revelam experiência.
Calibrar o nível de detalhe: o nível de detalhe adequado para uma entrevista é "suficiente para que um engenheiro sênior implemente o componente sem fazer perguntas arquiteturais" — sem ser a implementação em si. "Usaria um Redis Sorted Set com o timestamp como score para o leaderboard, com ZRANGEBYSCORE para queries por janela de tempo" é o nível certo. O código do ZADD não é — consome tempo sem acrescentar informação arquitetural.
A entrevista de system design é um proxy imperfeito para a habilidade real de design — ela mede a capacidade de externalizar raciocínio em 45 minutos, não a capacidade de design bem em condições reais. Mas é um proxy com correlação razoável: engenheiros que pensam bem sobre sistemas conseguem articular esse pensamento, e os que praticaram essa articulação ficam mais confortáveis sob pressão. O investimento em preparação para entrevistas de system design é, em grande parte, investimento em clareza de pensamento sobre sistemas — que tem valor direto no trabalho, independente de qualquer entrevista.
Decisões de engenharia
Clarificação tem retornos decrescentes. Após 8 minutos, perguntas adicionais começam a parecer procrastinação ou insegurança. O critério de parada: você consegue articular os 3 requisitos não-funcionais mais importantes e o fluxo principal do usuário? Se sim, comece o design — você pode ajustar quando entender melhor.
Regra prática: 3–5 perguntas funcionais e 3–4 não-funcionais são suficientes. Anote as suposições que está fazendo e confirme com o entrevistador ao final da sessão se não ficaram claras antes.
Nomear tecnologias específicas (Kafka, DynamoDB, Redis Cluster) demonstra experiência real e torna o design concreto. Manter agnóstico ("uma message queue") é mais seguro mas pode parecer vago. O risco de nomear: se o entrevistador conhece a tecnologia melhor que você, pode fazer perguntas difíceis sobre detalhes internos.
Regra prática: nomeie tecnologias que você usou em produção com confiança suficiente para justificar a escolha e responder perguntas. Para tecnologias que conhece só pela literatura, nomeie mas qualifique: "pelo que conheço do modelo de dados do Cassandra, essa abordagem deveria funcionar porque..."
Breadth-first primeiro (cobrir todos os componentes em alto nível) garante que o entrevistador vê o sistema completo antes do tempo acabar. Depth-first precoce (aprofundar um componente antes de ter o mapa completo) arrisca não mostrar que você entende o sistema como um todo.
Regra prática: sempre breadth-first até o passo 4 (arquitetura de alto nível completa), depois depth-first no passo 5 nos 2 componentes mais críticos para os requisitos não-funcionais. Nunca fazer depth-first antes de ter o mapa completo — mesmo que o entrevistador estimule.
Mudanças de requisito durante a sessão são propositais em ~60% dos casos: o entrevistador quer ver como você adapta o design. A resposta errada é continuar explicando o design antigo ou mostrar frustração. A resposta certa é reconhecer o impacto da mudança, identificar o componente afetado, e propor como o design precisaria mudar — com o trade-off resultante.
Regra prática: "Boa mudança — se a latência de escrita precisa ser <50ms em vez de <200ms, isso muda minha estratégia de replicação. Estava propondo assíncrona para throughput; teria que mudar para síncrona na região primária, o que aumenta a latência de writes em outras regiões ou exige writes locais com reconciliação."
Perguntas de entrevista
Como você abordaria um problema de system design que nunca viu antes — sem travar no primeiro minuto?
O travamento vem de tentar recuperar "a resposta certa" da memória antes de fazer as perguntas certas. A solução é ativar o processo antes de ativar o conhecimento.
Os primeiros 30 segundos: repetir o problema com suas próprias palavras para confirmar o entendimento. "Você está pedindo um sistema de ride-sharing focado em matching motorista-passageiro com baixa latência — correto?" Essa repetição compra tempo e confirma a interpretação.
Depois: ir direto para clarificação de requisitos não-funcionais. Escala, latência, disponibilidade, consistência são perguntas genéricas que funcionam para qualquer sistema. Enquanto o entrevistador responde, você está mapeando mentalmente quais componentes vão ser críticos.
Em paralelo: associar o problema a categorias conhecidas. Ride-sharing matching tem elementos de sistema de geolocalização em tempo real, sistema de alocação de recursos, e sistema de notificações push. Você não precisa ter visto ride-sharing antes — precisa reconhecer os padrões subjacentes e aplicar o que sabe sobre cada categoria.
Como você escolhe quais 2 componentes aprofundar quando o tempo é curto?
O critério principal: onde estão os requisitos não-funcionais mais exigentes? O componente que atende ao requisito mais difícil é onde o entrevistador vai querer ver profundidade — e onde você pode demonstrar experiência real.
Exemplos por tipo de requisito:
- Latência P99 < 50ms global → CDN e estratégia de cache
- Consistência em writes distribuídos → replicação e consensus
- 1M writes/segundo → pipeline de ingestão e particionamento
- Zero data loss → write-ahead log e replicação síncrona
- Matching em tempo real → indexação geoespacial e websockets
Segundo critério: onde está o problema técnico mais único do sistema específico? URL shortener tem o problema de geração de ID único em ambiente distribuído. Twitter timeline tem o celebrity problem. URL shortener sem o problema de ID único não é um deep dive de URL shortener — é um deep dive de qualquer sistema que precisa de IDs únicos.
Antes de entrar no deep dive, checkpoint com o entrevistador: "pretendo aprofundar em cache strategy e no mecanismo de geração de ID — faz sentido, ou prefere que eu cubra outro componente?"
Como você lida com a sensação de não saber a resposta "certa" durante a sessão?
Não há resposta certa em system design — há escolhas justificadas. A armadilha mental de procurar "a resposta certa" é o que paralisa candidatos experientes: eles sabem que o problema é complexo e que qualquer escolha tem trade-offs, então ficam presos tentando encontrar a solução perfeita em vez de propor uma solução boa e justificada.
A mudança de frame que resolve o problema: você não está sendo avaliado pela solução que chega, mas pelo processo de chegar. Propor uma solução e articular seus trade-offs honestamente — incluindo as limitações — demonstra mais senioridade do que hesitar tentando encontrar a solução sem limitações.
Quando genuinamente incerto entre duas opções: explicite a incerteza e peça input. "Estou avaliando entre X e Y aqui — X tem a vantagem de A mas paga o custo de B; Y evita B mas exige C. Você tem preferência ou quer que eu aprofunde nos trade-offs?" Isso é comportamento colaborativo, não fraqueza.
Quando não conhece uma tecnologia mencionada pelo entrevistador: "Não tenho experiência direta com [tecnologia], mas pelo que conheço do seu modelo de [dados/consistência/etc.], creio que funcionaria porque..." Assumir conhecimento que não tem é pior do que admitir a lacuna.
Qual a diferença entre como um júnior e um sênior abordam a mesma sessão de design?
Quatro diferenças estruturais emergem consistentemente:
Requisitos: júniores assumem; sêniores perguntam. Um júnior ouve "design um sistema de chat" e começa a desenhar componentes. Um sênior pergunta: "chat de texto ou multimídia?", "quantos usuários simultâneos?", "mensagens precisam persistir?", "há grupos além de conversas 1-a-1?". Cada resposta pode mudar a arquitetura fundamentalmente.
Failure modes: júniores design o happy path; sêniores design o failure path. "O que acontece quando o Redis está indisponível?", "o que acontece com mensagens em trânsito durante failover do banco?", "o que acontece se dois usuários tentam reservar o mesmo motorista simultaneamente?" — essas perguntas surgem naturalmente em sêniores porque já viram essas falhas em produção.
Trade-offs: júniores escolhem uma solução; sêniores escolhem um trade-off. A diferença é explicitação. Um sênior diz "escolhi consistência sobre disponibilidade porque o domínio é financeiro — dado stale pode causar problemas de negócio maiores do que indisponibilidade temporária".
Escala: júniores tendem a over-engineer por insegurança ("e se crescer muito?"); sêniores dimensionam para a escala real e documentam quando precisariam mudar a abordagem. Complexidade desnecessária é um sinal tão negativo quanto complexidade insuficiente.
Como preparar para entrevistas de system design de forma eficiente — sem estudar meses?
A preparação mais eficiente combina três elementos em ordem de impacto:
1. Internalizar os números de referência (1–2 dias): latências de I/O (RAM 100ns, SSD 100µs, disco 10ms, rede intra-DC 0.5ms, inter-continental 150ms), capacidade de um servidor típico (100k requests/segundo para serving, 10k writes/segundo para banco), tamanhos típicos (registro de usuário ~1KB, tweet ~280 bytes, foto perfil ~100KB). Esses números eliminam a fase de "será que isso aguenta?" e permitem raciocinar sobre escala em tempo real.
2. Praticar os sistemas clássicos completos (1–2 semanas): URL shortener, Twitter timeline, sistema de notificações, WhatsApp, Uber matching. Não para memorizar as soluções — para internalizar os padrões de trade-off que aparecem repetidamente: fan-out write vs read, consistency vs availability, SQL vs NoSQL por padrão de acesso, cache invalidation strategies.
3. Mock interviews com feedback (contínuo): o conhecimento só se consolida com prática no formato real. Pelo menos 5 sessões completas de 45 minutos com parceiro que dá feedback específico sobre comunicação, gestão de tempo, e profundidade de trade-offs. Leitura sem prática não transfere para a performance sob pressão.
O que não vale o tempo: memorizar listas de "top 10 system design questions", estudar tecnologias específicas que você nunca usou só porque aparecem em guias de preparação, ou praticar componentes isolados sem fazer sessões completas.
Exercícios práticos
Faça uma sessão completa de system design gravada, sozinho (pensando em voz alta) ou com parceiro. Problema: design um Pastebin — criar snippets de texto/código com URL compartilhável, visualizações por paste, expiração opcional, sem autenticação obrigatória. Siga a distribuição de tempo: 8 min requisitos, 7 min estimation + API, 12 min arquitetura, 12 min deep dives em 2 componentes, 6 min trade-offs. Ouça a gravação identificando: silêncios longos onde o raciocínio deveria ter sido externalizado, escolhas sem justificativa, tempo mal alocado.
Critério: ao ouvir a gravação, você consegue identificar claramente quando cada passo do framework começou e terminou. A arquitetura de alto nível ficou completa antes do minuto 27. Pelo menos dois trade-offs foram articulados explicitamente no formato "priorizei X sobre Y porque Z".
Organize uma sessão de mock interview com um colega. O colega propõe um dos sistemas dos Conceitos 03–11 sem avisar qual. Antes da sessão, o colega recebe a rubrica: (1) o candidato clarificou requisitos não-funcionais antes de começar? (2) as escolhas tecnológicas foram justificadas com alternativas? (3) pelo menos um failure mode foi mencionado proativamente? (4) o candidato adaptou o design quando o colega mudou um requisito? (5) o deep dive foi nos componentes certos para os requisitos? Ao final, feedback específico por item da rubrica.
Critério: você recebeu feedback em pelo menos 3 dos 5 itens da rubrica — positivo ou negativo. Sem feedback específico, a sessão não foi útil. Repita até receber consistentemente positivo em todos os 5 itens.
Sem consultar referências, estime de cabeça: (a) latência de uma leitura de RAM vs SSD vs banco de dados remoto; (b) quantos requests/segundo um servidor de aplicação típico aguenta; (c) quantos writes/segundo um PostgreSQL aguenta em escrita simples; (d) tamanho médio de um tweet, uma foto de perfil, e um vídeo de 1 minuto em HD. Depois consulte os números reais e calcule sua margem de erro. Repita semanalmente até consistentemente errar por menos de 10x (não precisa ser exato — ordem de magnitude é o objetivo).
Critério: você consegue fazer capacity estimation de um sistema simples (URL shortener ou pastebin) em menos de 5 minutos, sem calculadora e sem consultar referências, chegando a conclusões que direcionam corretamente as decisões arquiteturais (cache necessário ou não, sharding necessário ou não).
Pratique apenas a fase de clarificação — 8 minutos, sem design. Peça para alguém propor um sistema ("design uma plataforma de streaming de vídeo", "design um sistema de reservas de hotel"). Durante 8 minutos, faça só perguntas — nenhum componente, nenhum diagrama. Ao final, escreva os requisitos funcionais e não-funcionais que você derivou. A outra pessoa avalia se os requisitos que você documentou são suficientes para tomar as decisões arquiteturais principais sem fazer mais perguntas.
Critério: os requisitos documentados cobrem escala, latência, disponibilidade, e consistência com números ou faixas concretas. Nenhum requisito crítico foi assumido silenciosamente. A outra pessoa concorda que um engenheiro poderia começar o design só com esses requisitos.
Faça o design de um dos sistemas cobertos nos Conceitos 03–11 (Twitter timeline, Uber matching, ou WhatsApp) antes de ler o conceito correspondente. Depois, leia o conceito e compare: onde seu design divergiu? As divergências são por falta de informação (não sabia do celebrity problem), por escolha diferente com trade-off diferente (fan-out on read em vez de write), ou por problema que você não considerou (cache stampede, ordering de mensagens)? Documente as três maiores divergências e o que elas revelam sobre lacunas no seu modelo mental.
Critério: você identificou pelo menos duas lacunas genuínas no seu design que a arquitetura real resolve — não diferenças de tecnologia específica, mas diferenças em como o problema fundamental foi modelado. Essas lacunas devem informar onde aprofundar o estudo.
Referências
- book Alex Xu — System Design Interview vol. 1 e 2
- book Donne Martin — System Design Primer
- article Gergely Orosz — The System Design Interview at Big Tech
- video Gaurav Sen — System Design Playlist
- video Jordan Has No Life — Mock System Design Interviews
- article Jeff Dean — Numbers Every Engineer Should Know
- article High Scalability — Real Architecture Posts
- article Stripe Engineering Blog — How We Interview Engineers
- article Discord Engineering — How Discord Stores Billions of Messages
- article Twitter Engineering — Handling Five Billion Sessions a Day
- book Martin Kleppmann — Designing Data-Intensive Applications
- article Interviewing.io — System Design Interview Guide