#読書録
p1. 「UNIXの創始者たちは、ある極端なコンセプトから始めた。ユーザーははじめからコンピュータを使えるとみなしたのだ。UNIXはユーザーが何をしているかをわかっているという前提に立っている。他のOS設計者が、初心者から専門家まで幅広いユーザーを受け入れようとして苦労しているとき、UNIXの設計者たちは、何をしているのかわからないなら、ここにいるべきではない、という不親切きわまりないアプローチを選んだ。」
・UNIXの発明者はAT&Tのケン=トンプソン
・UNIXは移植性が高い
→ 最初はアセンブリで書いていたが、後にB言語で書くことになる
- Small is Beautiful
・コードだけでなく、プログラム自体もSmallにする
→ 例えば、ファイルをコピーするプログラムは、とにかくファイルをコピーするだけ!ファイルの存在有無や、ファイル名のチェックなどはしない
→ そのチェック等の処理は別のプログラムにまかせる (例えば testコマンド)
・利点はなにか
→ 1. わかりやすい ⇒目的が明確である
-
- 保守しやすい ⇒ わかりやすいため
-
- システムリソースに優しい ⇒ メモリの消費を抑えることができる / プログラムが終了すれば、メモリを占有することもない
-
- 他のプログラムと組み合わせやすい
- 一つのプログラムには一つのことをやらせる
・多機能主義に陥ってはいけない
→ 「しのびよる多機能主義」(原文では creeping featurism)
→ おもしろいから覚えとく
チェックリスト
・プログラムは対話型でないといけないのか?
・入力データは特殊フォーマットでないといけないのか?フォーマットを変化するプログラムが他にあるのではないか?
・出力データは特殊フォーマットでないといけないのか?
・新しいプログラムを書かなくても、似たようなプログラムの組み合わせで実現できるのではないか?
道を踏み外したUNIXコマンドの一例は ls コマンド
→ lsコマンドは、オプションの数が膨大
→ lsコマンドはファイル名を縦に表示することに専念すべき
→ 列の整理だったりするのは、他のプログラムがやること
→ 保守が大変だし、理解しにくくなる
-
できるだけ早く試作を完成させる
→ 要するにleanにやるということ -
効率より移植性
→ Lotus 1-2-3: 表計算ソフト
→ windowsプラットフォームに対応するのが遅れてしまったためにマーケットから締め出されExcelにとって変わられた
→ 「あらゆる個人や、起業、組織、あるいは国家でさえも、優れた着想を自分だけの秘密にしておける時代ではない。いずれ他人が気づき、「そこそこの複製」が現れるだろう。あるアイデアを得てその利点を確信した知的起企業は、生き残りのためにできるだけ多くのハードウェア上でそのアイデアを具体化し、できるだけ大きな市場シェアの獲得を目指さねばならない。このあために最も効率的な方法は、移植性のあるソフトウェアを書くことだ」
→ 要するに、「保守」と「移植性」が大事
→ UNIX上の移植性を考えるなら、「C言語」で書くよりも、「shell script」で書いたほうがいい
- ソフトウェアの梯子を有効に活用する
「良いプログラマは良いコードを書く。偉大なプログラマはよいコードを借りてくる」
→**「ソフトウェアを大量に書く一番よい方法は、借りてくることだ」**
→ 「借りてくること」とは「他人のモジュールやプログラム、設定ファイル」を使うということ
→ 借りてくることで大量のコードを素早く書くことができ、それによって素早いリリースが期待できる
→ 「独自技術症候群」を避ける = 独自技術に固執しても、創造性は伸ばさない。
→ 「借りてくる」ことで余ったリソースを創造性に費やしたほうが良い。
→考: 個人レベルでの実践に関して言えば、目的に依るということだろう。常に目的意識を持て、そういう風に読み取れる
→ 一方で企業レベルでの実践では、率先して「借りてくる」ことによって「付加価値」の創造にリソースを注ぐことができる
アインシュタイン「私は人生で2度しか奇跡を見たことがない。一つは核融合、もう一つは複利だ。」
→ アインシュタインは、少量のものを繰り返し掛け合わせていくことで、やがて奇跡的な規模に達するということを明らかに理解していた。
→ 考: これってUNIXだけじゃなくて、分割統治法とかにも言えそう
- 全てのプログラムをフィルタにする
→ パイプ機能
7.5. 沈黙は金 ←面白い!
例えば空のフォルダに対して、UNIX以外のOSで"Dir"コマンドを実行すると、きちんと「NO FILES FOUND」と出る
→ しかし、UNIXの"ls"コマンドでは空の場合、何一つ表示されない
→ これは、パイプ機能を想起すると容易にその理由が理解できる
→ 例えば " ls -l | awk ‘{ print $4 }’ | sort " というコマンドを実行した場合、もし仮にlsが「NO FILES FOUND」などと返してしまえば、わけがわからないことになる
まとめ
・とにかく、小さく分割!
→ 「部分の総和は全体よりも大きい」
・そして効率よりも移植性を考える!
・コードは借りてくる!
考: 観念的にはありきたりに見えるかもしれないが、これらをプロダクト単位にて実際の実践に移せたのが大きな功績だと思う
→ この世にUNIXというOSが存在しなかったならば、我々はどのようにしてUNIXを発明するのか?