Ответ с точки зрения внешнего интерфейса:
Не слушайте, чтобы все говорили, что это невозможно, потому что экспериментальный веб-сервис Государственного университета Сан-Франциско, который я в соавторстве написал в 1996 году, наконец-то попал в Интернет-рай пару лет назад и в то время не требовалось ни одного исправления совместимости браузера. ; это почти половина вашей 40-летней цели. И этот интерфейс на основе JavaScript, который я сделал в 1998 году для проекта Стэнфордского исследовательского института, несколько лет спустя был заменен чем-то более ярким, но нет никаких причин, по которым оригинальный пользовательский интерфейс все еще не мог работать сегодня с небольшими исправлениями совместимости.
Хитрость заключается в том, чтобы убедиться, что ваше приложение использует только широко поддерживаемые стандарты W3C / ECMA и имеет чистый дизайн под вашим контролем. Хотя многие веб-приложения, написанные по модной технологии эпохи 90-х, не будут работать должным образом или вообще не работают сегодня, веб-приложения эпохи 90-х, написанные в соответствии с основными стандартами, по-прежнему работают. Они могут выглядеть пассивно, но они работают.
Цель здесь не в том, чтобы написать веб-приложение, которое будет работать на своем сервере и оставаться там в течение 40 лет, и никто не будет к нему прикасаться. Это создание основы, которая может использоваться десятилетиями, которая может расширяться для поддержки новых функций без необходимости восстановления с нуля.
Прежде всего, вы должны соблюдать официальные стандарты и только официальные стандарты. Нет функций JavaScript, не являющихся частью ратифицированного стандарта ECMAScript; ES5.1 является текущей версией и обычно поддерживается, так что это безопасно для цели. Аналогично, текущие версии HTML5, CSS и Unicode хороши. Нет экспериментальных функций JavaScript, CSS3 или HTML (с префиксами поставщиков или без 100% согласия между браузерами). И никаких браузерно-совместимых взломов совместимости. Вы можете начать использовать новую функцию, как только она появится в стандарте, и все поддерживают ее без префиксов.
Поддержка ES5 будет означать отказ от IE8 или более ранней версии, что я предлагаю в любом случае, так как для этого требуются взломы для конкретных браузеров, которые через пару лет будут бесполезны. Я бы посоветовал строгий режим ES5 для лучшего шанса на долголетие, который фактически устанавливает совместимость вашего базового браузера с IE10 и последними версиями всех остальных . Эти браузеры также имеют встроенную поддержку многих функций проверки формы HTML5 и заполнителей, которые будут полезны в течение очень долгого времени.
Новые выпуски ECMAScript поддерживают совместимость с более старыми версиями, так что будет гораздо проще принять новые функции, если ваш код написан в соответствии с текущими стандартами. Например, классы, определенные с использованием следующего class
синтаксиса, будут полностью взаимозаменяемы с классами, определенными с текущим constructor.prototype
синтаксисом. Таким образом, через пять лет разработчик может переписывать классы в формат ES6 для каждого файла, не ломая ничего - при условии, конечно, что у вас также есть хорошие модульные тесты.
Во-вторых, избегайте модных фреймворков приложений JavaScript, особенно если они меняют способ кодирования вашего приложения. Backbone был в моде, тогда как SproutCore и Ember, а теперь Angular - это фреймворк, который все любят продвигать. Они могут быть полезны, но у них также есть что-то общее: они часто ломают приложения и требуют изменения кода, когда выходят новые версии и их долговечность сомнительна. Я недавно обновил приложение Angular 1.1 до 1.2, и пришлось немного переписать. Аналогично, переход с Backbone 2 на 3 требует большого количества изменений HTML. Стандарты медленно движутся по какой-то причине, но эти структуры движутся быстро, и периодические сбои являются издержками.
Кроме того, новые официальные стандарты часто оставляют старые фреймворки устаревшими, и когда это происходит, эти фреймворки либо мутируют (с серьезными изменениями), либо остаются позади. Вы знаете, что произойдет со всеми конкурирующими библиотеками обещаний в мире, когда ECMAScript 6 будет ратифицирован, и все браузеры будут поддерживать его стандартизированный класс Promise? Они устаревают, а их разработчики перестанут их обновлять. Если вы выбрали правильный фреймворк, ваш код может адаптироваться достаточно хорошо, и если вы догадались плохо, вы будете рассматривать основной рефакторинг.
Поэтому, если вы думаете о переходе на стороннюю библиотеку или фреймворк, спросите себя, как трудно будет удалить ее в будущем. Если это такая среда, как Angular, которую невозможно удалить без перестройки приложения с нуля, это хороший знак, что ее нельзя использовать в 40-летней архитектуре. Если это сторонний виджет календаря, который вы абстрагировали с помощью некоторого пользовательского промежуточного программного обеспечения, его замена может занять несколько часов.
В-третьих, создайте хорошую, чистую структуру приложения. Даже если вы не используете каркас приложения, вы все равно можете воспользоваться инструментами разработчика, сценариями сборки и хорошим чистым дизайном. Я лично поклонник управления зависимостями Closure Toolkit, потому что он легкий и его издержки полностью удаляются при создании приложения. LessCSS и SCSS также являются отличными инструментами для организации ваших таблиц стилей и создания основанных на стандартах таблиц стилей CSS для выпуска.
Вы также можете организовать свой собственный код в одноразовые классы со структурой MVC. Это значительно облегчит возвращение на несколько лет в будущее и понимание того, о чем вы думали, когда писали что-то, и замену только тех частей, которые в этом нуждаются.
Вы также должны следовать советам W3C и полностью исключить презентационную информацию из своего HTML. (Это включает в себя читы, такие как присвоение имен элементам презентационных классов, таких как «большой зеленый текст» и «два столбца в ширину».) Если ваш HTML является семантическим, а CSS - презентационным, его будет намного проще поддерживать и адаптировать. на новые платформы в будущем. Также будет проще добавить поддержку специализированных браузеров для слепых или инвалидов.
В-четвертых, автоматизируйте свои тесты и убедитесь, что у вас почти полный охват. Напишите модульные тесты для каждого класса, будь то на стороне сервера или в JavaScript. На внешнем интерфейсе убедитесь, что каждый класс работает в соответствии с его спецификацией в каждом поддерживаемом браузере. Автоматизируйте эти тесты от своего сборочного бота для каждого коммита. Это важно как для долговечности, так и для надежности, поскольку вы можете обнаруживать ошибки на ранних этапах, даже если современные браузеры их скрывают. И Jasmine, и Google Closure, основанные на JSUnit, хорошо подходят для тестирования.
Вы также захотите запустить полные функциональные тесты пользовательского интерфейса, в которых Selenium / WebDriver хороши. По сути, вы пишете программу, которая просматривает ваш пользовательский интерфейс и использует ее так, как если бы кто-то ее тестировал. Подключите их к сборочному боту.
Наконец, как уже упоминали другие, ваши данные - король. Продумайте модель хранения данных и убедитесь, что она рассчитана на длительное время. Убедитесь, что ваша схема данных надежна, и убедитесь, что она тщательно проверяется при каждом коммите. И убедитесь, что ваша серверная архитектура масштабируема. Это даже более важно, чем все, что вы делаете на переднем конце.