Fornire supporto per un sistema operativo meno recente è una delle ragioni (vedere la risposta di Crono). L'altro motivo è "risparmiare denaro". Citato perché risparmia solo soldi a breve termine.
Dipende dal tipo di progetto, naturalmente, ma per le applicazioni aziendali, che di solito sopravvivono per un numero significativo di anni, ci sono buone probabilità che un aggiornamento sia necessario ad un certo punto, per qualsiasi motivo: supporto per nuove piattaforme, nuove caratteristiche, prestazioni migliori ... Quindi, posticipate l'aggiornamento fino a quando non avete altra scelta, o continuate ad aggiornare come parte della normale routine di sviluppo.
Passaggi piccoli, rapidi e poco costosi o passaggi lunghi, costosi. È esattamente lo stesso problema con il refactoring. In realtà, immagino che potresti persino dire che un aggiornamento di framework / library è una sorta di refactoring.
Nota a margine: c'è una discussione nei commenti della risposta di JeffO sull'analogia dell'automobile. Dato che il mio rappresentante è troppo basso per commentare, sto lasciando questa nota qui. Il software non invecchia come una macchina se non viene toccata, sì, ma fa invecchia se funziona. Codice è stato aggiunto Diventa gonfio. Proprio come una macchina, se non si sostituiscono continuamente parti di essa, qualcosa si rompe. Nel caso di un'auto, è ancora possibile sostituire la parte rotta, se disponibile. Con il vecchio software, trovare e risolvere il problema diventa così costoso con il tempo che alla fine dovrai rinunciare.