あと味

たくさん情報を食べて、たくさん発信すると、あとになって味わい深い。

非プログラマがプログラマに学ぶべきお作法 - メタプログラミング

これシリーズ化したいなと思ってるくらいなんですけど、常日頃から非プログラマプログラマから学ぶべきお作法がめちゃくちゃたくさんあると思ってます。

以前、以下の記事で言及したことがありましたが、今後もう少し具体例に落とし込んだ形で言及していきます。
一般人よりプログラマが優れている10の理由 - あと味

俺自身はプログラマではないけれど、週末はプログラミングに勤しむ、いちアマグラマーとして、プログラマの持つお作法を、他の職種の方へ説明できたらいいなーと考えています。知識がつたない分、多少の語弊がある箇所も出てくるかもしれませんが、がんばります。

で、今回は、メタプログラミングという概念をプログラマから学んでみます。*1

メタプログラミングとは?

メタプログラミングについてWikipediaではこのように定義されています。
メタプログラミング - Wikipedia

メタプログラミング (metaprogramming) とはプログラミング技法の一種で、ロジックを直接コーディングするのではなく、あるパターンをもったロジックを生成する高位ロジックによってプログラミングを行う方法、またその高位ロジックを定義する方法のこと。主に対象言語に埋め込まれたマクロ言語によって行われる。

要するにプログラムを作るプログラムを作るプログラミングのことをメタプログラミングと言います。言葉がややこしいですね。

プログラマは熟練度を上げると、このメタプログラミングというものを扱うようになることがあるようです。用意された環境下で機能を作るのではなく、用意された環境を用意された環境+αで作り直し、そこに機能を作るような感じです。自分自身を再定義するというようなことだと思います。

こうすることで、普段行っている仕事をより効率的に、より効果的に実施するための土壌ができあがります。

Ruby on Railsprototype.jsのようなフレームワーク、ライブラリも、一種のメタプログラミングの産物だと捉えてよいと思います。

Ruby on Railsができたことで、すばやく容易にWebアプリケーションが作れるようになったり、prototype.jsができたことで、クロスブラウザの処理だとか、実現したい機能を書くための無駄な記述を省略できるようになり、プログラマの生産性を向上させることができるようになりました。

プログラマがメタプログラミングをする場合

プログラマがどのようにこのメタプログラミングを実践するかというと、例えば、報告書を作るのではなく、報告書を作るための方法論を作るということになります。

一見無駄な作業が発生するだけのようですが、無駄ではありません。プログラマの世界でも「車輪の再発明をするな」という言葉があって、無駄を省くことが推奨されていますが、車輪を発明する人になるためには、車輪の再発明ができなきゃらならないので、遅かれ遠かれスーパープログラマ車輪の再発明的なことをしているはずです。

5W1Hという有名なフレームワークがあると思いますが、これは非プログラマのメタプログラミングからできた産物です。

報告する内容を5W1Hにあてはめることで、漏れのない簡潔な報告書を作ることができるようになります。

一度メタプログラミングで5W1Hを作ってさえしまえば、次回から報告書を作成する時に苦労が激減します。

5W1Hは汎用性の高い仕組みなので、報告書以外にも使える非常に優れた仕組みです。

5W1Hを採用するとしても、仕事によっては他に必要な項目があったり、不要な項目があったりするわけで、これをそのまま使うのではなく、拡張(オーバーライド)して仕組みづくりをしなければならなくなると思います。一筋縄にいかない。だから、誰にでもメタプログラミングが必要になるんです。

メタプログラミングができれば

プログラマでもそうですが、プログラミングができる人とメタプログラミングができる人では、圧倒的な技術差があります。もちろん収入の差も。ある程度経験を積まなければ手を出しにくい技術です。車輪のことがわからないのに、車輪の再発明なんて夢物語です。一言で言えば経験値が必要。

プログラマのメタプログラミングも先の例で取り上げたように、報告書のメタプログラミングをすると言っても、報告とはなんぞやということを理解していなければ、到底できません。ビジネスでの経験値が必要。

でも。

できるできない良い悪いは別にして、するかしないかの選択権はある

上を目指すプログラマは、業務時間中にそれができなくても、車輪の発明の方法を学び、盗んでいます。それによって、実際の業務スキルも上がっていく。上を目指す非プログラマも同じようなことをしているはずだと思います。

世の中、仕組みを利用する人は仕組みを構築する人に一生かかっても勝てません。マーケットを利用する人は、マーケットを作り出した人に一生かかっても勝てません*2。楽天に楽天ショップが勝つことはあり得ないわけです。

ようするにメタプログラミングをしなければ、メタプログラミングする人に勝てないわけで、メタプログラミングに挑戦しなければ、上は目指せないんです。

プログラマはメタプログラミングをして、仕事の方法論を一生懸命作っては改善して切磋琢磨し続けないといけません。特に、非プログラマは、プログラマに比べてメタプログラミングを学ぶ場が少ないので、常日頃意識していないといけない。

何か作業をする時は、ひとつ上の階層(メタ)から俯瞰して、そのやり方でよいかどうかを常に自問自答する。そういうことです。

ただし、俺もその傾向があるのだけど、車輪の再発明をするにしても、既に確立された車輪の作り方や、ベストプラクティスは最大限尊重しないと、単なるオナメタ(オ○ニーメタプログラミング)になります。自分だけ気持ちよくなって終わりみたいな。他人を満足させる視点は最低限必要です。

ここまで書いておいてなんですが、今言ってることはメタプログラミングより一次元下の話な気がしてきましたが、言葉のインパクトが強いので、メタプログラミングで通します。

まとめると、非プログラマの人も、プログラマに学んで、メタプログラミングに積極的に取り組みましょうというお話でした。

最後に最も尊く、価値のあるメタプログラミングとは、教育なのだ

*1:以前同じような記事を書いた気もしますが、気にしない

*2:ごくまれに勝てるとしても