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

UNIXという考え方読んだ

誕生日に id:aereal さんに頂いた本。ありがとうございます!

UNIXという考え方―その設計思想と哲学

UNIXという考え方―その設計思想と哲学

たいへん有名な本。原著は1994年に書かれていて、古典という感じ。

大きな一枚岩のソフトウェアよりも、cat、sort、uniq、sedやawkのような小さくて便利なツールを組み合わせることが好まれる。UNIXの世界には、こういった、UNIX開発者やユーザがが大事にしている哲学があり、そのおかげで、この本が書かれた1994年、そして現代においてもUNIXが広く使われることになった。この本では、そういったUNIXの考え方のエッセンスの部分を9つの定理にまとめてとして詳しく教えてくれる。

  • スモール・イズ・ビューティフル
  • 一つのプログラムには一つのことをうまくやらせる
  • できるだけ早く試作を作成する
  • 効率より移植性
  • 数値データはASCIIフラットファイルに保存する
  • ソフトウェアの挺子(てこ)を有効に活用する
  • シェルスクリプトを使うことで挺子(てこ)の効果と移植性を高める
  • 過度の対話的インタフェースを避ける
  • すべてのプログラムをフィルタにする

いくつか、おもしろかった部分をピックアップしてみよう。

第一のシステム、第二のシステム、第三のシステム

"できるだけ早く試作を作成する"について説明してくれる3章で説明されている第一、第二、第三のシステムの話が特におもしろい。曰く、人間にはこの三種類のシステムしか作れない。

第一のシステムは、一人もしくは少人数が、時間に追われる中で創造性を発揮し、勢い良く作ったシステムだ。時間追われたために、足りない機能もあるが無駄はなく効率的に動く。第一のシステムまったく新しい考え方を導入するので、はじめは世間には相手にされない。

しかし、第一のシステムが成功しはじめると、多くの人が集まってくる。そして、第一のシステムにより有用性が証明されたアイディアをもとにした新しいシステムが作られる。これが第二のシステムだ。第二のシステムは第一のシステムに目をつけた多くの参加者からなる委員会が機能を決定する。その結果として、多くの人の意見を取り込みすぎため、機能は多いが、無駄のある遅いシステムができあがる。多くの人に期待された第二のシステムは時には商業的にも成功するが、実はあまり役に立たない。

第二のシステムの失敗に反省した人々が、第三のシステムを構築する。第三のシステムだけが、第一のシステムが発見したアイディアと第二のシステムの中で見つかった必要な機能をバランスよく取り入れて、やっと役に立つシステムを構築することができる。

UNIXの考え方では、なるべくはやく第三のシステムを構築するために、すばやく試作することをおすすめしている。直接、第三のシステムをつくることはできないのだ。

必ずしもこうだと言い切れるものではないだろうが、実感としては同意できる。よくできたと思えるソフトウェアが一度にできることはない。イテレイティブな開発が現代のアジャイル開発手法では推奨されているけども、1994年の時点でもこのような話があるのはおもしろい。

ソフトウェアに完成はない

ソフトウェアには常に改善の余地はあるのはもちろんだし、時間的な制約などでそのソースコードは必ずしも最高の状態が保たれているわけではない。曰く、ほとんどのソフトウェアは妥協の産物だ。完成することはなく、ただリリースがあるだけだ。

ソフトウェアや計算機が常に進化していることを意識しなければならない。UNIXの考え方はソフトウェアの進化にも強い。ソフトウェアを小さくてシンプルな部品に分割すれば、将来の変更に容易に対応できるし、ソフトウェアを容易に移植可能にしておけば、来年には利用できるようになる、よりはやい計算機でも簡単に動かすことができる。

この話もまったく納得するはなしで、ソフトウェアを常に進化する流動的なものとして扱うというのは、現代でもホットな話題だが、普段利用しているUNIXにもその考え方が息づいているというのも面白い。

シンプルなソフトウェアのコンポーネント化手法

小さなソフトウェアを組み合わせる方法がシンプルであることもUNIXでは重要だ。UNIXではパイプを通じたプロセス同士の通信の仕組みがあって、多くのソフトウェアがこのシンプルなインタフェースに準拠してる。第8章ではMHを例に複雑なメールアプリケーションが、40近くのコマンドの連携によって構築できることを示している。

ソフトウェアコンポーネントのように、ソフトウェア特定の機能群を部品として使う方法を標準化して、それらを組み合わせるだけでアプリケーションを構築できるようにするというアプローチはいろいろある(CORBAとか)が、大成功している例はあまりみない。たぶん気楽に試すには難しすぎるのではないかと思う。

UNIXのプロセス同士をパイプでつなげて通信する方法は、ソフトウェアコンポーネントほど複雑なことはできないが、そのシンプルさ故にアプローチとしては成功している。これくらいシンプルだと、ちょっと自分でも試してみようと思うし、シンプルなわりに強力なことができてしまうので、人気がでてエコシステムも潤う。バランスの妙という感じで真似できるならしたい。

まとめ

この本は、UNIXをお手本にしたソフトウェア工学について書かれた本だとも言えると思う。古典だが現代に通じる考え方が多くて参考になる。UNIXに慣れ親しんでいるひとは、あらためて読む必要はないかもしれないが、よくまとまっているのでポイントを整理するのにも良い。うすいしすぐ読める。

ときどき時代背景がわかる記述があるのもおもしろい。CD-ROMが今後のソフトウェア業界を大きく変化させるであろう、だとか当時の時事ネタを楽しめるのもおすすめ。

UNIXという考え方―その設計思想と哲学

UNIXという考え方―その設計思想と哲学