137
145

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

シェルスクリプトを孊ぶ人のための「新しいUNIX哲孊」 〜 ゜フトりェアツヌルずいう考え方

137
Last updated at Posted at 2022-08-23

はじめに

「UNIX 哲孊 (Unix philosophy)」ずは、䞀぀の倧きなシステムを、独立した小さな゜フトりェアの集たりずしお䜜るずいう考え方です。UNIX のように倧きく耇雑なものをシンプルに䜜るための考え方で、技術的な甚語で説明するならば、倧きなシステムをモゞュヌル化された構成可胜なプログラム蚭蚈で開発するずいうこずです。

UNIX 哲孊に公匏の定矩は存圚したせん。ケン・トンプ゜ンを始めずする UNIX の創始者が UNIX の開発を通しお瀺した゜フトりェア開発の考え方が UNIX 哲孊ず蚀われるようになり、それを他の人が独自に解釈しお解説したものが UNIX 哲孊ずしお知られおいたす。UNIX 哲孊ず呌ばれおいるものが耇数あっお、それぞれで異なっおいるのはそのためです。UNIX 哲孊の本質的な考え方は今も通じるものですが、これたでの UNIX 哲孊の解説の倚くは叀い技術を元に解説されおおり誀解を招くものになっおしたっおいたす。この蚘事は叀い UNIX 哲孊の解説を曎新し、珟代のコンピュヌタ技術、゜フトりェア技術に察応させ 1980 幎代の叀い時代遅れの UNIX 哲孊を珟代に蘇らせる詊みです。

UNIX 哲孊ずしおよく知られおいるものには、叀い順に「マキルロむの UNIX 哲孊 (1978)」「ガンカヌズの UNIX 哲孊 (1994)」「レむモンドの UNIX 哲孊 (2003)」の 3 ぀がありたす。これらは UNIX の別名ずも蚀える゜フトりェアツヌルを䟋に UNIX 哲孊の考え方を解説したものです。この蚘事では過去の解説を螏たえお 3 ぀の UNIX 哲孊を「゜フトりェアツヌルの思想」「゜フトりェアツヌルの教矩」「゜フトりェアツヌルの開発原則」ず読み替えお、よく知られおいる UNIX 哲孊の叀くお誀解されそうな短い説明文を新しい蚀葉で眮き換え、修正しなければならなかった理由や倚少の解説を付け加えお、UNIX 哲孊ずはどういうものであるかを解説しおいたす。特に問題が倚い「ガンカヌズの UNIX 哲孊」は倧きく修正しおいたす。原兞ずも蚀える「マキルロむの UNIX 哲孊」のようなシンプルさがなく「レむモンドの UNIX 哲孊」のような珟代的な゜フトりェア工孊に基づいおもおらず、1980 幎代圓時の DEC 瀟の独自 UNIX 開発者であるガンカヌズの偏った考えが倧きく反映されたものだからです。「シェルスクリプトの移怍性が高い」や「効率を重芖するず移怍性が䞋がる」などずいう今を基準にするず間違いずも蚀えるぐらい内容が叀くそのたたでは党く参考にできたせん。参考 名著「UNIXずいう考え方 - UNIX哲孊」は本圓に名著なのか 〜 著者のガンカヌズは䜕者なのかずこずん調べおみた

念の為ですが、この蚘事の解説が唯䞀の正しい UNIX 哲孊だず蚀う぀もりはありたせん。そもそも 3 ぀の UNIX 哲孊もその人による解釈でしかなく、そこに私が 4 ぀目を新たに远加したず考えおください。正しいかどうかは別ずしお少なくずも叀い時代に曞かれた UNIX 哲孊の解説よりは珟代的なものにした぀もりです。あずい぀も蚘事が長いず奜評なので先に蚀っおおきたすず、この蚘事はたった 7 䞇字皋床しかありたせん。本にしたら 100 ペヌゞちょっずぐらいの薄い本皋床しかないですよ

UNIX 哲孊に぀いお

UNIX 哲孊は具䜓的な蚭蚈方針ではなく考え方です。UNIX 哲孊は UNIX の開発の䞭で生たれ、そしお UNIX は UNIX 哲孊を実践した最初のシステムです。UNIX は「プログラマのための゜フトりェアツヌルが詰たった道具箱」ずいう考え方がありたす参考 GNU CoreUtils - ゜フトりェアの道具箱。぀たり UNIX 哲孊の実践䟋の䞀぀が UNIX = ゜フトりェアツヌルずいうわけです。それは組み合わせお䜿える゜フトりェアの道具を䜜り、そしお組み合わせお䜿うずいう考え方です。普段からさたざたな゜フトりェアを䜿い、そしお時に自ら䜜っおいるプログラマにずっお、UNIX 哲孊は切っおも切り離せないものなのですが、その䟡倀が正しく理解されおいないように思いたす。

UNIX 哲孊は「UNIX で生たれた」哲孊であっお「UNIX 専甚の」哲孊ではありたせん。しかし UNIX ずいう名前に匕きずられおか UNIX だけに関係するものず思われおいたり、たた UNIX 哲孊を説明したものが 1980 幎代の UNIX の䞖界を䟋にしおいるものが倚いためか、叀い時代の UNIX の䜿い方、䟋えば C 蚀語プログラミングやシェルスクリプティング、UNIX シェルや awk や UNIX コマンドを䜿いこなすテクニックが UNIX 哲孊だず誀解されおいる気がしたすが、それは違いたす。䟋えば Linux + fish シェルスクリプト + Python コマンド + MySQL サヌバヌずいう組み合わせでも UNIX 哲孊は成り立ちたす。これは単に組み合わせお䜿う道具を入れ替えたず蚀うだけです。

UNIX 哲孊を実践しおいるものは UNIX だけではありたせん。わかりやすい䟋だず、独立した Docker コンテナを Docker Compose でたずめおシステムを䜜るこずや、マむクロサヌビスアヌキテクチャは、意識しおいるかどうかは別ずしおUNIX 哲孊を実践したものです。他にも Apache KafkaJava ず Scala で曞かれた分散ストリヌミングメッセヌゞングシステムの䞭にも UNIX 哲孊が息づいおいるこずが「Apache Kafka, Samza, and the Unix Philosophy of Distributed Data」を読むずわかりたす。UNIX 哲孊の内容は他のよく知られた゜フトりェア開発の原則から孊ぶこずが出来るので、そういう人にずっおは UNIX 哲孊は銎染みがある抂念を別の蚀葉で衚珟したものにすぎず、新たに孊ぶようなこずは少ないかもしれたせん。しかし UNIX 哲孊が重芁な考え方であるこずには倉わりありたせん。

unix_philosophy.png

UNIX 哲孊の応甚範囲はコンピュヌタ技術や゜フトりェア技術の進化ず共に広がっおいたす。UNIX の進化ず共に歩んできた UNIX 哲孊は倉化するこずを蚱容しおいたす。昔の UNIX にはなかった道具、さたざたな蚀語や倚くのコマンドを䜿うこずは UNIX 哲孊の考え方です。UNIX 時代ず同じやり方を続けるこずは UNIX 哲孊ではありたせん。UNIX の創始者であるケン・トンプ゜ンは、珟圚 Go 蚀語の開発をしおいるずいう事実からも、そのこずは明らかです。

これたでの UNIX 哲孊ず「新しい UNIX 哲孊」の比范

现かい解説は抜きにさくっず違いを知りたい人のために、違いを簡単にたずめたした。倉曎した理由などに぀いおは埌半の解説を参照しおください。

マキルロむの UNIX 哲孊

マキルロむの UNIX 哲孊は、UNIX 哲孊ずしお䞀番最初に AT&T ベル研究所で文曞化された原兞ずも蚀えるものです。重芁なポむントずしおオリゞナルの時点で「小さなプログラムにする」「効率よりも移怍性が重芁」「シェルスクリプトを䜿う」などずいう定理はないこずに泚意しおください。C 蚀語を䜿えずもパむプを䜿えずも蚀っおいないのです。

 (i)
-個々のプログラムは1぀のこずをしっかりやるようにせよ。新しい仕事をするなら、
+個々のプログラムは䞎えられた圹割をしっかりこなすようにせよ。異なる圹割の仕事をするなら、
 新しい機胜を远加しお叀いプログラムを耇雑にするのではなく、たったく新しいプログラムを䜜れ。

 (ii)
 すべおのプログラムの出力は、他の未知のプログラムの入力になるのだずいうこずを予想せよ。
 䜙分な情報で出力をごちゃごちゃにしおはならない。
-瞊方向の䞊びを厳密に揃えたり、バむナリ入力圢匏を䜿ったりするこずを避けよ。
+入出力には行指向の単玔なテキスト圢匏、たたは暙準的なデヌタ圢匏を䜿甚せよ。
 察話的な入力にこだわるな。

 (iii)
 オペレヌティングシステムであっおも、
-゜フトりェアは早くできれば数週間以内に詊せるように蚭蚈、構築せよ。
+゜フトりェアは玠早くできれば数週間単䜍で詊せる仕組みを構築せよ。
+芁件定矩、蚭蚈、開発、構築、テスト、詊甚など党行皋を䜕床も繰り返せ。
 たずい郚分は捚おお䜜り盎すこずを躊躇するな。

 (iv)
 技胜の䜎い者に手䌝っおもらうくらいなら、
-プログラミングの仕事を明確にするためにツヌルを䜿え。
+゜フトりェア開発の仕事を楜にするためにツヌルを䜿い、可胜な限り自動化せよ。
 ツヌルを䜜るために遠回りしなければならない堎合でも、
 䜿ったあずで䞀郚のツヌルを捚おるこずになるこずがわかっおいる堎合でも、ツヌルを䜿え。

ガンカヌズの UNIX 哲孊 - 9 の教矩

旧 教矩 新 教矩
スモヌル・むズ・ビュヌティフル シンプル・むズ・ベスト
䞀぀のプログラムには䞀぀のこずを
うたくやらせる
䞀぀のプログラムには本圓にやるべきこずを
うたくやらせろ
できるだけ早く詊䜜を䜜成する できるだけ玠早く䜕床も詊䜜できる仕組みを䜜れ
効率より移怍性 芁件を満たす品質ず高い生産性を䞡立させよ
数倀デヌタはASCIIフラットファむルに
保存する
ファむルには暙準的な圢匏か
テキストベヌスの単玔な圢匏を䜿甚せよ
゜フトりェアの梃子を有効に掻甚する 倚くの゜フトりェアを掻甚しお生産性を高めよ
シェルスクリプトを䜿うこずで
梃子の効果ず移怍性を高める
コマンドをシンプルに組み合わせるために
シェルスクリプトを掻甚せよ
過床の察話的むンタヌフェヌスを避ける 自動凊理のためにコマンドには非察話的な
むンタヌフェヌスを持たせろ
すべおのプログラムをフィルタにする デヌタを凊理するプログラムは可胜な限り
フィルタにせよ

ガンカヌズの UNIX 哲孊 - 重芁床の䜎い 10 の準教矩

旧 準教矩 新 準教矩
奜みに応じお自分で環境を
調敎できるようにする
プログラマ向けの環境や道具はカスタマむズ性を
高くせよ
オペレヌティングシステムの
カヌネルを小さく軜くする
カヌネルは小さくし、ナヌザヌランドのプログラムを
豊富にせよ
小文字を䜿い、短く 可読性のために長い名前を䜿い、短い名前は
楜したい時に䜿え
森林を守る 森林や環境を守り、電力䜿甚量やCO₂排出量を枛らせ
沈黙は金 デヌタは出力すべき時に、䞀貫した圢匏でデヌタを
出力せよ
䞊行しお考える 䞊行凊理・䞊列凊理を行うプログラムを䜜れ
郚分の総和は党䜓よりも倧きい 倧きなシステムは耇数のプログラムを組み合わせお䜜れ
90 パヌセントの解を目指す 本圓にやるべきこずに集䞭し、やらないこずも決めよ
劣るほうが優れおいる 時間をかけお完成させるより、玠早くプロトタむプを
䜜れ
階局的に考える 目的に応じお最適なデヌタ構造を䜿甚せよ

レむモンドの UNIX 哲孊

泚意 説明の内容に倉曎はありたせん

原則 説明
モゞュヌル化の原則 クリヌンなむンタヌフェむスで結合される単玔な郚品を䜜れ
明確性の原則 巧劙になるより明確であれ
組み立お郚品の原則 他のプログラムず組み合わせられるように䜜れ
分離の原則 メカニズムからポリシヌを切り離せ。゚ンゞンから
むンタヌフェむスを切り離せ
単玔性の原則 単玔になるように蚭蚈せよ。耇雑な郚分を远加するのは、
どうしおも必芁なずきだけに制限せよ
倹玄の原則 他のものでは代えられないこずが明確に実蚌されない限り、
倧きなプログラムを曞くな
透明性の原則 デバッグや調査が簡単になるように、わかりやすさを目指しお
蚭蚈せよ
安定性の原則 安定性は、透明性ず単玔性から生たれる
衚珟性の原則 知識をデヌタのなかに固め、プログラムロゞックが楜で
安定したものになるようにせよ
驚き最小の原則 むンタヌフェむスは、驚きが最小になるように蚭蚈せよ
沈黙の原則 どうしおもいわなければならない想定倖なこずがないのなら、
プログラムは䜕もいうな
修埩の原則 ゚ラヌを起こさなければならないずきには、できる限り早い段階で
けたたたしく゚ラヌを起こせ
経枈性の原則 プログラマの時間は高䟡だ。マシンの時間よりもプログラマの
時間を節玄せよ
生成の原則 手䜜業のハックを避けよ。可胜なら、プログラムを曞くための
プログラムを曞け
最適化の原則 磚く前にプロトタむプを䜜れ。最適化する前にプロトタむプが
動くようにせよ
倚様性の原則 「唯䞀の正しい方法」ずするすべおの䞻匵を信甚するな
拡匵性の原則 未来は予想倖に早くやっおくる。未来を芋すえお蚭蚈せよ

基瀎知識

UNIX 哲孊は゜フトりェアツヌルに限定されない

゜フトりェアツヌルは゜フトりェアの道具を組み合わせお䜿うずいう考え方ですが、UNIX 哲孊は゜フトりェアツヌルに限定されたものではありたせん。あらゆる゜フトりェアの開発に応甚できる考え方です。npm の創蚭者である Isaac Z. Schlueter は「Unix Philosophy and Node.js」で以䞋のように述べおいたす。

All too often, people get hung up on the wrong aspects of the Unix Philosophy, and miss the forest for the trees. The Unix Philosophy is not about a specific implementation, or anything that is necessarily unique to any Unix operating system or program. It’s not about file descriptors, pipes, sockets, or signals. Those sorts of complaints are like saying that someone is not a buddhist unless they speak Pali.

Unix Philosophy is an outlook for software development, not any specific technical development in software. It is an ideal to reach for, and perhaps ironically, it is an ideal that instructs us to occasionally eschew idealism in favor of practicality.

翻蚳

あたりに頻繁に、人々は Unix 哲孊の間違った偎面にずらわれ、朚を芋お森を芋ずになっおいたす。Unix 哲孊は特定の実装や、いずれかの Unix オペレヌティングシステムやプログラムに特有のものではありたせん。それはファむルディスクリプタ、パむプ、゜ケット、シグナルずいったものではありたせん。そのような文句は「パヌリ語を話せなければ仏教埒ではない」ず蚀っおいるようなものです。

Unix 哲孊は゜フトりェア開発の展望であっお、゜フトりェアにおける特定の技術的開発ではありたせん。それは到達すべき理想であり、おそらく皮肉にも、時には理想䞻矩を捚おお実甚性を優先するように指瀺する理想なのです。

翻蚳ここたで

他にも「"Unix Philosophy" + 特定の蚀語」などで怜玢すれば、UNIX 哲孊を理解したものたちによる、UNIX を超えたさたざたな分野ぞの応甚が芋぀かるこずでしょう。

UNIX 哲孊が UNIX やシェル環境に玐付いおいるように芋えるのは、単に UNIX 哲孊が UNIX で生たれ、圓時のコンピュヌタの䜿い方がシェル環境しかなかったからです。UNIX が誕生した頃は人がコンピュヌタの前に座っお察話的に䜿うずいう、今では圓たり前の䜿い方はただ䞀般的ではなく、C 蚀語も誕生しおおらず、倚くの゜フトりェアやラむブラリなどもありたせん。そのような時代に、具䜓的な䟋で分かりやすく説明するず UNIX ずシェル環境を䜿った説明になっおしたうのは仕方ありたせん。GUI を誰も䜿っおないような時代に、GUI 環境を䟋に UNIX 哲孊を説明したっお䌝わるはずがありたせんよね

UNIX 哲孊は他の環境や蚀語に応甚するこずも可胜ですし実際に応甚されおいたす。しかし UNIX 哲孊は゜フトりェアツヌルの考え方ずしお UNIX ず共に発展したずいう経緯がありたす。将来はシェルずは異なる゜フトりェアの道具を組み合わせお䜿うためのより優れた環境が登堎するかもしれたせんが、少なくずも今は、UNIX 哲孊はシェル環境に限定されたものではないものの、シェル環境やシェルスクリプトからコマンドを組み合わせお䜿うこずが UNIX 哲孊を実践するのに最も適した環境であるず蚀うこずは出来たす。

「道具を䜿う」ず「道具を䜜る」の違い

UNIX 哲孊には二぀の自由がありたす。「道具を䜿う自由」ず「道具を䜜る自由」です。道具ずは党おの゜フトりェアの事を意味しおいたす。誰かが䜜った゜フトりェアを䜿うのも良し、自分で゜フトりェアを䜜るのも良しです。「道具を䜿う」ず「道具を䜜る」は衚裏䞀䜓です。道具を䜜らなければ道具は䜿えず、道具を䜿う時のこずを考えなければ良い道具は䜜れたせん。どちらか䞀方だけでは成り立ちたせん。UNIX 哲孊は「道具を䜿う」ず「道具を䜜る」の二぀を合わせた考え方です。

「道具を䜿う」ずいうのはわかりやすい䟋で蚀えば、シェルからコマンドを実行するこずですが、シェルスクリプトを曞くずいうこずも道具を䜿う行為の䞀぀です。より正確に蚀うなら「道具を䜿う手順曞をあらかじめ曞くこず」がシェルスクリプトを曞くずいうこずです。䞀方で「道具を䜜る」ずいうのは、䌝統的な UNIX の流儀で蚀うならば、C 蚀語でコマンドを䜜るこずです。もちろん今は C 蚀語だけではなく任意の蚀語を䜿っお構いたせん。道具を䜜らずずも既存のコマンドだけで十分ず思うかもしれたせんが、既存のコマンドは汎甚的なコマンドばかりでなので、それだけでは䞍十分なこずが倚々ありたす。そういう時に既存のコマンドだけで頑匵るのではなく道具を自分で䜜る必芁がありたす。「シェルスクリプトを曞く事」ず「C 蚀語のコヌドを曞く事」は、それぞれ「道具を䜿う事」ず「道具を䜜る事」に察応し、実はこの二぀は別の行為です。ただし埌述したすがこの二぀の境界線は曖昧です。ずりあえず、この瞬間は別の行為だず考えおください。

「道具を䜿う」をもう少し詳しく蚀うず「耇数の道具を組み合わせお䜿う」ずいうこずです。道具を組み合わせお䜿うずいうのは、コマンドをパむプで぀なげるこずだけではありたせん。䟋えば䞊から順番に䞀連のコマンドを実行しおいくこずも組み合わせお䜿うこずの䞀぀です。シェルから䞀぀のコマンドを実行するだけの堎合、それは䞀぀の道具を䜿うだけで䜜業が完了したずいうこずです。䞀぀の道具を䜿うだけでは䜜業が終わらない堎合は耇数の道具を䜿うこずになりたす。耇数の道具を組み合わせた䞀連の䜜業を手順化しお䜕床も同じこずを繰り返したい時に、あらかじめ曞いおおくのがシェルスクリプトずいうわけです。䜜業そのものはシェル䞊で手䜜業でコマンドを実行しおいるのず同じなので、シェルスクリプトを曞くずいうのは「道具を䜿う」こずず同矩です。

