Wenn Sie ein Programmierer sind, betrachten Sie sich nicht als "Informatiker". Computerwissenschaftler sind diejenigen, die die nächste Generation von Computern erschaffen, von denen einige noch Science-Fiction sind, bis der richtige Materialmix, die richtige Miniaturisierung und die richtige Computertheorie abgeleitet sind. Sie sind nur der Anfang der Pipeline. Menschen, die im Hier und Jetzt Software entwickeln, sind "Software-Ingenieure"; Sie nutzen die Theorien und Werkzeuge, die manchmal praktische Theorie und reale Werkzeuge überlagern, um die Potenziale dieses komplexen Stücks elektroinischer Zauberei zu nutzen und es dazu zu bringen, das zu tun, was wir wollen. Dies ist wiederum eine Spezialisierung auf dem Gebiet der "Computertechnik", die die Theorien der Informatiker aufgreift und sie, Hardware und Software, auf reale elektronische Endbenutzerlösungen anwendet.
Hier, IMO, trifft Geschäft auf Theorie. In solchen Fällen kann das alte Sprichwort "Der Feind des Guten ist gut genug" leicht umgedreht werden, um zu lesen "Der Feind des Guten ist besser". Wenn Sie sich als "Ingenieur" anstatt als "Wissenschaftler" betrachten und Ihre Arbeit parallel zu anderen Ingenieurdisziplinen betreiben, werden die Unterschiede deutlich.
Angenommen, ein Kunde kommt zu Ihnen, ein Bauingenieur, und bittet Sie, eine Brücke zu bauen. Die Brücke muss 20 Fuß überspannen, sich selbst tragen und eine Tonne tragen, sie sollte 10 Jahre mit routinemäßiger Wartung aushalten und sie soll in einem Monat für 20.000 US-Dollar geliefert werden. Das sind deine Zwänge; das Minimum einhalten und das Maximum nicht überschreiten. Das zu tun ist "gut genug" und bringt Ihnen den Gehaltsscheck. Es wäre eine schlechte Technik für Sie, die Golden Gate Bridge zu bauen, die sowohl die Konstruktionsspezifikationen als auch das Budget um ein Vielfaches übertrifft. Normalerweise verschlingen Sie die Kostenüberschreitungen und zahlen Strafen für Zeitüberschreitungen. Es wäre auch eine schlechte Technik für Sie, eine Seilbrücke zu bauen, die für das Gewicht von 5 erwachsenen Männern ausgelegt ist, obwohl sie nur 1000 US-Dollar an Zeit und Material kostet. Sie erhalten keine guten Kundenbewertungen und Erfahrungsberichte,
Zurück zur Software, sagen wir, Sie haben einen Client, der ein Dateiverarbeitungssystem benötigt, um eingehende Dateien zu verarbeiten und die Informationen in das System einzufügen. Sie möchten, dass es in einer Woche erledigt wird, und es muss fünf Dateien pro Tag verarbeiten, die etwa 10 MB Daten enthalten. Ihre kostbaren Theorien gehen größtenteils aus dem Fenster; Ihre Aufgabe ist es, in einer Woche ein Produkt zu entwickeln, das diese Anforderungen erfüllt. Auf diese Weise erfüllen Sie auch das Kostenbudget des Kunden (da Materialien für einen Softwarevertrag dieser Größe in der Regel ein Tropfen auf den heißen Stein sind). Zwei Wochen zu verbringen, selbst für das Zehnfache des Gewinns, ist keine Option, aber höchstwahrscheinlich ist auch kein Programm an einem Tag erstellt, das nur die Hälfte des Durchsatzes bewältigen kann, mit der Anweisung, zwei Kopien laufen zu lassen.
Wenn Sie denken, dass dies ein Randfall ist, liegen Sie falsch. Dies ist die tägliche Umgebung der meisten Haushalte. Der Grund ist der ROI; Dieses anfängliche Programm kostet nicht viel und macht sich daher sehr schnell bezahlt. WENN die Endbenutzer mehr oder schneller arbeiten müssen, kann der Code überarbeitet und skaliert werden.
Das ist der Hauptgrund für den aktuellen Stand der Programmierung. Die Annahme, die sich in der gesamten Geschichte des Rechnens bestätigt, ist, dass ein Programm NIEMALS statisch ist. Es muss immer aktualisiert werden und es wird schließlich ersetzt. Parallel dazu ermöglicht die ständige Verbesserung der Computer, auf denen die Programme ausgeführt werden, eine geringere Beachtung der theoretischen Effizienz und eine stärkere Beachtung der Skalierbarkeit und Parallelisierung (ein Algorithmus, der in der N-Quadrat-Zeit ausgeführt wird, aber für die Ausführung auf N Kernen parallelisiert werden kann) erscheinen linear, und oft sind die Kosten für mehr Hardware billiger als für Entwickler, um eine effizientere Lösung zu finden.
Hinzu kommt der sehr einfache Grundsatz, dass jede Zeile Entwicklercode etwas anderes ist, was schief gehen kann. Je weniger ein Entwickler schreibt, desto unwahrscheinlicher ist es, dass das, was er schreibt, ein Problem darstellt. Dies ist keine Kritik an der "Fehlerrate" von irgendjemandem; Es ist eine einfache Feststellung. Sie wissen vielleicht, wie man eine MergeSort in 5 Sprachen vor- und zurückschreibt, aber wenn Sie nur einen Bezeichner in einer Codezeile fetten, funktioniert die gesamte Sortierung nicht, und wenn der Compiler sie nicht abfängt, kann dies zu Problemen führen Stunden, um es zu debuggen. Vergleichen Sie das mit List.Sort (); es ist da, es ist effizient im allgemeinen Fall, und hier ist das Beste, es funktioniert bereits.
Aus diesem Grund wurden viele Funktionen moderner Plattformen und Grundsätze moderner Entwurfsmethoden entwickelt:
- OOP - Bauen Sie verwandte Daten und Logik in ein Objekt ein, und wo immer das Konzept dieses Objekts gültig ist, also das Objekt oder eine spezialisiertere Ableitung.
- Vorgefertigte Vorlagen - Gut 60% oder mehr des Codes sind syntaktische Cruft und die Grundlagen dafür, dass das Programm etwas auf dem Bildschirm anzeigt. Indem Sie diesen Code standardisieren und automatisch generieren, reduzieren Sie die Arbeitsbelastung des Entwicklers um die Hälfte und erhöhen so die Produktivität.
- Bibliotheken mit Algorithmen und Datenstrukturen - Wie oben können Sie vielleicht einen Stack, eine Queue, QuickSort usw. schreiben, aber warum müssen Sie das tun, wenn es eine Codebibliothek gibt, in die all dies integriert ist? Sie würden IIS oder Apache nicht umschreiben, weil Sie eine Website benötigen. Warum sollten Sie einen QuickSort-Algorithmus oder ein rot-schwarzes Baumobjekt implementieren, wenn mehrere großartige Implementierungen verfügbar sind?
- Fließende Schnittstellen - Möglicherweise verfügen Sie über einen Algorithmus zum Filtern und Sortieren von Datensätzen. Es ist schnell, aber wahrscheinlich nicht gut lesbar. Ihr Nachwuchsentwickler würde einen Tag brauchen, um es zu verstehen, geschweige denn, um die chirurgische Änderung vorzunehmen, die erforderlich ist, um ein zusätzliches Feld im Datensatzobjekt zu sortieren. Stattdessen ersetzen Bibliotheken wie Linq viele sehr hässliche, oft spröde Codes durch ein oder zwei Zeilen konfigurierbarer Methodenaufrufe, um eine Liste von Objekten in gefilterte, sortierte, projizierte Objekte umzuwandeln.