読者です 読者をやめる 読者になる 読者になる

レガシーコード生産ガイド

私に教えられることなら

モードと人間とプログラミング

プログラミング言語や環境、スタイルの話に対して、2年ぐらい前からずっと考えてることがある。人間を眺めた方がいいんじゃないの、と思う。

再利用性を高める、保守性を高める、状態が引き起こすバグを防ぐ……などの目的のためのいろんな考え、理論はある。でも、それを使う人間まで含めた視点で語られてるものはあまり見たことがない。

コードを書くのは人間なので、人間にとってわかりやすくなること、人間のミスを減らせることが目的になる。それなら、人間はどういう思考や作業が苦手で、何が優れていて、どの能力を活かせばいいのか、という視点が一番重要では無いだろうか。

モード

場所に関する能力を活かせばと思って処理系を作ったことがあるけど、すぐにこれはダメだと感じた。

それからずっと、何故そう感じたんだろうかと不思議に思っていたんだけど、先日読んだヒューメイン・インターフェースが答えかもしれない。モードだ。

自分の考えを簡潔に書いておくと、人間が苦手とするのは大量に短期記憶を要求されることで、最も素晴らしい能力は「慣れ」だと思う。創造性も慣れから生じると確信している。とりあえずこれを前提として進める。

「モード」というものが存在すると、短期記憶を要求される。今どのモードなのか覚えておかないといけないからだ。その分、創造的な事、素晴らしい能力のために使えたであろう短期記憶領域は奪われる。モードの把握のために「慣れ」の発揮も阻害される。

例えばペイントソフトを使う際に、選択ツールモードに切り替えていたとする。一瞬の間に、作品をどう変更するかイメージし、短期記憶領域を上書きする。表現すべく操作し始めたところで、選択ツールモードになっていたことに気づく。短期記憶領域を使って描画ツールモードに切り替える。慣れによる行動は阻害されて、フラストレーションが溜まり、イメージには霞がかかり始める。

ペイントソフトの場合は、覚えておくべきモードは少ない。「選択ツールモードに切り替えてから選択する」「描画ツールモードに切り替えて、色を選んでから描き始める」という動作に慣れてしまえばいい。実際にプロの人の作業動画を見てみると、モードによって苦労させられた結果生まれたであろう動作が多かった。

プログラミング

プログラミングの場合、モードは簡単に悪夢になる。好きなだけ増やせるからだ。グローバル変数などで全体のモードをいくらでも増やせる。どこかに置かれた、存在すら忘れてしまうモードに痛めつけられると、全部放り出したくなる。

また、モードが問題になるのは、書いているプログラムにとってではなく、書いてる最中の人間にとってだ。モードの阻害によってうんざりしながら、それでも必死にモードの遷移を考えながら書いてる最中は、モードそのものが悪いということになかなか気づけない。

グローバル変数だらけ、破壊的な変更だらけのプログラムでも、もし書いてる最中の人間が一切モードに煩わされることが無いなら、それは問題とならない。

逆に破壊的な変更が容易にはできないような言語を使っても、プリプロセッサやテンプレートでソースコード自体にモードが生まれたり、ファイルやモジュールの関係、エディタやウインドウの操作などで作業にモードが生まれると、プログラミングはすぐに苦痛となる。

擬似モード

ヒューメイン・インターフェースでも書かれているように、モードを完全に無くすことは難しい。イミュータブルな部品を組み合わせてプログラムを組んでいっても、最終的にはどこかを変更する、つまりモードを作らないといけない。

同書の中で提示されてる解決策の一つは擬似モードだ。

モードによって動作を切り替えると、今どのモードだったか忘れて予想外の動作が起き、慣れが阻害される。しかし、例えば「あるキーを押している間はマウスの動作が変わる」というような擬似的なモードを導入すると、「キーを押しながら操作する」という慣れがすぐに生まれて、モードは問題では無くなる。

関数の中が変数の破壊的な変更によるモードだらけでも、その変更が中で完結しているなら全く慣れを阻害しない事が多い。自分にとって問題になるのは、モードが外に漏れだした時や、関数の中が大きくなってモードが増えた時だ。

プロジェクト毎に必要なモジュールをインストールするような仕組みも、バージョンなどのモードを閉じ込める解決策と言える。それでもまだ苦痛なら、もっと閉じ込めるか、できれば無くすべき。

結論

コードと動作するプログラムだけを眺めると「とにかく疎結合にして」「目的に応じて臨機応変に」みたいな話に終わりやすい。その先の話は、人間を眺めると良い。

「臨機応変に」じゃない指針の一つとして

  • 書いてる最中の人間から見た、モードを無くす
  • 無理なら擬似モードに閉じ込める

が使える。

広告を非表示にする