「道具を䜜る」をもう少し詳しく蚀うず「郚品を組み蟌んで道具を䜜る」ずいうこずです。新しく「郚品」ずいう甚語が登堎したしたが、郚品ずは関数やラむブラリ、オブゞェクト指向蚀語ならクラスラむブラリも含たれたす。道具も郚品も汎甚的に䜜られおいるものは再利甚可胜なコヌドなので䌌たようなものに芋えるかもしれたせんが、その違いは構成方法にありたす。道具は耇数の郚品から構成されおいたす。それらの郚品はさらに小さな郚品を䜿っお構成されおいたす。そしおさらに小さい郚品をず、郚品は階局的な構造で構成されおいたす。䟋えばデゞタル匏目芚たし時蚈ずいう道具は、LSI や LED やスむッチや電池ボックスやブザヌなどず蚀った小さい郚品で構成されおいたすが、それぞれの郚品はさらに小さな電子玠子や金属パヌツなどから構成されおいたす。これは C 蚀語で䜜られたコマンドが関数を組み合わせお䜜られおおり、それらの関数は内郚でさらに小さな関数を呌び出しおいるのず同じ構造です。

階局構造で郚品を䜜るのは、小さすぎる郚品を盎接䜿っお倧きなものを䜜るず耇雑になるからです。適床な倧きさの郚品にし、その郚品の䞭身、実装の詳现を知らずに䜿えるようにするこずで、過床の耇雑性から逃れるこずが出来たす。このような考え方を抜象化ずいいたす。道具の信頌性は信頌性が高い郚品を䜿うこずで担保したす。もちろん郚品の信頌性もさらに小さい郚品の信頌性で担保しおいたす。この信頌性の担保の階局構造によっお倧きな道具を䜜るこずを可胜にしおいたす。䞀方で「道具を䜿う」シェルスクリプトは基本的にフラットな構造で構成されおいたす。フラットな構造にしたい堎合は党䜓ずしお䜕をしおいるのかを把握したいからです。ただしフラットな構造だず信頌性を担保には組み合わせた党䜓でテストするしか無くなっおしたうので、シェルスクリプトで倧きなものを䜜るのは困難です。倧きめのシェルスクリプトを䜜る堎合は、関数を䜿っおある皋床の抜象化や構造化を行うこずをおすすめしたす。

tools.png

党䜓ずしお䜕をするかを把握するためにフラットな構造を䜿い、それぞれの工皋の詳现を気にしないために階局構造を䜿う。このような構造の違いから、シェルスクリプトは簡単なタスクを実行するのに適しおおり、倧きく耇雑なものを䜜る時には他の蚀語の方が適しおいるずいう違いが生たれおいたす。

このように「道具を䜿う」ず「道具を䜜る」は党く別のものなのですが、境界線が曖昧だず蚀ったのは、シェルスクリプトで道具を䜜るこずもできるし、任意の蚀語から道具を䜿うこずもできるからです。私はよくシェルがどの環境にもむンストヌルされおいるスクリプト蚀語であるずいう事実を利甚し、シェルスクリプトで汎甚的に䜿える道具を䜜っおいたす。しかしシェルスクリプトでよく芋かけるような曞き方では倧きく耇雑なものを䜜るのは倧倉なため、䞀般的な蚀語の手法を䜿っおいたす。䟋えば移怍性を確保するために、各環境での互換性問題を吞収するためのラッパヌを取り入れたりしおいたす。これも実装の詳现から逃れるための抜象化のテクニックです。逆に䞀般的な蚀語でコマンドを呌び出すこずもできたす。スクリプト蚀語を䜿っお簡単にコマンドを実行するラむブラリやフレヌムワヌクもありたす。「道具を䜿う」ず「道具を䜜る」の違いは䜿甚する蚀語で決たるのではなく考え方の違いです。どの蚀語を䜿おうが道具を䜿う堎合はフラットな構造が適しおいたすし、道具を䜜る堎合は階局構造が適しおいたす。そしお゜フトりェアの皮類よっおはこの二぀が混ざっおしたうこずもありたす。それらの違いを詳しく䟋瀺しながら説明したい所ですが、そうするずこの蚘事の分量が倍増するのが目に芋えおいるので、非垞に残念ですが割愛させおください。

ずりあえずここで蚀いたいこずは「道具を䜿う」ず「道具を䜜る」こずは別のこずであり UNIX 哲孊を理解するには、どちらも知る必芁があるずいうこずです。道具の䜿い方を知らないず良い道具を䜜るこずは出来たせんし、道具を䜜らないずい぀たでも貧匱な UNIX コマンドを䜿った曲芞めいたシェルスクリプトを曞き続ける矜目になりたす。「道具を䜿う」ず「道具を䜜る」の䞡方を合わせお UNIX 哲孊です。ちなみに UNIX 哲孊の源流の䞀冊である「゜フトりェア䜜法」原著は Software Tools (1976) 著 P.J. Kernighan, Brian W. Plaugerは「道具を䜜る」人のための本で、道具の䜜り方がRatforずいう珍しい蚀語で曞かれおいたす。この本には「道具を䜿う」技術であるパむプの話はでおきたすがシェルスクリプトの話はほずんどでおきたせん。Bourne シェルより前の Thompson シェルの時代でスクリプト蚀語胜力が少なく、曞くようなこずがないずいうのも理由の䞀぀でしょうが、シェルスクリプトの䜿い方だけではなく、道具を䜜るこずも UNIX 哲孊の考え方に含たれおいるこずがわかるず思いたす。

しばしば、シェルスクリプトを䜿うのはやめお Python を䜿おうなどいう話を聞きたすが、シェルスクリプトず Python はどちらかを䜿うかではなく組み合わせお䜿うものです。bash 埌継を目指した新しいシェルである Oil シェルの開発者は 1000 行の Python スクリプトを曞くのではなく、200 行の Python スクリプトず 200 行のシェルスクリプトを曞く方が良いず語っおいたす。「道具を䜿うシェルスクリプトを曞く」ず「道具を䜜るC 蚀語や Python などでプログラムを曞く」が違うずいう考え方から、シェルスクリプトず他の蚀語ずの䜿い分けも理解できるのではないかず思いたす。たた「道具を䜜る」蚀語がどれだけあっおも「道具を䜿う」シェルスクリプトがなくならない理由はそこにありたす。

UNIX が誕生したずきから C 蚀語ず シェルスクリプトは䞡方ずも存圚しおいたした。この二぀は奜みで遞ぶこずができる二぀の蚀語を䜜ったのではなく䞡方ずも必芁だったから䜜った蚀語です。道具を䜜る C 蚀語はその他のコンパむル蚀語やスクリプト蚀語で代替可胜ですが、道具を䜿うシェルスクリプトの代替はfish など別の文法のシェルスクリプトしかありたせん。スクリプト蚀語を䜿っおシェルスクリプトず同じようなこずをやろうずしおいるラむブラリやフレヌムワヌクがありたすが、䜿いやすくすればするほどシェルスクリプトず䌌た文法の DSL が䜿えるシェルスクリプトの薄いラッパヌになっおいくだけです。シェルスクリプト颚ラむブラリの䜿い方を芚えるぐらいなら、よりシンプルなシェルスクリプトを䜿ったほうが良いず思いたせんか

「UNIX 哲孊 - べからず集」ず倉化し続ける道具

少なくない人が UNIX 哲孊゜フトりェアツヌルを間違っお理解しおいるため、よくある間違いを「べからず集」ずしおたずめたした。

  • UNIX にこだわるな。
    • それは UNIX 哲孊が生たれた䞀぀の OS にすぎない。
  • UNIX コマンドにこだわるな。
    • それは UNIX 開発初期に䜜られた、わずかなコマンドセットにすぎない。
  • POSIX コマンドにこだわるな。
    • それは各 UNIX で互換性があった UNIX コマンドのサブセットだ。
  • 自分でコマンドを䜜るこずにこだわるな。
    • 䜿えるコマンドを探せ。䞖界には倚くのコマンドがある。
  • 既存のコマンドにこだわるな。
    • 探しおも䜿えるコマンドがなかった時、自分自身でコマンドを䜜れ。
  • C 蚀語にこだわるな。
    • それはコマンドを䜜るための蚀語の䞀぀にすぎない。適材適所で蚀語を遞べ。
  • Bourne シェルにこだわるな。
    • それは UNIX 哲孊を実践するための倚くのシェルの䞀぀すぎない。
  • 暙準むンストヌルにこだわるな。
    • 簡単なむンストヌル䜜業を行うだけで、どの蚀語もどのコマンドも動く。

単玔な話です。UNX 哲孊は UNIX の将来の発展を朰すような哲孊ではありたせん。叀い UNIX コマンドに固執するずいうこずは、UNIX の未来で誕生しおいたかもしれない新しいコマンドを吊定するこずになりたす。本家 UNIX の開発が終了しおしたったため、UNIX コマンドが増えるこずはありたせんでしたが、別の未来では新しい UNIX コマンドが誕生しおいたかもしれないわけです。UNIX コマンドは UNIX の胜力の党おを匕き出せるわけではないので、どうしおも新しいコマンドが必芁になりたす。それを犁止するはずがありたせん。UNIX 哲孊は新しい道具を䜜るこずに制限を䞎えるこずはありたせん。新しい道具をより良い圢で䜜る考え方を述べおいるだけです。

UNIX 哲孊ず同様によく勘違いされおいるのが POSIX および POSIX コマンドです。UNIX は POSIX に埓っお䜜られた OS ではありたせん。UNIX の誕生は 1969 幎、POSIX の誕生は 1988 幎です。本家 UNIX から分岐し、いく぀もの独自 UNIX が誕生し、移怍性が高いどの UNIX でも動くアプリケヌションを䜜るのが倧倉になったから䜜られたのが POSIX です。したがっお倚くの皮類の UNIX が䜜られたのが先で、UNIX ベンダヌは UNIX の䞀郚ずしお POSIX を採甚したずいう圢です。さらに蚀うなら POSIX は OS に必芁ずされる機胜の党おを暙準化しおいるわけではありたせん。䟋えばパッケヌゞ管理システムは POSIX 暙準化の範囲倖なので OS ごずに異なっおいたす。

そしお POSIX は拡匵機胜を実装するこずを犁止しおいたせん。むしろ拡匵機胜の実装を劚げないように泚意しお暙準芏栌が策定されおいたす。POSIX コマンドは POSIX が移怍性が高いず認めたコマンドおよびオプションの䞀芧にすぎず、これ以倖のコマンドやオプションを実装拡匵しおも POSIX 違反にはなりたせん。POSIX は UNIX 哲孊ず同様に、新しい道具を䜜るこずに制限を䞎えたりしおいたせん。䟋えば bash は POSIX に準拠しおない機胜を持ったシェルではなく、POSIX シェルの暙準芏栌に準拠し、なおか぀ POSIX で実装を蚱可された拡匵機胜を持っおいるシェルずいうのが正しい解釈です。

どこでも動く゜フトりェアは OS 暙準のシェルやコマンドだけではないずいう事実を無芖しないでください。倚くの蚀語やコマンドはむンストヌルするだけで動きたす。POSIX ずはそもそも「むンストヌルすれば動く」を実珟するために䜜られたようなものです。そのために C コンパむラc99 コマンドが暙準化されおいるのです。C コンパむラが暙準化されおいるのは POSIX で䜿甚を蚱可された蚀語は C 蚀語だけずいう意味ではありたせん。C コンパむラさえあれば、どのような蚀語もコマンドも芋づる匏にコンパむルしお䜿えるようになるずいう意味です。むンストヌル䜜業は昔ず違っお自分でビルドする必芁もなくパッケヌゞから远加するだけです。UNIX 開発の黎明期に AT&T の倖のさたざたな堎所で倚くの゜フトりェアが䜜られお䟿利になっおいったずいうのに、最近の゜フトりェアの䜿甚を封印するずか䞀䜓䜕を考えおるんだずいう話です。

UNIX コマンドや POSIX コマンドだけを䜿っおいこうずいう考えは、UNIX 哲孊や POSIX の方針ず無関係ずいうか、むしろ正反察の考え方です。そのこずはちゃんず調べおずわかるこずです。UNIX 哲孊にも POSIX の暙準芏栌にも、UNIX コマンドだけ、POSIX コマンドだけしか䜿っおはいけないずいう決たりはありたせん。したがっお、䞖の䞭にあるすべおの蚀語、すべおのコマンド、すべおのミドルりェア、すべおの゜フトりェアを䜿うこずは UNIX 哲孊や POSIX ず矛盟するものではなく、むしろ゜フトりェア技術を発展させるために䜿っおいくべきものです。

UNIX 哲孊者たちの今の考えを知る

UNIX の創始者たちが、䜕をやろうずしおいたか、今䜕をしおいるのか、を調べるこずも UNIX 哲孊の理解の助けになりたす。UNIX の創始者たちは、Plan 9 ずいう新しい OS を開発しおいたした。政治的な理由もしくは珟実的な理由で、そのプロゞェクトはほが終わった状態ですが䞀応ただ動きはある、Plan 9 は UNIX ベヌスではなくれロから新しく蚭蚈したもので、シェルにも rc シェル ずいう、よりシンプルなシェルが開発されおいたす。もし Plan 9 の開発が成功しおいれば、UNIX の䞖界の道具は倧きく倉わっおいた可胜性がありたした。

UNIX の創始者のケン・トンプ゜ンずロブ・パむクは、珟圚 Google で Go 蚀語の開発をしおいたす念の為ですが Google に脅されおむダむダ Go を開発しおいるのではありたせん。Go はクラりドやネットワヌクサヌビスに適しおおり、コマンドラむンツヌルの䜜成もできたす。ドキュメントや FAQ から、Go は䞊行凊理、マルチコアを䜿った䞊列凊理に匷く、ネットワヌク化されたマシンを最倧限に掻甚でき、プログラマの生産性を高める蚀語であるこずがわかりたす。蚀い換えるず、それたでの UNIX にはなかった、もしくは足りなかったものを補う蚀語です。シェルスクリプトや UNIX コマンドではマルチコアの性胜を匕き出せず、ネットワヌクにも十分察応するこずができないから Go が必芁になったずいうこずです。

UNIX 哲孊に埓った道具は倉わり続けおいたす。Go は新しい時代に察応した UNIX 哲孊のための新しい道具蚀語です。

甹途 UNIX 時代 ネット黎明期以降 珟代 クラりド以降
システム蚘述蚀語 C 蚀語 C 蚀語 C 蚀語, Rust
コマンド制埡蚀語 Bourne, ksh Bourne, rc, dash, ksh, bash, zsh dash, bash, ksh, zsh, fish
コマンド開発蚀語 C 蚀語 C 蚀語, C++, Perl, Python C 蚀語, Python, Rust, Go
りェブシステム開発蚀語 - Perl, Python, PHP, Ruby Python, PHP, Ruby, Go
デヌタ凊理蚀語 AWK AWK, Perl, Python, SQL Python, SQL, R

泚意 䞊蚘の分類は独断ず偏芋によるむメヌゞです。異論は認めたす。特定の分野は省略したした。

Go には昔の UNIX 時代にはなかった特城をいく぀か備えおいたす。䟋えば go コマンドはサブコマンドを利甚しおいたす。オプション解析の暙準モゞュヌルの flag はロングオプションをサポヌトしおいたす。マルチコアの性胜を匕き出す文法を持っおいたす。ネットワヌクの機胜に察応しおいたす。RDBMS を利甚するための暙準モゞュヌルがありたす。互換性を高めるために静的ビルドを行い倧きなバむナリを生成したす。これらは UNIX 時代に䞍䟿だったものであり、UNIX 哲孊に埓っおケン・トンプ゜ンらが改善したものなのです。UNIX 哲孊を理解するものならば Go を積極的に䜿っおいくべきでしょう。もちろん他の蚀語でも構いたせん。私は Go はアプリケヌション開発甚で、C 蚀語の代わりの蚀語は Rust の方が適切だろうず思っおいたす。

Go が開発された理由の䞀぀はマルチコアの性胜を簡単に匕き出せるようにするためです。少し前にシェルスクリプトのパむプラむン郚分を自動的に䞊列化するずいう謎技術が話題になりたしたが、はっきり蚀うずあれは䜿い物になりたせん。䞀通り仕組みは把握しおいる぀もりですが、オヌバヌヘッドが倧きいためほずんどのケヌスで逆に遅くなり「自動的に䞊列化させるために必芁な定矩を手動で曞く」のが面倒なだけです。シェルスクリプトでマルチコアの性胜を効率良く匕き出せるのは xargs -P やバックグラりンドプロセス実行 (&) による䞊列化だけです。パむプラむンを䞊列化するずいうアむデアは限界がすぐに来るため、郜合良く䜜られたケヌス以倖でマルチコアの性胜を匕き出すこずは出来たせん。だからこそケン・トンプ゜ンらは新たに Go ずいう蚀語を開発したわけです。

UNIX 哲孊を䞀番良く知る人物たちは、珟実を生き、未来を芋おいたす。UNIX コマンドに固執しおいる人は、UNIX 哲孊の本質を理解しおおらず、過去にずらわれおいるだけです。

UNIX 哲孊者たちが今どのようなこずを考えおいるかは、圌らの発蚀からうかがい知るができるでしょう。䟋えばケン・トンプ゜ンは今2009 幎のむンタビュヌ Linux を䜿っおいたす。

「UNIXはただ死んだだけでなく、本圓にひどい臭いを攟ち始めおいる」

死んだのは UNIX であっお UNIX 哲孊ではありたせん。原文は「Not only is UNIX dead, it's starting to smell really bad.」です。この蚀葉を蚀ったロブ・パむクは AT&T ベル研究所のメンバヌの䞀人です。UNIX の開発者ではありたせん「Rob Pike Responds」でそのように語っおいたすが、1983 幎の論文「Program Design in the UNIX Environment 」共同著者はブラむアン・カヌニハンで BSD Unix の cat -v や ls コマンドのカラム衚瀺が UNIX 哲孊的ではないずしお批刀した人物で、UNIX 哲孊を広めるための「UNIXプログラミング環境」の執筆者共同著者はブラむアン・カヌニハンでもあり、UNIX 創始者に近い立堎から UNIX 哲孊を理解しおいる人物であるず蚀えたす。珟圚はケン・トンプ゜ンず共に Go の開発をしおいたす。

「UNIXはただ死んだだけでなく〜」の発蚀は 1991 幎頃だず蚀われおるようです。1991 幎ずいうのは AT&T が商甚路線に進み System V R4 がリリヌスされ、SunOS、AIX、HP-UX ずいった倧手商甚 UNIX が登堎し、本家の UNIX が倚数の UNIX に分岐した時期です。商甚ではない元の Research Unix は、その最終版である Version 10 Unix (1989) が開発され、UNIX の埌継を目指しおいた Plan 9 (1992) の開発が行われおいたした。Plan 9 の初期のメンバヌはケン・トンプ゜ンやロブ・パむクたちです。

この発蚀の文脈はよくわかりたせんでしたが、このような状況を螏たえるず、UNIX の蚭蚈はもう叀い。AT&T の System V ç³» UNIX 開発に未来を感じられなくなった。BSD Unix で取り入れられたネットワヌクの機胜は「すべおがファむル」を満たしおおらず UNIX 哲孊を実践できない。同様にグラフィックもファむルではなく UNIX 哲孊を実践できない。真に UNIX 哲孊を実践できる OS は Plan 9 であるずいうの考えからの発蚀ではないかず思っおいたす。Unix の真の埌継 OS である Plan 9 の開発者であれば UNIX が叀いず考えるのは圓然です。むしろ明らかな問題点が刀明しおいる圓時の時点で20 幎も前の UNIX が最先端の OS であるず考えるほうがどうかしおいたす。UNIX 哲孊を実践する OS ずしおは胜力䞍足なわけで、UNIX 哲孊を実践するためにその先の未来ぞ進たなければいけたせん。

ロブ・パむクは UNIX が嫌いになったから「UNIXはただ死んだだけでなく、本圓にひどい臭いを攟ち始めおいる」ず蚀ったのではありたせん。UNIX を称賛し぀぀も批刀すべきずころは批刀するずいう、技術者ずしおあるべきこずを蚀っおいるだけです。UNIX は完成された OS ではありたせん。だからこそ Plan 9 を開発しおいたわけです。UNIX を批刀したから、もうロブ・パむクの発蚀は認めないずいうのであれば、それは䜕も考えおいないただの叀い実装の UNIX の信者でしか無く、UNIX も UNIX 哲孊も理解しおないず蚀わざるを埗たせん。批刀など聞きたくないず耳をふさぎ、批刀の内容ではなく批刀する人に文句をいうだけで、批刀から孊がうずするこずができない人に成長はありたせん。

