ひとりで小規模メタシステムを構築して「わからないこと」について考えた

f:id:piyo_yeah:20181119223552p:plain

小規模なシステムを構築した思い出

仕事の関係で、一人だけでシステムを構築したことがあった。
構築期間は4か月。既存のアプリケーションの機能を把握し、それを外からたたくためのシステムを作っただけではあるが。
一人で作らせてもらったことで何を得たのか。ふと言語化してみた。

一人で作ってみると、細かいポイントを直したくなる。
常に自分で触り続けていると、細かい変更に対して柔軟ではない箇所がだんだんわかってくる。
そしてそれがイヤになる。だから少しずつ改良しながら、指示された要件を満たすシステムを作っていた。
プログラムとは言わずシステムと呼ぶのは、それ単体で業務の一部を完結させることができるというイメージがあるからだ。閑話休題。

メタシステムを構築してLinux哲学に共感

ぼくが構築したシステムは既存のアプリケーションの持つ機能に依存するものであったため、
言ってしまえば、ぼくは既存のアプリケーションのメタシステムの1つを作ったに過ぎないのだ。
そして、半人前の個人が4か月で作れるようなシステムは小規模に決まっている。つまり簡単なものだったのだ。
この簡単なメタシステムを構築することで気づいたのは、呼び出されるシステムというのは意味的な最小単位で構成されているのが望ましいということ。

たとえばLinuxでいうと、cat, echo などのコマンドがある。彼らは名前付けとその役割に意味的な関連性がきちんとあり、
その確かさが担保されてきた歴史が、彼らの存在の意味的な確かさを保証している。
ぼくの構築したメタシステムが依拠するところのシステムにも、そういったコマンドが用意してあった。
結局のところ、既存のプログラミング言語を数種類つかって、いちシステムが持つコマンドをたたくためのメタシステムを作り上げたに過ぎなかったわけだ。

ぼくたちはレールの上しか走っていない?

メタシステムとは、既存のシステムを知り新しい小規模のシステムを構築することだ。
言うまでもないことかもしれないが、メタシステム構築は、全く新しいシステムをゼロから作るよりはるかに簡単なことだ。
(半人前の時代に、ぼくがそれにじっくり取り組む機会を得たことはとても幸運だったように思える。それはさておき。)
メタシステム構築とは、既存のシステムを理解するところから始まる。これはシステム構築者がのこしたものの出来によって難易度が大きく異なる。
もちろんもとのシステム自体の複雑さと、それを知るための努力の複雑さとは比例関係にあるわけだが、取り上げたいのはそこではない。
ぼくたちは、知ること自体の労力の大小はあれど、そもそも「既存のシステムを知る努力」しかしない生き方をしてしまってはいないか、という懸念だ。

言うまでもなく世の中は既に既存のシステムで溢れかえっている。クルマ、電車、自動車すらも、どんな仕組みでできあがっているのか、ぼくには検討がつかない。
ぼくらの社会が戦争をすることなく平穏に回り続けるのなら、いやそうではないとしても、ぼくらはメタゲームの上でしか生きていかれないのではないかと思わざるを得ない。
もちろん、身の回りのものをすべて自作できるような社会に戻すべきだ、などという意味不明な主張をしたいわけでは毛頭ない。
ただし、わからないものだらけの中でわかったような感覚だけを残して生きること自体に気持ち悪さがぬぐえない。

「わかる」の驚くべき曖昧さ

ぼくらは身の回りのものを使うことができる。意図したことを実現させることができる。
そして、意図したことを実現させることができる以上、ぼくたちは「わかっている」と言えてしまうのだ。

プログラミングを例に出してみる。
ぼく個人の話で恐縮だが、Vue.jsフレームワークを最近触ってみた。JavaScriptの基礎をおよそ理解し、Vue.jsを使用した簡易なアプリケーションであれば自作できるぐらいには、Vue.jsフレームワークへの理解も深まった。
さて、あるクライアントから依頼されたシステムを、このVue.jsフレームワークで構築できたとする。ハイライトや配置をふくむ画面の表示の仕方、DBとの連携にいたるまで。
実際にシステムをつくりあげた人が「Vue.jsフレームワークのことは全然わかりません」と言うのはオカシイ、そんな気がしないだろうか?
しかし、彼(ぼく)はJavaScript言語そのものを何がどうやって支えているのかも知らないし、Vue.jsフレームワークのソースコードを読んだこともない。
であれば、オカシイと言われようとも、彼にとって実態に「Vue.jsフレームワークのことは全然わかりません」というのは正しいのだ。

ぼくらはソレを使えている限りにおいては「ソレについてはわかっている」ことになってしまうのだ。
いや、直感的にそう思える、というのが正しいのだが。
ただしシステムを構築できたからといって、それは「知っている範囲の知識を用いてシステムを作り上げることができた」というだけのことに過ぎない。
調べ物をしても、それは「わかる範囲を少し広げた」というだけのことで、「それに関してはすべて理解している」わけでは全くない。
自分たちの想定する範囲によって「わかる」と「わからない」の定義がまるっと変わってしまうのだ。
ぼくらは、ぼくらにとっての「わかる」というのは、それだけのことなのだ。

もっとも曖昧な「わかる」はプログラミングだ

例に出しておいてなんだが、こういう例えができるのはプログラミングだからかもしれない。
プログラミングは「使う」より「くみ上げる」ものであるから、その他の「道具」とは異なる特徴が強い。使い方が道具によってあまり規制されておらず、それどころか常に拡張され続けている、というものだからだ。
ぼくらプログラマーないしエンジニアというのは、自分の「わからない」に対して、ややおかしな態度で取り組まなければならない存在なのではないか。