Penso che sia difficile raggiungere tutti e tre. Due penso che possano essere fattibili. Ad esempio, penso che sia possibile ottenere efficienza e leggibilità in alcuni casi, ma la manutenibilità potrebbe essere difficile con il codice microtun sintonizzato. Il codice più efficiente del pianeta in genere mancherà sia di manutenibilità che di leggibilità, come è probabilmente ovvio per la maggior parte, a meno che tu non sia il tipo in grado di capire la mano Codice SIMD multithread vettorializzato a mano che Intel scrive con assembly incorporato o il più efficace -edge algoritmi utilizzati nel settore con documenti matematici di 40 pagine pubblicati solo 2 mesi fa e 12 biblioteche di codice per una struttura di dati incredibilmente complessa.
Micro-Efficiency
Una cosa che suggerirei che potrebbe essere contraria all'opinione popolare è che il codice algoritmico più intelligente è spesso più difficile da mantenere rispetto all'algoritmo più microtunito. Questa idea secondo cui i miglioramenti della scalabilità generano più denaro per il codice micro-sintonizzato (es: schemi di accesso compatibili con la cache, multithreading, SIMD, ecc.) Sono qualcosa che sfiderei, almeno avendo lavorato in un settore pieno di estremamente complesso strutture di dati e algoritmi (il settore degli effetti visivi), specialmente in settori come l'elaborazione della mesh, perché il botto potrebbe essere grande ma il dollaro è estremamente costoso quando si introducono nuovi algoritmi e strutture di dati di cui nessuno ha mai sentito parlare da quando sono marchi nuovo. Inoltre, io '
Quindi questa idea che le ottimizzazioni algoritmiche prevalgono sempre, diciamo, sulle ottimizzazioni legate ai modelli di accesso alla memoria è sempre qualcosa con cui non sono del tutto d'accordo. Ovviamente se stai usando una sorta di bolla, nessuna quantità di micro-ottimizzazione può aiutarti lì ... ma, a ragion veduta, non credo sia sempre così ben definita. E probabilmente le ottimizzazioni algoritmiche sono più difficili da mantenere rispetto alle microottimizzazioni. Troverei molto più facile mantenere, per esempio, Embree di Intel che prende un algoritmo BVH classico e semplice e ne sintonizza semplicemente la cazzata rispetto al codice OpenVDB di Dreamwork per modi all'avanguardia di accelerare algoritmicamente la simulazione fluida. Quindi, almeno nel mio settore, mi piacerebbe vedere più persone che hanno familiarità con l'architettura del computer e micro-ottimizzazione di più, come ha fatto Intel quando sono entrati in scena, al contrario di trovare migliaia e migliaia di nuovi algoritmi e strutture di dati. Con efficaci micro-ottimizzazioni, le persone potrebbero potenzialmente trovare sempre meno ragioni per inventare nuovi algoritmi.
Ho lavorato in una base di codice legacy prima in cui quasi ogni singola operazione dell'utente aveva una propria struttura di dati e un algoritmo unici dietro (aggiungendo fino a centinaia di strutture di dati esotici). E la maggior parte di loro aveva caratteristiche prestazionali molto distorte, essendo strettamente applicabili. Sarebbe stato molto più semplice se il sistema potesse ruotare intorno a un paio di dozzine di strutture di dati ampiamente applicabili, e penso che sarebbe potuto essere il caso se fossero state micro-ottimizzate molto meglio. Cito questo caso perché la micro-ottimizzazione può potenzialmente migliorare enormemente la manutenibilità in questo caso se ciò significa la differenza tra centinaia di strutture di dati micro-pessimizzate che non possono nemmeno essere utilizzate in modo sicuro per scopi di sola lettura rigorosi che comportano mancate mancanze della cache e destra vs.
Linguaggi Funzionali
Nel frattempo alcuni dei codici più gestibili che abbia mai incontrato erano ragionevolmente efficienti ma estremamente difficili da leggere, poiché erano scritti in linguaggi funzionali. In generale, la leggibilità e la superabilità sono idee contrastanti secondo me.
È davvero difficile rendere il codice leggibile, mantenibile ed efficiente tutto in una volta. In genere è necessario scendere a compromessi in una di quelle tre, se non due, come compromettere la leggibilità per la manutenibilità o compromettere la manutenibilità per l'efficienza. Di solito è la manutenibilità che soffre quando cerchi molti degli altri due.
Leggibilità vs. manutenibilità
Ora, come detto, credo che la leggibilità e la manutenibilità non siano concetti armoniosi. Dopo tutto, il codice più leggibile per la maggior parte di noi mortali è mappato in modo molto intuitivo ai modelli di pensiero umani, e i modelli di pensieri umani sono intrinsecamente soggetti a errori: " Se questo accade, fallo. Se ciò accade, fallo. Altrimenti. Oops. , Ho dimenticato qualcosa! Se questi sistemi interagiscono tra loro, questo dovrebbe accadere in modo che questo sistema possa farlo ... oh aspetta, che dire di quel sistema quando questo evento viene attivato?"Ho dimenticato la citazione esatta, ma qualcuno una volta ha detto che se Roma fosse costruita come un software, ci vorrebbe solo un uccello che atterra su un muro per farla crollare. Questo è il caso della maggior parte dei software. È più fragile di quanto ci interessi spesso Alcune righe di codice apparentemente innocuo qua e là potrebbero fermarlo al punto da farci riconsiderare l'intero progetto, e linguaggi di alto livello che mirano a essere il più leggibili possibile non fanno eccezione a tali errori di progettazione umana .
I linguaggi puri funzionali sono quasi invulnerabili a ciò come si può ottenere (nemmeno vicino a invulnerabili, ma relativamente molto più vicini della maggior parte). E questo in parte perché non si associano in modo intuitivo al pensiero umano. Non sono leggibili. Costringono su di noi schemi di pensiero che ci obbligano a risolvere i problemi con il minor numero possibile di casi speciali utilizzando la minima quantità di conoscenza possibile e senza causare effetti collaterali. Sono estremamente ortogonali, permettono spesso di cambiare e cambiare il codice senza sorprese, così epico che dobbiamo ripensare il design su un tavolo da disegno, fino al punto di cambiare idea sul design generale, senza riscrivere tutto. Non sembra essere più facile da mantenere di così ... ma il codice è ancora molto difficile da leggere,