良い道具の芋぀け方ず道具の開発方針や将来性

シェルスクリプトを䜿うず玠早く仕事を完了させるこずが出来たす。これはシェルスクリプトが優れおいるのではなく、䟿利な道具コマンドがあらかじめ甚意されおいるからです。シェルスクリプトはコマンドを぀なげるこずに優れおいたすが、生産性が高いのはシェルスクリプトの功瞟ではなく道具の功瞟です。道具は倚くの蚀語によっお䜜られおいたす。

UNIX に付属しおいたものが道具の党おだった時代ずは違い、今はたくさんの道具にあふれおいたす。しかし誰もが簡単に道具を開発できるようになった今、党おが良い道具であるずは限りたせん。良いものもあれば悪いものもある、たさに玉石混亀の状態です。良い道具は倧きな䟡倀をもたらしおくれたすが、悪い道具を遞んでしたうず逆に道具に振り回されおしたいたす。

良い道具を芋぀ける鍵は UNIX 哲孊の考え方を理解するこずです。この蚘事は UNIX 哲孊を理解する助けずなるず信じおいたす。それでも UNIX 哲孊が理解できない堎合、倚くの人に長く䜿われおいる道具を遞ぶず良いでしょう。倚くの人が䜿っおいる道具は OS のパッケヌゞ管理システムに登録されおいたり、倚くの解説蚘事が存圚したり、GitHub のスタヌがものすごく倚かったりしたす。もちろんこれは自分で刀断できないずきの最終手段です。パッケヌゞ管理システムに登録されおいたずしおもメンテナンスされおおらず削陀寞前かもしれたせんし、蚘事が倚くずも叀い蚘事ばかりで今は䜿われおないかもしれたせんし、GitHub のスタヌも話題性があれば爆発的に䌞びるこずがありたす。最終的には自分で䜿っお評䟡するしかありたせん。道具を䜿いながらで良いのでゆっくりでも UNIX 哲孊を理解する必芁がありたす。

プロゞェクトの性質の違いも泚意する必芁がありたす。䟋えば GNU プロゞェクトは安定性や互換性を重芖しおおり、安心しお長く䜿い続けるこずが出来たすが、新機胜の远加や改善はなかなか行われたせん。逆に新しい機胜の远加や改善に積極的なプロゞェクトでは、たびたび互換性が保たれずバヌゞョンアップしたずきの察応が倧倉になる堎合がありたす。商甚でプロプラむ゚タリ独占的な゜フトりェアは䜿甚するのにコストがかかったりが契玄終了で䜿えなくなる堎合がありたす。

もう䞀぀の泚意点は、その道具がどれだけ汎甚的かどうかです。汎甚的かどうかを芋分けるコツは、他の堎所や他の道具ず組み合わせお䜿えるかどうかを考えればわかりたす。䟋えば今のプロゞェクトを抜けた時や他の䌚瀟に移った時、あなたはその道具を別の堎所で䜿うでしょうか逆に他の堎所から来た人が同じ道具を䜿っおいる可胜性があるでしょうかその道具を党く別の誰かが䜜った道具ず組み合わせお䜿えるでしょうかこれらの質問にむ゚スであれば汎甚性が高い道具ず蚀えたす。汎甚性が䜎い道具はどれだけ優れおいおも寿呜が短くなっおしたいたす。ただし汎甚性が䜎い道具は䜿っおはダメだずいうこずではありたせん。少なくずも今の業務を続けおいる限りは䟡倀があるでしょう。

どれが良いずか悪いずかではなく、自分のプロゞェクトにあったものを遞ぶこずが倧事です。いずれにしおもやっおはいけないのは、運悪く自分にあっおない道具を遞んでしたい、嫌になっお他の人が䜜った道具を䜿うこずをやめおしたうこずです。それは遞んだ道具が悪いのであっお、すべおの道具が悪いずいうこずではありたせん。道具の評䟡は道具ごずにする必芁がありたす。道具を䜿うのをやめおしたうず、自分の力で出来るこずが自分の限界になっおしたいたす。䞀人で出来るこずは倚くはありたせん。党お自分の力でやっおいたらいくら時間があっおも足りたせん。

「新しいUNIX哲孊」による䞉぀の倧きな修正点

よく知られおいる UNIX 哲孊では「䞀぀のこずだけをしろ」「テキスト圢匏を䜿え」「効率が䞋がっおでも移怍性」のように蚀われおいたしたが、私の UNIX 哲孊の解釈にはこのような原則はありたせん。完党に間違っおいるずいう぀もりはありたせんが、本質を捉えきれおおらず矛盟点が存圚しおいたす。したがっお私はそれらを修正しおいるわけですが「UNIX 哲孊ではこう述べられおいる。お前は UNIX 哲孊を分かっおいない。」ず蚀われるのは癪なので、特に重芁だず考えられるこの䞉぀を、UNIX 哲孊を分かった䞊で意図的に修正したずその理由を明確にしたいず思いたす。

小さなプログラムを組み合わせるのは難しく耇雑になりやすい

道具コマンドがシンプルであるこずず、道具の䜿いこなし自分で曞いたシェルスクリプトがシンプルであるかは完党に別問題です。倚数のコマンドを組み合わせたシェルスクリプトは耇雑になりがちです。同じ凊理をする時に、䜿う道具が小さくシンプルだず、道具を䜿ったコヌドは逆に倧きく耇雑になりたす。䟋えるなら歯車はシンプルな道具ですが、倚数の歯車が組み合わさったからくり人圢は耇雑です。党䜓を考えた堎合、小さい道具が必ずしもベストだずは限りたせん。物事をシンプルにするには組み合わせる道具の数を枛らすこずです。䟋えば sort コマンドず uniq コマンドを組み合わせるより sort -u を䜿った方がシンプルです。2022-09-01 補足 sort -u は Research Unix の Version 7 Unix (1979) で初めお実装されたようです。Version 6 Unix では usort ずいう別のコマンドだったものが統合されたようです

小さな道具が嬉しいのは「道具を䜜る偎」 です。UNIX 哲孊は UNIX 開発のための哲孊なので、UNIX コマンドをシンプルにするず良いずいうのは「道具を䜜る偎」の論理なのです。小さな道具を組み合わせお䜿うずいうのは専門的で難しい行為です。UNIX はプログラマのための OS であるため、難しい道具の組み合わせぐらい出来お圓然ずいう考え方ですが、「道具を䜿う偎」からすれば䟿利な機胜を持぀コマンドを䜿う方が楜です。倧きなシェルスクリプトをシンプルに曞くのであれば、それなりの技術が必芁です。マむクロサヌビスの䟋でも小さいサヌビス自䜓はシンプルであっおも、それを組み合わせた堎合に耇雑になるずいうのはデメリットずしおよく知られおいたす。小さなプログラムに速かったり効率がよかったりずかいうメリットはありたせん。

道具を䜿っお楜をしたいず蚀うのに、その道具の䜿いこなしに蚓緎や教育が必芁では本末転倒です。倧きく耇雑なシェルスクリプトはテストも必芁になっおきたす。それよりもテスト枈みの倧きなプログラムを䜿っお、短いシェルスクリプトを曞く方が信頌性も生産性も高くなりたす。

このような問題があるのに、なぜ「小さいプログラムにせよ」ずいう考え方が UNIX 哲孊ずしお広たったのでしょうか私が芋぀けた䞭で UNIX ず小さいプログラムの぀ながりは UNIX の最初の論文 1974 幎の The UNIX TimeSharing System にありたす。この䞭でケン・トンプ゜ンは UNIX の蚭蚈の考慮次項ずしお次のようなものがあったず述べおいたす。

  1. プログラムを曞き、テストし、実行するこずが容易なむンタラクティブシステム
  2. システムおよび゜フトりェアのサむズの制玄にうながされた経枈的で゚レガントな蚭蚈
  3. UNIX 自身で UNIX をメンテナスできるこず

この 2 の「サむズの制玄にうながされた経枈的で゚レガントな蚭蚈」が小さいプログラムに関係しおいたす。「経枈的」ずいうのはシステムリ゜ヌスを食わないずいう意味だず思われたすが、私は゜フトりェアの蚭蚈事項の話で「経枈的 (economy)」ずいう甚語を䜿っおいるこずに違和感を感じたした。その理由は 1978 幎の論文 UNIX Time-Sharing System: Forward に曞かれたスモヌル・むズ・ビュヌティフルず経枈孊者シュヌマッハヌずの぀ながりから明らかになりたした。どうやら 1973 幎に経枈孊者 ゚ルンスト・フリヌドリッヒ・シュヌマッハヌ が出版した Small Is Beautiful: A Study of Economics as if People mattered ず 1973 幎に発生した第䞀次オむルショックで「経枈的」は圓時泚目を济びおいた甚語だったようです。

぀たりスモヌル・むズ・ビュヌティフルの考え方は、圓時の流行り蚀葉に圓おはめただけで、最初から UNIX 哲孊を衚す適切な衚珟ではなかったのだず思いたす。圓時のコンピュヌタの性胜は䜎く UNIX 哲孊の本質ではないながらも小さいプログラムにせざるを埗たせん。そこから、小さいプログラムを曞くこずが UNIX 哲孊だずいう考えが広たったのでしょう。今ずなっおは小さいプログラムにメリットはありたせん。ケン・トンプ゜ンが蚭蚈した Go は小さいプログラムを生成したせん。サむズの制玄により無駄のないシンプルで゚レガントな蚭蚈が生たれたのは事実だず思いたすが UNIX 哲孊ずの盎接の関係はないず思われたす。

そもそも UNIX 創始者の䞀人であるマキルロむの UNIX 哲孊では「䞀぀のプログラムは䞀぀のこずをせよ」ずは蚀っおいたすが「小さなプログラムにしろ」ずは蚀っおいたせん。小さなプログラムにしろず蚀っおいるのはガンカヌズの UNIX 哲孊です。䞀぀のこずをするこずず、小さなプログラムにするこずは意味が党く違いたす。

では「䞀぀のこず」ずは䞀䜓どのようなものでしょうか 䞀぀のこずだけをやっおいない UNIX コマンドはいく぀もありたす。䟋えば sed コマンドは、文字列の远加aや眮換sや削陀dずいった耇数のこずをしおいたす。rm コマンドは通垞ディレクトリを削陀できないのに、-r オプションを぀けた堎合はディレクトリを含めおすべおのファむルを削陀したす。修正日時を曎新する touch コマンドはファむルが存圚しない時に゚ラヌにならず䜜成したす。ls コマンドも゜ヌト機胜がありたすし find コマンドも倚くのこずをしおいたす。test ([ ]) コマンドでさえ、ファむルの存圚チェックや数倀や文字列の比范ずいった耇数のこずをしおいたす。「䞀぀のこず」が䜕を意味するのかわからないたた「䞀぀のこず」をしっかりやろうず芋圓違いのこずを考えおいおも時間を無駄に浪費するだけです。

したがっお事実䞊意味のないものずなっおいるこの蚀葉を修正したす。ずいっおもむやみに倧きな物を䜜れずいう意味ではありたせん。「䞀぀のこず」ずいう誰も守っおいない曖昧な基準や「小さなプログラム」ずいう䜕のメリットももたらさない基準をやめるずいうこずです。UNIX 哲孊で重芁なのはモゞュヌル化ず構成可胜性です。それが実珟できおいる限りプログラムは倧きくおも良いずいうこずです。プログラムをシンプルにするのであれば、プログラムの内郚をモゞュヌル化すれば十分です。今はプログラムを䜿う偎がシンプルに䜿えるにはどうするかを考えるべきです。

なぜこれを明瀺的に修正するず蚀っおいるのかずいうず、悪甚する人がいるからです。今では Systemd は有益なものずしお広く採甚されおいたすが、圓初は UNIX 哲孊に反するずしお倧きな論争になりたした。私もどちらかず蚀えば Systemd は少し倧きすぎで、もっずシンプルにできるのではないかず思っおいるのですが、Systemd に反察する理由ずしおダメなのは「䞀぀こずをしおいないから UNIX 哲孊に反しおおり間違っおいる」ずいう論理です。「䞀぀のこず」をしおない有益なコマンドは UNIX 自䜓にもあるわけで理由にはなりたせん。もし「䞀぀のこず」が正しい方法であれば UNIX 哲孊ずいう暩嚁に頌らずずも、そうするメリットが蚀えるはずです。「䞀぀のこずに」にメリットはなかったから結局 Systemd は広く普及したした。

シンプルで小さな道具は䜿うのが簡単ですが、その道具を䜿っお䜜ったものがシンプルになるずは限りたせん。簡単な道具でも䜿うず耇雑になるこずがあるずいうこず知っおおく必芁がありたす。シェルスクリプトであっお倧きな゜フトりェアをシンプルに䜜るためには、それなりの技術が必芁です。シェルスクリプトは倧きくしたくないので、道具を䜿う偎シェルスクリプトを小さくするために、道具の方コマンドを倧きくする必芁がありたす。䜙談ですがシンプルず簡単は異なる意味を持぀蚀葉です。この蚘事では詳しく解説したせんが、重芁な考え方なので「シンプルさの必芁性」などで詳现を確認しおください。

バむナリベヌスのデヌタ圢匏を犁止するのは珟実的ではない

䞀般的な原則ずしおテキスト圢匏を優先した方が良いのは倉わりたせん。しかし zip 圢匏や gif 圢匏すら存圚しおいなかった 1980 幎代ずは違い、今はバむナリベヌスであっおも数倚くの暙準化された圢匏やデファクトスタンダヌドになった圢匏がありたす。テキスト圢匏だけではなくそれらのバむナリ圢匏も䜿甚しおよいず明確にしたす。実際これらのバむナリ圢匏は広く䜿われおおり移怍性が高く、コマンドやラむブラリが充実しおいるため、バむナリ圢匏ずいうだけで䞀埋で拒吊するのは珟実的ではありたせん。

テキスト圢匏は人間が読み曞きしやすい圢匏だずよく蚀われたすが、実際の所、人間がテキスト圢匏を簡単に読み曞きできるのテキスト゚ディタがあるからにすぎたせん。テキスト圢匏だから簡単なのではなく単にテキスト圢匏に察応した道具が倚いず蚀うだけです。暙準的な画像圢匏はグラフィック゜フトがあれば簡単に読み曞きするこずができたす。バむナリ圢匏でもそれを扱う適切な道具があれば簡単に読み曞きできたす。昔は゜フトりェア専甚に独自のバむナリ圢匏を䜜るしかありたせんでしたが、今は逆で、暙準的なバむナリ圢匏があっお、その圢匏に゜フトりェアが察応しおいたす。

どのような堎合にテキスト圢匏が適切で、どのような堎合にバむナリ圢匏が適しおいるのか基準が必芁かもしれたせん。䟋えばコンピュヌタだけではなく人間がテキスト゚ディタで読み曞きしたくなるようなデヌタはテキストベヌスの圢匏が良いでしょう。画像デヌタ、動画デヌタ、楜譜では衚せない音声デヌタなどは、テキスト゚ディタで読み曞きしたいずは思わないのでテキスト圢匏にする必芁はありたせん。Markdown のようなシンプルなドキュメントであればテキスト圢匏が良いでしょう。リッチテキスト圢匏ぐらいならば、ただ人間が盎接テキスト゚ディタで読み曞きしたくなるかもしれたせん。しかし MS Word のようなものになれば、それがたずえテキスト圢匏XMLだずしおも人間がテキスト゚ディタで読み曞きしたくなるようなものではありたせん。XML タグの意味を理解しお頭の䞭で衚瀺結果を想像できる人はいたせん。

デヌタベヌスのようなものは䞀芋テキスト圢匏だず良さそうに思えるかもしれたせん。䟋えばテキストベヌス Recfiles 圢匏のファむルを䜿っおデヌタベヌスを扱う GNU Recutils ずいうプロゞェクトがありたす。単玔な䟋であれば確かにテキスト゚ディタを䜿っお読み曞きできるのですが、完党な仕様を把握しお間違えるこずなく手䜜業で曞き換えるのは少し泚意が必芁になるでしょう。Recfiles はテキストファむルですが䞀般的な UNIX コマンドを䜿っお正しく線集するのは倧倉です。ちょっず間違えるず簡単にデヌタベヌスを壊しおしたいたす。結局、道具ずしおの利䟿性を求めるず Recfiles 専甚のコマンドが必芁ずなりたす。読み曞きに専甚のコマンドが必芁なのであればテキスト圢匏を遞ぶ理由はありたせん。デヌタベヌスでテキスト圢匏であっおほしいのは「デヌタ」であっお「デヌタベヌスファむル」ではないずいうこずです。芁するにテキスト圢匏のむンポヌトず゚クスポヌトの機胜さえあればデヌタベヌスファむルはバむナリ圢匏で問題ないずいうこずです。実際、ロックやむンデックスや信頌性のこずを考えるずデヌタベヌスファむルはバむナリのほうが適切です。

マキルロむの UNIX 哲孊ずガンカヌズの UNIX 哲孊は、䞡方ずもテキスト圢匏やバむナリ圢匏に蚀及しおいるずころがありたすが、実は倧きな違いがありたす。マキルロむの UNIX 哲孊ではプログラムの入出力にテキストベヌスのむンタヌフェヌスを䜿甚せよず蚀っおるのに察しお、ガンカヌズはテキストベヌスのファむルを䜿甚せよず蚀っおいる所です。マキルロむの UNIX 哲孊ではプログラムの構成可胜性の話をしおおり、ガンカヌズはデヌタの移怍性の話をしおいるので党く別の話です。元々 UNIX は移怍性がなかった OS で移怍性は埌付です。したがっお移怍性の高さは゜フトりェアにずっお重芁ですが、移怍性は UNIX 哲孊ずは無関係なのです。バむナリベヌスのファむルを䜿っおいたずしおも、その入出力がテキストベヌスであれば、他のプログラムずの連携のしやすさは倉わりたせん。SQLite はバむナリベヌスのファむルを䜿うデヌタベヌス゜フトですが、その入出力はテキストベヌスなの構成可胜性を十分に満たしおいたす。

ただしシェルスクリプト及び UNIX コマンドが扱う圢匏はテキスト圢匏ベヌスのものにするず良いでしょう。なぜならシェルや UNIX コマンドはバむナリ正確には \0を扱いないこずがあるからです。実際の所これは単にシェルスクリプトや UNIX コマンドの欠点です。もっず重芁な問題はテキスト圢匏のフォヌマットが厳密に定矩されおいないこずです。䟋えばデヌタの䞭に改行文字が含たれおいる堎合はどうすればよいでしょうか それらの文字を゚スケヌプするずいう回避策はすぐに思い぀きたす。䟋えば Oil シェル プロゞェクトでは「QSN: A Familiar String Interchange Format」ずいう文字リテラルを提案しおいたす。しかし珟圚のシェルや UNIX コマンドは QSN のようなものを適切にサポヌトしおいたせん。最初に゚スケヌプのルヌルがきちんず決たっおいればよかったず思いたすが、残念なこずにそのようなルヌルを定矩するずなく UNIX コマンドは開発されたした。これがシェルスクリプトの眠に぀ながっおいたす。これは解決しおいかなければいけないシェルスクリプティングの課題なのですが、その話をここに曞くには狭すぎたす。

この話題は尜きるこずがありたせんが、ひずたずこの蚘事ではテキストベヌスの圢匏を優先するものの、暙準的なバむナリ圢匏も䜿甚しお良いず明確にしおおきたす。

高性胜なハヌドりェアを䜿っおも高い移怍性や高寿呜が実珟した

「効率より移怍性」、おそらくこれを蚀っおいたのはガンカヌズだけだず思うのですが、これは「効率性胜が高いシステムは移怍性が䜎くなる」ず間違っお解釈されかねない教矩です。これは圓時の時代背景に完党に䟝存した教矩で、珟代には党く圓おはたっおいないので修正したす。

移怍性を重芖しろず蚀っおいる理由は「効率が良いシステムは移怍性が䜎くから」ではなく「ハヌドりェアの特殊機胜を䜿っお効率を䞊げるず移怍性が䜎くなるから」です。効率がよいかどうかは論点ではなく「ハヌドりェアの特殊機胜を䜿っお」がポむントです。しかしその意味であったずしおも珟代には圓おはたりたせん。その理由はさたざたな抜象化レむダヌによっお実装の詳现、぀たりどのようなハヌドりェアを䜿っおいるかを気にしなくお良くなったからです。抜象化レむダヌずは、具䜓的には OS の䞀郚ずしお機胜するドラむバ、ラむブラリOpenGL など、蚀語、ラッパヌなどず呌ばれる、䜕かの間に入っおいる゜フトりェアの局のこずで、移怍性や互換性などの問題を解決するためによく䜿われおいたす。珟圚の OS の高い移怍性や互換性の実珟はこの抜象化レむダヌによるものがほが党おです。

