Risposta da una prospettiva front-end:
Non ascoltare tutti dicendo che non si può fare, perché un servizio web sperimentale della San Francisco State University che ho co-scritto nel 1996 finalmente è andato in paradiso Internet un paio di anni fa e in quel momento non ho mai avuto bisogno di una soluzione di compatibilità con un singolo browser ; questa è quasi la metà del tuo obiettivo di 40 anni. E questo front-end basato su JavaScript che ho realizzato nel 1998 per un progetto dello Stanford Research Institute è stato sostituito con qualcosa di più appariscente qualche anno dopo, ma non c'è motivo per cui l'interfaccia utente originale non possa essere ancora in esecuzione oggi con correzioni di compatibilità minori.
Il trucco è garantire che la tua app utilizzi solo standard W3C / ECMA ampiamente supportati e abbia un design pulito sotto il tuo controllo. Mentre molte app Web scritte con la tecnologia alla moda degli anni '90 non funzionano bene o per niente oggi, le app web degli anni '90 scritte secondo i principali standard funzionano ancora. Possono sembrare passé, ma funzionano.
L'obiettivo qui non è quello di scrivere un'app Web che salirà sul loro server e rimarrà lì per 40 anni senza che nessuno lo tocchi più. Serve a costruire una base che possa ancora essere utilizzata decenni fa, che può crescere per supportare nuove funzionalità senza dover essere ricostruita da zero.
Prima di tutto, devi codificare secondo gli standard ufficiali e solo verso gli standard ufficiali. Nessuna funzionalità JavaScript non fa parte di uno standard ECMAScript ratificato; ES5.1 è la versione corrente ed è generalmente supportata, quindi è sicuro targetizzare. Allo stesso modo, le versioni correnti di HTML5, CSS e Unicode sono buone. Nessuna funzionalità sperimentale JavaScript, CSS3 o HTML (quelle con prefissi fornitore o senza accordo al 100% tra i browser). E nessun hack di compatibilità specifico del browser. Puoi iniziare a utilizzare una nuova funzionalità una volta che è nello standard e tutti la supportano senza prefissi.
Il supporto ES5 significherebbe far cadere IE8 o versioni precedenti, cosa che suggerisco comunque poiché richiede hack specifici per browser che saranno inutili tra un paio d'anni. Suggerirei la modalità rigorosa ES5 per la migliore possibilità di longevità, che in realtà imposta la compatibilità del tuo browser di base su IE10 e le versioni recenti di tutti gli altri . Questi browser hanno anche il supporto nativo per molte delle funzionalità di validazione dei moduli e segnaposto di HTML5, che saranno utili per molto tempo.
Le nuove edizioni di ECMAScript mantengono la compatibilità con le versioni precedenti, quindi sarà molto più semplice adottare le funzionalità imminenti se il tuo codice è scritto secondo gli standard attuali. Ad esempio, le classi definite utilizzando la class
sintassi imminente saranno completamente intercambiabili con le classi definite con la constructor.prototype
sintassi corrente . Quindi in cinque anni uno sviluppatore può riscrivere le classi nel formato ES6 su base file per file senza interrompere nulla, supponendo, ovviamente, che anche tu abbia buoni test unitari.
In secondo luogo, evitare i framework di app JavaScript di tendenza, soprattutto se cambiano il modo in cui si codifica l'app. La spina dorsale era di gran moda, poi SproutCore ed Ember lo erano, e ora Angular è il framework che tutti amano promuovere. Possono essere utili, ma hanno anche qualcosa in comune: spesso rompono le app e richiedono modifiche al codice quando escono nuove versioni e la loro longevità è discutibile. Di recente ho aggiornato un'app Angular 1.1 alla 1.2 e ho dovuto riscrivere parecchio. Allo stesso modo, passare da Backbone 2 a 3 richiede molte modifiche HTML. Gli standard si muovono lentamente per un motivo, ma questi quadri si muovono rapidamente e le cose si rompono periodicamente sono il costo.
Inoltre, i nuovi standard ufficiali spesso lasciano obsoleti i vecchi framework, e quando ciò accade, tali framework o mutano (con cambiamenti di rottura) o vengono lasciati indietro. Sai cosa succederà a tutte le biblioteche promettenti concorrenti del mondo una volta ratificato ECMAScript 6 e tutti i browser supporteranno la sua classe Promise standardizzata? Diventeranno obsoleti e i loro sviluppatori smetteranno di aggiornarli. Se scegli il giusto framework, il tuo codice potrebbe adattarsi abbastanza bene, e se hai indovinato male, vedrai un refactoring importante.
Quindi, se stai pensando di adottare una libreria o un framework di terze parti, chiediti quanto sarà difficile rimuoverlo in futuro. Se si tratta di un framework come Angular che non può mai essere rimosso senza ricostruire la tua app da zero, è un buon segno che non può essere utilizzato in un'architettura di 40 anni. Se si tratta di un widget di calendario di terze parti che è stato estratto con un middleware personalizzato, la sua sostituzione richiederebbe alcune ore.
In terzo luogo, dagli una struttura per app buona e pulita. Anche se non stai utilizzando un framework per app, puoi comunque sfruttare gli strumenti per sviluppatori, creare script e un design pulito. Personalmente sono un fan della gestione delle dipendenze di Closure Toolkit perché è leggero e il suo overhead viene completamente rimosso durante la creazione della tua app. LessCSS e SCSS sono anche ottimi strumenti per organizzare i fogli di stile e creare fogli di stile CSS basati su standard per il rilascio.
Puoi anche organizzare il tuo codice in classi monouso con una struttura MVC. Ciò renderà molto più facile il ritorno di diversi anni nel futuro e sapere cosa stavi pensando quando hai scritto qualcosa, e sostituire solo quelle parti che ne hanno bisogno.
Dovresti anche seguire i consigli del W3C e tenere le informazioni di presentazione completamente fuori dal tuo HTML. (Ciò include trucchi come dare agli elementi nomi di classe di presentazione, come "big-green-text" e "wide-column-wide".) Se il tuo HTML è semantico e CSS è presentazionale, sarà molto più facile mantenerlo e adattarlo verso nuove piattaforme in futuro. Sarà anche più facile aggiungere supporto per browser specializzati per non vedenti o disabili.
In quarto luogo, automatizza i test e assicurati di avere una copertura quasi completa. Scrivi unit test per ogni classe, sia sul lato server che in JavaScript. Sul front-end, assicurati che ogni classe si comporti secondo le sue specifiche in ogni browser supportato. Automatizza questi test dal tuo bot di build per ogni commit. Ciò è importante sia per la longevità che per l'affidabilità, poiché è possibile rilevare i bug in anticipo anche quando i browser attuali li oscurano. Entrambi i framework di test basati su JSUnit di Jasmine e Google Closure sono buoni.
Ti consigliamo inoltre di eseguire test funzionali dell'interfaccia utente completa, su cui Selenium / WebDriver sono bravi. Fondamentalmente, scrivi un programma che attraversa l'interfaccia utente e lo utilizza come se una persona lo stesse testando. Collegali anche al robot di costruzione.
Infine, come altri hanno già detto, i tuoi dati sono re. Pensa al tuo modello di archiviazione dei dati e assicurati che sia costruito per durare. Assicurati che il tuo schema di dati sia solido e assicurati che sia testato accuratamente anche ad ogni commit. E assicurati che l'architettura del tuo server sia scalabile. Questo è ancora più importante di qualsiasi cosa tu faccia sul front-end.