フロントエンドの視点からの回答:
1996年に私が共同執筆した実験的なサンフランシスコ州立大学のWebサービスが数年前にようやくインターネットの天国に行き、その時点で単一のブラウザー互換性修正プログラムを必要としなかったため; それはあなたの40年の目標のほぼ半分です。そして、1998年にスタンフォード研究所のプロジェクトのために作成したこのJavaScriptベースのフロントエンドは、数年後に派手なものに置き換えられましたが、元のUIが軽微な互換性修正で今日も実行できなかった理由はありません。
秘Theは、アプリが広くサポートされているW3C / ECMA標準のみを使用し、管理下でクリーンなデザインを使用するようにすることです。トレンディな90年代時代の技術で書かれた多くのWebアプリは今日ではうまく機能しないか、まったく機能しませんが、主要な標準規格で書かれた90年代時代のWebアプリは依然として機能します。彼らは古く見えるかもしれませんが、彼らは動作します。
ここでの目標は、サーバー上で起動し、誰も再び触れずに40年間そこにとどまるWebアプリを作成することではありません。数十年後もまだ使用できる基盤を構築することです。基盤をゼロから再構築することなく、新しい機能をサポートするために成長させることができます。
まず第一に、あなたは公式の標準にのみ、公式の標準にコーディングする必要があります。承認されたECMAScript標準の一部ではないJavaScript機能はありません。ES5.1は現在のバージョンであり、一般的にサポートされているため、ターゲットを設定しても安全です。同様に、現在のバージョンのHTML5、CSS、およびUnicodeが適しています。JavaScript、CSS3、またはHTMLの実験的な機能はありません(ベンダープレフィックスが付いているか、ブラウザ間で100%の同意がないもの)。また、ブラウザ固有の互換性ハッキングもありません。新しい機能は、標準になったら使用を開始でき、誰もが接頭辞なしでサポートします。
ES5のサポートはIE8以前をドロップすることを意味しますが、これはブラウザ固有のハッキングを必要とするので、数年後には役に立たなくなるでしょう。寿命を最大限に伸ばすために、ES5のStrict Modeをお勧めします。これにより、IE10およびその他すべての最新バージョンでのベースラインブラウザーの互換性が実際に設定されます。また、これらのブラウザーは、HTML5のフォーム検証およびプレースホルダー機能の多くをネイティブでサポートしており、非常に長い間役立ちます。
ECMAScriptの新しいエディションは古いバージョンとの互換性を維持しているため、現在の標準に従ってコードを記述すれば、今後の機能をより簡単に採用できます。たとえば、今後のclass
構文を使用して定義されたクラスは、現在のconstructor.prototype
構文で定義されたクラスと完全に互換性があります。そのため、開発者は5年間で、クラスごとに何も壊さずにファイルごとにES6形式に書き換えることができます。もちろん、優れた単体テストもあると仮定します。
第二に、特にアプリのコーディング方法を変更する場合は、流行のJavaScriptアプリフレームワークを避けてください。バックボーンが大流行し、SproutCoreとEmberが大流行し、今ではAngularが誰もが促進したいフレームワークです。これらは有用かもしれませんが、共通点もあります。新しいバージョンがリリースされ、その寿命が疑わしい場合、アプリが壊れたり、コードの変更が必要になることがよくあります。私は最近、Angular 1.1アプリを1.2に更新しましたが、かなり書き直す必要がありました。同様に、Backbone 2から3に移行するには、多くのHTMLの変更が必要です。規格には理由があるため動きが遅いですが、これらのフレームワークは速く動き、定期的に壊れるものがコストになります。
さらに、新しい公式標準では、古いフレームワークが陳腐化することが多く、そのようなフレームワークが発生すると、それらのフレームワークは変化します(変更を伴う)か、取り残されます。ECMAScript 6が批准され、すべてのブラウザが標準化されたPromiseクラスをサポートすると、世界の競合するすべてのpromiseライブラリに何が起こるか知っていますか?それらは廃止され、開発者は更新を停止します。適切なフレームワークを選択した場合、コードは十分に適応する可能性があります。不適切に推測した場合は、主要なリファクタリングを検討することになります。
したがって、サードパーティのライブラリまたはフレームワークを採用することを考えている場合は、今後削除するのがどれほど難しいかを自問してください。アプリをゼロから再構築せずに削除できないAngularのようなフレームワークである場合、40年のアーキテクチャでは使用できない良い兆候です。いくつかのカスタムミドルウェアで抽象化したサードパーティ製のカレンダーウィジェットの場合、交換には数時間かかります。
第三に、アプリの構造をきれいに整えます。アプリフレームワークを使用していない場合でも、開発者ツール、ビルドスクリプト、優れたクリーンデザインを利用できます。私は個人的にClosure Toolkitの依存関係管理のファンです。なぜなら、それは軽量であり、アプリのビルド時にオーバーヘッドが完全に削除されるからです。LessCSSとSCSSは、スタイルシートを整理したり、リリース用の標準ベースのCSSスタイルシートを構築したりするための優れたツールでもあります。
また、MVC構造を使用して、独自のコードを使い捨てのクラスに整理することもできます。これにより、数年先に戻って何かを書いたときに考えていたことを把握し、それを必要とする部分だけを交換することがはるかに簡単になります。
また、W3Cのアドバイスに従い、プレゼンテーション情報をHTMLから完全に排除する必要があります。(これには、「big-green-text」や「two-columns-wide」など、要素にプレゼンテーションクラス名を与えるなどのチートが含まれます。)HTMLがセマンティックでCSSがプレゼンテーションの場合、保守と調整がはるかに簡単になります。将来の新しいプラットフォームへ。また、目の不自由な人や障害のある人向けの専用ブラウザのサポートを簡単に追加できます。
第4に、テストを自動化し、ほぼ完全にカバーするようにします。サーバーサイドまたはJavaScriptであるかどうかにかかわらず、すべてのクラスの単体テストを記述します。フロントエンドでは、サポートされているすべてのブラウザーで、各クラスがその仕様に従って動作することを確認してください。コミットごとにビルドボットからこれらのテストを自動化します。これは、現在のブラウザでバグがわかりにくい場合でもバグを早期に発見できるため、寿命と信頼性の両方にとって重要です。JasmineとGoogle ClosureのJSUnitベースのテストフレームワークはどちらも優れています。
また、Selenium / WebDriverが得意な完全なUI機能テストを実行することもできます。基本的に、UIをステップスルーし、人がテストしているように使用するプログラムを作成します。それらもビルドボットに接続します。
最後に、他の人が言及したように、あなたのデータは王様です。データストレージモデルを熟考し、それが最後まで構築されていることを確認してください。データスキーマがしっかりしていることを確認し、すべてのコミットで徹底的にテストされていることを確認してください。また、サーバーアーキテクチャがスケーラブルであることを確認してください。これは、フロントエンドで行うことよりもさらに重要です。