『UNIXという考え方』新人エンジニアにオススメする技術書

2020年06月29日 月曜日


【この記事を書いた人】
古賀 勇

IIJ ネットワーク本部アプリケーションサービス部所属。 メールサービスの運用業務に従事し、日々世界の悪と戦う一児の父親。社内 Power Automate エバンジェリスト(自称)。M3AAWG member / openSUSE Users / WIDE Project メンバー。趣味は大喜利。はがき職人。

「『UNIXという考え方』新人エンジニアにオススメする技術書」のイメージ

─── 小さいことは美しい、劣るほうが優れている
いったい、どういうことなのか。

 

書籍情報

UNIXという考え方

  • 著者:Mike Gancarz 著、芳尾 桂 監訳
  • オーム社

IIJ 古賀です。普段は、IIJ セキュア MX という迷惑メールフィルタサービスの運用業務に従事し、お客様を守るために、毎日世界の悪と戦っています。

今週は「新人エンジニアにオススメする技術書」というテーマでお送りします。

早速なのですが、この「UNIXという考え方」は、厳密には技術書ではないかもしれません。なぜなら、この本は UNIX という OS が(または Linux に代表される “UNIX-like” な OS が)、どのような人々の思想のもとに設計され、進化しているか、という「哲学」にフォーカスしており、その使い方については一切触れていないからです。

そしてこの本が発行されたのも 1994年と、かなり古い。一般的な技術書なら、もうなんの役にも立たないでしょう。
(もしや、今年配属された新人の皆さん、まだ産声を上げていないのでは…?)

しかし、この本に書かれた 9つの定理と、10個の考え方は、現代のソフトウエア開発や、サービス運用だけに留まらず、プロジェクト管理、ビジネス戦略、日々の生活にすら参考になる考え方が凝縮して書かれており、読むたびにハッとさせられる名著です。

今日は本書の中でも、特に私が印象に残っている言葉を、厳選して 3つ紹介します。

 

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

「移植性のあるソフトウエアは、ユーザーのトレーニング時間も減らす」(※1)

この言葉は [定理 4: 効率より移植性] の章に現れます。

今日日、特定アーキテクチャでしか動かないようなソフトウエアを書くことは一部の業界に限られ、ほぼなくなりました。しかし、ソフトウエア開発をする上で、知っていると、知らないとでは、この方向性に大きな差が生まれることでしょう。

著者は、プログラマが本来達成したい目的があったとしても、常にいくつかの妥協案の中からいずれかの方法を選択している、という点について述べています。何かを求めれば、何かが犠牲になる、トレードオフの問題です。

このとき UNIX 哲学では、プログラムが効率よく動くことよりも移植性が重視されます。UNIX 上で動作するアプリケーションの代表として Emacs が挙げられますが、Emacs が最初にリリースされたのは、なんと 1972年。約半世紀前に書かれたアプリケーションが、現代の PC 上でも動作するのは、Emacs が移植性を重視されていたことのほかにありません。(※2)

また、著者は様々な処理を、可能な限りシェルスクリプトにしておくべきだと言及しています。なぜなら、UNIX 環境には、awk、sort、grep、sed のような、他人が書いてくれた、テスト済みで、無駄のない、小さな機能ごとのプログラムがすでに存在するので、それらを組み合わせるだけで書ける上に、低水準の処理を除く、ほとんどのことが、どのような環境でも実行可能で、他の言語で書いたプログラムよりもずっと移植性が高いからです。そうすることで、ユーザは車輪の再発明をするのではなく、もっと創造的なことに時間を掛けられます。

このように先人の努力を活かし、コードの有用性と価値を高めることを、本書では「ソフトウエアの梃子(てこ)」と表現しています。

 

「拘束的プログラムはユーザを人間と想定している」

「コンピュータが人間の限界に制約され、システムがユーザー入力を待つ必要があると、キーボードの前に座る人間と同じ速さでしか動作できない。つまり、全く速くないということだ。」

この言葉は、[定理 8: 過度の対話的インタフェースを避ける] で登場します。

「拘束的プログラム」というのは、プログラムの実行、条件分岐、経過、完了時などに、入力や選択を求める、対話的プログラムのことです。マウスで操作するグラフィカルなインタフェースは、この拘束的プログラムの典型例と言って良いでしょう。一見、ユーザフレンドリーに見える設計ですが、この拘束的プログラムには致命的な欠点があります。

それは、他のプログラムと結合するのが難しく、スケーラビリティに欠け、ソフトウエアの梃子の効果を利用できない点です。

