プログラミングにおける「サービス」の何となくの理解


プログラミング関係で「サービス」という言葉は頻繁に登場する。
ある書籍には「サービスとはプログラムの機能がネットワークから呼び出せるように実装されていることだ」と書いてある。「Webサービス」と書かれているとき、APIで呼び出す抽象的なものを指すこともあれば、通販サイトのホームページを丸ごと指している場合もある。[「機能や操作性を改善するためのソフトウェア」のことをサービスプログラムと呼ぶ](https://yougo.ascii.jp/caltar/%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0)こともあるようだ。

ただ、エディタに向かってプログラムを書いている人が意識する「サービス」というのは上記の定義ではちょっと合わない気がしている。インターネット上の文章では、プログラムの単位としての「サービス」と、接客などに使う「サービス(お客様に提供する無形の商品)」が混在している。設計に登場する「サービス」は、それらともちょっと違う感じがする。

考えているうちに、自分のなかで「サービス」というものがモヤモヤとしていると気が付き、頭を整理するためにこの文章を書いた。

この文章は、帰り道に「そういえばサービスって何だっけな？」と一人で悶々と考えて、家に着いてすぐに走り書きした文章である。誰かと相談したわけではないため、みんなが呼んでいる「サービス」とはピッタリ一致しないかもしれない。また、文脈によって「サービス」と呼ばれるもの(呼べないもの)は変わってくるかもしれない。そもそもこうやって考えているのは自分だけで、「何がサービスか」なんてみんな当たり前に分かっているのかもしれない。

あくまで「自分の場合はこう考えている」であり、「異論は認める」という方向なので、そのあたりご了承ください。

### 参考ページ
+ [Wikipedia:サービス (曖昧さ回避)](https://ja.wikipedia.org/wiki/%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9_(%E6%9B%96%E6%98%A7%E3%81%95%E5%9B%9E%E9%81%BF)
+ [Wikipedia:Webサービス](https://ja.wikipedia.org/wiki/Web%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9)
+ [Wikipedia:サービス指向アーキテクチャ](https://ja.wikipedia.org/wiki/%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E6%8C%87%E5%90%91%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3)
+ [アプリの基礎  |  Android デベロッパー  |  Android Developers](https://developer.android.com/guide/components/fundamentals?hl=ja)


## ソフトウェアの「サービス」の一番広い範囲
早速「自分の場合」を使うが、自分の場合「サービス」の一番広い意味としては

+ プログラムのうち、何も画面表示をしないもの
+ ずっと動いているもの

あたりで考えている。これは自分が「バックグラウンドサービス」というものを意味の中心として理解しているからだ。そのため、あれもこれも「サービス」と呼べる。範囲は広い。

[androidのリファレンス](https://developer.android.com/guide/components/fundamentals?hl=ja#Components)ででは、「アクティビティ(≒ウィンドウ)」と「サービス」を別々のものとして定義している。自分の理解に近い。

2個目はどう表現していいかまだ迷っているが、「WifiのON/OFFを切り替えてすぐ終了するプログラム」等はサービスではないだろう、と思って付け足した。

この理解だと、通販サイトをブラウザ画面含めて「Webサービス」と呼んだ時の「サービス」は、プログラミング用語の「サービス」ではない(接客業の意味での「サービス」)。ただ、HTTPサーバはブラウザから呼び出される「サービス」だと思う。この辺は微妙。

## 利用実態から考えた時
次に世の中で実際に「サービス」と呼ばれているプログラムの動作を考えてみる。「サービス」と呼ばれるための必要な機能として、

+ 主に他のプログラムから呼び出されて使う
+ 呼び出し元のプログラムとは別に実行・停止が行える
+ 呼び出すタイミングをあまり制限しない(好きな時に呼び出せる)

あたりが意識されるかなと思う。1つ目に「主に」と書いたのは、Windows updateや検索インデックスなど、意識して呼び出さないものもサービスと呼ばれているから。「OSというプログラムから呼び出されている」言えばそうなのだけれど、OSはアプリケーションとは別の階層なので分けた。微妙な差ではある。

「他のプログラム」をブラウザとすると「Webサイト」＝「Webサービス」と言えなくもない。ただ先に説明した「画面表示がないのがサービス」という定義からは外れる。また、次に説明する「プログラムでの機械的処理が想定されているか」という検討からすると、HTML(ハイパー「テキスト」である)を返すのは、プログラミング視点でいう「サービス」らしくはない。

## インターネットにおける「サービス」
関数レベルのものからアプリケーションレベルの単位まで非常に様々なものが「サービス」「Webサービス」と呼ばれているが、プログラミングの視点で見た場合、

+ HTTPなどネットワーク経由で呼び出す
+ 特定のフォーマットに従って呼び出すと、データが返ってくる
+ 返ってきたデータがプログラム処理用のデータであること(HTMLを受け取る場合は「サービス」と言わない気がする…)
+ 何かパラメータが指定できる(ことが多い(？))

ものが「サービス」として扱われているのではないかと思う。

## 設計における「サービス」
上記「一番広い意味のサービス」に近いが、全体の一部として設計されるため、アプリケーションよりは小さい単位のイメージ。でもクラスよりは大きいイメージ。

開発をしたことが無いので想像になるが、要件定義には出てこない、外部設計で定義される、内部設計には出てこない、くらいの粒度だろうか。

これも解釈に幅がありそう。実際にどう使っているのか誰かに聞いてみたい。

## その他

上記の理解を伝えるにしても、相手にある程度ソフトウェアの知識が無いと分かってもらえないかもしれない。

どうしても理解してもらえない場合、やや強引になるが「serverで実行されているものはserviceなんだ」と説得(説明ではない)してしまうのが早いかもしれない。

## おまけ：一般的な「サービス」

[Wikipedia:サービス(2020年2月15日 11:00 (UTC)の版)](https://ja.wikipedia.org/w/index.php?title=%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9&oldid=76208185)より。

>
サービス（英: service）あるいは用役（ようえき）、役務（えきむ）とは、経済用語において、売買した後にモノが残らず、効用や満足などを提供する、形のない財のことである。



## おしまい
参考になるのかな、これ。