ソフトウエア技術者からは、少し難しいシステムレベルの視点

記事
IT・テクノロジー

ソフトウエア技術者からは、少し難しいシステムレベルの視点

システムレベルの視点とは、単にソフトウエア(プログラム)だけではなく、プログラムを実行するのに必要な環境を含めた「全体」をみる事です。この視点は、ハードウエアや OS などを含む幅広い知識と経験が要求されるので、中々気をつけていてもポイントを見つけるのが難しい分野です。 この記事では、Web 開発をする場合に絞って、どのような事を考えると良いかのヒントをまとめてみました。


Web アプリ・Web サービスの特徴
当たり前ですが、Web アプリや Web サービスはネットワーク(インターネットなど)が前提になっているサービスです。 従来のデスクトップアプリなどは、利用する PC の中で完結する場合が多く、この分野の視点の範囲は限定的でした。

しかし、Web アプリの場合、Web ブラウザを動かす端末(PC やスマホなど)に加えて、Web サイトをホスティングするサーバー、これらを接続するネットワーク、オンライン上(インターネット上)にデータを保持するための、データベースやストレージなどサービスを実現するための要素が広範囲に渡るようになっています。

プログラムの実行も、Web ブラウザーが動作する端末(PC やスマホ)に加えて、Web サイトをホスティングするサーバーでも行われます。多くの場合、端末側のプログラム(フロントエンドと呼ばれています)とサーバー側のプログラム(バックエンドと呼ばれています)のように複数の別々のプログラムを開発する必要があります。これらのプログラムは、勝手に動くわけではなく、お互いにコミュニケーションしながら動作します。このコミュニケーションを助けているのが、別々のコンピュータを繋ぐネットワークです。

プログラムも自分自身の実行だけでなく、別の外部のプログラムとどのようにデータをやり取りするかなどを考える必要があるので、こうしたシステムレベルの視点はとても重要になります。

Web アプリや Web サービスのプログラムは、従来の PC で動作するだけのデスクトップアプリに比べると、複雑な仕組みの上で動作するので、実は少しハードルの高いプログラミングの分野といえます。

プログラムが何を使えるか?
システムレベルの視点で最初に考えることが、プログラムが「使うことのできるものは何か」を理解する事です。使うことのできる物には、例えばメモリがあります。こうした、支える物を「リソース」と呼んでいます。 開発するプログラムがどのようなリソースをどの位を使うのかを知ることはとても重要です。

例えば、PC やスマホで利用できるメモリには限りがあります。Web ブラウザー以外にも沢山のプログラムが動いているので、Web アプリや Web サービスだけで全てのリソースを独占することはできません。リソースが不足すると、処理速度が極端に遅くなることがあります。そうなると、利用者は、処理の待ち時間が増えるため、快適にアプリやサービスを利用することが難しくなってしまいます。

端末の場合は、通常は端末を使う人のみが利用するというのが殆どで、他の人の事を考慮する必要は余りありません。しかし、サーバー側は複数の人が利用する場合が殆どです。Web サイトの場合複数の利用者が同じサイトに同時にアクセスするのは普通に行われている事です。つまり、同時にどのくらいの人が利用するかで、利用するリソースの使用量も変わってきます。例えば、一人の利用者が利用するメモリの容量は少なくても、同時に 100 人の人が利用すると、利用容量は概ね100倍になることになります。

こうした通常の利用で起こり得るリソースの使用容量は予め想定しておかないと、サービスが利用できなかったり、処理速度が極端に遅くなったりして、便利で快適なサービスの提供が難しくなります。

相手の状態はわからない
デスクトップアプリのように、一つのプログラムで処理が可能な場合は、いろいろなデータのやりとりも同じプログラム内で行われる場合が多いので余り気にする必要がありません。しかし、ネットワーク経由でサーバーとデータのやり取りをする必要があり場合は事情が変わってきます。良くある問題は、「相手のプログラムが動いていない」「ネットワークの状態が悪くて上手くコミュニケーションできない」など、データをやりとりしたいのだけれども、相手の応答がいつ来るのか、あるいは来ないのかはアクセスをする前の段階ではわかりません。

