似て非なるインターフェース

外見というものは一番ひどい偽りであるかもしれない。
シェークスピア
引き続き、プログラミングにおける関数(ライブラリ)インターフェースの話を。

今までに生み出されてきたプログラムの数は数知れず。さらにこうしている今も世の中では無数のソースコードが生み出されています。とはいえ、そのうちのほとんどはそれほど新規性のあるものではないでしょう。細かい違いはあれど、基本的なロジックは既にどこかで作られたものものを焼き直し、組み合わせているだけです。

アルゴリズム+データ構造=プログラム」と言えば、Pascalの設計者であるNiklauth Wirth氏によって書かれた古典的名著ですが、まさに言い得て妙。「アルゴリズム」と「データ構造」はまさにプログラムの基本構成要素であり、定石とも言えるパターンがあります。クイックソートや二分探索のアルゴリズムや、リスト構造や配列、ハッシュ等のデータ構造。それらの計算オーダー、メモリ効率。。。プログラミングのテキストには必ず出てきます。テキスト上で眺めている間は退屈なものですが、基本的なパターンを知っておくことは実際にプログラムを書く上では重要です。このようなテキストにあるような基本パターン以外にも、既存のソースコードからは、パターン化されたデータ構造やアルゴリズムを数多く見ることが出来ます。

さて、アルゴリズムやデータ構造に加えて、プログラミング、特にモジュール設計において重要なのがインターフェース設計。このインターフェースについても全てを一から考えるようなケースはほとんどなく、大抵の場合、リファレンスとなる前例があるでしょう。これも一種の定石のようなものです。

しかし、このインターフェースについては、アルゴリズムやデータ構造にはない注意点があります。それは、アルゴリズムやデータ構造がコンピュータを対象としたものであるのに対し、インターフェースはそれを使う人間を対象にしているという点です。使う対象の差は、変化に対する追従性に表れます。
アルゴリズムやデータ構造を変えたとしてもコンピュータならすぐ追従してくれます。しかし、例えば関数のインターフェースをちょっと変えても、それを使う人間はすぐに適応してはくれません。慣れ親しんだインターフェースであるほどそうです。人間の思い込みというものはそうすぐには変わりません。

ちょっと例を出しましょう。今、ファイルアクセスを行うライブラリの設計を行っているとします。POSIXのopen/close/read/writeは標準的なインターフェースと言えるので知っている人も多い。リファレンスとしては良いでしょう。 でもここで一つ問題が。このopenのflagsには、ファイルが存在しないときは作成するというO_CREATというフラグがあります。O_CREATEではなくO_CREATです。E一文字くらい省略するなよと何人の人が思ったことでしょう。ということで今回はO_CREATはO_CREATEと変えたとします。
さて、ここで何が起こるでしょうか。大抵のユーザはI/Fを一瞥して、「あぁ、POSIXと同じだな」と思い込んで、詳細な仕様をわざわざ見ずに使うでしょう。となると、ファイルを作成したいときは思わずO_CREATと指定してしまいます。この場合は、コンパイルでエラーになるだけなので対した被害はありませんが、実行時でしか気がつかないような機能的な違いだと非常にやっかいです。
これがPOSIXのopen()と似ても似つかないインターフェースならユーザーはCREATEと指定してくれる可能性が高いでしょう。「似て非なる」という点が混乱のもとになっているのです。

アルゴリズムやデータ構造といったコンピュータを相手にする部分は、小さな工夫を積み重ねることで効果は上がるでしょう。しかしインターフェースのような人間が使うものは小さな変化を積み重ねていては、かえって混乱を招くだけです。「似て非なる」はコンピュータには別々できても人間には分かり難いものです。キーボードのQWERTY配列は人間工学的に見て優れているとは言えませんが、そうは分かっていてもなかなか変更されないのも良く似た理由と考えられるでしょう。

一から新たなインターフェースを設計する際には、単純に最も良いと思われるものを目指せば良いでしょう。しかし、それが何かしら基になるものを改善するようなものである場合は、改善後のインターフェースに対する利便性等だけでなく、変化に対する移行性、時には互換性といったものに対する配慮も必要でしょう。

【関連記事】
関数のユーザビリティ
選択できない選択肢

【関連リンク】
入力法および表記法のヒューマン・インタフェース学入門(QWERTY成立の解説等)

【関連書籍】
Algorithms + Data Structures = Programs Niklaus Wirth
アルゴリズムとデータ構造 - N.Wirth
珠玉のプログラミング―本質を見抜いたアルゴリズムとデータ構造 - Jon Bentley
プログラミング作法 - Brian Kernighan

コメント

非公開コメント

本のおすすめ

4873115655

4274065979

4822236862

4274068579

4822255131

B00SIM19YS


プロフィール

  • Author:proger
  • 組み込み関係で仕事してます

ブログ内検索