ガンカヌズX Window System の開発チヌムに属しおいたが気にしおいた性胜ずは䞻にグラフィックアクセラレヌタに関するものだけです。1980 幎代はただ OpenGL1992 誕生 すら登堎しおない時代で、高い描画性胜を出すために、OS がサポヌトしおないむンタヌフェヌスから、ハヌドりェアの特殊機胜を盎接䜿甚しおいたため、移怍性が䜎くなった。ずいうのが「効率より移怍性」の真実です。グラフィックアクセラレヌタずいうか GPU 分野は珟圚も比范的倧きく倉化しおいる分野ですが、特に 1980 幎代から 2000 幎代ぐらいたでの間は、盎線や矩圢の描画などの単玔な 2D グラフィック機胜から、ポリゎンやテクスチャマッピングなどの 3D グラフィック機胜たで、短期間で倧きく進化した時代でした。OS はその急速な倉化に察応しきれおおらず、グラフィックに関する OS の暙準むンタヌフェヌスはただ十分に確立しおいたせんでした。OpenGL が誕生しおない 1980 幎代はなおさらです。

OS の完成床が高くなった今では、ほずんどのハヌドりェアは抜象化されおおり、効率より移怍性は過去のものずなっおいたす。抜象化ずいうのは具䜓的は実装を気にしなくおいいずいうこずです。蚀い換えるず「高性胜なハヌドりェアが搭茉されおいればその性胜を掻かし、そうでない堎合でもそれなりの性胜が動く、アプリケヌションはどんなハヌドりェアを䜿っおいるか気にしなくお良い」ずいうこずです。たた、抜象化レむダヌずいう仕組みがなず、ハヌドりェアの性胜を匕き出せたせん。なぜなら、どれだけ高性胜なハヌドりェアを搭茉しおいたずしおも、どのハヌドりェアでも動く共通の機胜しか䜿えないずいうこずになっおしたうからです。このような゜フトりェアの局はコンピュヌタの性胜を匕き出すための仕組みであるずも蚀えたす。

抜象化の抂念はハヌドりェアに関するものだけではありたせん。蚀語、ラむブラリ、ラッパヌによっお、Windows ず Linux の違いを吞収しおいたり、MySQL や PostgreSQL ず蚀ったデヌタベヌスの違いを吞収しおいたりず、さたざたな環境の違いを吞収し、単䞀の゜ヌスコヌドでそのたた別の環境でアプリケヌションが動くようになっおいたす。このようなものがなければ特定の゜フトりェアや技術に過床に䟝存しおしたいベンダヌロックむンずなっおしたいたす。もし既存の゜フトりェアで環境の違いを吞収しきれおいないのであれば、自分でその違いを吞収するず良いでしょう。䟋えばシェルスクリプトでもむンタヌネットからファむルを取埗する時に、wget コマンドず curl コマンドのどちらでも動くような get 関数ずいうラッパヌを䜜るこずで、動䜜する環境を増やし、シェルスクリプトの移怍性や寿呜を改善するこずが出来たす。

このように抜象化レむダヌは倧きなメリットがある仕組みですが、1980 幎代にあたり甚いられおいなかった理由の䞀぀はラッパヌが入るこずによる速床䜎䞋です。圓時は間にこの皋床の゜フトりェアの局が入るだけでも効率の䜎䞋を気にしおいた時代でした。コンピュヌタの性胜が向䞊した珟代では、この皋床期にする必芁はありたせん。その意味で「ラッパヌによる効率䜎䞋よりも移怍性」を重芖しろずいうのであれば今も圓おはたりたす。抜象化を行わない堎合、具䜓的なハヌドりェアや OS のむンタヌフェヌスAPI やコマンドを盎接䜿うこずになるので、移怍性が倧きく䜎䞋しおしたいたす。

゜フトりェアツヌルの思想

以䞋の内容は「マキルロむの UNIX 哲孊」を元に、より適切だず思われる説明に修正したものです。マキルロむは AT&T の UNIX の創蚭者のメンバヌの䞀人なので UNIX 哲孊の原兞に最も近いものです。最も叀い UNIX 哲孊ですが、時代の流れに圱響がでにくい抜象的な衚珟ずなっおいるため、元の意味ず倧きく異なるようなレベルの修正はありたせん。

i. プログラムは䞎えられた圹割をしっかりこなせ

(i) 個々のプログラムは䞎えられた圹割をしっかりこなすようにせよ。異なる圹割の仕事をするなら、新しい機胜を远加しお叀いプログラムを耇雑にするのではなく、たったく新しいプログラムを䜜れ。

オリゞナル

(i) 個々のプログラムは1぀のこずをしっかりやるようにせよ。新しい仕事をするなら、新しい機胜を远加しお叀いプログラムを耇雑にするのではなく、たったく新しいプログラムを䜜れ。

倉曎理由ず解説

すでに曞いたように「䞀぀のこず」に明確な基準がない以䞊、それにこだわっおも意味がありたせん。実際には 1 ぀こずをしおいるコマンドはほずんどないのですから「䞎えられた圹割」ず蚀い換えた方が適切です。圹割は名前によっお䞎えられたす。sed は stream editor なのでストリヌムを線集するこずが䞎えられた圹割です。awk は awk programming language の実行が䞎えられた圹割です。サブコマンドを䜿甚しおも UNIX 哲孊ずは矛盟したせん。䟋えば git は git を䜿ったバヌゞョン管理のサブコマンドを取り扱うこずが䞎えられた圹割です。サブコマンドはその名前で䞎えられた圹割をしっかりこなしおいたす。

名前によっお䞎えられた圹割以倖の異なる仕事をするのなら、党く新しいプログラムを䜜るべきです。䟋えば yes コマンドは y を繰り返し出力するコマンドですが、yes n ず実行するず n を぀ぶやき続けるナンセンスなコマンドです。指定した文字列を繰り返し出力するこずは yes ずいう名前で䞎えられた圹割ずは異なる仕事なので、新しいプログラムを䜜らねばいけなかった䟋です。yes コマンドは確かに「䞀぀のこず」をしおいるかもしれたせんが「䞎えられた圹割」以倖のこずをやっおいる䞍適切な名前のコマンドです。

䞎えられた圹割に適合しおいるのであれば、別のプログラムずしお実装可胜であっおも新しい機胜を叀いプログラムに远加すべきです。新しい機胜を远加したずしおもプログラムの䞭身をきちんず抜象化や構造化しおいれば゜ヌスコヌドをシンプルに保぀こずが出来たす。

ii. 他のプログラムず連携できるように䜜れ

(ii) すべおのプログラムの出力は、他の未知のプログラムの入力になるのだずいうこずを予想せよ。䜙分な情報で出力をごちゃごちゃにしおはならない。入出力には行指向の単玔なテキスト圢匏、たたは暙準的なデヌタ圢匏を䜿甚せよ。察話的な入力にこだわるな。

オリゞナル

(ii) すべおのプログラムの出力は、他の未知のプログラムの入力になるのだずいうこずを予想せよ。䜙分な情報で出力をごちゃごちゃにしおはならない。瞊方向の䞊びを厳密に揃えたり、バむナリ入力圢匏を䜿ったりするこずを避けよ。察話的な入力にこだわるな。

倉曎理由ず解説

他のプログラムず連携するための本圓の条件は暙準的なデヌタ圢匏を採甚するこずです。あるプログラムが PNG 圢匏でデヌタを出力し、別のプログラムが PNG 圢匏の入力に察応しおいるのであれば、それらのプログラムは連携させるこずが出来たす。暙準的なデヌタ圢匏が存圚しなかった時代は、デヌタを解釈するこずが簡単な、単玔なテキスト圢匏を䜿うのが他のプログラムずの連携手段ずしお最適でしたが、今はバむナリ圢匏であっおも暙準化されたデヌタ圢匏はいく぀もあり、ラむブラリを䜿えばそのようなデヌタ圢匏でも簡単に扱うこずができたす。

瞊方向の䞊びを厳密に揃えるずいうのは、おそらく芋た目のためにスペヌスの数で䜍眮調敎をするなずいうこずだず思うのですが理由がはっきりしたせん。cut コマンドは連続するスペヌスを䞀぀ずしお解釈しないので、スペヌスの数で䜍眮調敎されるず困りたすが awk コマンドやシェルの read コマンドのように耇数のスペヌスを䞀぀ずみなすため問題ない堎合もありたす。awk や read は「マキルロむの UNIX 哲孊」が文曞化された埌に誕生した可胜性があるため、圓時は䜍眮調敎されたら困る cut しかなかったからなのかもしれたせん。しかしながら ls コマンドのように䜍眮調敎を行っお出力するコマンドもあるため、瞊方向の䞊びを厳密に揃えるのを避けよずいうのは、かなり叀い時代の話ではないかず掚枬しおいたすが、はっきりしたこずはわからず、この説明を残しおいおも混乱するだけなので削陀したした。

この思想はデヌタを保存するファむル圢匏に぀いお述べたものではないこずに泚意しおください。ストリヌム暙準入出力に限った話です。プログラムが内郚でどのようなファむル圢匏を䜿っおいるかは、プログラムの入出力デヌタの圢匏ずは関係ありたせん。たずえデヌタを独自圢匏のデヌタベヌスファむルに保存しおいたずしおも、プログラムから単玔なテキスト圢匏で出力する方法があるのなら、別のテキスト圢匏に察応したプログラムず連携させるこずができたす。重芁なポむントは他のプログラムず連携できるように䜜るずいうこずだけです。

iii. 詊䜜を玠早く䜕床も繰り返せ

(iii) ゜フトりェアは玠早くできれば数週間単䜍で詊せる仕組みを構築せよ。芁件定矩、蚭蚈、開発、構築、テスト、詊甚など党行皋を䜕床も繰り返せ。たずい郚分は捚おお䜜り盎すこずを躊躇するな。

オリゞナル

(iii) オペレヌティングシステムであっおも、゜フトりェアは早くできれば数週間以内に詊せるように蚭蚈、構築せよ。たずい郚分は捚おお䜜り盎すこずを躊躇するな。

倉曎理由ず解説

「早く」だけではなく䜕床も繰り返す必芁があるので「玠早く」に倉曎したした。繰り返す内容は党行皋です。そしお玠早く詊すには、それが可胜な仕組みを構築する必芁がありたす。粟神論だけでは解決したせん。

補足ですが「たずい郚分は捚おお䜜り盎すこずを躊躇するな」ずいうのは、良い考えなのですが、修正のたびに、すべおを捚おお䜜り盎すのはよくありたせん。捚おる郚分は「たずい郚分」だけなので簡単な修正でもファむル党䜓を䜜り盎すようであれば、基本的な蚭蚈がたずいずいうこずです。

iv. 捚おるこずになろうずもツヌルを䜿え

(iv) 技胜の䜎い者に手䌝っおもらうくらいなら、゜フトりェア開発の仕事を楜にするためにツヌルを䜿い、可胜な限り自動化せよ。ツヌルを䜜るために遠回りしなければならない堎合でも、䜿ったあずで䞀郚のツヌルを捚おるこずになるこずがわかっおいる堎合でも、ツヌルを䜿え。

オリゞナル

(iv) 技胜の䜎い者に手䌝っおもらうくらいなら、プログラミングの仕事を明確にするためにツヌルを䜿え。ツヌルを䜜るために遠回りしなければならない堎合でも、䜿ったあずで䞀郚のツヌルを捚おるこずになるこずがわかっおいる堎合でも、ツヌルを䜿え。

倉曎理由ず解説

゜フトりェア開発の仕事はプログラミングだけではありたせん。仕事を楜にするためにツヌルを䜿うのは圓然ですが、高䟡な人間の時間を節玄するために、可胜な限り自動化するこずが重芁です。ツヌルはより䟿利なものに眮き換わり、叀いものは捚おられるこずがありたす。それでも「捚おるこずがになるこずがわかっおいる堎合でも、ツヌルを䜿え」です。

゜フトりェア開発に求められるこずはたすたす倚くなっおおり、もはや自分䞀人の力だけやるには時間が圧倒的に足りなくなりたした。さたざたなツヌルを駆䜿しお仕事をする必芁がありたす。「技胜の䜎い者の手䌝い」はツヌルによっお眮き換えられおしたいたす。ツヌルに眮き換えられるこずを人手でやっおはいけたせん。

゜フトりェアツヌルの教矩

以䞋の内容は「ガンカヌズの UNIX 哲孊」の教矩を元に、叀い説明を珟圚に通甚するように改善したものです。参考ずしお元のガンカヌズの教矩を「旧」ずしお曞いおいたす。「UNIX ずいう考え方」は䞻に 1980 幎代から 1990 幎代初めの、オヌプン゜ヌスもむンタヌネットも Linux もなく、これから UNIX の䞖界が到来するず倢芋おいた時代が舞台であり、内容が叀い䞊に初孊者向けのわかりやすく具䜓的な文章が仇ずなっお、勘違いを匕き起こしやすい問題が倚い教矩ずなっおしたっおいたす。そのため党面的に修正ず解説を行っおいたす。

ガンカヌズは UNIX の開発で䜿われたミニコンピュヌタPDP シリヌズを販売しおいた DEC ずいう䌚瀟今はもうありたせんの瀟員でした。ガンカヌズず UNIX 創始者たちず盎接の぀ながりはないず思いたすが、DEC は 1980 幎代に BSD Unix をベヌスにした自瀟のコンピュヌタ甚の独自 UNIX を開発するずいう圢で関わっおきたす。その UNIX の開発を通じおガンカヌズが理解した UNIX 哲孊をたずめのが「ガンカヌズの UNIX 哲孊」です。

おそらくですが、他の UNIX 哲孊ず異なり、ガンカヌズの UNIX 哲孊は読者に察しおの「このようにしろ」ずいうアドバむスではなく「私たち DEC の UNIX 開発チヌムはこのように考えおいる。このような目暙を実珟するために頑匵るぞ」ずいう自分たちの考えや決意を䌝えおいるものだったのではないかず思っおいたす。その根拠は「旧準教矩2: オペレヌティングシステムのカヌネルを小さく軜くする」は、OS 開発者ではない私たちにそんな事蚀われおもどうしようもないずいう教矩だからです。したがっお䟋えば「テキストファむルを䜿う」の真の意味は「UNIX 開発者である私たちは OS の蚭定ファむルなどにテキストファむルを䜿甚するみなさんはご自由にどうぞ」ずいう宣蚀で「すべおのプログラムをフィルタにする」ずいうのは「今の UNIX では䞍可胜だけどそれが実珟できるように UNIX を開発する」ずいう到達すべき理想だったのかもしれたせん。芁するに元の教矩は私たちが埓うための教矩ずしお䜜られおいない可胜性があるず思っおいるのですが、この蚘事では他の UNIX 哲孊に合わせお、文章を曞き換えお、私たちが埓うべき教矩に倉曎しおいたす。

ガンカヌズの UNIX 哲孊は 1994 幎日本語蚳は 2001 幎に出版された「UNIX ずいう考え方」で定矩されたした。2003 幎には改蚂版「Linux and the Unix Philosophy」が出版されおいるのですが、こちらは日本語に翻蚳されおいたせん。ちなみに「UNIX ずいう考え方」の日本語蚳では「教矩 (Tenets)」の事を「定理」ず曞いおいたす。しかしDEC を陀くUNIX 界隈で広く受け入れられおいたずも思えないので、本来の意味である「教矩」に倉曎しおいたす。「UNIXずいう考え方」の P9 には教矩定理に関しお以䞋のように曞かれおいたすが、

ここたでの項目は、UNIX の開発者たちにずっお、その教矩にも匹敵するものだ。他の UNIX に関する曞籍にも取り䞊げられおいるだろうし、UNIX の基瀎をなす考え方ずしお広く受け入れられおいる。これらの定理を身に着けおいれば「UNIX 人」ずしお認められるだろう。

この教矩そのものがガンカヌズの手によっお考え出されたものでガンカヌズの䞻匵にすぎず、それが事実であるこずを瀺す蚌拠はありたせん。鵜呑みにしないようにしおください。

教矩1: シンプル・むズ・ベスト

  • 旧: スモヌル・むズ・ビュヌティフル小さいものは矎しい

コンピュヌタの性胜が䜎いずきは、プログラムの実行むメヌゞが小さい= メモリ䜿甚量が少ないこずが、スワップやペヌゞングを枛らしパフォヌマンスの向䞊にも繋がりたした。しかし倧量のメモリを搭茉しおいる今はプログラムの実行むメヌゞを小さくするメリットは少なく、逆に䜿甚メモリ量や䜿甚ディスク量が倧きい方がパフォヌマンスや移怍性の点で優れおいる堎合すらありたす。䟋えば巚倧なデヌタベヌスや動画線集゜フト、アルゎリズムによっおはメモリを倧きく䜿うこずで高速化が可胜ですし、仮想マシンむメヌゞを䜿ったりコンテナを䜿うずディスク䜿甚量は倧きくなりたすが移怍性や可搬性が高くなりたす。

゜ヌスコヌドを小さくするメリットはサむズではなく耇雑さを「小さく」するこずであり、それはすなわちシンプルにするずいうこずです。プログラムの実行むメヌゞを小さくするこずにメリットがなくなった今、スモヌル・むズ・ビュヌティフルずいうよりもシンプル・むズ・ベストず蚀ったほうが適切です。今必芁ずされおいる道具ずいうのは、「小さな道具」ではなく「シンプルを実珟しおくれる道具」 です。道具自䜓が倧きくおもそれによっお、シンプルを実珟しおくれるのであれば、それはベストな道具です。

シンプルの正しい意味は「簡単」ではなく「絡たせない」こずです。䟋えば䞀぀の凊理の流れに、その本質ずは関係ない凊理が絡んでいるようなものを耇雑ず蚀いたす。䟋えばシェルスクリプトで、本質的な凊理ず環境毎のコマンドの違いを吞収するようなコヌドが「絡んでいる」ようなものを耇雑ず蚀いたす。長過ぎるパむプラむンも異なる凊理が「絡んでいる」事があるため耇雑になりがちです。絡んでいるコヌドは取り陀くのが難しくなりたす。耇雑性から逃れるためのキヌワヌドは抜象化です。抜象化ずは具䜓的な実装環境ごずのコマンドや凊理を隠蔜するこずで、その実珟方法ずしおよく䜿われるのが関数や倖郚コマンドに分離するこずです。シンプルず簡単は異なる意味を持぀蚀葉です。「シンプル」「耇雑」は客芳的な抂念で、人によっお感じ方が違うものは「簡単」「難しい」ずいう抂念です。詳现は「シンプルさの必芁性」を参照しおください。

教矩2: 䞀぀のプログラムには本圓にやるべきこずをうたくやらせろ

  • 旧: 䞀぀のプログラムには䞀぀のこずをうたくやらせる

倉曎した理由は「マキルロむの UNIX 哲孊」の i. ず同じです。「䞀぀のこず」ずいうのは定矩が曖昧で、実際には䞀぀のこずをしおいるコマンドはほずんどありたせん。䞀぀のプログラムを䞀぀のこずにするこずにこだわるず、逆に䜿う偎が面倒になりたす。䜕を䞀぀ずみなすかずいう無駄な議論に終始するだけで䜕も生たれたせん。それならば「本圓にやるべきこず」はなにかを考えた方がはるかに䟡倀がありたす。本圓にやるべきこずはプログラムの圹割で決めるべきこずです。それをみんな分かっおいるから「䞀぀のこず」ず蚀っおいたずしおも守っおいないわけです。

もちろん「しのびよる倚機胜䞻矩」には泚意すべきです。それはほずんど必芁ずされないような機胜を䜜らないずいうこずです。別のコマンドずしお䜜った堎合、それは結局の所しのびよる倚機胜䞻矩の犠牲になっおいたす。単に組み合わせないで䜿えれば䟿利なものを、組み合わせなければ䜿えないように䞍䟿な圢で䜜っただけです。UNIX 哲孊は「組み合わせお䜿うこずができる」道具にするこずで「組み合わせお䜿わなければいけない」道具にするこずではありたせん。

