Software crisis
# Software crisis

Software crisis (crisi del software) è un termine usato ai primordi dell'ingegneria del software per descrivere l'impatto della rapida crescita della potenza degli elaboratori e la complessità dei problemi che dovevano essere affrontati. Le parole chiave della software crisis erano complessità, attese e cambiamento.

## Descrizione

I requisiti, continuamente in conflitto tra loro, impedivano lo sviluppo del software. Per esempio, mentre gli utenti domandavano un largo numero di funzionalità, i committenti, generalmente, chiedevano di minimizzare i costi dello sviluppo ed i tempi.

Il concetto di software crisis emerse alla fine degli anni '60. Un vecchio uso del termine era in ACM Turing Award Lecture, "The Humble Programmer" (EWD340), di Edsger Dijkstra del 1972 pubblicato in Communications of the ACM.

Dijkstra affermava:

«The major cause of the software crisis is that the machines have become several orders of magnitude more powerful! To put it quite bluntly: as long as there were no machines, programming was no problem at all; when we had a few weak computers, programming became a mild problem, and now we have gigantic computers, programming has become an equally gigantic problem»

(Edsger Dijkstra, The Humble Programmer)

Le cause della software crisis erano collegate alla complessità dei processi software ed alla relativa immaturità dell'ingegneria del software. La crisi si manifestava in diversi modi:

* Progetti oltre il budget
* Progetti oltre i limiti di tempo
* Software di scarsa qualità
* Software che spesso non rispettava i requisiti
* Progetti ingestibili e codice difficile da mantenere.

La crisi del software condusse, quindi, alla nascita dell'Ingegneria del software ed ai primi modelli di sviluppo, come il modello a cascata.

Per superare la crisi, infatti, si dovettero introdurre:

* Management;
* Organizzazione, attraverso l'analisi e la progettazione;
* Teorie e Tecniche, tra cui la programmazione strutturata e la programmazione ad oggetti;
* Strumenti, tra cui gli Integrated development environment;
* Metodologie, tra cui il modello a cascata e la metodologia agile.
