What is POSIXism (POSIX fundamentalism)?
#posixismadvent この記事はPOSIX原理主義Advent Calendarの1日目だ。
ここ1年ほどでPOSIX原理主義という考え方と,それを実践しているシェルショッカーという組織を知った。この記事では,POSIX原理主義と,自分がPOSIX原理主義を知った経緯,賛同する理由について説明する。
POSIX原理主義を知った経緯
2016年3月ごろにTwitterで秘密結社シェルショッカー日本支部(@shellshoccarjpn)というアカウントが誰かと議論しているのを目撃した。
シェルスクリプトで作成されたTwitterクライアントの「恐怖!小鳥男」でツイートを行い,POSIX原理主義による世界征服を企んでいるらしい。
これが、シェルスクリプト製Twitterクライアント怪人「恐怖!小鳥男」のスペックだ!! pic.twitter.com/Ugc7ib61Wb
— 秘密結社シェルショッカー日本支部 (@shellshoccarjpn) 2015年12月20日
過激な発言と,POSIXという古い規格に基づいたシェルスクリプトを至上としているということで,なんだか怪しいなと思っていた。しかし,シェルスクリプトだけでTwitterクライアントを作り上げてしまう技術力はすごいと素直に感心していた。
このシェルショッカーであるが,2016-03-20にドワンゴが主催である『歌舞伎座.tech#9「異種プログラミング言語格闘勉強会」』にて発表を行うとアナウンスがあった。幸いなことに,この勉強会ではインターネット中継により自宅からも発表の様子をリアルタイムで閲覧でき,ニコニコ動画のプレミアム会員になればタイムシフトで今でも閲覧可能だ。
歌舞伎座.tech#9「異種プログラミング言語格闘勉強会」 – 2016/03/20 13:30開始 – ニコニコ生放送
そのときのシェルショッカーの発表資料が以下だった。
中継でリアルタイムで閲覧していたのだが,まず発表のインパクトに圧倒された。インパクトだけでなく,POSIX原理主義を実践された実績をいくつも残されており,説得力がとてもあった。そして,自分の中で共感するところがあった。具体的には以下2点だ。
- 組版ソフトTeXで環境依存に苦しむ
- Pythonのバージョンが2から3へ移行したことでバージョンアップに苦しむ
「10年後の自分は,10年分の成長ができているのか…」これは自分の中で響く言葉だった。前からISOやJISなど国際規格・国際標準に準拠させることが,技術や品質の向上につながると思っていたので,まさにPOSIX原理主義という考え方には共感できた。
こうした経緯でPOSIX原理主義というものに興味を持ち始めた。
POSIX原理主義とは?
POSIX原理主義という言葉を聞くと,「原理主義」という言葉がついているからか,なんだか宗教じみた怪しい印象を受けるかもしれない。しかし,自分の中ではPOSIX原理主義というものは,OSS(Open Source Software:オープンソースソフトウェア)と同じようなプログラムの開発方針なんだと解釈している。
POSIX原理主義への誤解
POSIX原理主義について,以下のツイートのような認識を持ってしまっているだろうか?
POSIX原理主義 = シェルとバンドル済みコマンド群での縛りプレイ これって誰が定義したん?
— ミスター 松茸ご飯 (@mattn_jp) 2016 年11月15日
しかし,これは誤りだ。シェルショッカーが言及するように,POSIX原理主義の本質は「交換可能性」だ。
POSIX原理主義の本質とは「交換可能性」だ。1つの実装に依存できなくなった時でも他の 実装に交換するだけで動くようにプログラムを書くから、そのプログラムは生き延びる。交換可能性が本質ゆえ我々は、webにはcurlやwget、メール にはsendmailも使う。交換可能性を担保してな
— 秘密結社シェルショッカー日本支部 (@shellshoccarjpn) 2016 年11月12日
ISOやJIS,プログラミング言語の公式マニュアルで記載されている事項をなぜ準拠すべきなのか?この当たり前とも思える問いに,僕は突き詰めて考えていなかった。この答えの一つが「交換可能性」なんだとはっきりした。
実際のところ,この「交換可能性」の重要さを痛感させられる事件があった。それは,2014年9月に発生したシェルショックとよばれるbashの脆弱性だ。この脆弱性により,bashに任意のOSコマンドを実行されることが判明した。BashなんてLinuxの標準シェルとしてもう何年も使い古されており,こんな致命的な脆弱性が見つかるなんて誰が思っただろうか?
実際にbashCMSと呼ばれるbashだけで作られたCMSプログラムが作られていたが,bashの独自拡張に依存していたがために,他のシェルに移植できず公開停止を余儀なくされていた(その後dashに移植されて公開されている)。
POSIX原理主義の参考文献
POSIX原理主義は,2016-07-08に発表された以下の論文で解説されている。
松浦, 智之; 大野 浩之 & 當仲 寛哲 (2016) : ソフトウェアの高い互換性と長い持続性を目差すPOSIX中心主義プログラミング, DICOMO, pp. 1328 – 1334. http://tsys.jp/dicomo/program/7A.html.
ただし,上記の論文は一般公開はされていない。POSIX原理主義について知りたければ,この他に以下の文献も参照できる。
- 松浦, 智之; 大野, 浩之 & 當仲, 寛哲 (2016) : POSIX中心主義と情報科学教育 , 情報処理学会第78回全国大会. http://www.slideshare.net/tomoyukimatsura/posix-59447685.
- シェルショッカー日本支部 (2016) : 恐怖!シェルショッカーの POSIX原理主義シェルスクリプト. http://www.slideshare.net/ShellShoccarJpn/posix-59780910.
- 松浦, 智之 (2016) : Windows/Mac/UNIX すべてで20年動くプログラムはどう書くべきか. http://richlab.org/coterie/pfb2.html.
POSIX原理主義の3の指針
前述のPOSIX原理主義について解説された文献を読み,自分が理解したPOSIX原理主義を説明する。
POSIX原理主義とは,ソフトウェアに高い互換性と長い持続性を実現するプログラミング指針である。以下の3の指針から構成される。
POSIX準拠とは,名前の通りPOSIX規格に極力準拠したプログラミングを行うことである。POSIXで規定されている言語がシェルスクリプトとC99(C言語)しかないため,この2種類が利用可能である。しかし,C言語はバイトオーダーの考慮やコンパイルが必要であるなど,ハードウェア構造を意識する必要がある。シェルスクリプトであればこのようなことを意識する必要がないため,基本的にはシェルスクリプトを用いる。また,POSIX準拠を指して狭義のPOSIX原理主義と呼ぶこともある。
交換可能性担保とは,POSIX原理主義の本質である。POSIX規格だけではネットワーク処理がほぼ できず,また処理速度からバイナリデータの処理は現実的でない。そこで,交換可能性担保を維持できる場合に限り,POSIX範囲外のコマンドを利用する。 例えば,Webからのデータのダウンロードを行うコマンドとしてwgetとcurlが存在する。この片方であるwgetに脆弱性が見つかり使えなくなったとしても,もう片方のcurlでも動作するようにすれば,プログラムの動作を維持できる。
W3C準拠とは,クライアントサイドでの開発指針である。POSIX原理主義ではWebページの仕様は規定されていないため,代わりにW3C勧告やECMAに準拠することで,複数のWebブラウザーでの動作を保証し,交換可能性を担保したWebアプリを開発する。W3C準拠を指してW3C原理主義と呼ぶこともある。
これらの3の指針に準拠することを広義のPOSIX原理主義と呼ぶ。また,狭義のPOSIX原理主義と明確に分けるためにPOSIX中心主義と呼ぶこともある。
賛同する3の理由
ここまでで説明してきたPOSIX原理主義を賛同する3の理由を述べる。
- 完璧な理論
- 十分な実績
- 無駄のなさ
完璧な理論
まず,POSIX原理主義という理論が確立されており,論理に矛盾がないと感じた。
実際のところ,シェルショッカーのPOSIX原理主義について疑問を持つ人がTwitter上で批判をしていた。しかし,シェルショッカーの反論に技術的な理論で反論できず,ブロックしてその場を退散していた。新進気鋭の若手IT技術者から,熟練のIT技術者まで,POSIX原理主義を技術的に論破しきれなかった。
シェルショッカーの圧倒的な自信とこの様子を見せつけられて,理論の完璧さを思い知らされた。
十分な実績
次に,POSIX原理主義の実績は十分だと感じた。
2016-03-20のドワンゴでの発表の時点で,東京メトロのコンテストやTwitterクライアント,ショッピングカートなどPOSIX原理主義に基づいた実益的なプログラムがいくつも開発されている。そして,実際にそれらは利用・運用されている。極めつけは,学会論文への論文の投稿及び発表を行い学術的な評価を得ていることだ。学問の分野でもその理論を発表しており,非常に説得力が強いと感じた。
これだけの実務と学術面での実績を残したPOSIX原理主義を批判するには,対抗できる主義・手法による実績を出したり,批判論文を投稿するしかないのではないか?
無駄のなさ
最後に,POSIX原理主義を実践することに無駄がないと感じた。
まず,POSIX原理主義はプログラムの開発手法や思想である。無理に取り入れる必要はない。自分ができる範囲で取り入れて実践していけばいい。シェルショッカーも他人に無理やり強制するようなことは一切していない。ただ,その思想をアピールしているだけだ。実際にPOSIX原理主義を批判してシェルショッカーに論破された人々は,本人が最初に批判している。シェルショッカーからけしかけることはなかった。
そして,POSIX規格自体は使い古されており,暗黙の内に他のプログラミング言語でも準拠されている場合が多い。例えば,環境変数やコマンド引数の仕様,正規表現などだ。POSIX規格を学ぶことで,これらの共通の知識を身につけることができるので,ローコストハイリターンで魅力的だ。POSIX規格を学んで損をすることが考えにくい。逆に,今まで曖昧だった知識の裏付けをとることができ,技術力向上にさえつながる。
さらに,少し心がけるだけで,シェルスクリプトに時空を超える力を与えられるというのが非常に魅力的に感じた。例えば,bashの独自拡張である[[ ]]
を控えたり,指定回数のfor
ループにおいて,seq
を使う代わりにawk
やyes | head
を代用するといった具合だ。少し気をつけるだけでいい。今やWindowsにもWidnows 10からWindows Subsystem for
Linuxによりbashが使えるようになった。まだ普及していないが,もう10年もすればWindows 7からの乗り換えも行われ,どのOSでも同じシェルスクリプトが使える可能性が高い。
このように,少し注意するだけで,OSやバージョンを問わずに,しかも多くの場合追加ソフトのインストールなしで,動作するプログラムを作れる。この時空を超える力は何者にも代えがたい魅力がある。
最後に
シェルショッカーが悪の組織といわれることがある。
シェルショッカーつええな、さすが悪の(?)組織
— puhitaku (@puhitaku) 2016年11月16日
これは全くの反対で,正義の組織だと思う。
最近のIT技術の潮流としてのソフトウェアや依存関係の頻繁なバージョンアップにより,逆に作業効率が落ちてIT技術者は疲弊してしまっている面もあるだろう。POSIX原理主義という思想と秘密結社シェルショッカーは,こうした人々を救うことのできる正義の組織だと勝手に思っている。
OSSやオープンソースという開発手法が登場したときも,それまで存在しなかった考え方だったため批判があった。しかし,今となってはソフトウェアの開発手法として広く認知され受け入れられてきた。逆に,クローズドであることが批判を受ける風潮すら形成されつつある。POSIX原理主義は,OSSと同じように世界で広く普及されるだけのポテンシャルがあると強く感じている。
今後も,自分のPOSIX原理主義を実践していき,この素晴らしい考え方を広めていきたい。