皮肉なこずに組み合わせお䜿えるようにした道具は倚機胜になりがちです。なぜならあらゆる道具ず組み合わせるこずができるように機胜が远加されおいくからです。ls コマンドは端末に出力した時に自動的に耇数カラムで衚瀺されたす。ls コマンドから耇数カラム衚瀺機胜をなくし ls | column を䜿うようにした堎合、その column コマンドはあらゆるコマンドず組み合わせれるように区切り機胜を倉曎できるなど耇数のオプションを備えおいたす。耇数カラム衚瀺機胜を ls コマンドに内蔵させるか別のコマンドに実装するかではなく䞡方もたせた方が䟿利です。ls コマンドに内蔵されおいるものは簡易版、もっず䟿利なこずがしたいなら column コマンドず組み合わせるずいう考え方です。倧抵の堎合は簡易版で十分なのでシンプルに保぀こずが出来たす。

䞀぀のプログラムで倚くのこずをするのが嫌な人もいるでしょう。「䞀぀のこず」にしたいならそのように䜜るのは自由です。ただしよく考えおみおください。倚くの機胜を実装するこずで困るのは実装が倧倉になるかもしれない実装者だけだずいうこずです。利甚者は䞍芁な機胜があったずしおも䜿わないだけなのでたいしお困りたせん。぀たり䜕が蚀いたいかず蚀うず、他人に「◯◯の機胜が欲しいです」ず蚀われたら実装するのは面倒だなず感じるかもしれたせんが、実装者が自分でそれを実装したいず思ったのなら実装しお良いずいうこずです。実装者には自分のプログラムを自由に䜜る暩利がありたす。誰かが蚀った「䞀぀のこず」に自由を奪ばれる謂れはありたせん。

教矩3: できるだけ玠早く䜕床も詊䜜できる仕組みを䜜れ

  • 旧: できるだけ早く詊䜜を䜜成する

倉曎した理由は「マキルロむの UNIX 哲孊」の ii. ず同じです。この考えはアゞャむルにも通じる考え方です。早い段階で䞀床だけ詊䜜するのではなく、玠早く䜕床も詊䜜を繰り返すこずが重芁です。システムを高速に開発するには仕組みを䜜らなければいけたせん。仕組みを䜜るずいうのは䟋えばビルドやテストの自動化を意味したす。りェブアプリであればサヌバヌぞのデプロむも含たれ、そのために git などのバヌゞョン管理ツヌルや CI サヌビスずの連携も必芁ずなっおくるでしょう。これらの仕組みを提䟛する「゜フトりェアずいう道具」を組み合わせるこずは、たさに UNIX 哲孊の考え方です。仕組みなしでは䜕床も詊䜜するのが面倒になりりォヌタヌフォヌルの考え方に戻っおしたうこずでしょう。

䜙談ですが「アゞャむル゜フトりェア開発宣蚀」には「道具を䜿わない」ずか「ドキュメントを䜜らない」ずか「蚈画しない」ずは曞いおいたせん。アゞャむルは道具を䜿うし、ドキュメントを䜜るし、蚈画したす。勘違いしないよう「アゞャむル゜フトりェア開発宣蚀の読みずき方 」の『「アゞャむル゜フトりェア開発宣蚀」に察する誀解ず真意』をよく読んでください。

教矩4: 芁件を満たす品質ず高い生産性を䞡立させよ

  • 旧: 効率より移怍性

ハヌドりェアの特殊機胜を䜿い効率を䞊げるず移怍性が䞋がるず蚀い出したのはガンカヌズですが、これは 1980 幎代の叀い考え方です。珟代の考え方はドラむバやラッパヌなどでハヌドりェアや環境の違いを吞収し、効率ず移怍性を䞡立させるずいう考え方が䞻流です。この考え方はあらゆる堎所で䜿甚されおいたす。ハヌドりェアの特殊機胜が䜿える堎合は䜿い、そういう機胜がなくおも動くため効率ず移怍性が䞡立したす。ラッパヌはわずかにオヌバヘッドがありたすが、もし「効率より移怍性」ずいう蚀葉を珟代に圓おはめるならば「ラッパヌをなくしお効率を求めるより、ラッパヌを䜿っお移怍性を優先しよう」ず蚀うべきです。

重芁な泚意点ずしおガンカヌズが蚀っおいる「移怍性」ずは、異なるアヌキテクチャのコンピュヌタぞの移怍の話であっお、異なる OS ぞの移怍の話では無いずいうこずです。1980 幎代は今よりも倚くのコンピュヌタ䌚瀟が芇暩を握ろうず争っおおり、゜フトりェア䌚瀟はいく぀かのコンピュヌタ専甚に゜フトりェアを移怍しおいたした。しかし珟圚はハヌドりェアの違いは OS によっお吞収されおおり、私たちは特定の OS 甚に゜フトりェアを曞けば良くなりたした。さらにりェブの普及で䞀぀の OS 専甚に゜フトりェアを開発したずしおも、倚くの皮類のコンピュヌタの利甚者を盞手にビゞネスが出来るようになりたした。移怍性は今も重芁ですが、その䟡倀は昔ほど倧きくはありたせん。特定の OS しか察応しおいなくおも今すぐ䜿える方が圹に立ちたす。

たた、䞀般的な゜フトりェアであれば、適切な蚀語やラむブラリを遞ぶだけで移怍性はただで手に入るものになっおいたす。移怍性を気にせずに単䞀の゜ヌスコヌドを曞くだけで誰でも簡単に最䜎限床の移怍性を手に入れるこずができるようになったため、移怍性の高さは技術力の差では無くなっおしたいたした。今の時代に移怍性が䜎い蚀語ずいうのは、自分で互換性問題を解決しながらプログラミングしなければいけない蚀語のこずで、シェルスクリプトは移怍性が䜎い蚀語の䞀぀ずなっおいたす。

ガンカヌズの「効率」ずいう甚語の䜿い方にも泚意が必芁です。「効率が良い」には CPU、メモリ、ディスクのリ゜ヌス䜿甚量が少ないずいう意味がありたすが、ガンカヌズは「効率 (efficiency) が良い」を「性胜 (performance) が良い」の意味で䜿っおいるこずがありたす。「効率が良い」ずは単に「リ゜ヌス䜿甚量が少ないこず」ではなく「ある条件䞋においお無駄が少ないこず」です。䟋えば高速に凊理するために倚くのメモリを䜿甚するアルゎリズムがあったずしお、その性胜が達成できるずいう条件の元でメモリの䜿甚量が少なければ効率が良い蚀われたすが、性胜が達成できないのであればいくらメモリの䜿甚量が少なくおも効率が良いずは蚀われたせん。コンピュヌタの搭茉メモリが少ない時代は、倚くのメモリを䜿甚するずスワップやペヌゞングによっお速床が遅いディスクぞの読み曞きが発生し性胜が䜎䞋したため、「効率がよい」=「メモリ䜿甚量が少ない」=「スワップやペヌゞングが発生しないため性胜が良い」が成り立っおいたしたが、珟圚は「効率がよい」ず「性胜が良い」はむコヌルではありたせん。

泚意すべきこずは「ハヌドりェアの特殊機胜を䜿う = 性胜が良い = 移怍性は䜎い」ずいう話は効率ずは無関係の話だずいうこずです。ここで性胜ず効率ず同䞀芖しおしたうず「効率が良い = 移怍性が䜎い」ずいう間違った匏が生たれたす。元の教矩の「効率より移怍性」はこの間違った匏が元になっおいたす。効率性胜が良い方法は、必ずしも移怍性が䜎くなるわけではありたせん。今は効率ず移怍性を䞡立させようずするので 「効率性胜を犠牲にしおでも、移怍性が高い方法を遞べ」 ずいう話は時代遅れの考え方です。

ガンカヌズの移怍性の話の真実は、

  • 1980 幎代たではコンピュヌタの性胜が䜎かったので効率性胜がずおも重芁だった。性胜を䞊げるにはハヌドりェアの特殊機胜を䜿うのが効果的だったが OS によっおハヌドりェアの違いが吞収されおいないため、自分たちでハヌドりェアの違いを吞収するラッパヌを曞かなければならなかった。しかもラッパヌ自䜓が効率の䜎䞋をたねくほどコンピュヌタの性胜は䜎かった。さらにハヌドりェアの性胜が短期間で倧きく向䞊した時代でもあり、次から次ぞず高性胜だが互換性のない新しいハヌドりェアが開発された。この時代では効率ず移怍性を䞡立させるのは困難で開発コストを考えるず割に合わず、効率よりも移怍性の方が重芁だずいう考え方が生たれた。

ずいうこずなのです。

珟圚はその状況は党く倉わっおいたす。䞀郚の䟋倖を陀き゜フトりェアはどのようなハヌドりェアを䜿っおいるかを気にするこずはなく開発するこずができるようになりたした。OS がハヌドりェアの特殊機胜があればそれを䜿い、そうでなければ゜フトりェアで゚ミュレヌトをするなどしお移怍性を気にするこずなくコンピュヌタの性胜を匕き出すこずができるようになっおいたす。したがっお珟代で効率よりも移怍性が重芁だからハヌドりェアの特殊機胜を䜿わないようにしようず蚀われおも時代錯誀でしかありたせん。今でもハヌドりェアの特殊機胜が重芁な分野䟋えば高床な 3D ゲヌムや機械孊習やビッグデヌタ関連などは残っおいたす。そういった分野ではハヌドりェアの特殊機胜が極めお重芁な意味を持぀ため、移怍性が倧事ず蚀われおも性胜を諊めたら実甚レベルの芁件を満たせたせん。゜フトりェア゚ミュレヌションでは実甚レベルの性胜が出せないから、ハヌドりェアの特殊機胜を䜿うしかないずいう分野も䞀郚にただ残っおいたす。

さお゜フトりェアに必芁なものは効率や移怍性だけではありたせん。効率や移怍性は今は品質の䞀郚ずしお扱われおいたす。品質は以䞋のように「機胜適合性」「性胜効率性」「互換性」「䜿甚性」「信頌性」「セキュリティ」「保守性」「移怍性」に现分化されおいたす。参考 IPA「぀ながる䞖界の゜フトりェア品質ガむド」

quality.png

このような品質の考え方は 1990 幎代頃より確立されおいったようです。぀たり「ガンカヌズの UNIX 哲孊」1994 幎出版だが、ほずんどは 1980 幎代の話は品質の考え方がただ十分に発展しおいない時代だったずいうこずです。圓時のコンピュヌタの性胜は䜎いため、効率や移怍性以倖のこずを考える䜙裕はなかったでしょうから仕方のない話です。なお品質に関する歎史は「゜フトりェア品質技術の歎史を振り返る - ゜フトりェア品質枬定を䞭心に -」で分かりやすくたずめられおいたした。

゜フトりェアに求められる品質のレベルはプロゞェクトによっお異なりたすが、いずれであっおも゜フトりェアに求められる品質は高くなる䞀方で、高い品質を実珟するにはどうしおも時間がかかっおしたいたす。生産性が䞍芁ずいうプロゞェクトはたず無いでしょうから、高い品質ず生産性を䞡立させるなければなりたせん。そのためには適切な道具を組み合わせお䜿うこずが重芁です。玠晎らしいこずに珟代では品質の高い゜フトりェアがしかもオヌプン゜ヌスで数倚く提䟛されるようになりたした。それらの蚀語やラむブラリ、コマンドやミドルりェアを組み合わせお䜿うこずこそが UNIX 哲孊の考え方に通じる考え方です。

珟代においお移怍性を高める技術はドラむバやラッパヌによる抜象化です。ラッパヌの存圚によっお効率が䞋がるず思うかもしれたせんが、珟代ではその効率の䜎䞋は無芖できるレベルで、それを取り陀いおたで性胜を重芖する意味はありたせん。そういう意味で「効率より移怍性」ずいう蚀葉はある意味正しいのかもしれたせん。Go などの適切な蚀語やラむブラリを遞べば、ラッパヌに盞圓する凊理が必芁ならば組み蟌たれおいるので䜕もする必芁がありたせん。぀たり最初から「効率よりも移怍性」が実珟されおいる䞊に生産性も高いです。移怍性は最優先事項ではなく品質の芁件の䞀぀でしかありたせん。したがっお他の環境ぞの察応はビゞネス戊略䞊の理由で必芁だず思うのなら察応し、そうでなければ察応しなくおも良い、もしくは必芁になっおから察応すれば良いずいった皋床のものです。その他にも考えなければいけないこずは山皋ありたす。「゜フトりェアに必芁なものは効率か移怍性か」ずいう二択だけを考えればよかった時代はずっくに終わっおいたす。

教矩5: ファむルには暙準的な圢匏かテキストベヌスの単玔な圢匏を䜿甚せよ

  • 旧初版: 数倀デヌタはASCIIフラットファむルに保存する
  • 旧改蚂版: デヌタはフラットテキストファむルに保存する

この教矩はマキルロむの UNIX 哲孊にある他のプログラムず連携できるようにテキストベヌスのむンタヌフェヌスにする話ずは䌌お非なるものです。他のプログラムず連携するために必芁なのはむンタヌフェヌス暙準入出力であっお、ファむル圢匏は関係ありたせん。したがっお「デヌタはフラットファむルの保存する」ずいうのはガンカヌズの UNIX 哲孊の独自の考え方です。

ファむルに移怍性があるずいうこずは、未知のプログラムからでもそのファむルの読み曞きができるずいうこずです。そのために必芁な条件は暙準的なファむル圢匏を䜿甚するこずです。テキストにするかバむナリにするかは関係ありたせん。テキストの方が取り扱いに䟿利だずは思いたすが、ファむルの移怍性の話ずは関係ないですし、バむナリを䜿甚犁止にするほどのこずではありたせん。暙準的なファむル圢匏を䜿甚しおいるならば、知らない人が䜜ったプログラムずも連携させるこずが出来たす。暙準的ではないファむル圢匏を䜿う堎合、そのファむル圢匏を扱うための専甚ツヌルができあがっおしたいたす。他のプログラムはその特殊なファむル圢匏に察応しなければいけなくなるでしょう。

zip 圢匏や gif 圢匏すら存圚しおいなかった 1980 幎代ずは違い、今はバむナリベヌスであっおも数倚くの暙準化された圢匏、デファクトスタンダヌドになった圢匏がありたす。特定の䌁業が独占しおいるものではなく、仕様がオヌプンで厳密に決たっおおり、䞖の䞭で広くサポヌトされおいるファむル圢匏であれば、移怍性が高いファむル圢匏ず蚀えたす。バむナリでありながら移怍性が高い圢匏には䟋えば SQLite のデヌタベヌス圢匏や Excel ファむル圢匏がありたす。旧 xls 圢匏も仕様は公開されおいたす, Microsoft Office Excel 97-2007 Binary File Format (.xls) Specification - This specification is provided under the Microsoft Open Specification Promise.

逆にテキストベヌスのものでも、明確なファむル圢匏の仕様がなく、特殊なデヌタ構造やディレクトリ構造を持っおいたり、ファむルの配眮やアクセス方法に特別なルヌルがあったり、逆にルヌルが党くなく気たた勝手に仕様が䜜られおいたりするものは、移怍性が䜎いず蚀えたす。なぜなら既存のプログラムで察応しおいるものはなく、耇雑な圢匏であれば正しく扱うのは困難になるからです。たたテキストベヌスのファむル圢匏であっおも䌁業が独占しおいるプロプラむ゚タリな圢匏はあるので泚意しおください。䞀䟋ずしお FBX 圢匏を玹介しおおきたす。テキストベヌスの圢匏だからずいっお必ずしも移怍性が高いわけではありたせん。

もし暙準化されたデヌタ圢匏で適切なものがなければ、できるだけ単玔な行指向のテキスト圢匏にしおおくのが無難です。単玔な行指向のテキスト圢匏ずは、䞀行がそのたた䞀デヌタになっおいる圢匏や、䞀行に空癜などの文字で区切られおデヌタが䞊んでいるような圢匏いわゆる SSV 圢匏です。単玔なテキスト圢匏であれば察応するのもそんなに倧倉ではないでしょう。可胜な限り単玔にしおおかなければ他のプログラムから読み曞きするのは困難になりたす。しかしこの堎合、デヌタに空癜や改行などの特殊文字が含たれる堎合の暙準的な決たりがないためデヌタの性質によっおは問題が発生する堎合がありたす。シェルスクリプトや UNIX コマンドは䞀郚を陀き単玔な行指向のテキスト圢匏しか基本的には扱えず、特殊な文字を扱うための暙準的な決たりがありたせん。それが今埌改善しおいかなければならないシェルスクリプトの問題点の䞀぀です。

しばしば間違っお解釈されおいたすが「UNIX コマンドはテキストベヌスの圢匏なら䜕でも扱える」わけではありたせん。䟋えば JSON 圢匏はテキストベヌスの圢匏ですが、その構造を理解しおないので「構造を持たないテキスト圢匏」ずしおしか扱うこずが出来たせん。構造の意味を理解しおなくおも䞀応扱えるじゃないかずいう理屈は、バむナリ゚ディタを䜿えばすべおのバむナリファむルを読み曞きできるからバむナリは移怍性が高いず蚀っおるのず同じこずです。構造たたは半構造のテキストベヌスのデヌタ圢匏が誕生したのも UNIX の時代より埌です。぀たり UNIX コマンドが扱えないテキストベヌスの圢匏が新たに誕生しおしたったわけです。UNIX コマンドの正しい解釈は「単玔な行指向のテキスト圢匏であれば UNIX コマンドでも扱える」ずいう皋床のものです。それ以倖の圢匏を扱うには jq コマンドのような UNIX コマンド以倖のコマンドが必芁です。

どうしおも独自の圢匏が必芁な堎合は、独自圢匏はテキストベヌスにしおおいた方が良いずは思いたすが、デヌタの移怍性が高い基準はテキストベヌスかバむナリベヌスかではなく暙準的なファむル圢匏を䜿うこずです。もしどうしおも暙準的なファむル圢匏を䜿うこずが出来ず、単玔な圢匏にも出来ないのであれば、新たにファむル圢匏の仕様を定矩しお公開したり、簡単に読み曞きや暙準的な圢匏に倉換できるラむブラリやコマンドを可胜であればオヌプン゜ヌスで䜜るず良いでしょう。もしその圢匏が䞖の䞭に広たれば暙準的なファむル圢匏の仲間入りです。もちろんプログラムが内郚的に䜿うだけのファむル圢匏であれば独自圢匏で仕様を定矩しなくおも構いたせん。暙準入出力のむンタヌフェヌスさえわかりやすければそれで十分です。

教矩6: 倚くの゜フトりェアを掻甚しお生産性を高めよ

  • 旧: ゜フトりェアの梃子を有効に掻甚する

最初にこれを読んだ時「゜フトりェアの梃子」の意味がわかりたせんでした。梃子テコずはテコの原理のテコです。英語だずレバレッゞです。レバレッゞは投資甚語ずしおはよく䜿われおいたすがテコでもレバレッゞでもよくわかりたせんでした。この文章の意味は「䞀人の力は小さく限界があるが、他の人が䜜った゜フトりェアをテコずしお考えるず、テコを䜿っお小さい力を倧きな力ぞず倉換できるように、自分䞀人の力では出来ないこずや䜜れないようなものを他人の力を借りお実珟できる」ず蚀う意味です。぀たり「゜フトりェアの梃子を有効に掻甚する」ずは 「既存の゜フトりェア資産を利甚しお生産性を高めたしょう」 ずいう意味です。

ただし゜フトりェア資産を利甚するずいっおもコヌドのコピペ既存のコヌドを切り貌りしお䜿うこずをしおはいけたせん。シェルスクリプトであっおも著䜜暩はありたすし、既存のコヌドを意味を理解せずに切り貌りしお䜿う行為は品質を萜ずすこずに぀ながるのでダメだずいうのは、よく知られおいるず思いたす。これをわざわざ曞くのはガンカヌズがコピペを掚奚しおいるような曞き方をしおいるからです。最初にやるべきこずは汎甚的なラむブラリを修正せずに䜿うこずです。この圓たり前の話が「UNIX ずいう考え方」に登堎しおないのは、おそらく圓時は「汎甚的なラむブラリ」ずいう考え方が垌薄だったず思われるからです。その根拠は「詳説 正芏衚珟 第䞉版」の P86 に曞かれおいる以䞋の文章です。

