Per me è una proporzione di stabilità (come nel cemento cementato, nell'argilla cotta nel forno, incastonata nella pietra, scritta con inchiostro permanente). Più instabile è il tuo codice, poiché maggiore è la probabilità che tu debba modificarlo in futuro, più facilmente deve essere flessibile, come l'argilla bagnata, per rimanere produttivo. Sottolineo anche la flessibilità e non la leggibilità. Per me la facilità di modificare il codice è più importante della facilità di leggerlo. Il codice può essere facile da leggere e un incubo da cambiare, e a che serve leggere e comprendere facilmente i dettagli dell'implementazione se sono un incubo da cambiare? A meno che non sia solo un esercizio accademico, in genere il punto di essere in grado di comprendere facilmente il codice in una base di codice di produzione è con l'intento di essere in grado di cambiarlo più facilmente secondo necessità. Se è difficile cambiare, quindi molti dei vantaggi della leggibilità escono dalla finestra. La leggibilità è generalmente utile solo nel contesto della flessibilità e la flessibilità è utile solo nel contesto dell'instabilità.
Naturalmente anche il codice più difficile da mantenere immaginabile, indipendentemente da quanto sia facile o difficile da leggere, non rappresenta un problema se non c'è mai un motivo per cambiarlo, solo usarlo. Ed è possibile ottenere tale qualità, soprattutto per il codice di sistema di basso livello in cui le prestazioni tendono spesso a contare di più. Ho un codice C che uso ancora regolarmente, che non è cambiato dalla fine degli anni '80. Da allora non ha dovuto cambiare. Il codice è fugace, scritto nei giorni difficili, e lo capisco a malapena. Eppure è ancora applicabile oggi, e non ho bisogno di comprenderne l'implementazione per trarne grande utilità.
Scrivere a fondo i test è un modo per migliorare la stabilità. Un altro è il disaccoppiamento. Se il tuo codice non dipende da nient'altro, l'unica ragione per cui cambia è se, di per sé, deve cambiare. A volte una piccola quantità di duplicazione del codice può fungere da meccanismo di disaccoppiamento per migliorare notevolmente la stabilità in un modo che lo rende un degno compromesso se, in cambio, si ottiene un codice che ora è completamente indipendente da qualsiasi altra cosa. Ora quel codice è invulnerabile alle modifiche al mondo esterno. Nel frattempo il codice che dipende da 10 diverse librerie esterne ha 10 volte la ragione per cui cambierà in futuro.
Un'altra cosa utile in pratica è quella di separare la tua libreria dalle parti instabili della tua base di codice, possibilmente anche costruendola separatamente, come potresti fare per le librerie di terze parti (che allo stesso modo dovrebbero essere usate, non modificate, almeno non dal tuo squadra). Proprio quel tipo di organizzazione può impedire alle persone di manometterlo.
Un altro è il minimalismo. Meno il codice tenta di fare, più è probabile che possa fare ciò che fa bene. I progetti monolitici sono quasi permanentemente instabili, poiché più funzionalità vengono aggiunte a loro, tanto più sembrano incomplete.
La stabilità dovrebbe essere il tuo obiettivo principale ogni volta che miri a scrivere un codice che sarà inevitabilmente difficile da modificare, come il codice SIMD parallelizzato che è stato messo a punto con il micro-tuning. Contrastare la difficoltà di mantenere il codice massimizzando la probabilità che non si debba cambiare il codice e quindi non sarà necessario mantenerlo in futuro. Ciò porta a zero i costi di manutenzione, non importa quanto sia difficile mantenere il codice.