Die zunehmende Komplexität von Systemen ist unerbittlich, bedrückend und letztendlich lähmend. Für mich als Programmierer älterer Generationen ist es auch bitter enttäuschend.
Ich programmiere seit mehr als 40 Jahren, habe Code in 50-100 verschiedenen Sprachen oder Dialekten geschrieben und bin Experte in 5-10. Der Grund, warum ich so viele behaupten kann, ist, dass es sich meistens nur um dieselbe Sprache handelt, mit Verbesserungen. Die Anpassungen erhöhen die Komplexität und machen jede Sprache ein wenig anders.
Ich habe die gleichen Algorithmen unzählige Male implementiert: Sammlungen, Konvertierungen, Sortieren und Suchen, Codieren / Decodieren, Formatieren / Parsen, Puffer und Zeichenfolgen, Arithmetik, Speicher, E / A. Jede neue Implementierung erhöht die Komplexität, da jede einzelne nur ein bisschen anders ist.
Ich wundere mich über die Magie der hochfliegenden Trapezkünstler der Web-Frameworks und mobilen Apps, wie sie in so kurzer Zeit etwas so Schönes produzieren können. Dann wird mir klar, wie viel sie nicht wissen, wie viel sie über Daten oder Kommunikation, Tests oder Threads oder was auch immer lernen müssen, bevor das, was sie tun, nützlich wird.
Ich habe mein Handwerk in der Ära der Sprachen der vierten Generation gelernt, in der wir aufrichtig davon ausgegangen sind, dass wir eine Abfolge von Sprachen höherer und höherer Ebenen produzieren werden, um immer mehr sich wiederholende Teile von Schreibsoftware nach und nach zu erfassen. Wie ist das genau ausgegangen?
Microsoft und IBM beendeten diese Idee, indem sie zu C zurückkehrten, um Apps für Windows und OS / 2 zu schreiben, während dBase / Foxpro und sogar Delphi nachließen. Dann hat es das Web mit seinem ultimativen Trio von Assemblersprachen wieder geschafft: HTML, CSS und JavaScript / DOM. Es war alles bergab von dort. Immer mehr Sprachen und mehr Bibliotheken und mehr Frameworks und mehr Komplexität.
Wir wissen, dass wir es anders machen sollten. Wir kennen uns mit CoffeeScript und Dart aus, mit Less und Sass, mit Templates, um nicht HTML schreiben zu müssen. Wir wissen es und machen es trotzdem. Wir haben unsere Rahmenbedingungen voller undichter Abstraktionen und wir sehen, welche Wunder die wenigen Auserwählten vollbringen können, die die arkanen Zaubersprüche lernen, aber wir und unsere Programme sind von den in der Vergangenheit getroffenen Entscheidungen gefangen. Es ist zu kompliziert, um es zu ändern oder von vorne zu beginnen.
Das Ergebnis ist, dass Dinge, die einfach sein sollten, nicht einfach sind und Dinge, die möglich sein sollten, aufgrund der Komplexität nahezu unmöglich sind. Ich kann die Kosten für Änderungen abschätzen, um eine neue Funktion in einer etablierten Codebasis zu implementieren, und bin zuversichtlich, dass ich in etwa richtig liegen werde. Ich kann schätzen, aber ich kann es nicht rechtfertigen oder erklären. Es ist zu kompliziert.
Zur Beantwortung Ihrer letzten Frage empfehle ich jüngeren Programmierern nachdrücklich, so weit wie möglich mit dem Layer Cake zu beginnen und nur in die unteren Schichten abzutauchen, wenn Bedarf und Wunsch den Anstoß dazu geben. Ich bevorzuge Sprachen ohne Schleifen, ohne Verzweigung und ohne expliziten Status. Lisp und Haskell kommen mir in den Sinn. In der Praxis beende ich mich immer mit C # / Java, Ruby, Javascript, Python und SQL, da sich dort die Communities befinden.
Letzte Worte: Komplexität ist der ultimative Feind! Schlagen Sie das und das Leben wird einfach.