He reunido un montón de preguntas de entrevista como "Describe cómo diseñarías una aplicación de álbum de fotos", "Describe cómo diseñarías esta característica particular de este sitio web en particular" (por ejemplo, me gusta en Facebook, recomendación en Amazon, carrito de compras, juego de gato negro). Entonces, ¿qué pasa si hay millones de esta cosa? ¿Qué cambiarías?
Parece que esto está esperando un esquema de base de datos o un montón de definiciones de clase (¿o ambas?). Aprendí sobre bases de datos en la escuela, pero nunca antes diseñé una aplicación y tengo problemas para saber por dónde empezar, si los diseños que se me ocurren son "buenos" y qué puedo cambiar para que sea escalable.
¿Existe un enfoque general o proceso de pensamiento al diseñar estos sistemas? ¿Y problemas / problemas generales que parecen surgir mucho en el diseño que debo tratar de evitar? ¿Podría alguien guiarme a través de uno (o preferiblemente todos, al comparar las necesidades de cada uno) y explicarme:
1) ¿Cómo se te ocurren qué entidades se necesitan? 2) ¿Cómo decides qué relaciones tendrá todo? 3) ¿Cómo incorpora la optimización del rendimiento en su diseño? 4) ¿Hago esto usando clases o bases de datos? ¿Hay alguna diferencia (es decir, ¿tendría una clase que realmente no se puede traducir a una tabla de base de datos, por ejemplo?)
La razón principal por la que pregunto es porque estaba pasando por la "Entrevista de descifrado" y mis respuestas eran completamente diferentes a las del autor: tenía ideas muy diferentes sobre qué clases eran importantes.
MI INTENTO: Con la aplicación para compartir fotos, tendría las clases / tablas: foto y usuario seguro.
Entonces, creo que si estamos tratando de crear un esquema, habría una tabla que vincule la foto y el usuario si asumimos que cada persona en la foto está vinculada a la foto (¿es necesaria esta tabla? Si no, ¿sigue siendo una práctica común? tener una tabla separada para las relaciones de muchos a muchos o no?
Pero si estamos tratando de adoptar un enfoque orientado a objetos, quizás tengamos una clase llamada album que hace todo el trabajo y tiene toda la información de las otras dos tablas / clases. Esto es algo que noté en el libro: hay un montón de clases y luego una clase que básicamente tiene toda la información y conecta las otras clases, ¿es esto común? Por ejemplo, en mis ejemplos anteriores, ¿parece que esto se aplicaría?
Solo espero que sigan algunas reglas / pautas generales porque en este momento no tengo idea de cómo distinguir una buena arquitectura para un sistema grande.
Respuestas:
El objetivo de estas preguntas es evaluar si tiene habilidades del mundo real para escribir una aplicación de software. Has aprendido algo de teoría, pero el conocimiento teórico solo puede llegar tan lejos. La única forma de comprender realmente el desarrollo de software es hacerlo.
No hay un atajo para esto, porque no hay respuestas comunes a preguntas como "¿qué entidades se necesitan?" En cambio, debe aplicar su experiencia de varias herramientas y paradigmas, y cómo funcionan juntos, para llegar a una solución práctica al problema en cuestión.
Una pregunta como "¿Hago esto usando clases o bases de datos?" sugiere que le falta un conocimiento básico de qué son las cosas y cómo funcionan. Las clases son un paradigma para organizar su código; Las bases de datos son un método de almacenamiento de datos. Son dos conceptos inherentemente no relacionados (aunque pueden trabajar juntos). Esta no es una o una pregunta.
No quiero ser duro, pero creo que necesitas desarrollar tu experiencia de codificación para tener éxito en una entrevista de trabajo. Ciertamente tiene el potencial: su discusión sobre la aplicación para compartir fotos tiene algunas de las ideas correctas y se dirige en la dirección correcta. Pero debes aprender cómo funciona esto de primera mano. La mejor manera de prepararse para su entrevista es crear una aplicación de principio a fin. Una aplicación para compartir fotos sería un proyecto del tamaño adecuado, o podría elegir otra cosa. Su conocimiento realmente se ampliará a medida que vea cómo todas las partes pueden trabajar juntas para hacer una aplicación que funcione.
fuente
Creo que estás demasiado concentrado en los detalles aquí. Con esa pregunta, el reclutador no espera una descripción completa de todas las clases que escribiría (de lo contrario, le pedirían que lo codifique, no que hable sobre ello).
Su respuesta primero debe ser sobre el panorama general: arquitectura, niveles, capas, incluso el ciclo de vida del proyecto y el proceso de desarrollo que implementaría. No dude en hacer preguntas sobre los requisitos y el entorno en el que se supone que se ejecuta la aplicación para ajustar su respuesta. Como señaló dan1111, no existe una receta general para un diseño de aplicación correcto. Todos los diseños dependen del contexto.
Solo si el reclutador comienza a hacer preguntas realmente específicas, debe entrar en detalles sobre qué clases, entidades o tablas de base de datos usaría bajo el capó.
Además, si tiene poca experiencia, es normal decir "le mostraré una solución usando el tipo de diseño de aplicación que me han enseñado y utilizado hasta ahora. Sé de este y otros enfoques que puedo describirle en general, pero nunca los he aplicado realmente. También estoy abierto a descubrir y aplicar otros ".
No hay nada de malo en reconocer que solo hay tantas herramientas en su caja de herramientas que su experiencia le permite tener; de hecho, es mejor que escupir una respuesta ensayada que no tiene idea de cómo funciona en la práctica.
fuente
Pensé en hacer un comentario rápido sobre tu primera pregunta:
Lo primero que hago para un nuevo proyecto es, ya sea en una pizarra blanca o en un gran trozo de papel en blanco, escribir todas las cosas físicas y conceptuales sobre ese proyecto en particular que yo y mi equipo podamos pensar. Es una sesión de lluvia de ideas.
Los sustantivos tienden a ser objetos, los verbos tienden a ser casos de uso o métodos.
Físico: foto (¡obvio!), Tipo de pantalla, sistema, archivo de foto, formato de archivo, usuario, fecha ...
Conceptual: agregar, eliminar, guardar / almacenar, recuperar, ordenar, modificar, ver / mostrar foto ...
Haz conexiones entre sustantivos y verbos. El usuario agrega una foto. (Bueno, ¡hay un caso de uso!)
También sugeriría mirar UML y Patrones de diseño y cómo se pueden usar en OOD genérico. (Aviso: no mencioné un idioma o una base de datos en ninguna parte anterior. No elija un idioma y luego haga su OOD. Haga su OOD de manera que cualquier OOL pueda implementar el diseño.
fuente