Abbiamo avuto due grandi crisi legate alla dipendenza con due diverse basi di codice (Android e un'app Web Node.js). Il repository Android doveva migrare da Flurry a Firebase, il che richiedeva l'aggiornamento della libreria di Google Play Services quattro versioni principali. Una cosa simile è accaduta con la nostra app Node ospitata da Heroku in cui il nostro stack di produzione (cedro) era obsoleto e doveva essere aggiornato a cedar-14. Anche il nostro database PostgreSQL doveva essere aggiornato dalla 9.2 alla 9.6.
Ciascuna delle dipendenze di queste app è rimasta stantia per quasi due anni e quando alcune sono state deprecate e abbiamo raggiunto il periodo di "tramonto", è stato un grosso mal di testa aggiornarle o sostituirle. Ho trascorso più di 30 ore nell'ultimo mese o due a risolvere lentamente tutti i conflitti e il codice non funzionante.
Ovviamente lasciar stare le cose per due anni è troppo lungo. La tecnologia si muove rapidamente, soprattutto quando si utilizza un fornitore di piattaforme come Heroku. Supponiamo di avere una suite di test a tutti gli effetti e un processo CI come Travis CI, che elimina gran parte delle congetture dall'aggiornamento. Ad esempio, se una funzione è stata rimossa dopo un aggiornamento e la stavi usando, i tuoi test fallirebbero.
Con quale frequenza devono essere aggiornate le dipendenze o quando devono essere aggiornate le dipendenze? Abbiamo aggiornato perché siamo stati costretti a farlo, ma sembra che una sorta di approccio preventivo sarebbe migliore. Dovremmo aggiornare quando vengono rilasciate versioni secondarie? Versioni principali? Ogni mese se sono disponibili aggiornamenti? Voglio evitare una situazione come quella che ho appena vissuto a tutti i costi.
PS: per uno dei miei progetti personali di Rails, utilizzo un servizio chiamato Gemnasium che tiene traccia delle tue dipendenze in modo da poter essere informato, ad esempio, delle vulnerabilità di sicurezza. È un ottimo servizio, ma dovremmo controllare manualmente le dipendenze per i progetti che ho citato.