Ich denke, es ist schwer, alle drei zu erreichen. Zwei, denke ich, können machbar sein. Zum Beispiel denke ich, dass es in einigen Fällen möglich ist, Effizienz und Lesbarkeit zu erreichen, aber die Wartbarkeit kann mit mikrooptimiertem Code schwierig sein. Der effizienteste Code auf dem Planeten fehlt im Allgemeinen sowohl die Wartbarkeit und Lesbarkeit als wahrscheinlich offensichtlich für die meisten ist, es sei denn , Sie die Art sind, die die Hand SoA-vektorisiert verstehen kann, multithreaded SIMD - Code , dass Intel mit inlined schreibt Montage oder den cutting -edge-Algorithmen, die in der Industrie mit 40-seitigen mathematischen Artikeln verwendet werden, die erst vor zwei Monaten veröffentlicht wurden, und 12 Bibliotheken mit Code für eine unglaublich komplexe Datenstruktur.
Mikroeffizienz
Eine Sache, die meiner Meinung nach der gängigen Meinung widerspricht, ist, dass der intelligenteste algorithmische Code oft schwieriger zu warten ist als der am besten abgestimmte, unkomplizierte Algorithmus. Diese Idee, dass Verbesserungen der Skalierbarkeit im Vergleich zu mikrooptimiertem Code (z. B. cachefreundliche Zugriffsmuster, Multithreading, SIMD usw.) mehr Erfolg bringen, würde ich in Frage stellen, zumindest wenn ich in einer Branche mit extrem komplexen Branchen gearbeitet habe Datenstrukturen und -algorithmen (die Visual FX-Branche), insbesondere in Bereichen wie der Netzverarbeitung, weil der Knall zwar groß sein kann, aber der Preis extrem hoch ist, wenn Sie neue Algorithmen und Datenstrukturen einführen, von denen noch niemand etwas gehört hat, seit sie Marken sind Neu. Weiter, ich '
Diese Vorstellung, dass algorithmische Optimierungen beispielsweise Optimierungen im Zusammenhang mit Speicherzugriffsmustern immer übertreffen, stimmte mir also nicht ganz zu. Natürlich, wenn Sie eine Blasensorte verwenden, kann Ihnen dort keine Mikrooptimierung weiterhelfen ... aber innerhalb der Vernunft denke ich nicht, dass es immer so eindeutig ist. Und algorithmische Optimierungen sind wahrscheinlich schwieriger zu pflegen als Mikrooptimierungen. Ich finde es viel einfacher, beispielsweise Intels Embree zu warten, das einen klassischen und einfachen BVH-Algorithmus verwendet und den Mist nur im Mikromaßstab herausarbeitet, als Dreamworks OpenVDB-Code für innovative Methoden zur algorithmischen Beschleunigung der Flüssigkeitssimulation. Zumindest in meiner Branche würde ich gerne mehr Leute sehen, die mit der Mikrooptimierung von Computerarchitekturen vertraut sind, so wie es Intel getan hat, als sie in die Szene eingetreten sind. im Gegensatz zu Tausenden und Abertausenden neuer Algorithmen und Datenstrukturen. Mit effektiven Mikrooptimierungen könnten Menschen möglicherweise immer weniger Gründe finden, neue Algorithmen zu erfinden.
Ich habe zuvor in einer alten Codebasis gearbeitet, in der fast jeder einzelne Benutzervorgang über eine eigene Datenstruktur und einen eigenen Algorithmus verfügte (insgesamt Hunderte exotischer Datenstrukturen). Und die meisten von ihnen hatten sehr verzerrte Leistungsmerkmale und waren sehr eng anwendbar. Es wäre so viel einfacher gewesen, wenn sich das System um ein paar Dutzend allgemeiner anwendbare Datenstrukturen drehen könnte, und ich denke, dass dies der Fall gewesen wäre, wenn sie viel besser mikrooptimiert worden wären. Ich erwähne diesen Fall, weil die Mikrooptimierung in einem solchen Fall möglicherweise die Wartbarkeit erheblich verbessern kann, wenn es sich um den Unterschied zwischen Hunderten von mikropessimierten Datenstrukturen handelt, die nicht einmal sicher für reine Lesezwecke verwendet werden können, bei denen Cachefehler übrig bleiben richtig gegen
Funktionssprachen
In der Zwischenzeit war einer der wartbarsten Codes, die mir je begegnet sind, einigermaßen effizient, aber äußerst schwer zu lesen, da sie in funktionalen Sprachen geschrieben waren. Im Allgemeinen sind Lesbarkeit und Wartungsfreundlichkeit meiner Meinung nach widersprüchliche Vorstellungen.
Es ist wirklich schwierig, Code gleichzeitig lesbar, wartbar und effizient zu machen. In der Regel müssen Sie bei einem dieser drei Punkte Kompromisse eingehen, wenn nicht bei zwei, z. B. bei der Lesbarkeit oder bei der Wartbarkeit, um die Effizienz zu beeinträchtigen. Es ist in der Regel Wartbarkeit, die leidet, wenn Sie viele der beiden anderen suchen.
Lesbarkeit vs. Wartbarkeit
Nun, wie gesagt, glaube ich, dass Lesbarkeit und Wartbarkeit keine harmonischen Konzepte sind. Schließlich bildet der für die meisten von uns Sterblichen am besten lesbare Code sehr intuitiv menschliche Gedankenmuster ab, und menschliche Gedankenmuster sind von Natur aus fehleranfällig: " Wenn dies geschieht, tun Sie dies. Wenn dies geschieht, tun Sie dies. Andernfalls tun Sie dies. Hoppla Ich habe etwas vergessen! Wenn diese Systeme miteinander interagieren, sollte dies geschehen, damit dieses System dies tun kann ... Oh, was ist mit diesem System, wenn dieses Ereignis ausgelöst wird?"Ich habe das genaue Zitat vergessen, aber jemand hat einmal gesagt, wenn Rom wie eine Software gebaut wäre, müsste nur ein Vogel auf einer Wand landen, um es zum Umfallen zu bringen. Dies ist bei den meisten Programmen der Fall. Es ist zerbrechlicher, als wir es oft tun." Ein paar Zeilen scheinbar harmlosen Codes könnten hier und da dazu führen, dass wir das gesamte Design überdenken, und Hochsprachen, die so gut wie möglich lesbar sein sollen, sind keine Ausnahmen für solche menschlichen Designfehler .
Reine funktionale Sprachen sind dem so nahe wie möglich (nicht annähernd unverwundbar, aber relativ viel näher als die meisten). Und das liegt zum Teil daran, dass sie sich nicht intuitiv auf das menschliche Denken abbilden lassen. Sie sind nicht lesbar. Sie zwingen uns Denkmuster auf, die es uns ermöglichen, Probleme mit möglichst wenigen Sonderfällen mit möglichst geringem Wissen und ohne Nebenwirkungen zu lösen. Sie sind extrem orthogonal und ermöglichen es, den Code häufig zu ändern und zu ändern, ohne dass Überraschungen auftreten, die so episch sind, dass wir das Design auf einem Zeichenbrett überdenken müssen, bis wir unsere Meinung über das Gesamtdesign ändern müssen, ohne alles neu zu schreiben. Es scheint nicht einfacher zu sein, als das zu warten ... aber der Code ist immer noch sehr schwer zu lesen,