2022年10月19日水曜日

インタフェース論基礎

皆さん,情報システムというと,何を想像するだろうか.

銀行のATM?Googleの検索エンジン?チケット予約サイト?いずれも情報システムである.システム(system)とは,日本語で「系」のこと.ひらたくいうと「しくみ」のことだ.なかでも,情報を扱うシステムのことを,ここでは「情報システム」と呼ぼう.

まず,皆さん,身近にある情報システムには何があるか,思い浮かべてほしい.なんでもよいので情報を処理する仕組みを考えてみよう.何か思いついただろうか.

情報システムのモデル

さて,次の図は,情報システムのモデルである.

情報システムに何かを「入力」すると,何らかの「処理」がなされ,何かが「出力」される,という流れを簡潔に示している.下にある「フィードバック」ってなんだ?それはおいおい,説明する.

それでは,先ほど皆さんが考えた情報システムについて,入力と出力を考えてみよう.何を入力して,何が出力されるか,である.処理については考える必要はない.とりあえずここでは,情報システムをブラックボックスとして取り扱うことにする.

GoogleやYahoo!といったインターネット検索の例を考えよう.まず,入力するものはなにか,検索キーワードをテキストフィールドに入れ「検索」ボタンを押す,これらが入力されると考えてよかろう.検索エンジンが何がしかの仕事をした結果,検索結果が出力される.出力は,検索結果(の一部を表示した)ページである.

さてここで,出てきた検索結果は皆さん満足できるものだろうか?検索結果が多すぎたり,予想したものとは異なるような検索結果だったりしたら,皆さんどうするだろうか?

キーワードを追加して絞り込んだり,キーワードを変えて別の検索を試みたりしないだろうか?これが,フィードバックである.出力をみて,人間が考え,別の情報をまた入力する.このサイクルを繰り返して,目的の達成(Goal)に近づけるような工夫をするだろう.情報システムの利用は,入力→処理→出力→フィードバック→(入力→処理→出力→フィードバック→……)といった手順を繰り返して行われる.

機械系と人間系

ところで,情報システム学会の説明によれば,情報システムは機械的機構と人的機構から構成されるという.端的にいうと,機械的機構とはコンピュータなどメカのこと(ソフトウェアも含む),人的機構とは,システムを取り巻く人間や社会のことである.

先に示した図をもう一度みていただきたい.入力するのは誰がするか,出力をみて,フィードバックを考えるのは誰なのか,考えてほしい.

その答えは,人間である.すなわち,かの図において,機械的機構が担う部分は「処理」を取り囲む色付きの部分だけなのだ.機械的機構を人的機構が取り囲むという構図になっている点に留意されたい.

プログラミングを習っても……

「プログラミングを習っても,すぐにシステムやアプリを作れるようならない」という声を学生からよく聞く.そりゃそうだろう.システムやアプリを作れるようになるためには,以下のように,プログラミング以外の様々なことを学ばなければならないからである.

  • 適切かつ効率的なロジックの構築
  • 計算精度や誤差,コード体系の選択など
  • データの入出力(インタフェース)
  • データの永続化(データベースの利用)
  • エラー処理,例外処理,セキュリティ対応
  • テストや開発手法の共有(ソフトウェア工学)
  • プロジェクトのマネジメント,etc……

このなかで,ここでは「データの入出力」に注目したい.プログラミングの基礎科目では,せいぜい,printf() や scanf()(もしくは puts() や gets())あるいは,ファイルディスクリプタを介したファイルの読み書きを習う程度ではなかろうか.

しかし,先に示した人的機構と機械的機構の関連を考えていただきたい.機械的機構と,それを取り囲む人的機構の間で,入力・出力という情報のやりとりが生じる.そこで考えなければならないことは,いかにして効果的に情報のやりとりを行うか,その最適解は何か,ということである.

人と機械が接するところ,それはすなわち,界面であり,インタフェースである.インタフェースの検討,研究がいかに重要であるか,ということがこのロジックから分かろうというものである(その延長線上には,UXデザインなどの概念が横たわっている).というわけで,インタフェースをどうするかという観点から,システム構築のイロハを語っていこう.

システム定義,基礎のキ

まず,最も単純なパターンを考える.とりあえずフィードバックは置いておくとして,何かを入力したら何かが出力されるものを考えてみよう.

y = f(x),これは,中学校数学で学習するはずの「関数」である.独立変数xと従属変数yが,fという関係で結ばれているというやつ.xに何らかの値を入れると,それに従ってyの値が定まる.すなわち,xを入力するとfの処理が行われ,yが出力される,というものである(次図).

y = f(x)ではピンとこない人も多いだろう.fとして具体的な処理を考える.xの2乗を計算する関数を考えてみよう.y = x*x である.

pythonの関数として,square(x) というものを定義してみよう.パラメータxに値を入れてsquare() を呼び出すと,2乗の値が返される,というものだ.

def square(x):
y = x * x
return y

図で示すと,次のようになる.

次の図は,Google Colaboratoryを使って動作検証してみた結果である.まず,関数を定義して,その関数を実行している.

square() に6を入力し,処理結果の36が出力されている様子を確認してほしい.

プログラムは固定?

ところで,ここで問題となるのは,square(x) の呼び出しそれ自体がプログラムに含まれているということである.どういうことか.

先の例で,square() の実行は,square(6) というプログラムとして表現されたものを実行する,という手順になっている.すなわち,xの入力までがプログラムに埋め込まれているということであり,それは次の図の淡い青で示した部分全体がプログラムとして固定化されていることに他ならない.

したがって,入力を変更するには,プログラムを書き換える必要が生じる.しかし,一般的な情報システムにおいては,利用者がプログラムを自在に書き換えるということは,通常,あり得ない.どうしたものか?

インタフェースを定義する

そこで,プログラムでインタフェースを定義する必要が生じるのである.Cでいうならば printf() や scanf() などで実現していたものだ.

上記の関数では,入力はプログラムに埋め込まれており,出力は Colaboratory の機能を知らずうちに利用していた.次は,この入出力を明示し,プログラムに組み込むことを考える.

関数 cli() は,入出力のインタフェースを明示的に記述し,外部から入力された値を用いてsquare() を呼び出すものである.その結果は print() でフォーマットされて出力される.なお,この関数はもともと端末エミュレータ上で実施することを想定していたため,コマンドラインインタフェースとしているが,Colaboratoryで実行すると,図のように入力用のテキストフィールドが現れる.

関数 cli() には,入力,処理,出力の工程が,各行で綺麗に分離して記述されていることが分かるだろう.これがインタフェースを定義する考え方の最も基礎となる部分である.

今後は,この簡素なインタフェースを,どれだけリッチにできるかを考えていけばよい.ただし,インタフェースの道は一日にしてならず.奥が深いものである.じっくりと探究していこう.

0 件のコメント:

コメントを投稿