『 UNIX という考え方 』を読んだ。
はじめにまとめられており、それらの詳細を見ていく形になっている。
- スモール・イズ・ビューティフル
- 一つのプログラムには一つのことをうまくやらせる
- できるだけ早く試作する
- 効率より移植性を優先する
- 数値データは ASCII フラットファイルに保存する
- ソフトウェアを梃子 (てこ) として使う
- シェルスクリプトによって梃子の効果と移植性を高める
- 過度の対話的インタフェースを避ける
- すべてのプログラムをフィルタとして設計する
個別に感想を書いていく。
小さいものは良い。そして、ひとつのことをやるものは良い。この組み合わせの話はほとんど「凝集度」の話だ。
大きいものは往々にして余計な・不必要なものを含む。小さくすると余計なものを含む余地が減っていく。小さいものを組み合わせれば、必要なものだけを選び、不必要なものを避けられる。この点で素晴らしい。一方で、小さいものを組み合わせるのは手間がかかる。この点にはあとで触れる。
試作するのは良い。「案ずるより産むが易し」だ。やったほうが早いことはある。それに試作で気づくことは多い。「人間による三つのシステム」として書かれてもいるが、だいたいのものは三回目以降で良くなってくる。この回数は経験則的で根拠がない。ただ、こなれてくるまでには時間がかかるし、つくりなおしもある。後発のほうが良くなる。
試作するのは良い……が、どれくらい早いと良いのかは難しい。「できるだけ」の線引きだ。特に気になるのが計画の有無だ。ぼくはここ一ヶ月のうちに『計画を立てろ (2017-10-27) 』という日記を書いた。大まかでも計画を立てたほうが良いと思う。これは正しい状態かを判断できるようにする第一歩だ。大きな計画のもとで試作を重ねるのは良い。大切なのは、詳細までは要求していないこと、試作を否定しないことだ。遠足のしおりには、歩行のための手順は書かなくていいが、目的地と予定時間くらいは書いてほしいだろう。
効率より移植性を優先する。効率については例の最適化の法則を引用すると良さそうだ。
「プログラム最適化の第一法則: 最適化するな。プログラム最適化の第二法則(上級者限定): まだするな。」 - Michael A. Jackson
いろいろ事情が変わっている気はする。効率はマルチコア化が進んだあたりで変わっていそうだ。ぼく個人としてはそこまで効率を要求される状況にない。移植性は仮想マシンの登場や Docker などで変わっていそう。ぼく個人としてはアプリケーションは特定の環境 (たとえば Docker 内) で動けば良しとすることが多いように思う。もちろん原則として環境依存はしないように心がけてはいるけれど。
バイナリデータは必要なら使う。そうでなければ使わない。確認しづらいので。バイナリで効率を良くしないといけない状況にはまずならない。
梃子。まとめづらい。いくつかの話が混じっているように思う。
ひとつは「既にあるもの(ライブラリなど)を活かせ」という話だ。「車輪の再発明」的な話だ。ぼくは使うこともあるが、つくることも多い。 2017 の目標 (2016-12-31) を見ても↓のようなものがあるくらいだ。
あえて、つくることが多い。言い訳的だが、いくつかの理由を挙げておく。
- 車輪の再発明は学習という観点で問題にならない
- 大きいものを小さくするためにつくることが多い
- 自身のコントロールが利くようになる
- 楽しい
釘をさすように「独自技術症候群 (Not Invented Here (NIH) Syndrome) : 他所で開発された技術を嫌い、すべての技術を自前で用意しようとする考え方」などが何度も書かれる。
シェルスクリプトで既存のものを組み合わせて使えという話。梃子の続きでもある。小さいものがたくさんある前提なのだから、組み合わせる手段が大切なのは分かる。ただ、実際に使っているけれど、これで良いのかはずっと疑問だ。移植性の観点から言えば、コマンドの有無やオプションの違いなどから動かないことも多い。また誤った加工で壊れることも多い。簡単なデータ型も扱えない (扱いづらい) 。そういった理由で壊れていても気づかない (気づくようにつくるのも面倒だ) 。どうなんだろう。
過度の対話を避けるのは良い。これは Windows がそうだったんだろう (そこもまた変わってきている) 。すべて GUI だと操作が必要で大変だ。 GUI だからというよりは CUI でも対話があると同じだ。対話よりはオプションを使って、バッチ的に処理できるほうが便利なことは多い。
すべてのプログラムは……主語がでかい。