Ich habe eine Reihe von Interviewfragen gesammelt, darunter "Beschreibe, wie du eine Fotoalbum-Anwendung gestalten würdest", "Beschreibe, wie du diese bestimmte Funktion dieser Website gestalten würdest" (z. B. "Gefällt mir" auf Facebook, "Empfehlung bei Amazon", "Einkaufswagen", "Spiel") von Black Jack). Was ist dann, wenn es Millionen davon gibt? Was würdest du ändern?
Es sieht so aus, als würde dies entweder ein Datenbankschema oder eine Reihe von Klassendefinitionen (oder beides?) Erwarten. Ich habe in der Schule etwas über Datenbanken gelernt, aber ich habe noch nie zuvor eine Anwendung entwickelt und habe Probleme zu wissen, wo ich anfangen soll, ob die von mir entwickelten Designs "gut" sind und was ich ändern kann, um sie skalierbar zu machen.
Gibt es einen allgemeinen Ansatz oder Denkprozess beim Entwerfen dieser Systeme? Und allgemeine Probleme, die im Design häufig auftauchen und die ich zu vermeiden versuchen sollte? Könnte jemand mich vielleicht durch eines (oder am besten alle, während er die Bedürfnisse von jedem vergleicht) von diesen führen und erklären:
1) Wie kommen Sie auf die Entitäten, die benötigt werden? 2) Wie entscheidest du, welche Beziehungen alles haben wird? 3) Wie integrieren Sie die Leistungsoptimierung in Ihr Design? 4) Mache ich das mit Klassen oder Datenbanken? Macht es einen Unterschied (zB hätte ich eine Klasse, die nicht wirklich in eine Datenbanktabelle übersetzt werden kann?)
Der Hauptgrund, den ich frage, ist, dass ich das "Cracking the Coding Interview" durchlaufen habe und meine Antworten völlig anders waren als die des Autors - ich hatte sehr unterschiedliche Vorstellungen, welche Klassen wichtig sind.
MEIN VERSUCH: Mit der Foto-Sharing-App hätte ich die Klassen / Tabellen: Foto und Benutzer sicher.
Wenn wir dann versuchen, ein Schema zu erstellen, gibt es eine Tabelle, die Foto und Benutzer verknüpft, wenn wir davon ausgehen, dass jede Person auf dem Foto mit dem Foto verknüpft ist eine separate Tabelle für viele-zu-viele-Beziehungen haben oder nicht?).
Aber wenn wir versuchen, einen objektorientierten Ansatz zu verfolgen, haben wir vielleicht stattdessen eine Klasse namens album, die die ganze Arbeit erledigt und alle Informationen aus den beiden anderen Tabellen / Klassen enthält. Dies ist eine Sache, die mir im Buch aufgefallen ist - es gibt eine Reihe von Klassen und dann eine Klasse, die im Grunde alle Informationen enthält und die anderen Klassen verbindet - ist das üblich? Scheint dies zum Beispiel in meinen obigen Beispielen so, als würde es zutreffen?
Ich hoffe nur, dass einige allgemeine Regeln / Richtlinien befolgt werden, da ich im Moment keine Ahnung habe, wie eine gute Architektur für ein großes System aussieht.
Antworten:
Bei solchen Fragen geht es darum zu beurteilen, ob Sie über echte Kenntnisse beim Schreiben einer Softwareanwendung verfügen. Sie haben etwas Theorie gelernt, aber theoretisches Wissen kann nur so weit gehen. Die einzige Möglichkeit, die Softwareentwicklung wirklich zu verstehen, besteht darin, dies zu tun.
Hierfür gibt es keine Abkürzung, da Fragen wie "Welche Entitäten werden benötigt?" Nicht vorrätig beantwortet werden. Stattdessen müssen Sie Ihre Erfahrungen mit verschiedenen Werkzeugen und Paradigmen und deren Zusammenwirken anwenden, um eine praktische Lösung für das vorliegende Problem zu finden.
Eine Frage wie "Mache ich das mit Klassen oder Datenbanken?" Dies deutet darauf hin, dass Sie keine Grundkenntnisse darüber haben, was Dinge sind und wie sie funktionieren. Klassen sind ein Paradigma für die Organisation Ihres Codes. Datenbanken sind eine Methode zur Datenspeicherung. Es handelt sich um zwei inhärent unabhängige Konzepte (obwohl sie zusammenarbeiten können). Dies ist keine entweder / oder Frage.
Ich möchte nicht hart sein, aber ich denke, Sie müssen Ihre Programmiererfahrung verbessern, um in einem solchen Vorstellungsgespräch erfolgreich zu sein. Sie haben sicherlich das Potenzial - Ihre Diskussion über die Foto-Sharing-App hat einige der richtigen Ideen und geht in die richtige Richtung. Aber Sie müssen lernen, wie dies aus erster Hand funktioniert. Die beste Vorbereitung für Ihr Vorstellungsgespräch besteht darin, eine Bewerbung von Anfang bis Ende zu erstellen. Eine App zum Teilen von Fotos ist ein Projekt mit einer angemessenen Größe, oder Sie können sich für etwas anderes entscheiden. Ihr Wissen wird wirklich erweitert, wenn Sie sehen, wie alle Teile zusammenarbeiten können, um eine funktionierende Anwendung zu erstellen.
quelle
Ich denke, Sie konzentrieren sich hier zu sehr auf Details. Bei dieser Frage erwartet der Personalvermittler keine vollständige Beschreibung aller Klassen, die Sie schreiben würden (andernfalls werden Sie aufgefordert, sie zu codieren und nicht darüber zu sprechen).
Ihre Antwort muss sich zunächst auf das Gesamtbild beziehen - Architektur, Ebenen, Ebenen, sogar den Projektlebenszyklus und den Entwicklungsprozess, den Sie implementieren würden. Zögern Sie nicht, Fragen zu den Anforderungen und der Umgebung zu stellen, in der die Anwendung ausgeführt werden soll, um Ihre Antwort anzupassen. Wie dan1111 hervorhob, gibt es kein allgemeines Rezept für ein korrektes Anwendungsdesign. Alle Designs sind kontextabhängig.
Nur wenn der Personalvermittler wirklich spezifische Fragen stellt, sollten Sie sich näher mit den Klassen, Entitäten oder Datenbanktabellen befassen, die Sie unter der Haube verwenden würden.
Auch wenn Sie wenig Erfahrung haben, ist es normal zu sagen: "Ich zeige Ihnen eine Lösung unter Verwendung der Art von Anwendungsdesign, die ich bis jetzt gelehrt und verwendet habe. Ich kenne diesen und jene anderen Ansätze, die ich Ihnen beschreiben kann im großen und ganzen, habe sie aber nie wirklich angewendet. Ich bin auch offen dafür, andere zu entdecken und anzuwenden ".
Es ist nichts Falsches daran, anzuerkennen, dass nur so viele Werkzeuge in Ihrer Toolbox sind, wie Sie erlebt haben. Tatsächlich ist es besser, eine einstudierte Antwort auszuspucken, von der Sie keine Ahnung haben, wie sie in der Praxis funktioniert.
quelle
Ich dachte, ich würde kurz auf Ihre erste Frage eingehen:
Das erste, was ich für ein neues Projekt mache, ist, entweder auf einer weißen Tafel oder einem großen, leeren Blatt Papier alle physischen und konzeptuellen Dinge über das jeweilige Projekt aufzuschreiben, an die ich und mein Team denken können. Es ist eine Brainstorming-Sitzung.
Substantive sind eher Objekte, Verben eher Anwendungsfälle oder Methoden.
Physisch: Foto (offensichtlich!), Anzeigetyp, System, Fotodatei, Dateiformat, Benutzer, Datum ....
Konzeptionell: Hinzufügen, Löschen, Speichern / Speichern, Abrufen, Sortieren, Ändern, Anzeigen / Anzeigen von Fotos ....
Stellen Sie Verbindungen zwischen Substantiven und Verben her. Benutzer fügt Foto hinzu. (Nun - es gibt einen Anwendungsfall!)
Ich würde auch vorschlagen, sich mit UML- und Entwurfsmustern zu befassen und zu erläutern, wie sie in der allgemeinen OOD verwendet werden können. (Hinweis - Ich habe oben keine Sprache oder Datenbank erwähnt. Wählen Sie keine Sprache aus und führen Sie dann Ihre OOD durch. Führen Sie Ihre OOD so aus, dass das Design von jedem OOL implementiert werden kann.
quelle