J'ai rassemblé un tas de questions d'entrevue comme «Décrivez comment vous concevriez une application d'album photo», «Décrivez comment vous concevriez cette fonctionnalité particulière de ce site Web particulier» (par exemple, j'aime sur Facebook, la recommandation sur Amazon, le panier d'achat, le jeu de black jack). Alors, que faire s'il y a des millions de cette chose? Que changerais tu?
Il semble que ce soit attend un schéma de base de données ou un tas de définitions de classe (ou les deux?). J'ai appris les bases de données à l'école, mais je n'ai jamais conçu d'architecture auparavant et j'ai du mal à savoir par où commencer, si les conceptions que je propose sont "bonnes" et ce que je peux changer pour la rendre évolutive.
Existe-t-il une approche générale ou un processus de réflexion lors de la conception de ces systèmes? Et les problèmes / problèmes généraux qui semblent se poser beaucoup dans la conception que je devrais essayer d'éviter? Quelqu'un pourrait-il me guider à travers un (ou de préférence tous, tout en comparant les besoins de chacun) et expliquer:
1) Comment trouvez-vous les entités nécessaires? 2) Comment décidez-vous des relations que tout aura? 3) Comment intégrez-vous l'optimisation des performances dans votre conception? 4) Est-ce que je fais cela en utilisant des classes ou des bases de données? Cela fait-il une différence (par exemple, aurais-je une classe qui ne peut pas vraiment être traduite en table de base de données, par exemple?)
La principale raison pour laquelle je demande, c'est parce que je passais par "Cracking the Coding Interview" et que mes réponses étaient complètement différentes de celles de l'auteur - j'avais des idées très différentes sur les cours qui étaient importants.
MON TENTATIVE: Avec l'application de partage de photos, j'aurais les classes / tableaux: photo et utilisateur à coup sûr.
Ensuite, je pense que si nous essayons de créer un schéma, il y aurait un tableau reliant la photo et l'utilisateur si nous supposons que chaque personne sur la photo est liée à la photo (ce tableau est-il nécessaire? Sinon, est-ce toujours une pratique courante d'avoir une table séparée pour les relations plusieurs-à-plusieurs ou non?).
Mais si nous essayons d'adopter une approche orientée objet, peut-être aurions-nous plutôt une classe appelée album qui fait tout le travail et a toutes les informations des deux autres tables / classes. C'est une chose que j'ai remarquée dans le livre - il y a un tas de classes et puis une classe qui a fondamentalement toutes les informations et relie les autres classes - est-ce commun? Par exemple, dans mes exemples ci-dessus, cela semble-t-il s'appliquer?
J'espère juste que certaines règles / directives générales suivront, car pour le moment je ne sais pas comment dire à quoi ressemble une bonne architecture pour un grand système.
Réponses:
Le point de telles questions est d'évaluer si vous avez des compétences réelles pour écrire une application logicielle. Vous avez appris certaines théories, mais les connaissances théoriques ne peuvent aller jusque-là. La seule façon de vraiment comprendre le développement logiciel est de le faire.
Il n'y a pas de raccourci à cela, car il n'y a pas de réponses standard à des questions comme "quelles entités sont nécessaires?" Au lieu de cela, vous devez appliquer votre expérience des différents outils et paradigmes, et comment ils fonctionnent ensemble, pour trouver une solution pratique au problème en question.
Une question comme "Est-ce que je fais cela en utilisant des classes ou des bases de données?" suggère que vous n'avez pas une connaissance de base de ce que sont les choses et comment elles fonctionnent. Les cours sont un paradigme pour organiser votre code; les bases de données sont une méthode de stockage des données. Ce sont deux concepts intrinsèquement sans rapport (bien qu'ils puissent fonctionner ensemble). Ce n'est pas une question ni l'un ni l'autre.
Je ne veux pas être sévère, mais je pense que vous devez développer votre expérience en codage pour réussir un tel entretien d'embauche. Vous avez certainement le potentiel - votre discussion sur l'application de partage de photos contient certaines des bonnes idées et va dans la bonne direction. Mais vous devez savoir comment cela fonctionne de première main. La meilleure façon de préparer votre entretien est de créer une candidature du début à la fin. Une application de partage de photos serait un projet de taille appropriée, ou vous pourriez choisir autre chose. Vos connaissances vont vraiment se développer à mesure que vous voyez comment toutes les pièces peuvent fonctionner ensemble pour créer une application qui fonctionne.
la source
Je pense que vous êtes trop concentré sur les détails ici. Avec cette question, le recruteur ne s'attend pas à une description complète de toutes les classes que vous écririez (sinon il vous demanderait de le coder, pas d'en parler).
Votre réponse doit d'abord porter sur la vue d'ensemble - l'architecture, les niveaux, les couches, même le cycle de vie du projet et le processus de développement que vous mettriez en place. N'hésitez pas à poser des questions sur les exigences et l'environnement dans lequel l'application est censée s'exécuter pour ajuster votre réponse. Comme l'a souligné dan1111, il n'y a pas de recette générale pour une conception d'application correcte. Toutes les conceptions dépendent du contexte.
Ce n'est que si le recruteur commence à poser des questions vraiment spécifiques que vous devez entrer dans les détails sur les classes, les entités ou les tables de base de données que vous utiliseriez sous le capot.
De plus, si vous avez peu d'expérience, il est normal de dire "je vais vous montrer une solution en utilisant le type de conception d'application que j'ai appris et utilisé jusqu'à présent. Je connais ceci et ces autres approches que je peux vous décrire dans le grand mais je ne les ai jamais vraiment appliqués. Je suis aussi ouvert à découvrir et appliquer les autres ".
Il n'y a rien de mal à reconnaître qu'il n'y a que tant d'outils dans votre boîte à outils que votre expérience vous permet d'avoir - en fait, c'est mieux que de cracher une réponse répétée dont vous n'avez aucune idée de la façon dont cela fonctionne dans la pratique.
la source
J'ai pensé faire un petit commentaire sur votre première question:
La première chose que je fais pour un nouveau projet est, sur un tableau blanc ou sur une grande feuille de papier vierge, d'écrire toutes les choses physiques et conceptuelles sur ce projet particulier auxquelles moi et mon équipe pouvons penser. C'est une session de brainstorming.
Les noms ont tendance à être des objets, les verbes ont tendance à être des cas d'utilisation ou des méthodes.
Physique: photo (évidente!), Type d'affichage, système, fichier photo, format de fichier, utilisateur, date ....
Conceptuel: ajouter, supprimer, enregistrer / stocker, récupérer, trier, modifier, afficher / afficher la photo ....
Faites des liens entre les noms et les verbes. L'utilisateur ajoute une photo. (Eh bien - il y a un cas d'utilisation!)
Je suggérerais également de regarder UML et Design Patterns et comment ils peuvent être utilisés dans OOD générique. (Remarque - Je n'ai pas mentionné de langue ou de base de données nulle part ci-dessus. Ne choisissez pas de langue, puis faites votre OOD. Faites votre OOD de manière à ce que la conception puisse être mise en œuvre par n'importe quel OOL.
la source