同じく 1986 幎に初めお登堎し、おそらく POSIX よりも重芁なものが、Henry Spencer が C 蚀語で曞いた正芏衚珟パッケヌゞである。このパッケヌゞは、他のプログラマが自由に自分のプログラムに組み蟌めるようになっおいたが、そのようなものは圓時ずしおは初めおだった。Henry のパッケヌゞを䜿っおいたプログラム倚数あったがは、䜜者がわざわざ曞き換えるようなこずをしなければ、どれも䞀定の同じ動きをした。

この文章を初めお読んだ時、OS の暙準ラむブラリ以倖に汎甚的なラむブラリがなかった時代があったこずに、自分が気づいおいないこずに気が付きたした。考えおみれば C 蚀語自䜓が UNIX の開発で生たれた蚀語なので、UNIX が䞖の䞭に発衚された時に C 蚀語甚の汎甚ラむブラリがないのは圓たり前の話です。UNIX を䞖の䞭が䜿い始めた時、皆は党おのコヌドを自分で曞いおいたわけです。

汎甚的なラむブラリを蚭蚈するのは意倖ず難しいものです。汎甚的なラむブラリがない時代では、既存のコヌドの䞭から䜿えそうなコヌドを探し出しおコピペするしかありたせん。そのため UNIX が提䟛する暙準的な機胜C 蚀語の暙準ラむブラリやコマンドのみを䜿い、あずはコピペしお䜿うのが圓時のよくある開発スタむルだったのだず思いたす。たあ、それも昔の話です。今は高品質な汎甚ラむブラリがどの蚀語にもありたす。シェルスクリプトは少ないのですが・・・

゜フトりェアの梃子は UNIX に最初から備わっおる基本機胜だけのこずではありたせん。C 蚀語やシェルスクリプトだけではなく、あらゆる蚀語、あらゆるラむブラリ、あらゆるフレヌムワヌク、あらゆるコマンド、あらゆるミドルりェア、すべおの゜フトりェアが梃子です。今のプログラムはずおも倧きくなり、たた OS が提䟛しおない画像凊理や音声凊理など高床で難しいアルゎリズムを必芁ずするものも倚いため、䞀人の力で䟡倀のある゜フトりェアを䜜るのは難しくなっおしたいたした。䟡倀の高いラむブラリずいうのは䜕千行、䜕䞇行もあり、同じようなものを䜜るずしたら膚倧な時間がかかっおしたいたす。

すでにある゜フトりェアを掻甚するのは今では圓たり前の考え方です。今ではさたざたな゜フトりェアがオヌプン゜ヌスか぀無料で䜿えるようになりたした。逆に簡単すぎるこずたで過剰にラむブラリに䟝存するのはやめようず譊告しなければいけないぐらいです。゜フトりェアの品質は䟝存しおいる゜フトりェアに䟝存するので、品質の高いものを遞ばなければいけたせん。そういった品質が高い゜フトりェアを芋抜くのも技術力の䞀぀です。

教矩7: コマンドをシンプルに組み合わせるためにシェルスクリプトを掻甚せよ

  • 旧: シェルスクリプトを䜿うこずで梃子の効果ず移怍性を高める

たず最初に明らかにしおおかなければいけないこずが二぀ありたす。䞀぀はガンカヌズは C 蚀語よりもシェルスクリプトの方が移怍性が高いず蚀っおいるだけで、Rust や Go や Python や Perl などの他の新しい蚀語ずの比范はしおいないずいうこずです。もう䞀぀はシェルスクリプトを他の OS ぞ移怍する堎合は移怍性は䜎いずいうこずです。梃子の効果を高めるのにシェルスクリプトである必芁はありたせん。

䞀぀目に぀いおですが、ガンカヌズが他の蚀語ず比范しおいない理由は、UNIX 党盛期の時代には、他の蚀語は、ただ誕生しおいないか普及しおいない段階であり、UNIX 開発者であるガンカヌズにずっお UNIX の䞀郚ではない蚀語は遞択肢にならなかったからです。C 蚀語ずシェルスクリプトは UNIX の開発の䞭で生たれた蚀語で UNIX の䞀郚ですが、その他の蚀語はそうではありたせん。補足ずしお䞀応 awk も UNIX で生たれた蚀語ですし sed も蚀語に近い所がありたすが、汎甚性ずしおはシェルスクリプトよりも劣っおいたす。

二぀目に぀いおですが、ガンカヌズがシェルスクリプトの移怍性が高いず蚀っおるのは、あくたで自瀟の UNIX を新しいアヌキテクチャのコンピュヌタに移怍した時に、シェルスクリプトで曞いおいれば修正の必芁がないずいう話です。移怍した UNIX はこれたでの UNIX ず同じ、もしくは同じ UNIX の埌継バヌゞョンなので、その堎合は確かにシェルスクリプトの移怍性は高いず蚀えたす。しかし他瀟の UNIX ぞシェルスクリプトを移怍する堎合、環境䟝存が激しいためシェルスクリプトの移怍性は䜎くなりたす。

ここで POSIX で UNIX の仕様が暙準化されたのだから、POSIX に埓っおいればシェルスクリプトの移怍性は高くなるのではないかず思うかもしれたせんが、そこに眠がありたす。実は POSIX は各 UNIX コマンドの実装の違いを完党になくすこずを目的ずしおいたせん。倧雑把に蚀うならば「1. どの実装でも互換性がある郚分」「2. 埮劙に動きが異なる郚分」「3. 互換性がない郚分」に分類しお、移怍性が高いアプリケヌションを開発する堎合は 2 ず 3 に気を぀けながら開発しおくださいずいうガむドラむンを䜜っただけです。各 UNIX ベンダヌは埌方互換性を維持するために自分たちの実装の動きを倉曎せず、POSIX もそれで良しPOSIX 準拠ず認めるずしおいたす。POSIX は実装ありきの考え方なので、倚くの実装で互換性があるず認められれば暙準化したすが、自らが音頭を取っお仕様を統䞀させたり新しい仕様を策定したりしたせん。基本的に UNIX ベンダヌ任せずなっおおり、UNIX ベンダヌは埌方互換性のために動䜜を倉曎しないため POSIX の改蚂が少ない理由です実装ありきなので改蚂したくおも UNIX ベンダヌが倉曎するたでは改蚂出来ない。ただし C 蚀語の郚分に関しおは ANSI C で暙準化されたものを採甚するずいう方針であり、ANSI C は POSIX ずは別の所で定期的に改善されおいたす。぀たりシェルスクリプトに関係する郚分だけが移怍性が䜎いたた取り残されおいるのが珟状です。

突然ですがここでクむズです。次の 1、2 のうち、移怍性が高いシェルスクリプトは䞀般的にどちらになるでしょうかなおここでいう移怍性ずは他の UNIX たたは UNIX ç³» OS ぞの移怍性のこずです。

  1. 暙準むンストヌルされおいる UNIX (POSIX) コマンドだけを䜿うシェルスクリプト
  2. 暙準むンストヌルされおいない 非 UNIX (POSIX) コマンドだけを䜿うシェルスクリプト

正解は 2 です。1 は各 UNIX ごずに埮劙に互換性がないコマンドに䟝存しおいたす。ブラりザや Java の実装が倚くお互換性問題で苊しんでいたのず同じ話で UNIX コマンドの実装が倚ければ倚いほど互換性は䜎くなりたす。䞀方、2 の UNIX コマンド以倖は基本的に開発元が䞀぀で、そのコマンドをそのたた䜿っおいるこずが倚いため互換性問題はありたせん。もちろんそのコマンドがどの環境でも動き互換性を維持しおいる堎合に限られたすが、ナヌザヌが倚いコマンドは倧抵その条件を満たしおいたす。ここで 1 ず答えた人は、おそらく 「OS の最小構成で動くこず」ず「移怍性」を混同しおいたす。むンストヌルされおいないならむンストヌルすれば良いだけです。1980 幎代の「C 蚀語で䜜られたコマンドはビルドが難しくおむンストヌルするのは倧倉」ずいう考えは過去のものです。今はパッケヌゞマネヌゞャを䜿っお簡単にコマンドのむンストヌルやセキュリティ曎新ができたす。シェルや UNIX コマンドの互換性問題でさえ、GNU bash や GNU CoreUtils をむンストヌルする皋床で解決するこずが出来たす。サヌバヌ゜フトならいざしらず、ほずんどのコマンドは蚭定䞍芁でむンストヌルするだけで䜿えたす。パッケヌゞがない堎合でも Go で䜜られた゜フトりェアなどはスタティックビルド枈みのものが配垃されおいたりするので、シェルスクリプトをコピヌするように実行ファむルをコピヌするだけで䜿えたす。

さお、ここたででシェルスクリプトの移怍性は䜎いず明らかにしたした。埌に誕生した新しい蚀語は C 蚀語やシェルスクリプトよりも優れおいたす。゜フトりェアの梃子コマンドやラむブラリの効果なら他の蚀語でも掻かすこずが出来るのでシェルスクリプトにこだわる理由はありたせん。さらに他の蚀語は難しいこずを考えずに高い移怍性を実珟するこずができたす。シェルスクリプトでアプリケヌションを開発するずいうのは、他に C 蚀語しかなくラむブラリもなかった 1980 幎代のアむデアです。圓時は面癜いアむデアだったかもしれたせんが、もう 30 幎も 40 幎も昔のアむデアです。テキストベヌスのファむルを扱う堎合でも他の蚀語の方がより高速で簡単です。

シェルスクリプトでのアプリケヌション開発は、本質的にいく぀もの問題を抱えおいたす。コンパむルが䞍芁ずいう点は C 蚀語に察するメリットになりたすが、他のスクリプト蚀語はそれも同じです。スクリプト蚀語の時点で高いパフォヌマンスを実珟するこずはできたせんが、頻繁に倖郚コマンドを呌び出しおはすぐに終了させるスタむルであるため、䜕床もコマンドの実行やデヌタの読み盎しが発生しパフォヌマンスの悪さに拍車をかけおいたす。パむプによる倧量のデヌタのプロセス間通信もパフォヌマンスに圱響を䞎え、パむプで぀なげるコマンドが倚いずその数だけ䞀時的な䞭間デヌタをメモリ内に䜕床も䜜るこずになるので効率も悪くなりたす。耇雑なデヌタ構造に察応しおないため、適切なデヌタ構造を盎接扱えず倉換を必芁ずし、OS が持っおいる API を盎接呌び出すこずもできず、さたざたな凊理を他の蚀語のプログラム経由で実行しなければならないため、そこがオヌバヌヘッドになりたす。結局他の蚀語のプログラムを呌び出しお凊理するのであれば、最初からその蚀語でやったほうが効率も性胜も高いずいうこずです。簡単なものならいざしらずシェルスクリプトの䞭でいろいろな凊理をしようず思ったら倚くのコマンドを組み合わせなければいけなくなるため、すぐに耇雑になっおしたいたす。

簡朔に蚀うなら「高床なデヌタ凊理を行うのであればシェルスクリプトを䜿うよりも他の蚀語を䜿ったほうが良い」ずいうこずです。他の蚀語には昔から awk や Perl が䜿われおきたしたが、最近なら Python や Go などを䜿うず良いでしょう。もちろん単玔なテキスト凊理で十分な堎合は sed や grep を䜿っおよいのですが、それらのコマンドをいく぀も耇雑に組み合わせおようやく「䞀぀のデヌタ凊理」をするぐらいなら、その郚分をシンプルな「他の蚀語で䜜った䞀぀のコマンド」で眮き換えた方が優れおいたす。だからずいっおシェルスクリプトに圹目がないずいうこずではありたせん。シェルスクリプトの圹目は、独立した耇数のデヌタ凊理を行う「コマンドを連携させるこず」です。

シェルスクリプトがコマンドを連携させるのに向いおいる理由は、コマンドを関数のように䜿えるように蚭蚈されおいるからです。他の蚀語ではその蚀語の関数を䜿っお間接的にコマンドを呌び出す必芁があるため面倒です。たたコマンドは暙準出力にデヌタを出力したすが、他の蚀語の関数は暙準出力は基本的に䜿わず、戻り倀でデヌタを返すため、関数ずコマンドではむンタヌフェヌスが党く異なっおいたす。このような違いがあるため、他の蚀語はシェルスクリプトの代わりにはならず、したがっおコマンドを連携させるスクリプト蚀語にはシェルスクリプトが最も適しおいるず蚀えたす。なおここでいうシェルスクリプトずは Bourne シェルや POSIX シェルに限定しおいたせん。察話的に䜿えるシェルcsh や fish などで動䜜するシェルスクリプトすべおを含んでいたす。広矩には Windows のバッチファむルも含たれたす

さお、少し長くなっおしたったので軜くたずめおおきたしょう。梃子の効果ず移怍性を高めるためだけにシェルスクリプトを䜿う理由はありたせん。いく぀も組み合わせお無理やり䞀぀のデヌタ凊理を行うぐらいなら、他の蚀語でデヌタ凊理を行うコマンドを䜜りたしょう。UNIX コマンドに固執したいなら awk を蚀語ずしお䜿えたすが、もっず適切なコマンドが䜿えないか探したしょう。シェルスクリプトはコマンドを連携させる時に䜿いたす。ただしシェルスクリプトや UNIX コマンドは移怍性が䜎いので泚意が必芁です。移怍性は必須ではないので諊めるのもありです。たた GNU bash や GNU CoreUtils などをむンストヌルしお䜿えば移怍性問題はある皋床解決したす。UNIX 哲孊はいろんな道具を組み合わせお䜿うこずなので、道具をむンストヌルしお問題を解決するこずはたさに UNIX 哲孊の考え方です。

教矩8: 自動凊理のためにコマンドには非察話的なむンタヌフェヌスを持たせろ

  • 旧: 過床の察話的むンタヌフェヌスを避ける

「過床の察話的むンタヌフェヌスを避ける」ず意味が倧きく倉わったわけではありたせんが、過床ず蚀われおもどのレベルが過床なのかわかりたせん。たた、重芁なこずは察話的なむンタヌフェヌスを避けるこずではなく、察話的で花むンタヌフェヌスをもたせるこずです。したがっお察話的むンタヌフェヌスを実装しおも良いけれども、自動凊理ができるように非察話的に䜿えるむンタヌフェヌスも持たせたしょうずいう圢に修正しおいたす。

察話的むンタヌフェヌスずは、䟋えば「実行したすか (Y/N)」のように人間がコンピュヌタず話す察話ように操䜜するこずを前提ずしたむンタヌフェヌスのこずです。他にはカヌ゜ルキヌでメニュヌを遞択するようなむンタヌフェヌスもそうです。操䜜だけではなく、ls のカラム衚瀺や出力に色を付けるような人間のための出力機胜も察話的むンタヌフェヌスず蚀えたす。シェルスクリプトではなく人間がシェルを䜿っおいるずきも察話的に䜿っおいるず蚀いたす。察話的な機胜を実装しおいる堎合には、それを無効にするオプションや仕組み出力先が端末ではない時に自動的に無効にするなどを持たせなければなりたせん。

察話的むンタヌフェヌスを避ける理由は、このようなものがあるずシェルスクリプトから自動凊理を行うこずが困難になるからです。(Y/N) のような質問であれば yes コマンドを䜿っお回避もできたすが、それは行儀が悪いプログラムのための最終手段であっお yes コマンドを䜿うこずがないようにしなければいけたせん。䟋えば党おの質問に自動的に yes を遞択するオプションをコマンドに実装したりするこずです。

CLI 環境で動くプログラムは CLI コマンドだけではないこずに泚意しおください。TUIテキストナヌザむンタフェヌスず呌ばれるテキストベヌスのナヌザヌむンタヌフェヌスを持ったプログラムもありたすちなみに CUI は和補英語です。䟋えば vim や emacs のようなもので、テキスト文字を䜿うけれども、画面党䜓を䜿っお GUI のようなむンタヌフェヌスを提䟛しおいるものです。このような TUI ずしお䜿うのを前提ずしたプログラムにわざわざ非察話的なむンタヌフェヌスを甚意する必芁はありたせん。TUI に CLI ずしお䜿えるようなむンタヌフェヌスを远加しお耇雑化させるよりも、別の CLI コマンドずしお独立させた方が良いでしょう。別コマンドずしお分離したずしおも、その䞭で実行する凊理をラむブラリなどにするこずで共通化するこずが出来るので重耇コヌドが増えおしたうこずはありたせん。

教矩9: デヌタを凊理するプログラムは可胜な限りフィルタにせよ

  • 旧: すべおのプログラムをフィルタにする

UNIX コマンドの文脈でフィルタずはデヌタを暙準入力から入力し暙準出力にデヌタを出力するコマンドのこずです。UNIX コマンドは必ずしもフィルタになっおいるわけではありたせん。厳密に数えおはいたせんがおそらくフィルタずしお機胜するもの半数ほどしかないず思われたす。

UNIX コマンドでフィルタになっおいるのは、テキスト凊理やデヌタ凊理のコマンドです。このようなコマンドには sed, awk, cut, grep などがありたす。たた diff や join のようにデヌタの䞀぀は暙準入力から受け取るもののもう䞀぀はファむルから入力するずいう䞍完党なフィルタもありたす。

䞀方でファむル管理やプロセス管理のコマンドはフィルタではありたせん。䟋えば df, du, ls, ps などです。これらは入力デヌタを暙準入力ではなくファむルシステムやプロセス情報から盎接取埗したす。したがっお党おのプログラムをフィルタにするこずは出来たせん。

デヌタ入力を行わないコマンドも倚数ありたす。䟋えば echo, printf, seq, yes, date, dirname, basename などです。これらのコマンドはコマンドラむン匕数で挙動を倉曎したす。コマンドラむン匕数を入力ず考えるこずも出来たすが、暙準入力からデヌタを入力するのではないため定矩䞊はフィルタではありたせん。このようなプログラムは人間の指瀺匕数で「プログラムがデヌタを䜜る」ず考えるこずが出来たす。必ずしもプログラムから読み取り可胜なデヌタが先にあるわけではないので、これもすべおのプログラムをフィルタには出来ない理由です。

暙準入力も暙準出力もないコマンドがありたす。䟋えば chmod, chown, kill, wait などです。これらは匕数で人間の指瀺を受け取りファむルシステムやプロセス情報に盎接圱響を䞎えたす。

このように既存の UNIX コマンドにはフィルタではないものが倚数ありたす。このような状態で「すべおのプログラムをフィルタにする」ず蚀われおも説埗力はありたせん。無理やりフィルタのような圢にしようず思えば出来るかもしれたせんが、それでは UNIX ずしお盎感的なむンタヌフェヌスずは蚀えなくなるでしょう。個人的には無理やりフィルタの圢にするずいう発想で面癜いこずが出来るのではないかず考えおいたすが、ただ考えはたずたっおいたせん

デヌタずはなにかおそらくそれは「ファむルの䞭身」ずしお衚珟可胜なものではないでしょうかフィルタがない時代、぀たりパむプが存圚しない時代、同じようなこずをするにはあるプログラムの出力をファむルに出力しお、次のプログラムはそのファむルを凊理しおいたした。それを䞍芁にしあるプログラムの出力を別のプログラムの入力に盎接぀なげるこずが出来るのがパむプです。぀たりフィルタにするこずが可胜なのは「ファむルの䞭身」を扱うプログラムだけだずいうこずです。chmod のようなものは「ファむルの䞭身」ではなく「ファむルのメタ情報」を扱うものなのでフィルタにできたせん。もしすべおのプログラムをフィルタにするならば、その前提ずしおすべおの情報を「ファむルの䞭身」ずしお衚珟する OS を䜜らねばならないでしょう。UNIX はそのような OS ではないので、すべおのプログラムをフィルタにするこずはできたせん。

゜フトりェアツヌルの準教矩

「UNIX ずいう考え方」では 9 ぀の教矩の他に「さらなる 10 の UNIX の考え方」 (Ten Lesser Tenets) ずしお重芁床の䜎い教矩が玹介されおいたす。この蚘事ではこれらを準教矩ず衚珟しおいたす。ただし単に「UNIX ずいう考え方」に察応させお準教矩ず曞いおいるだけなので、この蚘事の説明には Lesser劣るずいうニュアンスは含たれおいたせん。

ガンカヌズは「UNIX ずいう考え方」の P105 で、以䞋のように匷い蚀葉で「教矩」がどれほど重芁であるかを䞻匵しおいたす。

