超高速アプリケーションの作り方
開発者の目的は、アプリのパフォーマンスを上げ、ユーザーエクスペリエンスを向上させることです。 利害関係者の息がかかったり、競合他社が自分たちより優れたアプリを出すと脅したり、ユーザーが他社のアプリに乗り換えることをほのめかしたり、開発者にとっては不利な状況になることがよくある。 そのため、プロジェクト管理チームは常に、アプリケーションを高速で構築するための方法を探しています。 そうそう、ただ速いだけではダメなんですよ。 これらのアプリケーションは、耐障害性、低遅延、優れたレンダリング時間を提供することに集中しなければなりません。
適切な技術スタックを選択する
テックスタックとは、開発者が機能的なWebアプリケーションを作成するために使用する、プログラミング言語、ツール、技術、ソフトウェア製品の集合のことです。 これは、サーバーサイド(バックエンド)スタック、クライアントサイド(フロントエンド)スタック、ミドルウェアに分類される。 RoRはgemライブラリの数が多いため、高速なアプリ開発には最もよく使われるフレームワークです。 例えば、ビジネスを始めたばかりであれば、プロトタイプを組めるような言語/フレームワーク/CMSツールを選ぶとよいでしょう。 学習時間の短いツールの方が、あなたには向いているでしょう。
早すぎる最適化を避ける
かつてドナルド・クヌースは、「早すぎる最適化は諸悪の根源である」と言った。
開発者は、コードの重要な部分を開発するよりも、ソフトウェアの重要でない部分について考えることに多くの時間を費やしています。 コードの重要な部分を重要視しないし、最適化が必要なコードには手をつけない。
経験の浅さが原因かもしれません。 あなたのチームで同じようなことが起きないようにするために、チームはパフォーマンスを気にせずに最初のバージョンのコードを書くようにします。 その後、プロファイラを使って、ボトルネックがどこにあるのかを確認することができます。
そうすることで、本当に注意しなければならない部分をチェックし、そうでない部分を気にする必要がなくなるのです。
PHPの世界では、コードのプロファイリングに利用できるツールがいくつかあります。 それらは、xdebug, xhprof, Symphony profiler, Tideways, Blackfire.io と The Stopwatch Component です。
必要なことだけをする
あなたのコードが、あなたが期待した以上のことをすることはよくあることです。 特に、複雑なライブラリやフレームワークを使用する場合はなおさらです。 時には、使用する予定のないクラスをロードしたり、特定のリクエストの結果を生成するために必要でないデータベース接続を開いたりすることがあります。
これらは、あなたのパフォーマンスの邪魔をする可能性があるため、これらを避ける必要があります。 ここでは、より良いパフォーマンスを実現するためのヒントをご紹介します。
a) オートローディング
– オートローディング機能を使えば、スクリプトに含める必要のあるファイルだけに煩わされる必要があります。 以前はオートローディングは少し複雑な作業でしたが、ComposerやPSR-0、PSR-4規格などのツールを使えば、オートローディングの設定も簡単にできるようになりました。
b) ディペンデンシーインジェクション
– Javaでは非常に一般的なデザインパターンですが、Dependency InjectionはPHPの世界でも多くの支持を集めました。 Symphony、Laravel、Zendなどのフレームワークで広く使われているからです。 Dependency Injectionによって、開発者はconstrictorメソッドを通してコンポーネントを注入することができ、依存関係という観点から考えることができるようになります。 そのため、1つのことに集中する小さな孤立したコンポーネントを作ることができます。
圧縮
コンテンツに利用可能な圧縮技術を使用することで、データサイズを小さくすることができます。 RESTサービスはオーバーヘッドが少なく、データ内の画像が正しいサイズであることを確認します。画像をロードしづらいと、アプリのロードに本当に影響を与えるからです。 また、Webサーバーで使用する場合は、HTTP圧縮がオンになっていることを確認してください。
繰り返し行う作業にはキャッシュ方式を利用する
最近のWebアプリケーションは本当に複雑で、入ってくるリクエストに対してレスポンスを生成する能力が必要なのは間違いありません。 繰り返しの作業をスマートに行う方法として、キャッシュがあります。 これは、どこでも見られる広く使われている手法です。 Webプログラミングでは、バイトコードキャッシュ、アプリケーションキャッシュ、HTTPキャッシュ、プロキシキャッシュなど、さまざまなレベルのキャッシュを使用することができます。 これにより、コンテンツインフラやモバイルネットワークを経由した過剰な移動を回避することができます。
コンテンツデリバリーネットワーク(CDN)
CDN(コンテンツデリバリーネットワーク)により、ネットワーク遅延の削減、コンテンツのプリフェッチ、ネットワークルーティングの最適化などを実現します。 これらは、アプリケーションをかなり高速化することができます。 CDNとしてよく利用されているのは、Akamai、Edgecast、Limelight、Amazon CloudFront、さらにはAT&TやLevel3などの通信事業者です。
バックエンドがパフォーマンスザッパーである場合
バックエンドサーバーに多くのパフォーマンス時間を取られていると感じるなら、移植性、消耗性、変更性、拡張性がアプリのパフォーマンスに影響を与えないようなソフトウェア構造を構成することです。 アプリのどの部分に速度がにじみ出るのか、アーキテクチャの評価が必要でしょう。 もし、第三者のサービスを選ぶのであれば、依頼する前に適切な質問をすべてしてください。
アセットのレイジーローディング
オンデマンドまたはレイジーローディングのアセットにより、Webアプリケーションのパフォーマンスを向上させることができます。 ただし、これは主に画像に適用されます。 画像の遅延ロードは、ページの読み込み時間の短縮につながります。
サーバーの負荷を軽減し、ブラウザのメモリ使用量を削減します。 レイジーローディングは、関連するプラグインやエクステンションによって行うことができます。 Reactの画像の遅延読み込みを処理するプラグイン – react-lazy-loadを紹介します。
DOM操作ライブラリ使用時の配列IDの使用について
React、Angular、EmberなどのDOM操作ライブラリを使用している場合、array-idの使用は動的サイトのパフォーマンス向上に大きく貢献することになる。 配列IDは、DOM操作エンジンに、あるノードが配列内の特定の要素にマッピングできることを示すものです。 この機能がないと、ライブラリは既存のノードを破壊して新しいノードを作成するため、パフォーマンスが低下する。
“これらのヒントに従って、プロジェクトに適したコードを書くことに集中するだけで、アプリのパフォーマンスとスケーラビリティの素晴らしいレベルを達成することができます。”
Flickr.com / Bjorn Gruenwald