Die Ernüchterung über Software
(tonsky.me)- Moderne Software gibt den Fortschritt der Hardware nicht in Form von Effizienz, Einfachheit und Reife zurück, sondern normalisiert Ineffizienz unter der Annahme, dass „Computer schnell genug sind“
- Selbst grundlegende Aufgaben wie Web-Scrolling, das Öffnen einer E-Mail in Google Inbox in 13 Sekunden, ein 30-minütiges Windows-10-Update oder Eingabeverzögerungen im Texteditor fühlen sich langsamer an als erwartet
- Ein Android-System mit 6 GB, Windows 10 mit 4 GB, Google Keyboard mit 150 MB sowie Beispiele wie Electron-Apps und Slack zeigen, dass die Aufblähung von Apps und Plattformen zu Kosten bei Leistung, Komplexität und Zuverlässigkeit führt
- Wie bei Updates von OS, Apps und Browsern oder dem Wegfall der 32-Bit-App-Unterstützung in iOS 11 kann Software, die einmal gut funktionierte, mit der Zeit langsamer werden oder kaputtgehen
- Um bessere Software zu bauen, müssen Ingenieure die Leistung, Struktur und Grenzen der von ihnen gebauten Systeme verstehen und mit weniger Ressourcen schnelle und vorhersehbare Ergebnisse liefern
Software, die Leistung verschwendet
- Moderne Software wird oft so akzeptiert, als sei es in Ordnung, wenn sie nur mit 1 % oder 0,01 % der möglichen Leistung läuft
- Während Autos, Gebäude und Flugzeuge sich physikalischen Grenzen oder optimalen Formen annähern, rechtfertigt Software Ineffizienz mit dem Satz: „Computer sind schnell genug“
- Das Sprichwort „Die Zeit des Programmierers ist teurer als die Zeit des Computers“ kann die Realität verschleiern, dass Computerzeit in nie dagewesenem Ausmaß verschwendet wird
- Ein Tweet, in dem ein täglich ausgeführtes Python-Programm in Rust neu geschrieben und von 1,5 Sekunden auf 0,06 Sekunden verkürzt wurde, aber die investierten 6 Stunden sich erst nach mehr als 41 Jahren auszahlen würden, wird als repräsentatives Beispiel in der Effizienzdiskussion verwendet
Unerträglich langsame Grunderfahrung
- Moderne tragbare Computer sind tausendfach leistungsfähiger als die Rechner aus der Zeit der Mondlandung, dennoch ist es selbst auf einem aktuellen MacBook Pro schwer, Webseiten mit 60 fps flüssig zu scrollen
- Das von Google entwickelte Inbox benötigt in Google Chrome 13 Sekunden, um eine einzelne E-Mail zu öffnen
- Statt Inhalte anzuzeigen, animiert es leere weiße Kästen, was eher wie ein Kompromiss wirkt, der an die Leistungsgrenzen von Webseiten angepasst ist
- Selbst zu einer Zeit, in der 120-Hz-Displays Mainstream sind, gilt schon 60 Hz beim Anzeigen einer einzelnen Antwort in einer Web-Community nicht als stabil
- Ein Windows-10-Update dauert 30 Minuten; in derselben Zeit könnte man eine SSD mehrfach formatieren, einen neuen Build herunterladen und installieren
- Moderne Texteditoren haben mehr Eingabeverzögerung als das 42 Jahre alte Emacs
- Es wird kritisiert, dass selbst eine Aufgabe, bei der pro Tastendruck nur ein kleines rechteckiges Gebiet aktualisiert werden muss, nicht innerhalb von 16 ms erledigt wird
- 3D-Spiele rendern in denselben 16 ms den gesamten Bildschirm, verarbeiten Eingaben, berechnen die Welt und verwalten Ressourcen
- Schnellere Hardware wird nicht für bessere Software genutzt, sondern dafür, Software auszuführen, die dieselbe Arbeit langsamer erledigt
Aufgeblähte Apps und Plattformen
- Web-Apps können schon durch das Blockieren von Werbung 10-mal schneller werden, und AMP ist weniger eine neue Technologie als vielmehr eine naheliegende Lösung, überflüssige Teile zu entfernen
- Ein Android-System belegt selbst ohne Apps 6 GB, Windows 95 hatte 30 MB und Windows 10 hat 4 GB
- Windows 10 ist 133-mal größer als Windows 95, bietet aber aus dieser Sicht keine grundlegend anderen Basisfunktionen
- Android ist sogar 1,5-mal größer als Windows 10
- Google Keyboard belegt typischerweise 150 MB, die Google-App 350 MB und Google Play Services 300 MB
- Kritisiert wird dies mit der Frage, ob Google Keyboard, eine App, die etwa dreißig Tasten auf den Bildschirm zeichnet, wirklich fünfmal komplexer sein müsse als das gesamte Windows 95
- Google Play Services lassen sich selbst dann nicht entfernen, wenn man sie nicht nutzt
- Die Situation, dass nach der Installation der Standard-Apps nur noch etwa 1 GB Speicherplatz für Fotos bleibt, wird dem früheren Zeitalter gegenübergestellt, als OS, Apps und Daten gemeinsam auf Disketten gespeichert wurden
- Eine auf Electron basierende Todo-App kann sogar Xbox-360-Controller-Treiber, 3D-Grafik-Rendering, Musikwiedergabe und Webcam-Aufnahmefunktionen enthalten
- Slack ist im Grunde eine App für Chat und einen einfachen Texteditor, wird aber wegen Ladezeit und Speicherverbrauch als schwergewichtige App eingestuft
- Je größer Apps werden, desto mehr wachsen Kontrollverlust, Kosten der Komplexität, Leistungsverluste und Zuverlässigkeitsschulden; übermäßig schwere Apps dürfen nicht als normal akzeptiert werden
Software, die mit der Zeit verfällt
- Vor drei Jahren reichte ein Android-Handy mit 16 GB noch aus, doch in der Ära von Android 8.1 wurden Apps ohne besonderen Grund doppelt so groß und dadurch schwer nutzbar
- Das iPhone 4s wurde mit iOS 5 vorgestellt, aber iOS 9 auszuführen ist mühsam, obwohl iOS 9 auch nicht grundsätzlich viel besser sei
- iOS 11 stellte die Unterstützung für 32-Bit-Apps ein, sodass Apps ohne Entwickler oder ohne Updates möglicherweise nie wieder nutzbar sind
- Es wird ein Tweet zitiert, nach dem DOS-Programme seit den 1980er Jahren auf vielen Computern ohne Änderungen laufen, während eine JavaScript-App schon durch das nächste Chrome-Update kaputtgehen kann
- Selbst eine Webseite, die heute einwandfrei funktioniert, könnte in zehn Jahren in keinem Browser mehr richtig laufen
- Man kauft ein neues Smartphone und ein neues MacBook, um am Ende dieselben Apps nur langsamer auszuführen — und dieser Zustand wiederholt sich ständig
Gesunkene Qualitätserwartungen
- Wenn Webseiten Probleme machen, verlangen sie oft einfach, dass man neu lädt, statt die Ursache zu untersuchen
- Web-Apps können selbst in kompatiblen Browsern „zufällige“ JavaScript-Fehler ausspucken
- Kritisiert wird, dass Webseiten und SQL-Datenbankdesigns auf der Hoffnung beruhen, dass sich Daten nicht ändern, während man die gerenderte Webseite betrachtet
- Funktionen für Zusammenarbeit bleiben oft auf dem Niveau von „best effort“ und enthalten alltägliche Szenarien, in denen Daten verloren gehen können
- Dialoge wie „Welche Version möchten Sie behalten?“ bedeuten faktisch oft nur, auszuwählen, welches Arbeitsergebnis zerstört werden soll
- Linux ist trotz eines Designs, das Prozesse willkürlich töten kann, das populärste Betriebssystem auf Servern
- Beispiele wie Dell-Monitore, AirDrop und Bluetooth zeigen, dass Software in Geräten und komplexe Spezifikationen Erfahrungen erzeugen, die von periodischen Resets oder Glück abhängen
- Um etwas zuverlässig Funktionierendes zu liefern, muss man das Gebaute von innen und außen verstehen; in übermäßig aufgeblasenen Systemen ist das jedoch schwierig
Verwirrung bei Programmierwerkzeugen und Entwicklungspraktiken
- Selbst bei Grundelementen wie Paketverwaltung, Build-Systemen, Compilern, Sprachdesign und IDEs ist schnelle, effiziente und langlebige Reife schwer zu finden
- Build-Systeme verfügen über alle Informationen zu Änderungen und verlangen dennoch regelmäßig, alles zu löschen und neu zu machen
- Es gebe keinen Grund, warum sie nicht zuverlässig, vorhersehbar und reproduzierbar gemacht werden könnten
- NPM habe jahrelang in einem Zustand verharrt, den man als „funktioniert manchmal“ beschreiben könne
- Es wird ein Tweet zitiert, wonach
rm -rf node_modulesin der Node.js-/JavaScript-Entwicklung unvermeidlich wirke
- Dass Compiler und Vor- oder Nachverarbeitung Minuten oder Stunden dauern dürfen, steht im Widerspruch zu der Aussage, die Zeit des Programmierers sei wichtig
- Fälle, in denen Hadoop gewählt wird, obwohl es langsamer ist als die Ausführung auf einem einzelnen PC, zeigen, dass Programmierer nicht immer rationale Entscheidungen treffen
- Maschinelles Lernen und „künstliche Intelligenz“ hätten Software in ein Zeitalter unzuverlässiger Vermutungen verschoben
- Ein Tweet wird zitiert, nach dem Apps oder Dienste mit „künstlicher Intelligenz“ oder „Machine Learning“ als unzuverlässig, unvorhersehbar und schwer erklärbar zu lesen seien
- Linux in einer VM zu betreiben und in der VM dann Docker zu verwenden, wird als Zeichen interpretiert, dass man nicht weiß, wie man Programme, Sprachen und Laufzeitumgebungen sauber aufräumt
- Dass die einzelne ausführbare Datei von Go als zentraler Vorteil gilt, zeige eine Lage, in der es schon als Erfolg gilt, einfach kein totales Chaos zu sein
- Abhängigkeiten lösen einfache Probleme als „komplette Paketlösung“, ziehen dabei aber Einführungskosten und weitere Abhängigkeiten nach sich
- Es wird kritisiert, dass Programme kaum über Jahre ohne Neustart genutzt werden können, manchmal nicht einmal über Tage
- Prozessneustarts, Datenbank-Restarts, Watchdogs, die Apps alle 20 Minuten neu starten, redundante Ressourcen und komprimierte Übertragung sind Wege, schnell weiterzumachen, statt Dinge zu reparieren
- Solche Praktiken seien keine Ingenieurskunst, sondern faules Programmieren; Ingenieurskunst bedeute, Leistung, Struktur und Grenzen des Gebauten tief zu verstehen
Aufgetürmte Komplexität und Gleichgültigkeit des Marktes
- Heutige Software ist ein Zustand, in dem auf Code, der gerade so funktioniert, wieder Code gestapelt wird, der ebenfalls gerade so funktioniert; alles wächst weiter, wird komplexer, und die Chancen auf Veränderung schwinden
- Ein gesundes Ökosystem braucht gelegentlich einen Rückschritt, bevor es wieder vorangeht, doch seit 25 Jahren habe man keinen neuen OS-Kernel gesehen, und inzwischen sei alles zu komplex geworden, um es neu zu schreiben
- Auch bei Browsern sei es wegen Edge Cases und historischer Altlasten schwer, eine Layout-Engine von Grund auf neu zu schreiben
- Der heutige Fortschritt wirkt, als würde man zur Lösung von Monolith-Problemen Microservices einführen, zur Lösung von Microservices-Problemen Docker und zur Lösung von Docker-Problemen Kubernetes — also immer mehr Brennstoff ins Feuer gießen
- Es wird ein Tweet zitiert, wonach man von XML-basierter deklarativer Konfiguration zu YAML-basierter Microservices-Konfiguration gewechselt sei, XML aber wenigstens noch ein Schema hatte
- Nutzer können am Ende nur akzeptieren, was Ingenieure liefern, und haben selbst bei 350-MB-Android-Apps, ruckelndem Scrollen oder „Wenn es nicht funktioniert, starten Sie neu“ kaum Alternativen
- Wenn konkurrierende Produkte ebenfalls langsam, groß und qualitativ schwach sind, entsteht kaum Wettbewerbsdruck
- Produkte, die zeitweise Spannung erzeugen — etwa iPhone/iOS gegenüber anderen Smartphones oder Chrome gegenüber anderen Browsern — halten aus dieser Sicht nicht lange an
- Die Aufgabe von Ingenieuren sollte sein zu zeigen, was auf modernen Computern bei Leistung, Zuverlässigkeit, Qualität und Verfügbarkeit möglich ist
Dennoch sichtbare Alternativen
- Martin Thompsons LMAX Disruptor, SBE und Aeron werden als beeindruckende, einfache und effiziente Beispiele genannt
- Raph Leviens Xi editor wird als mit den richtigen Prinzipien im Hinterkopf gebaut bewertet
- Jonathan Blow entwickelte für sein Spiel eine eigene Sprache und kann auf seinem Laptop 500.000 Zeilen Code in 1 Sekunde vollständig neu kompilieren
- Das Ergebnis ist ein vollständiger Neu-Compile, kein inkrementeller Build und keine Zwischen-Cache-Lösung
- Zum Schreiben schneller Programme brauche es weder Genie noch Magie; man müsse nur vermeiden, auf einem gigantischen Müllhaufen aus trendigen Toolchains zu bauen
Forderungen für bessere Software
- Software Engineering darf nicht im aktuellen Zustand verharren, sondern muss besser werden; es gibt keinen Grund, immer wieder dasselbe nur langsamer und größer zu bauen
- Die heutige Entwicklung ähnelt weniger Fortschritt als einem Zustand, in dem auf brüchigen Werkzeugen gerade so die Geschäftsziele erfüllt werden
- Es wird kritisiert, dass man sich durch lokale Optimierung an Aufblähung und Ineffizienz gewöhnt habe
- Ingenieure können und sollten mit besseren Werkzeugen bessere Apps mit um ein Vielfaches weniger Ressourcen schnell, vorhersehbar und zuverlässig bauen
- Um zuverlässige, vorhersehbare und hochwertige Produkte zu liefern, muss man vollständig verstehen, was man warum tut; die Ausrede „So ist es eben gegeben“ ist nicht akzeptabel
2 Kommentare
Für diesen Text gibt es bereits seit Längerem eine koreanische Übersetzung, sehen Sie sich also bitte diese an.
https://tonsky.me/blog/disenchantment/ko/
Ich habe den Link direkt durch den Übersetzungslink ersetzt.
Meinungen auf Hacker News
Kleinerer, saubererer, weniger fehleranfälliger, sichererer, schnellerer und langlebigerer Code ist natürlich möglich. Wenn wir das schon in den Anfangstagen des Informationszeitalters geschafft haben, gibt es keinen Grund, warum wir es heute mit Jahrzehnten an Erfahrung und mächtigen Werkzeugen nicht schaffen sollten.
Der Grund, warum wir es nicht tun, ist, dass damit kein Geld zu verdienen ist – tatsächlich ist eher das Gegenteil der Fall. VC-finanzierte Startups müssen zuerst auf den Markt, um zu überleben, und auch in reifen Organisationen sind Kosten und Aufblähung kein Problem, sondern funktionieren fast wie ein Feature, das das Prestige von Managern erhöht. Am Ende werden die Kosten an die Kunden weitergereicht.
Dass die „unerbittlichen Marktkräfte“ diese Verschwendung nicht korrigieren, liegt wohl daran, dass eine bessere Codebasis zwar irgendwann den Schlüssel zum Königreich bekommen könnte, das reale Wettbewerbsumfeld aber zu anfällig für Pathologien und Moden ist.
Was man allerdings leichter tun kann als VC-finanzierte Unternehmen, ist, Zeit für Refactoring und den Abbau technischer Schulden einzuplanen. Tatsächlich treten wir gerade 45 Tage lang bei der Entwicklung neuer Funktionen kräftig auf die Bremse und kümmern uns um wichtige technische Probleme. Wenn man erwartet, nächstes Jahr übernommen zu werden, ist es schwer, solche Investitionen zu tätigen, und technische Schulden werden zum Problem anderer Leute.
Solange ein Produkt weiterentwickelt wird, entstehen ständig neue Bugs und Probleme. „Perfekter Code“ ist nur in einem geschlossenen Kontext möglich, in dem keine neuen Funktionen mehr hinzugefügt werden.
Ich denke, das VC-Investmentmodell hat die Branche dorthin getrieben. Startups bekommen Millionen von Dollar und müssen schnell genug Geld verdienen, um die Investoren zufriedenzustellen; also müssen sie so schnell wie möglich Geld aus der App pressen. Arbeit, an der keine ROI-Kennzahl hängt, interessiert niemanden.
Im Grunde gab es offenen Zugriff, keine Passwörter oder kurze Passwörter, unsichere Passwortspeicherung, alles im Klartext, ignorierte Eingabebereinigung, Dinge wie telnet.
Darin liegt ein weiterer Grund, warum Software aufgeblähter geworden ist. Wir haben begonnen, Interaktionen und Risiken zu sehen, und wenn man sie einmal sieht, kann man nicht mehr so tun, als hätte man sie nicht gesehen. Die Randfälle, die behandelt werden müssen, werden nicht weniger, sondern mehr, und auch die zu unterstützende Hardware wird vielfältiger.
Der Prozess, performanten Code zu schreiben, kann verbessert werden, aber gleichzeitig steigt die Messlatte schneller, als wir sie erreichen. Interessant ist auch, dass wir uns jetzt wieder langsam in Richtung passwortloser Systeme bewegen.
Eine hohe Unit-Test-Abdeckung, die Refactoring schmerzhaft macht, behindert oft die Veröffentlichung von Funktionen – und meiner Meinung nach deutlich häufiger, als Test-Driven-Development-Fanatiker zugeben wollen. Viele „Best Practices“ der Branche sind eher unrealistische Dogmen, die von Leuten in Unternehmen entwickelt wurden, die Product-Market-Fit bereits gefunden haben und bei denen das Geld von selbst hereinkommt.
Ich habe noch einen HP MS200 All-in-One, der gerade noch benutzbar ist. Ich habe ihn 2017 günstig auf einem Garagenverkauf gekauft, und mit Linux konnte er, sobald Chrome geladen war, im Web-Client von Skype Vollbild-Videoanrufe oder YouTube im Vollbild abspielen.
Kürzlich habe ich ihn wiederbekommen und vor der Einrichtung als Kindercomputer FC38 und das aktuelle Chrome installiert; danach wurden YouTube-Videos zur Diashow. Egal, welche Einstellungen ich änderte, es half nichts. Als ich den RAM von 2 GB auf 3 GB erhöhte, war er wieder auf dem Niveau von vor sechs Jahren: 720p-Wiedergabe im Vollbild.
Für dieselbe Aufgabe braucht man also 1,5-mal so viel Speicher, 1 GB mehr. Ich weiß auch, dass 16 GB als Minimum gelten, aber selbst auf dieser miesen Maschine zeigt Chrome, obwohl es fast nur ein im Leerlauf befindlicher Webbrowser ist, einen Speicher-Footprint von etwa 30 GB an. Das meiste davon werden per mmap eingebundene Dateien sein, aber trotzdem: 30 GB.
Umgekehrt sind auf den meisten Geräten längere Akkulaufzeit, niedrigere Temperaturen sowie geringerer RAM- und Speicherbedarf klare Verbesserungen. YouTube könnte alte Encodings zusätzlich auf seinen Servern behalten, aber wenn die meisten Nutzer mit modernen Geräten zugreifen, wäre das Platzverschwendung.
Der größte Teil des gestiegenen RAM-Verbrauchs von Chrome stammt aus der Weiterentwicklung der Sandbox-Architektur. Gemeinsamer Speicher und Prozessräume können für Sandbox-Escape-Angriffe genutzt werden, daher wurde mehr Isolation hinzugefügt; außerdem ist es ein großer Faktor, dass Chrome für jeden Tab und jede Erweiterung einen neuen unabhängigen Prozess startet.
Heutzutage haben auch Adblocker großen Einfluss. Da das Web schlechter geworden ist, sind wirksame Adblocker schwieriger zu bauen und benötigen mehr Ressourcen. Langsame Software ist nicht einfach langsamer geworden, um Menschen zu ärgern; oft ist sie das Ergebnis davon, gefährliche Hacks durch gute Implementierungen zu ersetzen und geänderte Anforderungen zu erfüllen. FLV reicht längst nicht mehr aus, und auch h264 wird es schwer haben, in fünf Jahren noch lange durchzuhalten, wenn h265 und AV1 weiter verbreitet sind.
Moderne Toolchains konzentrieren sich auf „das Rad nicht neu erfinden“, aber wenn jede Abhängigkeit eine andere Version des Rads gewählt hat, zieht man schon mit ein paar Abhängigkeiten sechs Implementierungen derselben Low-Level-Funktion herein.
Installiert war allerdings Flatpak, und es fühlte sich aufgebläht an. Zum Glück lässt sich Chrome noch direkt nativ als RPM installieren und nutzt tatsächlich die Shared Libraries des OS.
Dieser Text berührt nicht einmal den Kernschmerz: Bugs. Fast jede Software fühlt sich an, als wäre sie so verbuggt wie nur möglich. Jedes Mal, wenn ich Software auf einem ungewöhnlichen Pfad oder in einem nicht normalen Ablauf benutzen muss, bekomme ich Angst – und fast immer scheitert es.
Vor Kurzem habe ich beim Verkauf meines Autos an Carvana nur mit Mühe zwischen Chrome und Firefox hin und her gewechselt, bis es endlich klappte. In Chrome warf der Assistent zum Hochladen von Bildern eine JS-Exception; dieser Teil funktionierte wie durch ein Wunder nur in Firefox, aber der Rest der Website hatte so viele Probleme, dass offensichtlich war, dass Firefox kaum getestet worden war.
Noch schlimmer ist, dass nichttechnische Nutzer, wenn sie auf Bugs stoßen, denken, sie hätten etwas falsch gemacht. Selbst wenn Software aufgebläht und langsam ist: Wenn sie stabil und robust wäre, würde ich das inzwischen bereitwillig akzeptieren.
Andererseits sehe ich ständig, wie verbuggt alles ist, und ich weiß nicht, ob es tatsächlich mehr Bugs geworden sind oder ob ich, je älter ich werde und je mehr ich die Interna kenne, einfach weniger Geduld für Softwareentwicklung nach Großkonzern-Art habe. Ich ärgere mich über den imaginären Product Owner, der sagt: „Feature X muss sofort raus“, obwohl offensichtliche UX-Bugs leicht zu finden wären.
Ich verstehe Argumente wie Kosten, Opportunitätskosten und Pragmatismus und stimme ihnen teilweise zu, aber manchmal lässt sich das Gefühl kaum abschütteln, dass wir einfach akzeptiert haben, in einer halb fertig gebauten Welt zu leben.
Ich glaube nicht, dass es heute besser ist. Wenn kleine Kinder ein Smartphone oder einen Laptop in die Hand bekommen, können sie moderne Geräte ziemlich zuverlässig zum Hängen, Einfrieren und Abstürzen bringen, indem sie nur Tasten zu schnell oder in unerwarteter Reihenfolge drücken. Sie machen physisch nichts kaputt – und trotzdem ist das der Zustand moderner Technik.
Ich verstehe, warum es nicht behoben wurde. Die Leute haben sich daran gewöhnt, dass gelegentlich ein Neustart nötig ist; in solchen Fällen ist es leicht, dem Kind die Schuld zu geben, und ein Neustart löst das Problem. Trotzdem hätte ich gehofft, dass Betriebssysteme über ihren Lebenszyklus hinweg inzwischen besser geworden wären.
In meinem Text über C habe ich es nicht erwähnt, aber einer der Hauptgründe, warum ich C verwende, ist, dass es schwer ist, damit Software aufzublähen. Man kann Funktionen hinzufügen, aber es ist nicht leicht, dass eine einzelne Funktion gleich 100 KB zur ausführbaren Datei hinzufügt.
Ich bin derzeit nicht angestellt, nutze aber für „Arbeit“ eine leistungsstarke Maschine. Trotzdem verwende ich statt einer IDE Neovim und tmux, statt einer gewöhnlichen Linux-Distribution ein stark angepasstes Gentoo und statt systemd OpenRC; außerdem nutze ich statt einer vollständigen Desktop-Umgebung den Tiling-Window-Manager Qtile.
Ich halte die Maschine schlank, sodass direkt nach dem Booten und Einloggen nur 40 Prozesse laufen. Im Moment betreibe ich wirklich Software-Engineering. Ich versuche, die Probleme von C effektiv abzumildern und die Software gleichzeitig klein und schnell zu halten, und hoffe, darauf eines Tages ein Geschäft aufbauen zu können.
Ich werde wohl sehen, ob es noch einen Markt für schlanke, flinke Software gibt.
https://gavinhoward.com/2023/02/why-i-use-c-when-i-believe-i...
https://gavinhoward.com/2020/12/my-development-environment-a...
https://gavinhoward.com/2023/06/an-apology-to-the-gentoo-aut...
https://gavinhoward.com/2023/09/lessons-learned-as-a-user-3-...
Programme wie WordPerfect, Lotus 123, MS-DOS 1.0 und SubLogic Flight Simulator vor der Übernahme durch Microsoft wurden in den 1980ern in Assembler geschrieben. Branchenbeobachter sahen damals, dass Microsoft bei MS Word und MS Excel schneller neue Funktionen iterierte und schneller auf andere Architekturen portierte als WordPerfect und Lotus 123, weil diese Programme in „aufgeblähtem“ C geschrieben waren. Die Konkurrenten blieben zu lange bei Assembler.
Bei persönlicher Software sehe ich denselben Trade-off. Wenn man statt schlankerem C/C++ ein höheres und „aufgeblähteres“ C#/Python verwendet, kann man bestimmte Aufgaben viel schneller erledigen. Ich bin in C++ geübter und bevorzuge kleine ausführbare Dateien, aber wenn C# die gewünschte Arbeit schneller fertig bekommt, wird dieser Vorteil bedeutungslos. Auch ich bin Teil des Problems aufgeblähter Software.
„Ich werde die stärkste und leichteste Brücke der Welt bauen“ ist etwas Wunderbares; „ich werde eine Brücke bauen, die leicht genug und stark genug ist, zu Kosten, die der Kunde tragen kann“ ist Engineering.
Ich habe etwas mehr als die Hälfte gelesen und dann aufgehört, aber die zentrale These schien zu sein, dass Software schnell sein müsse; an eine Rechtfertigung dieser Philosophie erinnere ich mich außer der Andeutung „das ist einfach wahr“ nicht. Der Einwand, dass es Fälle gibt, in denen Effizienzgewinne die Zeitkosten der Effizienzjagd niemals aufwiegen, wurde zwar anerkannt, aber die Argumentation wurde nicht wirklich aufgegriffen
Ein weiteres zentrales Merkmal des Textes war das Cherry-Picking von Daten und die übermäßige Vereinfachung des Bereichs. Mehrfach wird emotional gefragt: „Was zum Teufel macht Software eigentlich mit all dieser Zeit und diesem Speicherplatz?“, aber es wird nicht ernsthaft versucht, diese Frage zu beantworten; stattdessen wird die Tatsache, dass keine Antwort gegeben wird, wie ein Beleg für eine falsche Antwort benutzt. Teilweise werden auch mehrere Softwareprodukte ohne Funktionsgleichheit so verglichen, als unterschieden sie sich nur in der Performance
Über die sozialen, ökologischen und geschäftlichen Kosten von Ineffizienz und über effizientere Software ließe sich viel sagen, aber auch der Punkt ist diskussionswürdig, dass moderne Software Menschen, die sonst überhaupt nichts bauen könnten, ermöglicht, etwas „Schlechtes“ zu bauen, das sie brauchen. So wie Bauingenieure etwas auswählen, das „stark genug“ ist, zielen moderne Entwickler oft auf etwas ab, das „schnell genug“ ist
Es gibt reichlich Stoff für eine gute Debatte, aber dieser Text blieb bei emotionaler Empörung stehen und setzte sich nicht wirklich mit Vernunft und Argumenten auseinander. In einigen Behauptungen steckt Wahrheit, aber der Text selbst hat meiner Meinung nach deutlich gemacht, dass er gar nicht diskutieren will
Auch das Netzwerk ist wahrscheinlich kein 2G mit ein paar kbit/s, sondern 5G oder Glasfaser mit Hunderten Mbit/s. Am Ende sprechen Taten lauter als Worte, und wenn die Gesellschaft als Ganzes dem Axiom „schnellere Software“ folgt, kann man es als Tatsache akzeptieren
Besonders, weil es ein Axiom aus derselben Ecke ist wie die Behauptung „Entwicklerzeit ist wertvoller“; der Unterschied liegt nur darin, wessen Zeit man spart
Wenn Entwickler nicht auch auf Low-End-Geräten testen, bekommen sie dieses Problem überhaupt nicht mit. Das eigentliche Problem ist weniger technischer Natur als die Haltung mancher Entwickler, defensiv zu werden und erst einmal zu diskutieren, wenn sie mit der unbequemen Wahrheit konfrontiert werden, dass ihr Code zu langsam ist. Man sollte sich mit dem Produktmanager zusammensetzen, Zeit für Profiling und Optimierung einplanen und prüfen, wie sich Performance-Probleme entschärfen lassen, ohne alles von Grund auf neu zu bauen
BASIC und SQL hatten schon vor langer Zeit den Zweck, Menschen zu ermöglichen, etwas „Schlechtes“ zu bauen, und dasselbe gilt für Fortran und viele inzwischen verschwundene Sprachen und Technologien
Python oder Java sind wohlwollend betrachtet konservativ; wenn man an die Fortschritte bei Programmiersprachen in den 70ern denkt, müsste man sie eigentlich anachronistisch nennen. J oder Prolog sind konzeptionell viel weiter als Rust oder Go, wurden aber früher entwickelt. Ob C in seiner von C89 bis C23 akkumulierten Form eine moderne Sprache ist, ob nur C23 modern ist, oder ob es zwischen C89 und C23 wirklich einen großen Unterschied gibt, ist ebenfalls unklar
Wenn es nicht um den Entstehungszeitpunkt oder einen imaginären Evolutionsbaum geht, frage ich mich, ob es eine andere Möglichkeit gibt, Modernität zu definieren
Das ist eine alte Beschwerde. Viele Bequemlichkeiten, die wir als selbstverständlich ansehen, haben Kosten, und diese Kosten summieren sich beträchtlich. Ein 4K-Bildschirm hat 17-mal so viele Pixel wie 800x600 und verwendet 32-Bit-Farbe, wodurch die Rohgröße von Grafiken für moderne Displays etwa 68-mal größer wird
Früher reichten statische Bilder aus, heute sind hochwertige Animationen mit hoher Bildrate Standard. Arial Unicode ist eine 15 MB große Schriftart und hätte wohl nicht einmal in den Arbeitsspeicher der meisten Computer gepasst, auf denen Windows 95 lief
Rechtschreibprüfung überall ist selbstverständlich geworden, und solche Dinge summieren sich. Trotzdem machen sie Computer deutlich angenehmer. Ich vermisse weder 16-Farben-Videomodi noch die Zeit, in der man ohne extrem nervige Workarounds nicht zwei nicht-englische Sprachen gleichzeitig verwenden konnte
Aber Animationen, deren einziger Zweck darin besteht, Wartezeiten weniger langweilig erscheinen zu lassen, will ich nicht. Unicode ist die Kosten ebenfalls wert
Trotzdem sollte man Glyphen wie 1981 innerhalb einstelliger Millisekunden auf den Bildschirm zeichnen können. Es gibt mehr Pixel und mehr Glyphen, aber es ist möglich; es hat nur keine Priorität
Das ist so ähnlich, als würde man 100.000 Dollar für einen Performance-BMW bezahlen und der Ingenieur sagt, 0–60 mph dauere 30 Sekunden, und der Nutzer müsse das akzeptieren, weil er kein Performance-Experte ist
In meiner aktuellen Organisation habe ich einen ähnlichen Verlauf gesehen. Am Anfang, als das Team klein war, waren Details wichtig. Es durfte nicht langsam sein, Animationen mussten flüssig laufen, Scrollgeschwindigkeit und Ladezeiten waren wichtig, und man wollte das effizienteste Produkt bauen, um die Effizienz der Nutzer zu erhöhen.
Als das Team wuchs, verschob sich der Wert hin zur Steigerung der Entwicklereffizienz. Mehr Abstraktionen, Schichten und Frameworks kamen hinzu, und der Kompromiss, einen Entwicklertag zu sparen, dafür aber insgesamt Millionen Sekunden der Nutzer zu verbrauchen, wurde akzeptiert.
Der Unterschied liegt in der Sichtbarkeit. Das Management kann die Kosten auf Entwicklungsseite sehen, aber nicht den Nutzen von etwas schnellerer Ausführungszeit, besserem Caching oder flüssigerem Scrollen. Weil das nicht gemessen wird. Wenn eine Organisation an den Punkt kommt, an dem sie sich nur noch um messbare Zahlen kümmert, wirkt diese Entwicklung natürlich.
Natürlich nur, bis AI den Punkt erreicht, an dem sie alles reparieren kann, was wir schlecht geschrieben haben, oder was AI schlecht geschrieben hat, und sogar die sehr ineffiziente AI selbst, wie es der Originalbeitrag vorhersagt.
Autos wurden erst nach einem externen Ölschock optimiert, und selbst das sehr ungleichmäßig. Tatsächlich sind ineffiziente Produkte oft profitabler, weil Kunden sie häufiger ersetzen müssen. Ein mieses iPhone-Kabel, das nach einem Jahr aufreißt, ermöglicht es Apple, wieder und wieder Ersatz in Rechnung zu stellen. Weiße Ware geht häufiger kaputt, wird aber billiger hergestellt und erhöht so den Gewinn pro Einheit. Entscheidend ist nicht die Nutzungseffizienz nach dem Verkauf, sondern die Produktionseffizienz.
In Software funktioniert Kapitalismus so, dass neue Automatisierung möglichst schnell herausgeschleudert wird und die Verbraucher die Energie- und Zeitverschwendung tragen. Die Produktionskette wird immer stärker standardisiert und optimiert, sodass React-Entwickler oder Kubernetes-Administratoren wie Lagerarbeiter austauschbar werden, mit entsprechendem Lohndruck. Ein Teil der Automatisierung ist fast selbstrechtfertigend, so wie man Buchhaltungsbegriffe verkompliziert, um einen Beruf zu legitimieren; beim Rest geht es um Gewinn.
Alles hat Kosten. Wenn die Rechenkosten oder die schlechtere User Experience groß genug sind, optimiert man auf Effizienz. ML-Modelle sind ein Beispiel. In anderen Fällen optimiert man nicht, weil Endnutzer das nicht wollen, wenn sie dafür weniger Funktionen akzeptieren müssten.
Autos haben früher ebenfalls viel Sprit verbraucht, aber wegen Kraftstoffkosten und Umweltbedenken wollten Kunden schließlich etwas anderes, und das änderte sich. Viele Ingenieure vergessen, dass sie dafür bezahlt werden, Produkte für Kunden zu bauen.
Außerdem scheint der Autor des Originalbeitrags nie darauf gewartet zu haben, dass ein alter Windows- oder Linux-Rechner vollständig hochfährt. Moderne Versionen booten viel schneller, weil Kunden das wollten. Telefone sind rund um die Uhr eingeschaltet, daher interessiert es Kunden nicht, wenn der Bootvorgang alle paar Monate einmal lange dauert.
Mein BIOS braucht etwa 20 Sekunden für den POST, und angeblich ist das normal. Danach dauert der OS-Boot etwa 10 Sekunden.
Man könnte auch sagen, Ärzte oder Ingenieure würden dafür bezahlt, neue Medikamente oder neue Energiequellen zu entwickeln, aber weil diese Bereiche sensibel und wichtig sind, gibt es dort mehrere Ebenen staatlicher Kontrolle. Bei Software gibt es dieses Maß an Kontrolle noch nicht.
Sie haben die Macht, die Umgebung selbst zu formen, und können dadurch das Ergebnis von „Kundenanforderungen“ stark umlenken.
Dieser Artikel stammt aus dem Jahr 2018, und es gab schon einige frühere Diskussionen dazu.
https://news.ycombinator.com/item?id=18012334 (Sep 2018)
https://news.ycombinator.com/item?id=21929709 (Jan 2020)
https://news.ycombinator.com/item?id=31798580 (Jun 2022)
Ich stimme dem sehr zu. Als Entwickler ist es wichtig, sich daran zu erinnern, dass wir eine Wahl haben. Wir können nicht über alles entscheiden, aber wir können die weniger schlechte Alternative wählen.
Man muss nicht unbedingt Node verwenden. Auch im .NET- oder JVM-Ökosystem kann man hervorragende, abwärtskompatible Software schreiben und erwarten, dass sie in zehn Jahren noch unverändert läuft.
Man muss auch nicht zwingend Single-Page-Webseiten bauen. Altmodisches HTML, bei dem die Seite bei jedem Klick vollständig neu geladen wird, funktioniert gut und kann zu diesem Zeitpunkt sogar eine geringere Latenz haben.
Man muss Desktop-Apps auch nicht zwingend mit Chromium bauen. Ein UI-Framework aufzusetzen macht etwas mehr Arbeit, aber die Qualität ist es wert. Man hat nicht immer die Entscheidungsgewalt, aber wenn man sie hat, sollte man aus schlechten Entscheidungen aussteigen.