TL; DR: Es hängt davon ab, was Sie zu lösen versuchen.
Ich hatte ein ähnliches Gespräch mit meinen Gramps darüber, während wir darüber sprachen, wie großartig Func und Action in C # sind. My Gramps ist ein sehr alter Timer-Programmierer, bei dem es um Quellcodes ging, seit Software auf Computern ausgeführt wurde, die einen ganzen Raum beanspruchten.
Er wechselte mehrmals in seinem Leben die Technik. Er schrieb Code in C, COBOL, Pascal, BASIC, Fortran, Smalltalk und Java und begann schließlich C # als Hobby. Ich lernte mit ihm zu programmieren, saß auf seinem Schoß, als ich noch ein Entwickler war, und schnitzte meine ersten Codezeilen im blauen Editor von IBMs SideKick weg. Als ich 20 Jahre alt war, hatte ich bereits mehr Zeit damit verbracht, zu programmieren als draußen zu spielen.
Das sind ein paar meiner Erinnerungen, entschuldigen Sie mich, wenn ich beim Nacherzählen nicht ganz praktisch bin. Ich mag diese Momente ein bisschen.
Das hat er zu mir gesagt:
"Sollten wir uns um die Verallgemeinerung eines Problems bemühen oder es in einem bestimmten Bereich lösen, fragen Sie sich? Nun, das ist eine ... Frage."
Gramps machte eine Pause, um einen kurzen Moment darüber nachzudenken, während er die Position seiner Brille auf seinem Gesicht festlegte. Er spielte ein Match-3-Spiel auf seinem Computer, während er auf seinem alten Soundsystem eine Deep Purple-LP hörte.
"Nun, das hängt davon ab, welches Problem Sie lösen wollen", sagte er mir. "Es ist verlockend zu glauben, dass es eine einzige, heilige Lösung für alle Designentscheidungen gibt, aber es gibt keine. Sie sehen, Software-Architektur ist wie Käse."
"... Käse, Gramps?"
"Egal, was Sie über Ihren Favoriten denken, es wird immer jemanden geben, der denkt, dass es stinkt".
Ich blinzelte einen Moment verwirrt, aber bevor ich etwas sagen konnte, ging Gramps weiter.
"Wenn Sie ein Auto bauen, wie wählen Sie das Material für ein Teil aus?"
"Ich ... ich denke, es hängt von den damit verbundenen Kosten ab und was der Teil tun sollte, nehme ich an."
"Es kommt auf das Problem an, das das Teil zu lösen versucht. Sie werden keinen Reifen aus Stahl oder eine Windschutzscheibe aus Leder herstellen. Sie wählen das Material aus, das das vorliegende Problem am besten löst. Nun, was ist ein Problem?" Eine generische Lösung oder eine spezifische Lösung? Für welches Problem, für welchen Anwendungsfall? Sollten Sie sich für einen voll funktionsfähigen Ansatz entscheiden, um einem Code, der nur einmal verwendet wird, maximale Flexibilität zu verleihen? Sollten Sie einen sehr speziellen, fragilen Code schreiben? Ein Teil Ihres Systems, der viele, viele Verwendungen und möglicherweise viele Änderungen erfahren wird. Konstruktionsentscheidungen wie diese sind wie die Materialien, die Sie für ein Teil in einem Auto auswählen, oder die Form des Legosteins, den Sie für den Bau eines kleinen Hauses auswählen Welcher Legostein ist der beste? "
Der ältere Programmierer griff nach einem kleinen Lego-Modell, das er auf dem Tisch hat, bevor er fortfuhr.
"Das können Sie nur beantworten, wenn Sie wissen, wofür Sie diesen Baustein brauchen. Wie zum Teufel werden Sie wissen, ob die spezifische Lösung besser ist als die generische, oder umgekehrt, wenn Sie nicht einmal wissen, welches Problem Sie haben Versuche zu lösen? Du kannst keine Wahl hinter dir lassen, die du nicht verstehst. "
"..Haben Sie gerade die Matrix zitiert ? "
"Was?"
"Nichts, mach weiter."
"Nun, nehmen wir an, Sie versuchen, etwas für das National Invoice System zu entwickeln. Sie wissen, wie diese teuflische API und ihre XML-Datei mit ihren dreißigtausend Zeilen von innen aussehen. Wie würde eine" generische "Lösung zum Erstellen dieser Datei überhaupt aussehen? Die Datei ist voll von optionalen Parametern, voll von Fällen, die nur sehr bestimmte Branchen verwenden sollten. In den meisten Fällen können Sie sie ignorieren. Sie müssen kein generisches Rechnungssystem erstellen, wenn Sie das einzige sind, was Sie benötigen. Wenn Sie nur Schuhe verkaufen möchten, erstellen Sie einfach ein System für den Verkauf von Schuhen und machen Sie es zum besten Rechnungssystem für den Verkauf von Schuhen auf dem Markt. als eigenständiges, generisches Verkaufssystem weiterverkauft werden,zum Beispiel - jetzt ist es interessant, die Optionen zu implementieren, die nur für Gas, Lebensmittel oder Alkohol verwendet werden.Nun sind dies mögliche Anwendungsfälle. Vorher waren es nur einige hypothetische Don't Use Cases, und Sie möchten Don't Use Cases nicht implementieren . Don't use ist der kleine Bruder von Don't need . "
Gramps stellte den Lego-Zug wieder auf seinen Platz und wandte sich wieder seinem 3-Gewinnt-Spiel zu.
"Um eine generische oder eine spezifische Lösung für ein bestimmtes Problem zu finden, muss man zuerst verstehen, was zum Teufel dieses Problem ist. Andernfalls wird nur geraten, und das Erraten ist die Aufgabe von Managern, nicht von Programmierern. Wie fast alles in der IT, es kommt darauf an. "
Also, da hast du es. "Es hängt davon ab, ob". Das ist wahrscheinlich der mächtigste Ausdruck mit zwei Wörtern, wenn man über Software-Design nachdenkt.