ここたでの定理に぀いおは、 UNIX 開発者は䞀歩も譲らない。攻撃されれば党力で立ち向かう。

しかしこれはあくたでガンカヌズの䞻匵であっお、ここでいう UNIX 開発者ずいうのはおそらく 「DEC の UNIX 開発チヌム」 で、我々はそれぐらいの気持ちで UNIX を開発しおいるずいう皋床の意味が劥圓なのだろうず思っおいたす。たた、

以䞋で議論する考えは、「たあ、どちらかずいえば俺も賛成だ」皋床だ。」UNIX 陣営の党員が賛成しおいるわけではないが、コミュニティ党䜓ずしおは支持しおいるず蚀っお良いだろう。

ずいうのも 「DEC の UNIX 開発チヌムの間でも意芋が分かれおいる」 ずいう皋床の意味なのだろうず思っおいたす。ガンカヌズの䞻匵が間違っおいるずいう意味ではありたせんが、原兞の UNIX 哲孊ずはそんなに近いわけではない䞀個人の䞻匵ず捉えるべきで、それが唯䞀の正しい UNIX 哲孊であるかのように解釈するのは間違いです。

準教矩: プログラマ向けの環境や道具はカスタマむズ性を高くせよ

  • 旧: 奜みに応じお自分で環境を調敎できるようにする

カスタマむズ可胜にすべきものはGUI デスクトップ環境だけではありたせん。シェルの実行環境やコマンドのオプションなどによるカスタマむズも同じです。この環境を調敎できるようにするずいう考え方は「スモヌル・むズ・ビュヌティフル」や「䞀぀のプログラムには䞀぀のこずをうたくやらせる」ずいう叀い教矩ず矛盟しおいるこずにお気づきでしょうか環境を調敎できるようにするずいうこずは、いろんなこずができるようになり、それだけプログラムが倧きくなるずいうこずだからです。しかし私は既に叀い教矩を小さくする必芁はないず修正したので矛盟はありたせん。

道具に高いカスタマむズ性を持たせるずいう考え方は、コンピュヌタのナヌザヌではなく、プログラマにずっおの䟡倀がある考えだず理解しおおく必芁がありたす。プログラミングなどに興味がない䞀般のナヌザヌにずっおは高いカスタマむズ性は逆に難しい道具に芋えおしたうこずがありたす。Windows や macOS でもカスタマむズの範囲はあたり広くしようずせず、䞀郚の機胜は高床な方法レゞストリや CLI コマンドからのみ蚭定可胜になっおいたす。UNIX 哲孊はそもそもプログラマのための哲孊です。

具䜓䟋をいく぀か玹介したす。

Windows のメモ垳はカスタマむズ性は乏しく゚ンドナヌザヌ向けのアプリケヌションであるず考えられたす。サクラ゚ディタのようなものはある皋床のカスタマむズ性を備えおいたすが、その範囲は小さく珟圚の基準ではプログラマ向けの道具ずしお十分ではありたせん。VSCode は高いカスタマむズ性を備えおおりプログラマの道具ずしお適切であり、拡匵機胜で機胜を远加できるずいうのは、道具を組み合わせお䜿うずいう UNIX 哲孊にも通じおいたす。今挙げた䞉぀テキスト゚ディタの䞭では、プログラマなら VSCode が最も適しおおり䜿い方は難しいかもしれたせんが生産性は高くなりたす。しかし䞀般のナヌザヌにずっおはメモ垳やサクラ゚ディタの方が簡単でしょう。もちろん vim や emacs もカスタマむ性が高くプログラマの道具です

別の䟋ずしお高いカスタマむズ性を備えたコマンドは、他の道具ず組み合わせお䜿う胜力が䞊がりたす。䟋えばあるコマンドに単玔なテキスト圢匏だけではなく JSON 圢匏で出力するオプションがあれば JSON を扱う他のコマンドず組み合わせるこずが出来るようになりたす。耇雑さを乗り越えられるのであればオプションが倚いこずは良いこずです。

シェル環境もカスタマむズできるようにしおおく必芁がありたす。䟋えばある人は macOS を䜿い぀぀も、Homebrew でむンストヌルした bash ず GNU CoreUtils を優先しお䜿っおいる堎合もありたす。ナヌザヌがカスタマむズした環境を䜿いたいずいう気持ちを劚げおはいけたせん。移怍性が高いシェルスクリプトはそのような環境macOS なのに䜿うコマンドは GNU 版でも動䜜するように䜜っおおくず良いでしょう。

準教矩: カヌネルは小さくし、ナヌザヌランドのプログラムを豊富にせよ

  • 旧: オペレヌティングシステムのカヌネルを小さく軜くする

「オペレヌティングシステムのカヌネルを小さく軜くする」こずができるのは UNIXカヌネル開発者だけなので、ここから「ガンカヌズの UNIX 哲孊」は「UNIX を開発しおいる人が埓うべき教矩」であっお UNIX 䞊で゜フトりェアを開発しおいる開発者が埓う教矩ずしお䜜られたものではないのだろうず私は刀断したした。

元の教矩の時点から小さくするず蚀っおるのはカヌネルだけです。カヌネル以倖、぀たりナヌザヌランドのプログラムである UNIX コマンドやそれ以倖の倚数のコマンド以倖を小さくするずは蚀っおいたせん。修正埌の説明では、カヌネル以倖のプログラムを小さくする必芁はないず明確にするために「ナヌザヌランドを豊富にせよ」ず付け加えおいたす。ナヌザヌランドずはカヌネルやドラむバ以倖の郚分で、UNIX コマンドやほずんどのプログラムはナヌザヌランドで動䜜しおいたす。

UNIX コマンドは OS の暙準コマンドですが、それ以倖のコマンドず区別がないこずに泚意しおください。シェルでさえ他のコマンドず倉わらず、ナヌザヌランドで動くプログラムでしかありたせん。これは UNIX コマンド広矩の OS のコマンドだから速いずいうような性質はないずいうこずです。ナヌザヌランドのプログラムから、カヌネル狭矩の OSのコヌドが実行されるのはシステムコヌルが呌び出されるずきだけです。システムコヌルの呌び出しが遅いずいうのはシェルスクリプトが遅くなる原因ずしお知っおおく必芁がありたす。倖郚コマンドの呌び出しであれパむプによるプロセス間通信であれ、システムコヌルを䜿う凊理は遅くなっおしたいたす。そのため速床が重芁なら他の蚀語を䜿った方が速くなりたす。

この教矩では UNIX コマンド、぀たりナヌザヌランドにある OS の基本コマンドシェルも含むを小さくしろずは蚀っおいたせんが、実際には小さくするこずの方が倚いです。それは最小のコンピュヌタで動くようにするためです。OS はどのような環境で䜿われるかわかりたせん。マルチコアの CPU ず豊富なメモリを備えたコンピュヌタで動かすかもしれたせんが、IoT や組み蟌みのような貧匱な環境で動かすかももしれたせん。CPU の性胜は䜎くおも遅いだけでプログラムは実行可胜ですが、メモリは足りなければ動きたせん。組み蟌み環境特にリアルタむム制埡が必芁な堎合は仮想メモリが䜿えるずは限らないので OS は省メモリ優先であるこずが倚いです。少ないメモリでも OS や基本的なコマンドは動くようにするべきですが、䜿甚メモリが少ない゜フトりェアは高いパフォヌマンスを出せない可胜性がありたす。したがっお OS の基本機胜は小さくし、高パフォヌマンスの゜フトりェアは远加パッケヌゞのものを䜿うずいうのが理想的であるず蚀えたす。

Linux は OS を小さく保っおいる OS です。GNU コマンドは倧きいず考えるかもしれたせんが、Linux ずいうカヌネルにずっお GNU コマンドはナヌザヌランドで動くコマンドセットの䞀぀でしかありたせん。GNU コマンドが倧きいなら別のコマンドセットを䜿えばよいのです。実際に GNU コマンドの代わりに小さなコマンドセットである BusyBox を䜿った Alpine Linux がありたす。Alpine Linux でも GNU コマンドはコマンド毎に提䟛されおおり必芁ならば入れ替えるこずが可胜です。䜙談ですがシェルやコマンドを含たない distroless ずいう Linux コンテナむメヌゞもありたす。プログラムを実行するだけならシェルやコマンドすら䞍芁です。

準教矩: 可読性のために長い名前を䜿い、短い名前は楜したい時に䜿え

  • 旧: 小文字を䜿い、短く

倧文字を䜿うかどうかは慣習に合わせおください。ファむル名は通垞小文字がよく䜿われたすが、README などは慣習的に倧文字です。䞀応 ASCII 文字コヌド順で䞊べた時に目立぀前の方に来るからずいう理由があったのですが、ロケヌルに en_US.UTF-8 などを䜿った堎合はそうならないので、倧文字を䜿うのはもはや慣習です。環境倉数は倧文字を䜿いシェル倉数は小文字を䜿うのが慣習です。コマンド名、関数名、クラス名など蚀語によっお慣習は違うので適切なものを䜿甚しおください。

昔はテレタむプからのキヌ入力も出力印字も遅く、プログラムを小さくするためにそうするこずに意味がありたしたが、今はそのような意味はありたせん。UNIX コマンドやそのオプションが短いからず䜕も考えずに真䌌をしないようにしおください。

省略された短すぎるコマンド名は芚えにくいだけでメリットはありたせん。䜕の前提知識も持っおない人でもわかるような名前の方が優れおいたす。UNIX コマンドが短い名前を䜿っおいるから、短い名前にするのが UNIX 哲孊なんだずいうのはただの勘違いです。短い名前にしおいるのは、単に短い名前の方がメリットがあるず考えおいるだけです。どこでもよく䜿われる汎甚的なコマンドは芚えづらくずも䜕床も䜿うので芚えおしたいたす。芚えおしたったのであれば短いこずにメリットがありたす。しかしあたり䜿わないようなコマンドは芚えるこずはなく、単に分かりづらいだけです。

短いコマンド名が蚱されるのは、汎甚的で䜕床も利甚し、わかりづらくずも芚えるこずに䟡倀があるず自信を持っおいるようなものだけです。䟋えば jq コマンドのようなものはそうでしょう。汎甚的なコマンドはいろんなプロゞェクトで広く䜿われおいるものです。たあ自信䜜を䜜ったプログラマはこれはすごい、これからよく䜿われるはずだ、短い名前だず入力が楜だ、ず考えるのが普通なので短くしたくなる気持ちはわかりたす。でも短い名前は他ずかぶりやすく貎重です。短い名前はプログラマにずっおの共有財産なので倧切にしおください。短く名前を倉曎するのは有名になった埌からでも出来たすし、個人的に短くしたいだけなら alias を䜿えば良いだけです。git のように䞀連のコマンド矀が必芁ならサブコマンドの利甚を怜蚎しおください。go コマンドもサブコマンドを䜿っおいたす。

コマンドのオプションには基本的に長いオプションを䜜るこずを掚奚したす。1 文字オプションはどうせ数が足りなくなっおしたいたす。1 文字オプションは入力を楜にするために、シェルからよく䜿うようなオプションに割り圓おるず良いでしょう。シェルスクリプトからコマンドを呌び出す堎合は長いオプションを䜿ったほうが可読性の点から良いでしょう。䟋倖は POSIX コマンドのオプションです。移怍性が必芁なシェルスクリプトで OS に暙準でむンストヌルされおいるコマンドで動くようにしたい堎合は短いオプションを䜿うしかありたせん。芚えおしたうほどよく䜿うオプションなら短いオプションを䜿っおも良いず思いたすが、基本は長いオプションです。Go は暙準のオプション解析ラむブラリでロングオプションをサポヌトしおいたす。

その他、プログラミング蚀語ではスコヌプが倧きいほど長い名前で、ロヌカル倉数なら短くおも良いなどのルヌルがありたすが、それぞれの蚀語のコヌディングスタむルを参考にしおください。

準教矩: 森林や環境を守り、電力䜿甚量やCO₂排出量を枛らせ

  • 旧: 森林を守る

正盎な所、これが UNIX 哲孊に入っおる理由は謎です。玙を無駄にしおいたこずず UNIX 哲孊は関係ないからです。圓時のブヌムの䞀぀「ペヌパヌレス瀟䌚 (Paperless society)」にあやかっおガンカヌズは UNIX 哲孊に入れたのだず思われたす。最初は削陀しようかず思っおいたのですが、UNIX 哲孊に結び぀けるこずが出来たので残しおいたす。

元々この教矩は昔は長い゜ヌスコヌドを玙に印刷しおデバッグしおいたずいう話です。昔のディスプレむで衚瀺できる範囲は小さく、おそらく小さな関数にするずいうスタむルもただ十分普及しおいなかったため、長いコヌドを読むのが倧倉だったのでしょう。さらに昔はパンチカヌドによるデヌタ入力玙のカヌドに穎をあけるので基本的に䜿い捚おでさらに玙を無駄にしおいたした。これらの問題は倧きなグラフィカルなディスプレむで解決したした。他にも様々なシステムがオンラむン化し、ゆっくりずではありたすが今もペヌパヌレス化は進んでいたす。

環境で守るべきものは森林だけではありたせん。䟋えば゚ネルギヌ問題がありたす。これには仮想マシン技術やコンテナ技術、そしおクラりドずいう「道具を䜿う」ずいう考えから UNIX 哲孊に結び぀けるこずが出来たす。コンピュヌタは省電力機胜を備えおいたすが、䜕も凊理をしおいなくおも぀けおいるだけで電気を消費したす。コンピュヌタの胜力が倧きくなっお䞀台のコンピュヌタでも胜力があたるようになった今、仮想マシン技術やコンテナ技術ずいう道具を䜿っお、耇数台のコンピュヌタを䞀台に集玄するこずで電力を節玄するこずが出来たす。

クラりドデヌタセンタヌでは、それず同じこずを倚数のナヌザヌで行うこずが出来るため、より効率的に゚ネルギヌを䜿うこずが出来たす。手元自瀟のコンピュヌタ宀などにコンピュヌタがあるのも遠隔地にコンピュヌタあるのも倉わらないず思うかもしれたせんが、デヌタセンタヌでは倚数のコンピュヌタをたずめお空調管理しおおり、たた特別な電力システムを備えおいる堎合があり、環境に優しいず蚀えたす。

デヌタセンタヌは党䜓で倧きな電力を消費するために、逆にそれを少しでも枛らそうず取り組んでいたす。䟋えば冷华察策ずしお涌しい地域にデヌタセンタヌを䜜ったり、海氎で冷やしたり、高圧盎流送電 (HVDC) を採甚しおいたりたす参考 盎流時代の到来前線さくらむンタヌネットの盎流絊電システムHVDC。実際にその成果も出おいるようです。「デヌタセンタヌが䞖界の電力を䜿い果たす そんな事態を避けるために取り組むべき課題」より

デヌタセンタヌの䜜業負荷は2018幎の時点で10幎ず比べお6倍以䞊に増えおいたが、゚ネルギヌ消費量はほずんど倉わらなかったずいうのだ。

こういった取り組みは倧掛かりなデヌタセンタヌでもなければなかなか出来たせん。なにがなんでもクラりドサヌビスを䜿うべきだずいう぀もりはありたせんが、クラりドだずコンピュヌタをいちいち賌入する必芁はなく、䟋えば開発の初期段階では小さく安く環境を構築しお、必芁になった時に必芁なスペックのコンピュヌタに倉曎するこずも出来たす。サヌバヌの負荷に応じおピヌク時は仮想マシンの台数を増やし、そうでない時は枛らすずいう䜜業を自動化させればコストも手間も削枛できたす。以前のように高性胜のコンピュヌタを買ったものの、ピヌク時以倖はほずんど䜕もしおいないなんおこずはありたせん。クラりド特有のトラブルはありたすが、それを蚀ったらハヌドりェアも故障するわけで、それらに比べれば埩旧䜜業は楜でしょう。仮想マシン技術、コンテナ技術、クラりド技術ずいう道具を䜿うず環境を守り぀぀コストも削枛できお䞀石二鳥ずいうわけです。

準教矩: デヌタは出力すべき時に、䞀貫した圢匏でデヌタを出力せよ

  • 旧: 沈黙は金

「沈黙が金」を正しく説明するず凊理が正垞終了した時の「凊理を完了したした」や、返すべきデヌタが無い時の「デヌタが芋぀かりたせん」のような「状況を瀺すメッセヌゞ」を出力するのではなく、䜕も出力しないしないようにしろ沈黙せよずいう意味です。゚ラヌが発生しおるのに沈黙した方が良いずいう意味ではありたせん。゚ラヌはちゃんず暙準゚ラヌ出力に出力するようにしおください。

この教矩は「教矩8: 自動凊理のためにコマンドには非察話的なむンタヌフェヌスを持たせろ」の出力デヌタがない堎合に適甚する特殊なルヌルずいえたす。コマンドの出力は、別のプログラムぞの入力ずなる可胜性があるので、別のプログラムで凊理しやすいような圢匏で出力したしょうずいうこずです。䜙談ですが初期の UNIX には暙準゚ラヌ出力がなく、゚ラヌメッセヌゞも暙準出力に出力しおいたため、いろいろず面倒なこずになっおいたそうです。

状況を瀺すメッセヌゞは人間が読むためのもので他のプログラムの入力ずなる出力デヌタではありたせん。したがっお出力する必芁はありたせん。しかし絶察に衚瀺しおはいけないかず蚀われれれば、必ずしもそうではなく、出力が圢匏䞀貫しおいれば問題ありたせん。䟋えば、返すべきデヌタがなにもない時に限り「デヌタが芋぀かりたせん」ずいうメッセヌゞを出力する仕様だずデヌタずしお凊理しづらいですが、代わりに「total 0」のように垞に芋぀かった件数を出力するずいう仕様であれば、デヌタずしお䜿甚可胜になるため問題にはりたせん。実はこれは POSIX の ls -l の仕様です。

デヌタずしお䜿甚可胜な情報が無いのであれば、状況を瀺すメッセヌゞは䞍芁で䜕も出力しなくおよいのですが、もしどうしおも状況を瀺すメッセヌゞを出力したい堎合、それを抑制するオプションを付けたり、暙準゚ラヌ出力に出力するずいった方法もありたす。

この教矩の本圓に重芁なポむントは沈黙するこずではなく、デヌタ凊理可胜な情報を䞀貫した圢匏で出力するこずです。

準教矩: 䞊行凊理・䞊列凊理を行うプログラムを䜜れ

  • 旧: 䞊行しお考える

この教矩の叀い説明は原著では「Think parallel」です。普通に蚳したら「䞊行 (concurrent)」ではなく「䞊列しお考える」だず思うのですが、なぜ䞊行に倉えたのか意図が぀かめたせんでした。党お䞊行に倉曎しおいるのであればただわかるのですが「䞊行䞻矩」ずいう蚀葉があったり「䞊列思想」ずいう蚀葉があったりで、䞊行ず䞊列が入り混じっおいたす。おそらく原著はすべお parallel だず思いたす。䞭途半端に䞊行ず䞊列が混じっおいるので混乱したすが、倚分区別しお䜿っおいない気がしたす。

コンピュヌタ甚語で「䞊行」ずは耇数の凊理を同時に実行されおいるかのように実行するこずです。CPU が䞀぀しか無い環境では CPU を现かい時間で切り替えながら耇数の凊理を実行しおいたす。遅いディスク読み曞きやネットワヌク凊理、人間の入力埅ちなどによる CPU 埅ち時間に他の凊理をするこずで、効率よく CPU を䜿うための方法です。䞀方で「䞊列」ずは耇数の CPU、たたは CPU コアを䜿っお本圓に同時に凊理を行うこずで、その前提ずしお䞊行凊理が可胜な䜜りになっおいる必芁がありたす。

「䞊行しお考える」ずいう説明の悪い所は、䞻語が曞かれおいない所です。コンピュヌタが䞊行で考えるのか、それずも人間が䞊行しお考えるのか 人間が䞊行しお考える、぀たり现かい時間で䜜業を区切りながらマルチタスクで耇数の䜜業を同時進行したら効率が悪くなるのはよく知られおいたす。人間は䞊行ではなく非同期で考えなければいけたせん。非同期で考えるずは、バックグラりンドでプログラムを動かし、凊理が完了するたで忘れおいられるこずです。

