プログラミングは工業製品をまねして設計、実装する。
フリーランスエンジニアの @nabeemichi です。
エンジニアはアプリケーション作成やインフラ管理などをすることがお仕事なわけですが、 大規模なアプリを作ると、作り方やアプリとしてどの役割までを担保するかを考えながら設計やら実装を行うわけです。
そんなとき、僕がよく参考にするのは、工業製品です。 自動車とかもそうですが眼の前にあるMacBookとかも参考にします。 というか、観察します。
そして、自分のつくるアプリケーションと比べて、作り方を真似します。
工業製品を真似たプログラミングとは?
「僕はアプリ作るときは、工業製品を参考につくるよ」
と、そこらへんのエンジニアに話すと、だいたいの人の反応は、
「この人アホなんじゃないの?」
みたいな顔をした反応をします。 まぁそうでしょうね。工業製品はハードで物理的に触ることができるのに対して、アプリケーションはソフトでMacBookなどの工業製品を通して利用するものです。 違う次元のものです。
だから、大体の人は、次元が違うのだから真似するものなんてないでしょ!?という反応なのだと思います。
でも、僕は真似します。
どのように真似をするかというと、
このアプリのこの機能は、メインで心臓部の役割をするから自動車でいうエンジン。
でも、実際に作りたいのは自動車なんだから、エンジンは車体に載せないといけない。
車体に乗せるためには、車体とエンジンをつなぎ合わせる必要があって、それを担ってるのはネジ。
ネジも用途によって大きさや長さがたくさんあるけど、工業製品では規格が決まってる。 利用するネジの規格を揃えないと、車体とエンジンはつながらない。 だから規格が決まったネジを作って、車体作成部隊とエンジン作成部隊にネジが通る穴を計算して作ってもらわないといけない。
みたいな感じで、どの役割単位のパーツを作っていって、それらをどのようにくっつけるのか?を参考にアプリケーションを作っていく。
オブジェクト指向プログラミングで言ったら、クラスが保つ役割はエンジンで、これを車体クラスにくっつけるためのインターフェース(ネジ)を受け入れるようにしておかないといけなくて、だから実装するのは、エンジンクラス、車体クラス、ネジクラスで車体クラスとエンジンクラスはネジクラスを持ってる。
みたいな感じで考えると、役割も明確化されるし、結合するのにも部品が必要なのも納得できる。なんなら、部品と部品をくっつけて、一つの部品として扱うパターンも出てくる。
なんで工業製品を真似をするのか?
それは工業製品のほうがプログラミングの歴史よりも長いから。
例えば、自動車なんかは1769年頃に初めて蒸気自動車が誕生したとされてるので、コンピュータができるよりもずっと前のはず。 その自動車が今の形になるまでに、多くの改良や多くの作り直しをされてきている。 設計の仕方や作り方のトライアンドエラーを長い歴史の中で、汎用性や拡張性、保守性や開発効率なんかも考えられてるはずと考えることができる。 アプリケーション開発だって、同じようなことに悩んでいる。 だったら、先人に学ぶのが近道のはずだし、同じ失敗をする必要もないので、歴史の長いものから転用するのは同じ失敗をする確率が低いと考えられる。
これに近しいのが、アトミックデザインなのでは?と先週初めて聞いた単語をググって調べて思った。 自動車とか、ある程度のパーツを組み合わせて、組み合わせたパーツをさらに組み合わせて作っていくよね?
だから僕は、困ったら工業製品を観察してヒントをもらってます。 自動車の製造ラインとか見に行くともっと参考になること発見できるかも。