Respuesta desde una perspectiva frontal:
No escuche a todos decir que no se puede hacer, porque un servicio web experimental de la Universidad Estatal de San Francisco que coescribí en 1996 finalmente fue a Internet hace un par de años, y nunca necesité una sola solución de compatibilidad de navegador en ese momento ; eso es casi la mitad de tu meta de 40 años. Y este front-end basado en JavaScript que hice en 1998 para un proyecto del Instituto de Investigación de Stanford fue reemplazado por algo más llamativo unos años más tarde, pero no hay razón para que la interfaz de usuario original aún no se pueda ejecutar hoy con pequeñas correcciones de compatibilidad.
El truco es asegurarse de que su aplicación utilice solo estándares W3C / ECMA ampliamente compatibles y que tenga un diseño limpio bajo su control. Si bien muchas de las aplicaciones web escritas para la moderna tecnología de la era de los 90 no funcionarán bien o no funcionan en la actualidad, las aplicaciones web de la era de los 90 escritas con los principales estándares todavía lo hacen. Pueden parecer pasados, pero funcionan.
El objetivo aquí no es escribir una aplicación web que se instale en su servidor y permanezca allí durante 40 años sin que nadie la vuelva a tocar. Es para construir una base que todavía pueda estar en uso décadas después, que puede crecer para admitir nuevas funciones sin tener que reconstruir desde cero.
En primer lugar, debe codificar según las normas oficiales y solo según las normas oficiales. No hay características de JavaScript que no formen parte de un estándar ECMAScript ratificado; ES5.1 es la versión actual y generalmente es compatible, por lo que es seguro apuntar. Del mismo modo, las versiones actuales de HTML5, CSS y Unicode son buenas. Sin funciones experimentales de JavaScript, CSS3 o HTML (las que tienen prefijos de proveedor o sin un 100% de acuerdo entre los navegadores). Y no hay trucos de compatibilidad específicos del navegador. Puede comenzar a usar una nueva función una vez que esté en el estándar y todos la admitan sin prefijos.
La compatibilidad con ES5 significaría abandonar IE8 o anterior, lo que sugiero de todos modos ya que requiere hacks específicos del navegador que serán inútiles en un par de años. Sugeriría el modo estricto de ES5 para la mejor oportunidad de longevidad, que en realidad establece la compatibilidad de su navegador de referencia en IE10 y las versiones recientes de todos los demás . Esos navegadores también tienen soporte nativo para muchas de las funciones de validación de formularios y marcadores de posición de HTML5, que serán útiles durante mucho tiempo.
Las nuevas ediciones de ECMAScript mantienen la compatibilidad con versiones anteriores, por lo que será mucho más fácil adoptar las próximas funciones si su código está escrito de acuerdo con los estándares actuales. Por ejemplo, las clases definidas usando la próxima class
sintaxis serán completamente intercambiables con las clases definidas con la constructor.prototype
sintaxis actual . Entonces, en cinco años, un desarrollador puede reescribir las clases en el formato ES6 archivo por archivo sin romper nada, suponiendo, por supuesto, que también tenga buenas pruebas unitarias.
En segundo lugar, evite los marcos de aplicaciones de JavaScript modernos, especialmente si cambian la forma en que codifica su aplicación. La columna vertebral estaba de moda, luego SproutCore y Ember, y ahora Angular es el marco que a todos les encanta promover. Pueden ser útiles, pero también tienen algo en común: a menudo rompen aplicaciones y requieren cambios de código cuando salen nuevas versiones y su longevidad es cuestionable. Recientemente actualicé una aplicación Angular 1.1 a 1.2, y tuve que reescribir bastante. Del mismo modo, pasar de Backbone 2 a 3 requiere muchos cambios de HTML. Los estándares se mueven lentamente por una razón, pero estos marcos se mueven rápido y las cosas que se rompen periódicamente son el costo.
Además, los nuevos estándares oficiales a menudo dejan obsoletos los viejos marcos, y cuando eso sucede, esos marcos mutan (con cambios importantes) o se quedan atrás. ¿Sabes lo que va a pasar con todas las bibliotecas de promesa del mundo una vez que se ratifique ECMAScript 6 y todos los navegadores admitan su clase Promesa estandarizada? Se volverán obsoletos y sus desarrolladores dejarán de actualizarlos. Si eligió el marco correcto, su código podría adaptarse lo suficientemente bien, y si adivinó mal, buscará una refactorización importante.
Entonces, si está pensando en adoptar una biblioteca o marco de terceros, pregúntese qué tan difícil será eliminar en el futuro. Si es un marco como Angular que nunca se puede eliminar sin reconstruir su aplicación desde cero, es una buena señal de que no se puede usar en una arquitectura de 40 años. Si se trata de un widget de calendario de terceros que extrajo con un middleware personalizado, reemplazarlo tomaría algunas horas.
Tercero, dele una estructura de aplicación buena y limpia. Incluso si no está utilizando un marco de aplicación, puede aprovechar las herramientas de desarrollador, crear scripts y un buen diseño limpio. Personalmente, soy fanático de la administración de dependencias de Closure Toolkit porque es liviano y su sobrecarga se elimina por completo al crear su aplicación. LessCSS y SCSS también son excelentes herramientas para organizar sus hojas de estilo y crear hojas de estilo CSS basadas en estándares para su lanzamiento.
También puede organizar su propio código en clases de un solo uso con una estructura MVC. Eso hará que sea mucho más fácil regresar varios años en el futuro y saber lo que estaba pensando cuando escribió algo, y reemplazar solo aquellas partes que lo necesitan.
También debe seguir los consejos del W3C y mantener la información de presentación completamente fuera de su HTML. (Eso incluye trucos como dar a los elementos nombres de clase de presentación, como "texto verde grande" y "ancho de dos columnas".) Si su HTML es semántico y CSS es presentacional, será mucho más fácil mantenerlo y adaptarlo a nuevas plataformas en el futuro. También será más fácil agregar soporte para navegadores especializados para personas ciegas o discapacitadas.
Cuarto, automatice sus pruebas y asegúrese de tener una cobertura casi completa. Escriba pruebas unitarias para cada clase, ya sea del lado del servidor o en JavaScript. En la parte frontal, asegúrese de que cada clase se desempeñe de acuerdo con sus especificaciones en cada navegador compatible. Automatice estas pruebas desde su bot de compilación para cada confirmación. Esto es importante tanto para la longevidad como para la confiabilidad, ya que puede detectar errores temprano incluso cuando los navegadores actuales los ocultan. Tanto los marcos de prueba basados en JSUnit de Jasmine y Google Closure son buenos.
También querrás ejecutar pruebas funcionales de IU completas, en las cuales Selenium / WebDriver son buenos. Básicamente, usted escribe un programa que recorre su interfaz de usuario y lo usa como si una persona lo estuviera probando. Conecta esos al robot de construcción también.
Por último, como otros han mencionado, sus datos son el rey. Piense detenidamente en su modelo de almacenamiento de datos y asegúrese de que esté diseñado para durar. Asegúrese de que su esquema de datos sea sólido, y asegúrese de que también se haya probado exhaustivamente en cada confirmación. Y asegúrese de que la arquitectura de su servidor sea escalable. Esto es aún más importante que cualquier cosa que hagas en la parte delantera.