Processo de pensamento geral para as perguntas da entrevista "Como você construiria este site / aplicativo" [fechado]

14

Reuni várias perguntas da entrevista como "Descreva como você criaria um aplicativo de álbum de fotos", "Descreva como você criaria esse recurso específico desse site específico" (por exemplo, curtidas no Facebook, recomendações na Amazon, carrinho de compras, jogos de black jack). Então, e se houver milhões dessa coisa? O que você mudaria?

Parece que isso está esperando um esquema de banco de dados ou várias definições de classe (ou ambas?). Eu aprendi sobre bancos de dados na escola, mas na verdade nunca havia arquitetado um aplicativo antes e estou tendo problemas para saber por onde começar, se os projetos apresentados são "bons" e o que posso mudar para torná-lo escalável.

Existe uma abordagem geral ou um processo de pensamento ao projetar esses sistemas? E questões / problemas gerais que parecem surgir muito no design que eu deveria tentar evitar? Alguém poderia me orientar em uma delas (ou de preferência em todas, comparando as necessidades de cada uma) e explicar:

1) Como você cria quais entidades são necessárias? 2) Como você decide quais relacionamentos tudo terá? 3) Como você incorpora a otimização de desempenho em seu design? 4) Faço isso usando classes ou bancos de dados? Isso faz alguma diferença (ou seja, eu teria uma classe que realmente não pode ser traduzida para uma tabela de banco de dados, por exemplo?)

A principal razão pela qual estou perguntando é porque estava passando por "Cracking the Coding Interview" e minhas respostas eram completamente diferentes das do autor - eu tinha idéias muito diferentes de quais classes eram importantes.

MINHA TENTATIVA: Com o aplicativo de compartilhamento de fotos, eu teria as classes / tabelas: Foto e Usuário, com certeza.

Então, acho que se estamos tentando criar um esquema, haveria uma tabela vinculando foto e usuário se assumirmos que cada pessoa na foto está vinculada à foto (essa tabela é necessária? Se não, ainda é prática comum ter uma tabela separada para relacionamentos muitos-para-muitos ou não?).

Mas se estamos tentando adotar uma abordagem orientada a objetos, talvez tenhamos uma classe chamada album, que faz todo o trabalho e tem todas as informações das outras duas tabelas / classes. Isso é uma coisa que eu notei no livro - há várias classes e, em seguida, uma classe que basicamente tem todas as informações e conecta as outras classes - isso é comum? Por exemplo, nos meus exemplos acima, parece que isso se aplicaria?

Eu só espero que algumas regras / diretrizes gerais sejam seguidas porque, no momento, não tenho idéia de como é uma boa arquitetura para um sistema grande.

Mastid
fonte
1
Suponha que você estivesse codificando um álbum de fotos como um projeto de hobby. Em vez de perguntar "estou no caminho certo?" (bem, é claro, porque todos os requisitos estão a caminho de serem atendidos, de alguma forma), você provavelmente perguntaria "parece que esse aspecto do design torna as coisas desnecessariamente estranhas; poderíamos mudar as coisas para facilitar tudo? " Mas como você sabe que existe algum aspecto desagradável do design? Ao trabalhar com experiências de pensamento como casos de uso e piores casos. Além disso: "esse requisito de login é bastante comum; poderíamos encontrar uma biblioteca em vez de reinventá-la nós mesmos?"
Evgeni Sergeev

Respostas:

19

O objetivo de tais perguntas é avaliar se você possui habilidades do mundo real ao escrever um aplicativo de software. Você aprendeu alguma teoria, mas o conhecimento teórico só pode ir tão longe. A única maneira de entender verdadeiramente o desenvolvimento de software é fazendo isso.

Não há atalho para isso, porque não há respostas padrão para perguntas como "que entidades são necessárias?" Em vez disso, você deve aplicar sua experiência em várias ferramentas e paradigmas, e como eles funcionam juntos, para encontrar uma solução prática para o problema em questão.

Uma pergunta como "Eu faço isso usando classes ou bancos de dados?" sugere que você não tenha um conhecimento básico sobre o que são as coisas e como elas funcionam. As aulas são um paradigma para organizar seu código; bancos de dados são um método de armazenamento de dados. São dois conceitos inerentemente não relacionados (embora possam trabalhar juntos). Esta não é uma questão de um ou outro.

Não pretendo ser duro, mas acho que você precisa desenvolver sua experiência de codificação para ter sucesso em uma entrevista de emprego. Você certamente tem potencial - sua discussão sobre o aplicativo de compartilhamento de fotos tem algumas das idéias certas e está indo na direção certa. Mas você precisa aprender como isso funciona em primeira mão. A melhor maneira de se preparar para sua entrevista é realmente criar um aplicativo do início ao fim. Um aplicativo de compartilhamento de fotos seria um projeto de tamanho adequado ou você pode escolher outra coisa. Seu conhecimento realmente expandirá à medida que você vê como todas as partes podem trabalhar juntas para criar um aplicativo funcional.


fonte
8

Parece que isso está esperando um esquema de banco de dados ou várias definições de classe (ou ambas?)

Acho que você está muito focado nos detalhes aqui. Com essa pergunta, o recrutador não está esperando uma descrição completa de todas as aulas que você escreverá (caso contrário, elas pedirão que você codifique, não fale sobre isso).

Sua resposta precisa primeiro ser sobre o cenário geral - arquitetura, camadas, camadas, até o ciclo de vida do projeto e o processo de desenvolvimento que você colocaria em prática. Não hesite em fazer perguntas sobre os requisitos e o ambiente em que o aplicativo deve executar para ajustar sua resposta. Como dan1111 apontou, não há receita geral para um design de aplicativo correto. Todos os designs são dependentes do contexto.

Somente se o recrutador começar a fazer perguntas realmente específicas você deve entrar em detalhes sobre quais classes, entidades ou tabelas de banco de dados você usaria sob o capô.

Além disso, se você tiver pouca experiência, é normal dizer: "Mostrarei uma solução usando o tipo de design de aplicativo que aprendi e usei até agora. Sei disso e de outras abordagens que posso descrever. no geral, mas nunca os apliquei de verdade. Também estou aberto a descobrir e aplicar os outros ".

Não há nada de errado em reconhecer que existem tantas ferramentas na sua caixa de ferramentas que sua experiência permite que você tenha - na verdade, é melhor do que cuspir uma resposta ensaiada que você não tem idéia de como ela funciona na prática.

guillaume31
fonte
2

Eu pensei em fazer um comentário rápido sobre sua primeira pergunta:

1) Como você cria quais entidades são necessárias?

A primeira coisa que faço para um novo projeto é, em um quadro branco ou em um grande pedaço de papel em branco, anotar todas as coisas físicas e conceituais sobre esse projeto em particular que eu e minha equipe podemos pensar. É uma sessão de brainstorm.

Substantivos tendem a ser objetos, verbos tendem a ser casos ou métodos de uso.

Físico: foto (óbvio!), Tipo de exibição, sistema, arquivo de foto, formato de arquivo, usuário, data ....
Conceitual: adicionar, excluir, salvar / armazenar, recuperar, classificar, modificar, exibir / exibir foto ....

Faça conexões entre substantivos e verbos. Usuário adiciona foto. (Bem - há um caso de uso!)

Eu também sugeriria examinar UML e Design Patterns e como eles podem ser usados ​​em OOD genérico. (Observe - eu não mencionei um idioma ou banco de dados em nenhum lugar acima. Não escolha um idioma e faça seu OOD. Faça seu OOD de maneira que o design possa ser implementado por qualquer OOL.

Cheldric
fonte