OSSってやりがい搾取じゃねえか?と思ったので書く。
それを理解するにあたっていくつかのプログラミングの発展段階をまとめる必要があるように思う。
■原始時代
パソコンのメモリがギガ単位で当たり前となったこの時代には考えられないが、そもそも動かせるプログラムに限界があった時代があった。その時代のプログラムは極めてサイズが小さく、アプリは原始的な動きしかなかった。機械の性能がついてこなかったからだ。
プログラマの学習初期に見られるような、一枚のファイルで動く極めて小さいプログラムを作ること、それが原始時代だ。hello worldと画面に表示するだけのプログラムはせいぜい1KBファイルでコマンドライン一つ打ち込めば動く。
ムーアの法則通り集積回路が進化し続けた結果、あるいは素人プログラマが学習するにつれて1ファイルで動くプログラムでは満足できなくなり、大量のコードを動かすことができると、原始時代は終わった。
■牧歌時代
1ファイルの中に2万行のコードを書かれると、いかにスーパープログラマでも把握することは困難を極める。そこで、ファイル分割という知恵が生まれる。
2000年代にはありとあらゆる企業や個人が、それぞれのルールで肥大化したファイルの中身を分割して把握しやすくする時代があった。オレオレルールの時代は、ある意味もっともプログラマとしては楽しいものだ。なんせ自由があって、自分がルールを決めるからだ。これはとても牧歌的な時代でもある。ただし、その自分本位で分割されたソースコードが他人にとって素晴らしいというわけではない。スパゲッティコードが批判され、個人ならともかく、企業内の独自コードなどは負債と化してプログラマを苦しめた。
それらが極まると牧歌時代は終わりを告げ、ファイル分割に対するルールづくりが始まり、フレームワークが乱立することになる。
■付加価値の時代(ルネッサンス)
あらゆるプログラマが学習が辛くなり、苦しむ理由がここにある。非プログラマにはわかりづらいが、単なるソースコード分割の時代からそれに対して付加価値をつける時代がやってきた。それは今に至るまでの近代社会だ。
オブジェクト指向というものが流行した当初、僕はそれがなにか理解ができなかった。そして今ならはっきりと言える。オブジェクト指向とはプログラミングに対する付加価値の一種だったと。
わかりやすく言えば「どうせソースを分割するなら便利にしようよ」ということだ。
オブジェクト指向で書かれたコードはメンテナンス性を保持するという付加価値を持っていた。もちろん理想と現実は別だが、牧歌時代に比べればグローバルに価値観を整え発展させることになる。この時代は、ソースの書き方、ファイル名、設定ファイルの定義手法にいたるまですべてが付加価値をつけるために存在する。
非プログラマでも1ファイルの行数が多すぎるから複数ファイルに分割できるようにする、という点は理解できるだろう。だが付加価値の時代は本職でなければ理解しづらい。
例えばデータベースにアクセスするコードがあるとする。userテーブルにアクセスするメソッド、priceテーブルにアクセスするメソッドなどだ。
もしuserテーブルのアクセスを書いたファイル名が、userTable.phpでpriceテーブルへのアクセスメソッドが、priceModel.phpだったとするとどうだろう。そこには規則性がなく付加価値がつけられない。そこで、DB処理を行うファイルはmodelsフォルダを作りテーブル名+modelというファイル名にするというルールでフレームワークを作る。
models¥userModel.php
models¥priceModel.php
こうすると規則性ができ付加価値をつけやすくなる。単に見やすいわかりやすいだけではない。メタプログラミングが可能となる。
例えば書いたメソッドがきちっと動くかどうかテストしたいとする。その時、ひとつひとつにログをしこんで、1ファイルごとにテストするなど時間がかかりすぎて馬鹿らしい。どうにかして、コマンド一発でテストしたい。そのためにルールをガチっと決めていると、自動テストプログラムがかけるということだ。modelsフォルダ以下の、xxxModelと書かれたファイルを順番にすべて実行する、というようなプログラムだ。
そしてこれが付加価値というものだ。単純に長いソースを小さく分割をするだけでなく、規則性を作り上げることでコードに対して実行するコードが組めるようになる。そうすることでさらに生産的になる。
なるほど素晴らしいじゃないですか、と非プログラマは考えるかもしれない。だがこの際限のない付加価値を優秀なプログラマが製造競争した結果、OSS地獄ができあがったというわけだ。
ソースコード分割やファイル名のルールづくりをしたものをフレームワークといい、それ自体はとても便利だ。フレームワークは概ねOSSであり、様々なプログラマが開発をしている。そこでそれぞれのプログラマが付加価値を追求し始めた。
コード内で利用されたメソッドを選びながらctrl + Bボタンを押すと定義ファイルを開くようにしたり、useと書いただけでuserModelというclass名の入力候補がでてきたり、設定ファイルに定義すると本番環境と開発環境を切り替えたり、といったものだ。それ以外にも自動で誤字を検知してエラーメッセージを表示したり、メモリを大量に消費しながら延々と自動テストを繰り返すなどなど。
端的に言って限界知らずの拡張だ。
次々に便利になっていいじゃないですか、思うかもしれない。
だが便利になっただけでなく、便利なことを利用するための設定の仕方を学習したり、便利なことをするためのコーディングをしたりする必要性がでてきた。際限のない付加価値のための際限のない学習である。
■戦争と搾取
単純に付加価値をつけましょうね、というのが平和裏に実現されると思うなら現実知らずの小僧である。そこで起こっているのは地獄の戦争だ。
まずルールを作るということに対して、人によって何が良いルールであるかの考え方が違う。ファイル名の規則性一つとってもスタイルが分かれる。どの言語でどのようなルールのフレームワークを作るか、そのフレームワークに対してどういった便利機能をどう追加するか、という小さいレベルまで価値観の違いが表面化する。自分達が作る付加価値こそ大勢に利用されたい、という欲望のために大量の兵隊(プログラマ/デバッガ)が必要になり、上限なく駆り出され、OSSだからという利用で無償の労力で応援するライブラリに貢献するのだ。
本人たちが良かれと思ってやっていたとしても結果として搾取につながっている。ライブラリ開発チームはそれぞれが国家軍隊のようなもので、間違いなく敗北もあるからだ。
Angular(Google)とReact(Facebook)というもっとも有名な2つのOSSフロントエンドフレームワークがある。書き方の違い以外では、2つともほとんど同じことができる。にもかかわらず2つとも学習にそれなりに時間がかかる。継続性という意味では両者とも超巨大企業に支えられている。GoogleとFacebookがそれぞれ自分たちのルールでwebを支配するために、大量のコミッターを囲い込んで競った。概ねFacebook陣営が現在の「先進的な」web界隈のディファクトスタンダードとなったといえるかもしれない。
Angularは技術者が少なくなって雇うことが難しいため、今後新規開発であえてAngularを選ぶことがなくなり、どんどん衰退していくだろう。ゼロにはならないとしても。衰退陣営側のフレームワークを勉強したり、コミットした人は自己満足以外のものは手に入らない。react側がディファクトをとったので、FB陣営に立って勉強したひとたちは仕事にありつきやすくなる。仕事を選べるというのはかなり有意義なものだ。勝ち組側の当然の報酬である。重要なコミッターは将軍のように振る舞い、企業に対してブランド営業もできるというわけだ。Angular側は利用規模縮小する中で営業に工夫を強いられる。
このようなフレームワークやライブラリの戦争はいたるところで起こっている。非プログラマから見れば「できることは同じでしょ?」というふうに見えても、有象無象のプログラマが戦争に良かれ悪かれ駆り出され、負け陣営の人たちは学習コストをすべてではないがある程度無駄にする、ということが繰り返されている。
docker VS vagrant VS Mac VS WSL2
Laravel VS Cake VS Fhalcon VS Symphony
Angular VS Vue VS React
それぞれ特徴はあれど、やりたいことの本質は同じだ。いかに便利か、生産的かを競争しているが、すべてやろうとすれば学習時間がいくらあっても足りない。さらにそれぞれのFWにバージョンアップがあって、お作法が変化したりもする。
偽善的なプログラマは「それぞれ違っていいんですよ」とかいう。
嘘っぱちだ。
かつてのOSSと現在の姿は違っている。頂点のOSSグループがディファクトをとってビジネス拡大したり、ルールの支配者になるために過剰な宣伝をして、プログラマを巻き込んでいる。しかもOSSに貢献するのは絶対的に素晴らしいんですよ、という。利用するだけでも貢献ではある。そしていずれかを利用しなければ仕事はない。
どれか一つにまとめてくれませんか?平和が一番ですよ、と思うんだけれど全くそんなことできない。プログラマは聖人君子でないし、企業はなおさらOSSという名前をつけた支配力を持ちたい。
できればローコストで仕事したいなあ、と思うがそうもいかない。
どの陣営にも所属しないで仕事をすることは不可能だ。
だがたまたま斜陽の何かを利用することになった場合は支払った学習コストは戻らない。かつて利用されて今は利用されなくなった何かであれば悲惨である。
おまけに発展のスピードはさらに早くなっているようにさえ思う。開発スピードが遅ければ別の陣営が支配を固めてしまうためだ。そんなわけでますますプログラマの負担は増える。
そろそろ無償労働と勉強を強いるのはやめて、企業がお金をばらまくべきではないでしょうかねえ。