作業における冪等性の重要さ
正直、最高に便利で気持ちいい
これらを使いこなしているうちにそこにすごく大事な概念が含まれていることに気がついた
それがタイトルにもあるとおり、作業の冪等性である
Dockerが出る以前(VagrantやAnsible, Chefよりも前)、環境構築という言葉があった
今もあるの?
素のmacやubuntuには、最低限のライブラリしか入っておらず、そこで特定のソフトウェアを動かしたい場合は自分で色々インストールしたり設定ファイルを編集したりする必要があった
僕が増井研に入って先生から「自分のドメインとVPS持ってないのやばくないですか」と煽られさくらのVPSを借りてそこを耕すことになった時、その作業が非常に苦痛に思えた
理由は、自分のやりたいこと(ブログを書く)に対して必要とされる事前準備の作業が多すぎたからだ
Wordpressを入れるためにPHPを入れてApacheをいれてSSHを設定してiptablesを編集してMySQLを入れて………
これらの作業はネットに公開されているノウハウをもとにコマンドをコピペして意味もわからずyumを叩きまくって行ったわけだが、当然意味はわからないのでうまくいくのかどうかも分からないし、何かに躓いた場合何が行けなかったのかも分からない
tarで落としてg++とmakeでビルドしましょう〜みたいなことを「は?」と思っていた
僕はそういう作業が本当に苦痛だったし、今でも苦痛である
コマンド一発で全部終われよと思っていた
しかし、当時(と言ってもせいぜい6年前だ)そういった作業はすべて手作業で行うものだと思われていたし、当時のプログラマはそういった作業をいかにスムーズにできるかが技術力として評価されていたように思う
だが、望んだ結果が得られるのであれば、作業は手作業でなければ無いほどいい
なぜかというと、人間の手作業には冪等性がないからである
どういうことかというと、人間は機械よりも複雑に作られているがゆえに、同じことの繰り返しが苦手である
フリーキックの名手でも、この位置からなら必ず決められるという選手は存在しないし、書道の大家でも寸分の狂いなく同じ揮毫を量産することは出来ない
だが、コンピュータであればそれができる
計算機には予め命令の冪等性が備わっている
なので、同じ命令をすれば必ず同じ結果を得られることが構造的に保証されているわけだ
Dockerやterraformなどが革新的なのは、人間の手作業をコードとして記述し、冪等性を生み出したことだ
Immutable Infrastructureが面白いのは、作業の途中という概念がなく、今あるものが常に完成状態であるということだ
たった一つ追加や削除があった場合でも、結果としては1からの作り直しになる。以前のことはまったく無視する
※実際には、現状との差分を比較してパッチを当てることで冪等性を生み出すのであるが
これのおかげで作業から不確実性が減り、気軽に作業を行えるようになったわけだが、ソフトウェア開発以外でこのような事例があるのか非常に気になっている
なぜかというと、現状の人間の作業のほぼ全てには冪等性がなく、その再現性を上げられた人が優秀な作業者として頭角を表していくような構造になっていると思うからだ
学校の勉強から始まり、スポーツ、芸術、ゲーム、料理、オフィスワーク……
人間の作業はいかに冪等になれるかを競っているように思う
職人という存在は、作業の再現性を高めた存在であるがゆえに尊敬される
しかし、上記のように同じ作業を機械に取って代わられて職を失う人はたくさんいる
なので、職人の手作業を神聖視してその分野のニューカマーを笑うような考えは唾棄すべきである
正解は、高度な作業を子供から老人までだれでも同じような結果が得られるようにする仕組みを作ることだ
なので、UIやソフトウェアを研究する人はそういう考えを常に持っていて欲しい
こういう考えは「自動化」というコンテクストで語られている気がするが、ちょっと違う気がしている
なぜかというと、自動であることが冪等であることとは限らないからだ
重要なのは、その作業が可逆的であり、冪等であるということだ
なのでなにか複雑な作業をしている人はその作業が可逆的かつ冪等にすることができないかと考えると良いかも知れない
個人的には、料理はその工程に関して完全に冪等にできる気がしている
お絵かきとかもそうなったら良いと思うんだけど、なかなか方法が思いつかない