ここ数年、業務効率化や生産性向上を実現する「RPA (Robotic Process Automation)」という言葉が話題になりました。UNIX のコマンドは、入出力に人間が関わっていない可能性を考えて設計されているため、自動化するのに優れています。UNIX がどんなときでも可能な限りコマンドで実行できるようになっているのは、ここに理由があるのです。そして、UNIX は人間とマシンのどちらがボトルネックになるのかを良く知っているのです。

また、UNIX には “|” で表現されるパイプ機構を用いて、1つ目のプログラムの標準出力を 2つ目のプログラムの標準入力にし、さらに n 個目のプログラムの標準出力を n+1 個目の標準入力に…といったようなワンライナーで処理を連結し、強力なフィルタとして使うテクニックがあります。こうした処理を実現するには、意図的に対話インタフェースを避ける必要があり、[定理 9: すべてのプログラムをフィルタにする] 必要があります。(※3)

 

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

「データはなんらかの記憶媒体に保管されているが、いずれどこかへ移動しなければならない。ディスクに入れたままのデータは価値を失っていく。」

この言葉は、[定理 5: 数値データは ASCII フラットファイルに保存する] の章に現れます。

この章の本質は、テキストファイルがベストなファイル形式である、と主張しているのではなく、「データには移植性を持たせるべきだ」というポイントです。上記の定理 4 に「効率よりも移植性」という言葉が出てきましたが、当然データにも移植性がないと、そのデータとしての価値は時間とともに失われるでしょう。

著者が上司から言われたという、「データを紙に印刷してしまったら、もうそれ以上操作できないんだぞ」という言葉や、「紙には気を付けることだ。それはデータの死亡証明書といっていい。」という表現も心に刺さる言葉です。

本書では、動かせないデータの代表例として「紙」への印字を持ち出していますが、「独自形式のデータ」とか、「プロプライエタリファイル」と置き換えても意味が通ります。

 

最後に

少しでも気になる言葉はありましたでしょうか?

これから IT 業界に身を置く方は特に、そうでない方も、UNIX 哲学の世界に触れてみてください。
コンパクトにまとまっていますので、週末にサクッと読むことができます。

さて、冒頭に書いた「小さいことは美しい、劣るほうが優れている」
この言葉が意味することとは───ぜひ、お手に取って確かめてみてください。(※4)

 

Information

今週は「IIJエンジニアがオススメする技術書」特集をお送りしています。
新人エンジニアの皆さんは是非参考にしてください。
他の記事はこちら[オススメ技術書]

また、みなさんもオススメする技術書がありましたらこちらでご紹介ください!
Twitterハッシュタグ:#オススメ技術書

脚注

  1. 以前、本ブログの「IIJ 2018 TECHアドベントカレンダー」で、「妻のパソコンを Windows 7 から Windows 10 にアップグレードしたら使いにくいとキレられたので Linux にした件」という記事を投稿したことがありました。この本にも書かれている、
    • 効率よりも移植性 (定理 4)
    • 好みに応じて自分の環境を調整できるようにする (さらなる 10 の UNIX の考え方)

    は、まさに UNIX 哲学に通ずるポイントです。
    ちなみに、上記の事件から今年で 5年目になりましたが、OS を openSUSE Leap 15.0 → 15.1 とアップグレードしました。今も変わらない UI で使っており、昨年度担当した小学校の PTA の職務も、LibreOffice で問題なく遂行することができました。[↑]

  2. Emacs と共に UNIX 環境で人気なエディタとして vi が挙げられます。念のため触れておきます。[↑]
  3. ところで、詳しい人なら Windows のコマンドプロンプトでもパイプが使えるのでは? と指摘されるでしょう。そのご指摘は間違っていません。しかし、dir と ls、copy と cp といったコマンドの出力結果を見ると、この思想の違いを垣間見ることができます。[↑]
  4. この本は X Window System の開発にも関わった、Mike Gancarz 氏によって書かれた洋書の和訳で、原著のタイトルは “The UNIX Philosophy” です。堅苦しいタイトルですが、とても分かりやすく書かれているため、原著もスイスイ読めてしまいます。著者の本物のニュアンスを知りたい場合は、原著にもあたることをオススメします。[↑]

古賀 勇

2020年06月29日 月曜日

IIJ ネットワーク本部アプリケーションサービス部所属。 メールサービスの運用業務に従事し、日々世界の悪と戦う一児の父親。社内 Power Automate エバンジェリスト(自称)。M3AAWG member / openSUSE Users / WIDE Project メンバー。趣味は大喜利。はがき職人。

Related
関連記事