Uma boa estrutura é meio caminho andado. Ao utilizar o framework RADIO para responder perguntas de design de sistemas front-end, você estará muito mais próximo de ter sucesso na sua entrevista.
No contexto de entrevistas de design de sistemas de front-end, os sistemas que você é solicitado a projetar tendem a ser produtos, então vamos nos referir ao sistema como "produto" daqui em diante. Comece compreendendo os Requisitos, definindo a Arquitetura de alto nível e o Modelo de Dados. Em seguida, defina as Interfaces entre os componentes no produto e fale sobre quaisquer Otimizações ou aprofunde-se em áreas específicas que requerem atenção especial.
Objetivo: Compreender completamente o problema e determinar o escopo fazendo uma série de perguntas esclarecedoras.
Duração Recomendada: Não mais do que 15% da sessão.
As perguntas de entrevistas de design de sistemas são abertas por natureza e geralmente são propositalmente vagas e pouco especificadas. Você deve se aprofundar e esclarecer ambiguidades no problema fazendo perguntas úteis. Trate seu entrevistador como um gerente de produto com quem você está trabalhando em um novo projeto, faça perguntas suficientes para entender quais problemas você está tentando resolver e o que você precisa construir. Na realidade, alguns problemas podem ser resolvidos sem qualquer engenharia envolvida!
Nenhuma experiência de entrevista de design de sistemas é igual, mesmo que você possa ser questionado sobre a mesma pergunta. Os entrevistadores têm diferentes formações e podem priorizar aspectos diferentes do sistema. Aproveite essa oportunidade para descobrir o que eles estão mais interessados e planeje suas respostas de acordo.
Algumas perguntas gerais das quais você deve obter respostas antes de prosseguir para a próxima parte da entrevista são:
Imagine que você foi solicitado a "Projetar o Facebook". O Facebook é uma plataforma enorme, envolvendo recursos como feed de notícias, perfis, amigos, grupos, histórias e muito mais. Em qual parte do Facebook você deve se concentrar? O entrevistador tem a resposta em mente, mas quer que você descubra fazendo perguntas. Normalmente, você deve se concentrar nos aspectos mais únicos do produto, ou seja, nas características que o definem. Para o Facebook, seriam o feed de notícias, a paginação do feed e a criação de novas postagens. Para o YouTube, seria a experiência de assistir vídeos. As áreas importantes para outros tipos de produtos podem ser encontradas nos tipos de perguntas.
No restante desta página, usaremos "Projetar o Facebook" como o problema e aplicaremos a estrutura a ele.
Vamos supor que você não tenha esclarecido em quais partes do produto focar, assumiu que deveria falar sobre o fluxo de amizade e começou a falar sobre isso. No melhor caso, bons entrevistadores irão direcioná-lo de volta na direção em que a pergunta foi originalmente destinada, mas eles irão tomar nota mental de que você não esclareceu a pergunta. No pior caso, entrevistadores inexperientes podem permitir que você continue falando e tentar educadamente encontrar uma oportunidade para corrigi-lo, mas você já terá perdido alguns minutos preciosos discutindo um tópico não importante.
Em primeiro lugar, o que são requisitos funcionais e não funcionais?
Existem duas maneiras pelas quais você pode obter a resposta para essa pergunta:
No mínimo, o seu design deve atender aos requisitos funcionais. Após atender a todos os requisitos funcionais, passe a falar sobre como atender aos requisitos não funcionais.
Mesmo depois de conhecer os requisitos funcionais, ainda pode haver uma infinidade de pequenos recursos que compõem o recurso principal. Por exemplo, ao criar novas postagens no Facebook, que tipos de formatos de postagens devem ser suportados? Além das postagens usuais baseadas em texto, se o usuário puder fazer upload de fotos, fazer upload de vídeos, criar enquetes, fazer check-in em um local etc.
Você deve esclarecer os recursos principais antecipadamente e projetar para eles antes de passar para os recursos extras.
A lista acima deve fornecer uma boa lista inicial de perguntas, mas não é uma lista exaustiva! Problemas diferentes exigirão que você faça perguntas específicas do domínio, o que abordaremos nos estudos de caso.
Recomenda-se que você registre os requisitos acordados em algum lugar para poder consultá-los durante toda a entrevista e garantir que tenha abordado todos eles.
Objetivo: Identificar os principais componentes do produto e como eles estão relacionados entre si.
Duração recomendada: Aproximadamente 20% da sessão.
Com os requisitos em mente, podemos passar para o projeto de arquitetura propriamente dito. Sua próxima tarefa é criar uma arquitetura de produto/sistema identificando os principais componentes do produto, como os componentes interagem entre si e como estão relacionados. Lembre-se de focar na arquitetura do lado do cliente, não no backend.
Diagramas são seus amigos nesse caso. Cada componente pode ser representado usando um retângulo, e o design de alto nível geralmente acaba parecendo alguns retângulos conectados por setas para demonstrar o fluxo de dados. Também é possível ter componentes dentro de componentes. Nesse caso, desenhe o componente pai usando retângulos maiores, já que eles precisam abrigar vários subcomponentes.
Aqui estão alguns exemplos de componentes/módulos comumente encontrados em um design de front-end de alto nível:
Outros aspectos a serem considerados ao definir as responsabilidades dos componentes:
É importante perceber que nem todos os componentes comuns mencionados acima serão relevantes e necessários para todas as perguntas, isso depende do produto em questão.
Após desenhar o diagrama de arquitetura, descreva verbalmente as responsabilidades de cada componente (caixa no diagrama).
Aqui está um exemplo de diagrama de arquitetura para a pergunta do News Feed, desenhado usando o Excalidraw.
Algumas ferramentas de desenho gratuitas comuns que você pode ser solicitado a usar incluem diagrams.net e Excalidraw. Seria uma boa ideia se familiarizar com essas ferramentas antecipadamente.
Objetivo: Descrever as diversas entidades de dados, os campos que elas contêm e a(s) componente(s) a que pertencem.
Duração Recomendada: Aproximadamente 10% da sessão.
Agora precisamos pensar nos campos de dados presentes no cliente. Existem dois tipos de dados em aplicativos cliente:
Dados que se originam no servidor, geralmente de um banco de dados, e são destinados a serem vistos por várias pessoas ou acessados a partir de diferentes dispositivos. Exemplos comuns incluem dados do usuário (nome, foto de perfil) e dados gerados pelo usuário (publicações no feed, comentários).
Dados exclusivos do cliente, também comumente conhecidos como estado, são dados que apenas precisam estar no cliente e não precisam ser enviados para o servidor para serem gravados no banco de dados. Os dados do cliente podem ser subdivididos em dois:
Ao listar os campos de dados, seria útil identificar que tipo de dados esse campo é, se é um dado originado pelo servidor ou apenas pelo cliente.
Aqui está um exemplo básico de modelo de dados para as várias entidades usando a pergunta Feed de notícias.
Fonte | Entidade | Pertence a | Campos |
---|---|---|---|
Servidor | Post | Postagem do Feed | id , created_time , content , image , author (User ), reactions |
Servidor | Feed | Interface do Feed | posts (lista de Posts s), pagination (metadados de paginação) |
Servidor | User | Store do cliente | id , nome , profile_photo_url |
Entrada do usuário (cliente) | NewPost | Interface do Usuário (UI) do Feed Composer | message , image |
Dependendo de quão longe você avança na pergunta e de como os requisitos evoluíram e cresceram durante a entrevista, você pode precisar adicionar mais campos. É um processo dinâmico e iterativo.
Você pode querer escrever esses campos próximos aos componentes que os possuem no seu diagrama de arquitetura.
Objetivo: Definir a interface entre os componentes do produto, funcionalidade das várias APIs, seus parâmetros e respostas.
Duração recomendada: Aproximadamente 15% da sessão.
Com os componentes e dados dentro de cada componente, podemos prosseguir para discutir a interface (APIs) entre os componentes. API é um termo sobrecarregado e geralmente se refere ao protocolo pelo qual os componentes de software se comunicam e solicitam/enviam dados entre si. Client and server communicate via network layer APIs (HTTP/WebSockets). Componentes do cliente geralmente se comunicam por meio de funções no tempo de execução do navegador. Todas as APIs têm três coisas em comum, quer estejam entre o servidor e o cliente ou entre componentes do cliente:
Partes de uma API | Servidor-Cliente | Client-Client |
---|---|---|
Nome e funcionalidade | Caminho HTTP | Função JavaScript |
Parâmetros | Parâmetros HTTP GET e POST | Parâmetros da função |
Valor de retorno | Resposta HTTP, geralmente no formato JSON | Valor de retorno da função |
Usando o exemplo News Feed mais uma vez, nós temos uma API de servidor que permite que o cliente busque os últimos posts de feeds.
Campo | Valor |
---|---|
Método HTTP | GET |
Caminho | /feed |
Descrição | Recupera os resultados do feed para um usuário. |
Uma resposta de feed é uma lista paginada, portanto, a API espera parâmetros de paginação.
{"size": 10,"cursor": "=dXNlcjpXMDdRQ1JQQTQ"}
{"pagination": {"size": 10,"next_cursor": "=dXNlcjpVMEc5V0ZYTlo"},"results": [{"id": "123","author": {"id": "456","name": "João Silva"},"content": "Olá mundo","image": "https://www.example.com/feed-images.jpg","reactions": {"likes": 20,"haha": 15},"created_time": 1620639583}// . . Mais publicações.]}
A API cliente-cliente pode ser escrita de maneira semelhante à API servidor-cliente, sendo a principal diferença que são funções JavaScript ou eventos que estão sendo ouvidos. As partes mais importantes para descrever são a funcionalidade da API, os parâmetros e o valor de retorno/resposta.
Se você foi solicitado a projetar um componente de interface do usuário, na seção "Interface", discuta sobre as opções de personalização para o componente, semelhantes às props para componentes React.
Objetivo: Discutir sobre possíveis oportunidades de otimização e áreas específicas de interesse ao construir o produto.
Duração Recomendada: Aproximadamente 40% da sessão.
Não há uma maneira fixa de abordar a seção de otimização e aprofundamento, e você está livre para se concentrar em diferentes áreas do produto. Não haverá tempo suficiente para abordar todas as áreas, portanto, selecione como deseja gastar seu tempo cuidadosamente de acordo com essas diretrizes:
Aqui está uma lista de tópicos sobre os quais você pode falar para esta seção. Tenha em mente que a importância de um tópico depende da pergunta e alguns tópicos são completamente irrelevantes para certas perguntas (possível, mas improvável).
Consulte nosso Guia de Melhores Práticas para Construção de Interfaces de Usuário para obter detalhes sobre cada tópico.
Etapa | Objetivo | Duração Recomendada |
---|---|---|
Exploração de requisitos | Entenda o problema completamente e determine o escopo fazendo uma série de perguntas de esclarecimento. | <15% |
Arquitetura/Design de Alto Nível | Identifique os principais componentes do produto e como eles estão relacionados entre si. | ~20% |
Modelo de Dados | Descreva as várias entidades de dados, os campos que elas contêm e a(s) qual(is) componente(s) elas pertencem. | ~10% |
Definição de Interface | Defina a interface (API) entre os componentes do produto, a funcionalidade de cada API, seus parâmetros e respostas. | ~15% |
Otimizações e Análise Detalhada | Discutir sobre possíveis oportunidades de otimização e áreas específicas de interesse ao construir o produto. | ~40% |