こうした場合は、データがすぐに届くことを仮定してプログラムを作ってしまうと、データがすぐに届かない場合は、全く届かない場合には、プログラムの動作がその場所で止まってしまって身動きができない状態になってしまいます。いわゆる「ハング」とか「フリーズ」状態で固まってしまっている状態です。

あるいは、相手がデータを持っていると思ってリクエスしてみたものの、相手は希望するデータを持っていない場合なども、問題になりやすくなります。Web アクセスでは、間違った URL を要求したり、以前はあったかもしれないページにアクセスしたら、実はそのページは消去されていたなどは結構よく起きる不一致です。こうした場合は、相手のサーバーは「データが無いよ!」と返答してきます。こうした仕組みを知っていて、それに対応した処理を j 実装する必要があります。

このように、Web アプリや Web サービスの場合、自分(のプログラム)以外とのやりとりが多くなるので、こうした相手のいろいろな状態や考えられる返答(応答)に対応する処理を作っておく必要があります。

一言で行ってしまうと、「Web アプリや Web サービスでは想定外の事が起こりやすい」という事です。

想定していない場合は、きちんと動作しない場合が多いですが、想定しておいて、必要な処理を作っておけばきちんと動作します。 つまり、想定外にしないためには、システムレベルの視点を持ってそれに対応したプログラムを書くことが求められるという事です。

OS やネットワークの知識
別々のコンピュータで動いているプログラムがお互いにデータをやりとりする際にはネットワークを使う事になります。そのコンピュータのネットワーク関連の設定を管理しているのは、殆どの場合開発するプログラムではなく、コンピュータ上で動いている OS(オペレーティングシステム)です。Windows や Linux、MacOS などがそれに当たります。プログラムからネットワークを利用するには、殆どの場合、OS 上でネットワークの設定をして、利用する端末(スマホや PC)をネットワークに接続する必要があります。 このためには、ネットワークの仕組みや OS の知識が必要になります。

特に、IP アドレスの設定や、ネットワークの経路(ルーティング)の設定などは、OS 上で行う場合が殆どで、実際のプログラム(アプリケーション)では、触れない部分です。

IP アドレスは、わかりやすい例で説明すると、家に割り当てられた住所のようなもので「ネットワーク上の住所」です。Mac アドレスと呼ばれるものは、家に住んでいる人の名前のようなもので、ネットワークに繋ぐ機器に割り当てられています。ルーティングは、どうやって相手の家(IP アドレス)のところにデータを届けるかの経路の設定です。 実際の社会では、郵便局の人が手紙を届けるための仕事をしてくれているので、住所と名前を書いてポストに入れれば郵便を届けてくれますが、この郵便局に当たる仕事をしているのが OS の一部です。実際に、ネットワークを使ってデータをやり取りする場合、どのように設定するかがわからないと、単にプログラムを書いただけでは、アプリやサービスは機能しません。そのため、Web サービスや Web アプリを作るには、いろいろな物をどのように組み合わせて、どのように設定するかはとても重要で、ネットワークや OS の知識も必要になります。

実際は、アプリやサービスの全体設計をする人がわかっていれば、プログラムを書く上では全てを知っている必要はありません。しかし、こうした知識があると、プログラムのテストや設計をより効果的に行えるので、結果的に良いものが作れます。

まとめ
Web アプリや Web サービスは見かけ上はシンプルに見えますが、実はいろいろな要素(端末やサーバー、ネットワークや OS)を組み合わせて実現されています。フロントエンド、バックエンドのプログラムは別々のプログラムなので、片方の思うように動作しない場合もあります。こうしたシステムレベルの視点があると、そうした事を考慮したより信頼性の高い設計やコーディングが可能になるので、制作するプログラムの品質もより高いものにすることができます。

システムレベルの視点を得るには、プログラムの学習以外にも、ハードウエアや幅広いソフトウエアやシステムの学習と経験が必要です。Web 開発を極めるにはこうした、システムレベルの知識と経験が重要です。
サービス数40万件のスキルマーケット、あなたにぴったりのサービスを探す