[小さいものは美しい] UNIXという考え方を読んで、感銘を受けたので感想を書いた

UNIXという考え方という本をご存じだろうか?「エンジニアなら読んどけって本を教えてください」と、Twitterに書き込んだところ、失敗から学ぶRDBの正しい歩き方 の著者である@soudai1025 そーだいさんからおすすめされたので読んでみたのだ。

FireShot Capture 018 - (1) そーだい@初代ALFさんはTwitterを使っています 「@ici_mici UNIXという考え方」 _ Twitter_ - twitter.com

感想

最高だ!素晴らしすぎる。語彙力を失うほどに感銘を受けた。みんな読んだ方がいいよ。感想は以上。以降本の内容及び感銘を受けた事柄を書く。

どんな本なのか?

UNIX OSの設計思想について書かれている。そしてそれが他のOSとどう異なるのか、何が優れているのかについていくつかの観点から情熱的に言及されている。以下に本書における9つの命題を記載する。

1. 小さいものは美しい
2. 1つのプログラムには1つのことをうまくやらせる
3. できるだけ早く試作する
4. 効率より移植性を優先する
5. 数値データはASCIIフラットファイルに保存する
6. ソフトウェアを梃子(てこ)として使う
7. シェルスクリプトによって梃子(てこ)の効果と移植性を高める
8. 過渡の対話的インターフェースを避ける
9. すべてのプログラムをフィルタとして設計する

ワクワクしたでしょう?本書は上記命題についてひたすら解説されている。
出版されたのは2001年、20年ほど前だが現在にも通じる、というか多分今後も変わらない普遍的な価値観だと思う。

小さいものは美しい

フォルクスワーゲン社の小型自動車を冒頭にあげ、小さいものの価値について言及されている。UNIXの考え方の根源である。本書は終始以下の主張を繰り返す。

プログラムは小さくシンプルに作れ
1つのプログラムには1つの機能だけを持たせろ
別に早くなくていいから、皆が使えるようにしろ

これだけである。
今日のマイクロサービスアーキテクチャとおんなじこと言ってる。20年も前に。

小さいと何がいいのかについては要約するとこんな感じである。

わかりやすい(可読性がよい)。
使いまわしがきく(移植性がよい)。
組み合わせて再利用しやすい(梃子として使える)。


自分でも不思議だが「あれもしたいこれもしたい」でファット(多機能)なプログラムを作ってしまう。本書ではファットなプログラムに警鐘を鳴らしている「保守担当者にとっては究極の悪夢」だと。

移植性こそ重要である

ラットイヤーと言われるIT業界の進歩において非常に面白いことが書かれている。要約する。

プログラムを早く動作するように作りこむ必要はないよ、ハードの性能向上によって早く動くようになるから。シェルスクリプトをC言語に書き直す必要なんてないよ、移植しずらくなるだけだから。

日々新たなプラットフォームが誕生する中で移植性こそ重要と述べている。新たなプラットフォーム用にプログラムを作り直すんじゃなくて、あらかじめ未来の環境でも動くように作るんだよってこと。つまり高性能な言語で速く動くプログラム(でも適用には時間がかかる)よりも、遅くても簡単に適用可能なシェルスクリプトでいいですよと。

よいプログラムは死なず、ただ新しいハードウェアに移植されるのみ
移植か死か

小さくて、シンプルで、原始的なものこそ生き延びるって価値観に衝撃を受けた。

データとフィルタについて

データとプログラムの関係についても言及されている。

コンピュータの出現以来、書かれてきたすべてのプログラムはフィルタだ

プログラムはデータをフィルタリングするためだけに存在するという考え方である。この考えは今日になっても全く変わっていないと感じる。根源的な価値観である。続けてUNIXの標準入力、標準出力、標準エラー出力について以下のように書かれている。

ユーザがソフトウェアをどう使うかは、決して予測できない。

どこからどんなデータがやってきてもいいようにプログラムを作り、プログラムによってフィルタされたデータを返すだけだよってシンプルで汎用的で美しい思想だろうか。

そのためにデータはASCIIフラットファイルに格納しましょうと書かれている。時代によってASCIIでなくともよいかもしれない。データの読み取りにひと手間かけずに済むフォーマット。メモ帳で開けすぐ直せる形式で保存しましょうと。これは先述した移植性と大きな関係性がある。

動かせないデータは、死んだデータだ

とまで言い切られている。ASCIIデータはスピードが落ちることは否めないが、移植性の方がはるかに重要だと。また、UNIXだとパイプ | を使うことでシンプルなプログラムで驚くほど簡単にデータの操作が可能だよと。パイプの素晴らしさについても書きたいけど、そこまで詳しくないのでやめとく。

いやそんなことわかってるよ!でも驚くほどできてねーよな。

と思う方は多いんじゃなかろうか。私自身もそう思った。人月の神話を読んだ時もそう思った。では何故私たちを取り巻くプログラム達はそうではないのだろうか?本書の中でいくつかヒントがあったので記載する。

「自尊心」の3文字がひっかかっていたことだろう。

社内に蓄積したノウハウ(独自技術)に頼りプログラムを作ってきたエンジニアが、「他社のプログラムを真似すればいいじゃん」と言い放たれた際に胸の中に湧き上がってきた感情についてだ。

自尊心こそ最大の敵かもしれない。歴史ある企業や、ベテランのエンジニアであればあるほど成功体験や積もり積もったノウハウを捨てられないんじゃなかろうか。

UNIXのみんなで情報を共有し良くしていこう。って考えと、資本主義の対立を乗り越えないといけないなと。技術と自社利益は分けて考えないとなと。UNIXもこれが原因で、Linuxが生まれたり裁判したりしてるし。

6章の「対話的プログラムの危険性」でもプログラムが小さくならない理由についても言及されているのでぜひ読んでいただきたい。

思想について我々は知らなすぎるのでは?

世の中には「こうすればできるよ」というHow toは溢れている。私も「1週間でできるXX」や「XXでXXする方法」みたいな本はたくさん読んできた。しかし、プログラムやOSの思想についてあんまり考えたことがなかった。できるエンジニアとは素早くイケてるプログラムを書ける人だと信じて疑わなかったのだ。

しかし真に必要なのは「なぜそうなのか」「どうあるべきなのか」だとこの本から学んだ。

黒い画面に文字だけがずらっと並んでいるターミナル恐怖症のエンジニアこそ本書をお勧めする。自身の食い扶持であるプログラムやOSがどのような考えのもと洗練されてきたのかこそ、技術者として生きていく中で触れるべき価値観だと思う。

今後プロダクトのあるべき姿に迷った時には、きっと9つの命題を思い出し見つめなおすだろう。エンジニアとしての一つの指針を授けてくれた本書及びそーだいさんにはこの場を借りて感謝申し上げる。

最後に第8章「一つのことをうまくやろう」から引用する。

覚えておいてほしい。ソフトウェアは、実は作るものではなく、成長していくものなのだ。移植できるものは生き残る。それ以外のものは、やがて時代に取り残されてしまうだろう。

お付き合いいただきありがとうございます。


この記事が参加している募集

推薦図書

読書感想文

この記事が気に入ったらサポートをしてみませんか?