Processo geral de pensamento para as perguntas da entrevista “Como você criaria este site / aplicativo” [closed]

14

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

Parece que isso está esperando um esquema de banco de dados ou um monte de definições de classe (ou ambos?). Aprendi sobre bancos de dados na escola, mas na verdade nunca arquitetou um aplicativo antes e estou tendo problemas para saber por onde começar, se os projetos que desenvolvi são "bons" e o que posso alterar para torná-lo escalável.

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

1) Como você concebe 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) Eu faço isso usando classes ou bancos de dados? Isso faz diferença (por exemplo, eu teria uma classe que não pudesse ser traduzida para uma tabela de banco de dados?)

A principal razão que estou perguntando é porque eu estava passando por "Cracking the Coding Interview" e minhas respostas eram completamente diferentes das do autor - eu tinha idéias muito diferentes sobre 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 ligando foto e usuário se assumirmos que cada pessoa na foto está vinculada à foto (esta tabela é necessária? Se não, é ainda prática comum de ter uma tabela separada para muitos-para-muitos relacionamentos ou não?).

Mas se estamos tentando adotar uma abordagem orientada a objeto, 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 notei no livro - há um monte de 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?

Estou apenas esperando que algumas regras / diretrizes gerais sejam seguidas, porque, no momento, não tenho ideia de como é a boa arquitetura de um sistema grande.

    
por Mastid 26.04.2013 / 06:24
fonte

3 respostas

19
O ponto de tais questões é avaliar se você tem habilidades do mundo real para escrever um aplicativo de software. Você aprendeu alguma teoria, mas o conhecimento teórico só pode ir tão longe. A única maneira de realmente entender o desenvolvimento de software é fazendo isso.

Não há nenhum atalho para isso, porque não há respostas de ações para perguntas como "quais entidades são necessárias?" Em vez disso, você tem que aplicar sua experiência de várias ferramentas e paradigmas e como eles trabalham juntos, para chegar a 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 tem um conhecimento básico de quais são as coisas e como elas funcionam. Classes são um paradigma para organizar seu código; bancos de dados são um método de armazenamento de dados. Eles são dois conceitos inerentemente não relacionados (embora possam trabalhar juntos). Esta não é uma pergunta ou / ou.

Eu não quero 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 o potencial - sua discussão sobre o aplicativo de compartilhamento de fotos tem algumas das ideias 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 a entrevista é criar um aplicativo do início ao fim. Um aplicativo de compartilhamento de fotos seria um projeto de tamanho adequado ou você poderia escolher outra coisa. Seu conhecimento vai realmente se expandir conforme você vê como todas as partes podem trabalhar juntas para criar um aplicativo em funcionamento.

    
por 26.04.2013 / 07:58
fonte
8

It looks like this is either expecting a database schema or a bunch of class definitions (or both?)

Acho que você está muito concentrado em detalhes aqui. Com essa pergunta, o recrutador não está esperando uma descrição completa de todas as classes que você escreveria (caso contrário, elas pediriam que você codificasse e não falasse sobre isso).

Sua resposta primeiro precisa ser sobre o panorama geral - arquitetura, camadas, camadas, até mesmo o ciclo de vida do projeto e o processo de desenvolvimento que você estabeleceria. Não hesite em fazer perguntas sobre os requisitos e o ambiente em que o aplicativo deve ser executado para ajustar sua resposta. Como ressaltou Dan1111, não há uma receita geral para um projeto de aplicativo correto. Todos os designs dependem do contexto.

Somente se o recrutador começar a fazer perguntas realmente específicas, você deverá entrar em detalhes sobre quais classes, entidades ou tabelas de banco de dados você usaria de maneira oculta.

Além disso, se você tem pouca experiência, é normal dizer: "Vou mostrar uma solução usando o tipo de design de aplicativo que aprendi e usei até agora. Eu sei disso e de outras abordagens que eu pode descrevê-lo nos grandes, mas nunca os aplicou realmente. Também estou aberto a descobrir e aplicar outros ".

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

    
por 26.04.2013 / 13:21
fonte
2

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

1) How do you come up with what entities are needed?

A primeira coisa que faço para um novo projeto é, seja 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 específico que eu e minha equipe podemos imaginar. É uma sessão de brainstorming.

Os substantivos tendem a ser objetos, os verbos tendem a ser casos ou métodos de uso.

Física: foto (óbvia!), 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!)

Também gostaria de sugerir a visualização de padrões de design e UML e como eles podem ser usados no OOD genérico. (Aviso - Eu não mencionei uma linguagem ou um banco de dados em qualquer lugar acima. Não escolha um idioma e então faça seu OOD. Faça seu OOD de uma forma que o design possa ser implementado por qualquer OOL.

    
por 22.07.2014 / 20:52
fonte