"Se lo sviluppo del software è difficile, perché è difficile?"
Primo, lasciatemi dire che lo sviluppo del software probabilmente non è così difficile come molti altri campi. Tuttavia, è difficile, solo non nel modo in cui le persone che non hanno familiarità con esso vedono realmente.
I requisiti raramente corrispondono all'architettura interna del software
Questo non significa che l'architettura o i requisiti siano sbagliati. Significa che stanno usando vocabolari diversi e astrazioni diverse. I requisiti specificano i comportamenti visibili esternamente del software. La complessità è nascosta all'interno.
I clienti raramente conoscono tutti i requisiti
Immaginate di dover spiegare a vostro figlio come pulire il pavimento della cucina. È qualcosa che avete già fatto molte volte. A malapena devi pensare ai dettagli. Spiegate tutti i passi e il bambino è orgoglioso di essere in grado di contribuire in modo utile. La settimana successiva, mentre stai facendo qualcos'altro, vieni interrotto da tuo figlio che ti chiede dov'è la scopa perché la settimana scorsa l'hai tirata fuori quando hai iniziato la spiegazione e non gli hai detto da dove l'hai presa.
Ogni progetto è unico
Non stai sviluppando Fun App 1.0 più e più volte. Stai sviluppando Fun App 1.0, Fun App 1.1, Other Fun App 2.0 (perché sei entrato in quel progetto dopo), Fun App for Windows 1.2, ecc. Ci sono pezzi che sono gli stessi, e ci sono pezzi che sono unici per ogni progetto. I pezzi che sono gli stessi possono essere l'80% del codice. Sono il 20% dello sforzo. Spendi quasi tutto il tuo tempo sui pezzi che sono diversi.
Programmare è una questione di astrazioni e indirezioni
Per farlo efficacemente, devi generalmente essere in grado di avere almeno tre visioni di qualcosa nella tua testa allo stesso tempo. Avete bisogno di vedere cosa sta succedendo dal punto di vista del chiamante o dell'utente di un'astrazione. Avete bisogno di vedere cosa sta succedendo dal punto di vista della funzione chiamata o degli interni di una classe che state usando. E avete bisogno di vederlo dal punto di vista di ciò che dovrebbe accadere (se state facendo il debug) o di ciò che deve essere implementato (se state lavorando su nuove funzionalità).
Programmare implica tenere traccia dello stato e del processo
È stato osservato che uno degli ostacoli necessari per imparare a programmare è capire il cambiamento dello stato del programma nel tempo. Inizialmente si tratta solo di capire come le assegnazioni cambiano il valore delle variabili. Alla fine, dovete essere in grado di seguire come lo stato più ampio cambia durante l'esecuzione del codice. Tornando al punto precedente, gran parte dello sforzo sta nel vedere quali invarianti dovrebbero essere vere tra le chiamate e affrontare il fatto che nel mezzo di una chiamata, lo stato interno le viola perché il codice non si muove atomicamente da uno stato all'altro.
Una gran parte della programmazione è far rispettare i vincoli
Modificatori di accesso, dichiarazioni di costanti, convenzioni di denominazione, ecc, sono tutti vincoli che poniamo sul nostro codice. I vincoli di solito non sono eseguibili. Dicono al compilatore cose che sappiamo sul codice e limitano ciò che possiamo fare. Ad un principiante, sembra che rendano il processo più difficile, quando in realtà permettono di affrontare problemi più grandi perché il codice limita ciò a cui si deve pensare.
Strumenti migliori espandono la dimensione dei problemi che possiamo affrontare
Il miglioramento degli strumenti non rende il nostro lavoro più facile. La difficoltà rimane più o meno la stessa, e i problemi diventano più grandi.