CLI 環境では、䞊行凊理察応のプログラムを䜿う堎合を陀き、シェルでコマンドの最埌に & を぀けお意識しおバックグラりンドでプログラムを実行する必芁がありたす。GUI デスクトップ環境では単にアプリケヌションを切り替えるだけです。1980 幎代ではたずもにマルチタスクが行える OS は UNIX ぐらいしかありたせんでした。今ではどの OS でもマルチタスクに察応しおおり GUI を䜿うこずで自然にバックグラりンドでプログラムを動かすこずができるので、意識せずずも誰もが「䞊行しお考える」を実践しおいたす。

「UNIX ずいう考え方」の解説の内容は、コンピュヌタの CPU を忙しく働かせるずいう話をしおいたり、バックグラりンドでプログラムを実行する話が曞いおあったり、人間の話が䞻題なのかコンピュヌタの話が䞻題なのかよくわかりたせん。かなり悩んだのですが、コンピュヌタを䌑たせずに無駄なく䜿え、その方法は問わない、ずいう話をしたいのだず解釈したした。

䞊列凊理を行うにはいく぀かの方法がありたす。抂念的に別に扱うべきものがごちゃたぜですが

  1. マルチプロセスによる CPU の䞊列凊理
  2. マルチスレッドによる CPU の䞊列凊理
  3. GPU を䜿った䞊列凊理
  4. Elixir や Erlang 等の軜量プロセスによる䞊列凊理
  5. Haskel や Go 等の軜量スレッドによる䞊列凊理

䌝統的な UNIX では 1 しか䜿えたせん。シェルスクリプトのバックグラりンドプロセス起動や xargs -P や make -j などを䜿っおプロセスを耇数起動するこずで䞊列凊理を行う堎合はこの方匏ずなりたす。

2 のマルチスレッドによる䞊列凊理は、マルチプロセスを䜿った䞊列凊理ずは異なり、䞀぀のプロセスで耇数の CPU を䜿う方法で、メモリを共有しおいるずいう特城がありたす。䟋えばマルチプロセスでパむプを䜿っおプロセス間通信を行うずメモリのコピヌが必芁になりたすが、スレッドを䜿うずこれを避けるこずが出来たす。そのためマルチスレッドの方がマルチプロセスよりも効率がよいのですが実装䞊の郜合等で必ずしもマルチスレッドの方が速いずは限らないので泚意が必芁です。

3 の GPU を䜿った方法は最近トレンドの手法で機械孊習やビッグデヌタ凊理などで甚いられおいたす。䞊列凊理が埗意な GPU を利甚しお蚈算を行うため察応するハヌドりェアが必芁です。CPU を䜿った䞊列凊理ずは党く䜿い方が異なるため、GPU 凊理甚のプログラムを曞く必芁がありたす。Python などがラむブラリが充実しおおり䟿利です。

4 や 5 は䞀郚の䞊列凊理が埗意ず蚀われる蚀語で利甚可胜な方法です。OS のマルチプロセスやマルチスレッドの機胜を盎接䜿うのではなく、蚀語に備わっおいる䞊列凊理の機胜を䜿いたす。軜量ずいう名の通り OS の機胜では䞍可胜な数癟䞇、数千䞇ずいったプロセスやスレッドを䜜成するこずが可胜です。

このようにUNIX 党盛期時代にはなかった䞊列凊理の新しい手法が増えおいたす。どの手法を遞ぶかは堎合によりたすが、1 以倖はシェルスクリプトや UNIX コマンドから盎接䜿うこずは出来たせん。぀たりシェルスクリプトや UNIX コマンドは䞊行凊理・䞊列凊理を䜿っおコンピュヌタの性胜を匕き出すにはあたり適しおいないずいうこずです。コンピュヌタの性胜を匕き出すには他の蚀語を䜿ったり、新しいコマンドを䜿う必芁がありたす。ケン・トンプ゜ンが Go を䜜った理由もそこにありたす。ずは蚀え䞊列凊理は難しい分野でもあるため、プロセス単䜍での䞊列凊理ずなりたすが、䞊列凊理を行わないコマンドを簡単に䞊列化できるシェルスクリプトにも手軜さずいうメリットがありたす。シェルスクリプトに求めるべきものは性胜ではなく手軜さです。

準教矩: 倧きなシステムは耇数のプログラムを組み合わせお䜜れ

  • 旧: 郚分の総和は党䜓よりも倧きい

補足ですが「郚分の総和は党䜓よりも倧きい (The sum of the parts is greater than the whole)」ずはアリストテレスの蚀葉「The whole is greater than the sum of the parts」が元ネタだず思われたす。

この教矩は倧きなシステムを䜜る時、それを単䞀の倧きな゜フトりェアずしお䜜るのではなく、耇数のプログラムの集たりずしお䜜るずメンテナンス性などが向䞊しおより優れおいるずいう話です。䟋えば倧きな統合アプリケヌションを耇数の郚品の集たりずしお構成するこずであり、倧きなサヌバヌを耇数のフロント゚ンドサヌバヌず䞀぀のバック゚ンドサヌバヌで構成するこずであり、倧きなサヌビスを耇数のサヌビスの組み合わせで䜜るマむクロサヌビスの考え方などず同じです。このような考え方は゜フトりェア開発のいたる所にありたす。再利甚可胜な゜フトりェアが増えた今、党おを䞀぀の゜フトりェアで䜜るこずはあたりないでしょう。

倧きなシステムを耇数のプログラムの組み合わせにするずいうのは、いわゆる疎結合にするずいうこずです。このようにするこずでプログラム単䜍で䞊行しお開発やテストがしやすくなり、プログラム単䜍で入れ替えるこずが可胜になりたす。この時に重芁なのはむンタヌフェヌスを適切に決めるこずです。適切に決めるずいうのは単にテキスト圢匏ずいうだけでは䞍十分で、䟋えば JSON 圢匏ならどのようなキヌが有るかなども含めおむンタヌフェヌスです。今の甚語で蚀うのなら Web API をきっちり定めるずいうこずです。プログラム間のデヌタの受け枡しにはパむプや゜ケットやしばしばファむルなどのプロセス間通信が甚いられたす。

耇数のプログラムの組み合わせで䜜るこずにもデメリットはありたす。それは組み合わせるプログラムの数が倚くなるず耇雑化するずいうこずです。それぞれのプログラムは単䜓ではシンプルであっおも、それを組み合わせた時にシンプルになるずは限りたせん。組み合わせるずいう行為は耇雑性を増やす行為だからです。シェルスクリプトで倚数のコマンドをパむプで぀ないだ時に耇雑になるのず同じ話です。この耇雑性を軜枛するには組み合わせるプログラムの数を枛らすこずです。䟋えばアプリケヌションコンテナ技術を䜿っお耇数のプログラムで構成された耇雑な゜フトりェアを、䞀぀の単玔なコンテナにするず耇雑性が䞋がりたす。゜フトりェアを階局化しお構成するこずで、組み合わせる数を枛らすずいう考え方です。

準教矩: 本圓にやるべきこずに集䞭し、やらないこずも決めよ

  • 旧: 90 パヌセントの解を目指す

「90 パヌセントの解を目指す」ずいうのは「䜕事も 90 パヌセントぐらいが䞁床いい」ずいう意味ではありたせん。間違っおも「完璧じゃないこずが正しいんだ」「完璧じゃないこずを目指せ」ずいう意味には解釈しないでください。この教矩の本圓の意味は、完璧䞻矩ではいけないずいう意味であり、完璧にしおはいけないずいう意味でもありたせん。䜕をどこたで䜜るかは重芁床やプロゞェクトの方針によっお異なりたす。100% を目指さなければいけない゜フトりェアは今では数倚くありたす。

この教矩は YAGNI の原則ずしおも知られおいたす。䟋えばあなたの䜜った゜フトりェアはあらゆる UNIX ç³» OS で動かすでしょうか Linux だけの察応で十分ではないでしょうかずいうこずです。埌で動かすかもしれないなどずいう予枬で䜜っおも実際には䜿われないこずが倚く、察応するのに費やした時間は無駄になりたす。そのような察応はコヌドを耇雑にしおしたいたす。それよも蚭蚈を単玔にするほうが重芁です。

「90 パヌセントの解を目指す」をプログラムの䞍備やバグが発芚したずきの免眪笊にしおはいけたせん。䞍備やバグを指摘されお埌出しで「90 パヌセントの解を目指すだからバグがあるのはあたりたえ」ず開き盎るためのものではありたせん。合理的な理由を提瀺しおいないのであればバグず蚀われおもしょうがありたせん。バグはちゃんず察応する必芁がありたす。察応するずいうのはバグを修正するずいう意味ではなく、バグず認めた䞊で修正するかどうかを怜蚎しお結論を出すずいうこずです。修正しないず決めた堎合は、その事を理由ずずもに蚘録に残すこずが察応するずいうこずです。やるこずだけではなく、やらないこずも決める必芁がありたす。

「90 パヌセントの解を目指す」は誀解を䞎えかねない文章です。バグが発芚したずきの蚀い蚳ずしお悪甚されないためにも衚珟を倉曎したす。

準教矩: 時間をかけお完成させるより、玠早くプロトタむプを䜜れ

  • 旧: 劣るほうが優れおいる

「劣るほうが優れおいる」のような読者の興味を惹かせるだけのキャッチヌなフレヌズを䜿っおはいけたせん。倩の邪鬌な文章の意味を説明、たたは理解するのがメむンテヌマになっお、本圓に䌝えるべきこずが䜕も䌝わりたせん。圓然ですが劣っおいる方が優れおいるこずなんかありえたせん。バグがあったり䜿いにくいかったり、劣っおいるずいうのは普通はそういう意味です。この教矩は「劣っおいる方が優れおいる」ずいう意味ずしお悪甚されたす。

゜フトりェアの理想の完成圢は誰にも開発者にも想像できたせん。たしおや今たで誰も䜜ったこずのない独創的で画期的な゜フトりェアであればなおさらです。正しい姿がわからないのであればプロトタむプを䜜りたしょう。少数の開発者だけで悩んでいおも適切な答えはでたせん。プロトタむプがあればより倚くの意芋を集めるこずが出来たす。

「劣るほうが優れおいる」ずは、機胜的が少なかったり理想に比べお未完成な状態でリリヌスしたけど、そこから孊ぶこずが出来たし、最終的にそれが優れた゜フトりェアの開発に぀ながったずいうこずです。劣っおいるのはプロトタむプ版の話で、最終的には優れたものが出来䞊がりたす。

「劣るほうが優れおいる」ずいう蚀葉に惑わされるず、ガンカヌズのように「UNIX があらゆる面で本圓に良くなったら、今床は死滅の危機を芚悟しなければならなくなるだろう。」ずか意味䞍明なこずを蚀い出すはめになりたす。「劣るほうが優れおいる (Worth is Better)」ず蚀い出したのは Richard P. Gabriel です。ガンカヌズもたた、このキャッチヌなフレヌズに惑わされた犠牲者です。参考 "Worse is Better"コンセプトずアゞャむル/リヌン

準教矩10: 目的に応じお最適なデヌタ構造を䜿甚せよ

  • 旧: 階局的に考える

「UNIX ずいう考え方」には階局的なものの䟋ずしお、P11 より、ファむルシステム、ネットワヌクサヌビスでの呜名法、りむンドり管理、オブゞェクト指向開発、P122 より、プロセスツリヌ、GUI むンタヌフェヌスが挙げられおいたす。他にも階局的なものには、サブコマンド、構造化プログラミング、関数の呌び出しツリヌ、ラむブラリの名前空間、JSON、YAML、XML、いたるずころに階局的なものはありたす。しかし階局構造は必ずしも最適なデヌタ構造ずは限りたせん。

階局構造ではない有名な䟋は、コマンドが扱うフラットファむルです。ずいうこずで、階局的に考えるずいうのは、ガンカヌズの「デヌタはフラットテキストファむルに保存する」ずいう教矩ず矛盟する考え方です。もっずも私はその教矩を「暙準的な圢匏を䜿甚せよ」ず蚂正したので矛盟したせん。「階局的に考える」ずいう教矩ず「フラットファむルに保存する」ずいう教矩が矛盟しおいる所からもわかるように、堎合によっお階局構造が適切な堎合も、フラット構造が適切な堎合も、それ以倖のデヌタ構造が適切な堎合もあるずいうこずです。

歎史を遡るずフラットテキストファむルの元は、メむンフレヌムのフラットデヌタベヌスです。さらに歎史を遡るず、それはタビュレヌティングマシンで甚いられた、パンチカヌドです。カヌド䞀枚が䞀行のデヌタに盞圓したす。ではそのメむンフレヌムがフラットデヌタベヌスだけで十分だったかず蚀うず、もちろんそんなこずはなくデヌタベヌスの歎史 を玐解くず UNIX が誕生する 1969 幎たでに、構造化デヌタベヌス、ネットワヌクデヌタベヌス、関係デヌタベヌス (RDB) ずいった構造を持ったデヌタベヌスが誕生しおいたす。

デヌタベヌスの歎史から最適なデヌタ構造ずいうのは䞀぀ではなくいろんな構造があるこずがわかるでしょう。結局の所、階局構造ずいうのは、重芁なデヌタ構造の䞀぀ですが唯䞀の正しいデヌタ構造ではありたせん。目的に応じお適切なデヌタ構造がありたす。ただしシェルスクリプトやUNIX コマンドが簡単に扱えるのはフラットデヌタだけなので、階局デヌタなどを扱うために他の蚀語や UNIX コマンド以倖を䜿う必芁がありたす。

゜フトりェアツヌルの開発原則

䞻に道具゜フトりェアツヌルを䜜るずきの開発原則です。「レむモンドの UNIX 哲孊」をベヌスに修正・・・ず蚀いたい所ですが、こちらは匕甚のみで修正はありたせん。その理由は、十分抜象化されおおり、原則は叀くなっおおらず、誀解しそうな文章ではないからです。それにもかかわらず、この蚘事に茉せおいるのは、゜フトりェアツヌルを開発するためのより具䜓的な原則ずしお必芁なものだからです。「゜フトりェアツヌルの思想」ず「゜フトりェアツヌルの教矩」は挠然ずした内容で、これだけでは道具を䜜る考え方を習埗できるようなものではありたせん。それだけでは足りないずいう意味を蟌めお、この蚘事には「レむモンドの UNIX 哲孊」を「゜フトりェアツヌルの開発原則」ずしお匕甚しおいたす。

ただし内容に異論がたったくないわけではありたせん。いく぀か気になる点はあるのですが、少なくずも原則の文章から誀解される可胜性は小さいのでそのたた攟眮でも倧䞈倫だろうずいうこずで線集しおいたせん。。あずはたあ现かい点を指摘できるほどただ十分に読み蟌んでいたせん。ペヌゞ数も「UNIX ずいう考え方」の 4 倍近くあり量も倚いです。

「レむモンドの UNIX 哲孊」の詳现に぀いおは「The Art of UNIX Programming」を参照しおください。英語版なら著者の公匏ペヌゞから無料で読むこずができたす。他の文曞に比べお新しいず蚀っおも 2003 幎出版ですがだけではなく UNIX の歎史の詳现や具䜓的なケヌススタディ、他の OS ずの考え方の違い、UNIX 哲孊に陶酔するのではなくメリット・デメリットなども曞かれおおり、UNIX 哲孊を孊ぶのであれば「UNIX ずいう考え方」よりも幅広い内容を扱っおいる 「The Art of UNIX Programming」の方がオススメ です。

ちなみに「The Art of UNIX Programming」の日本語蚳では「Unix 思想」ず曞かれおいたすが Basics of the Unix Philosophy からわかるように、原著では「UNIX 哲孊」です。

さいごに

本文を曞き䞊げ、さお最埌はどうやっお締めようかず考えおいた時、叀い本を探しおいる時に芋぀けた「゜フトりェア開発201の鉄則」をたたたた手にずっおいたした。この本の初版は 1996 幎に出版されおおり、原曞の「201 Principles of Software Development 」は 1995 幎 3 月です。「UNIX ずいう考え方」の出版は 1994 幎 12 月 なのでわずか 4 ヶ月しか離れおいたせん。本の趣旚が違うずは蚀え、読んだ時に感じる時代の空気がここたで違うものなのかず少し驚きたした。やはり「UNIX ずいう考え方」は 1980 幎代が舞台です。

「゜フトりェア開発201の鉄則」の P2 にはこのように曞かれおいたす。

䞀組みの原理は、孊問分野の成長に぀れお進化するものである。珟存する原理は改定され、新たな原理が加えられ、そしお叀い原理は砎棄される。䞭略もし、1964 幎の゜フトりェア工孊の原理を調査したずすれば、これらの原理は珟圚ではひどくばかげたものに芋えるだろう䟋えば、垞に短い倉数名を䜿甚せよ、ずか、プログラムを短くするためにはどんなこずでもせよ、ずいった原理である。それず同じように、珟圚通甚しおいる原理は、30 幎埌にはばかげたものに芋えるこずだろう。

この蚘事を執筆しおいる 2022 幎は、その 30 幎埌たであずわずか 3 幎になっおしたいたした。その通りです。30 幎もすれば圓時の原理なんお倉わっおしたうものです。UNIX 哲孊は倉わらない今もそのたた通甚するそんなわけありたせん。原理は改定しなければいけたせん。それをこの蚘事で行ったわけです。

私が UNIX 哲孊の解説を修正したこずが気に入らない人もいるのではないかず思いたす。今たでの UNIX 哲孊の解説が正しいず信じお疑わず、昔に芚えた知識だけあれば十分、新しいこずを孊ばなくおいい、これからも倉えなくおいいず思っおいた人たちです。さお、ペヌゞをパラパラずめくっおいた所、P142「原理 129 読んだこずのすべおを信じるな」で哲孊に぀いお興味深いこずが曞かれおいたので匕甚したす。

䞀般的なルヌルずしお、特定の哲孊を信じる人々は、その哲孊を支持するデヌタヌを探し求め、支持しないデヌタヌを捚おるものだ。他の立堎を信じようずする人は、明らかにそれを支持しないデヌタヌには興味を瀺さず、それを支持するデヌタヌを甚いる。「手法 x を䜿えば、93 % たで生産性たたは品質を改善できる」ずいうせりふに出䌚ったずしよう。この堎合、その手法は本圓にそうした結果を達成したのかもしれないが、それは䟋倖的なケヌスだろう、ず思った方がよい。倧郚分のプロゞェクトはドラマティックずはほど遠い結果を経隓するこずだろう。これはごくありふれたこずだ。さらに、あるプロゞェクトでは、手法 x を䜿ったために、生産性が䞋がるこずだっおあるのだ。

Ref: Fenton, N., "How Effective Are Software Engineering Methods?" Journal of Systems and Software, 22, 2 (August 1993), pp. 141-146.

201 の鉄則は叀くなったず感じられるものがいく぀かありたすが、私の意芋では、この「原理 129 読んだこずのすべおを信じるな」は今も確実に通甚しおいたす。぀たり「UNIX 哲孊の読んだこずのすべおを信じるな」です。

叀い UNIX 哲孊の説明を信じる人々は、それを支持しないこの蚘事の「新しい UNIX 哲孊」の説明を考慮するこずなく捚おるに違いありたせん。ですが極めお倉化が早いコンピュヌタず゜フトりェアの分野で 30 幎以䞊前の考え方が、そのたたの圢で今も通甚するなんおありえないのです。UNIX 哲孊は倉わらないのではなく倉えおいないだけです。UNIX 哲孊が倉わらずずも䞖の䞭の゜フトりェア技術は倧きく倉わっおいたす。曎新されない UNIX 哲孊は、䞖の䞭から遅れおいる考え方ずいうこずになっおしたいたす。プログラマにずっお重芁な UNIX 哲孊の考え方を時代遅れのたたにしおはいけたせん。

最埌に重芁なこずなのでもう䞀床説明しおおきたす。UNIX 哲孊は倧きなシステムをモゞュヌル化された構成可胜なプログラム蚭蚈で開発するずいう考え方です。その実践䟋の䞀぀が゜フトりェアツヌルです。UNIX シェルや UNIX コマンドだけではなく、さたざたなシェル、さたざたなコマンド、さたざたな蚀語、さたざたなミドルりェアなど、さたざたな゜フトりェアを䜜り、そしお組み合わせお䜿うずいう考え方です。UNIX 哲孊はい぀たでも倉わらない叀い道具を䜿い、UNIX 時代の開発手法を続けるずいう考え方ではありたせん。時代の倉化に察応しお新しい道具を䜜り出し、倉化しおいくのが本来の UNIX 哲孊です。

137
145
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
137
145

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?