読者です 読者をやめる 読者になる 読者になる

日々常々

ふつうのプログラマがあたりまえにしたいこと。

「自動生成でプログラマ不要」とかゆーの

「自動生成」って言葉を聞くと、前のめりになったり顔をしかめたりと人によって反応は様々です。ですが「自動生成でプログラマが不要になる」と言われると「ばかじゃねーの」となると思います。
少しも「ばかじゃねーの」と思わない人はコンテキストが根本からズレてますので、以下は読む必要ありません。そこをあわせるつもりは無いですので。

自動生成されたコード

生成元はなんであれ、コードを自動生成すると言うアプローチはよくあります。
ここではコード全体を自動生成する場合を指すと思ってください。生成されたコードがそのままコンパイル可能である状態です。言ってしまえば「バイナリを自動生成する元であるコードを自動生成せざるを得ない」ってことで、さらに誤解を恐れずに言えば「扱っている言語は表現力に乏しい」となります。だって高級言語なんて人間が扱えるように作られてるはずなのに、それよりも読みやすく書ける上にそのままコンパイル可能なコードが吐ける、つまるところそのままコンパイル出来るって状況。これがその対象言語を表現力に乏しいと言わず何と言いますかね。……と言うのは、言語にも向き不向きがございますので置いておいて。
自動生成、いいですね。コード書かなくて良いんですよ。さて、ここで出力されるコードは誰のためのコードでしょう。私は「コードは読み物である」と思っているので、人の方を向いているものだと思っています。ですが、ここで出力されるコードは明らかに人の方を向いておらず、コンピュータの方を向いています。ならばそのようなコードは読み物ではありません。自動生成されるようなものは、自動的に読み取らせておけば良くて、人間が読む必要なんてないです。
この辺はもういい加減コードを吐かずにバイナリ吐いとけって思ってます。どうせメンテしない……と言うか、出来ないんだし。元々は自動生成されてたコードに手を入れて自動生成元と乖離してメンテナンスコストが天井知らずになってるの、とか、よくある、し……。下手にコード吐かないで欲しい。
この手の生成は嫌いつつも現実的な妥協点だと思っています。できれば無くなって欲しい。コードなんて吐かずそのままバイナリ吐いて欲しい。そしたらその生成元がコードですよ。

部分的な自動生成

穴埋めするための全体の雛形を生成するのとか。IDEが生成するのとか。この辺りが向いている先はコンピュータと人間と半々な感じです。人間にとってはあまり意味が無いけれど、コンピュータ(コンパイラ)に伝えるために書かざるを得ない部分をサクッと埋めてくれるのとかは機械向きです。穴埋めの雛形生成やテンプレートは人に書くことを促す意味で人間向いてる感じがします。
現実的に最後まで残るのは、この辺りの生成されるコードが人間の方を向いているものかなと。ここを生成せずに済ませるのは、逆に効率を落とすことになります。例えばIDEの生成するものだと「NPE」で意味がわかるかは際どいですし、「sout」とか「fori」とかで放置されるとわけわかりません。この辺りから生成されるものはタイプ量を減らし、生成後は可読性にも貢献してくれます。
この手の生成は大好きです。

自動生成されたコードと手書きのコードの違い

手作りの暖かみ!!!
……ネタで書いたつもりですが、意外と良いセン行ってるんじゃないかなと思った。と言うのも、人が書いたコードは、良いコードであればあるほど、人のことを考えて書かれます。それはCleanCodeと呼ばれるかもしれないし、ReadableCodeと言われるかもしれない。とかく、良いコードほど書いた人の考えがわかるようになっているものです。意味の通じる文章、みたいな感じでしょうか。良い手書きのコードは読む人のこと、つまり書き直す人のことを考えているってことになります。それは自動生成されるコードでは持てない特性かなと思います。自動生成されるコードは、生成されたコードを書き直されることは考えず、生成元を直して再生成するものですから。
反面、人が書いたコードは機械が作るものでは考えられないような腐臭を発することもあります。臭いに慣れている人だと気付かないこともあります。人間故に価値観の相違もありますし、押しつけや思い込みもあります。面白くも難しいところです。

自動生成でプログラマが要らなくなる?

自動生成ツールが吐くコードと、プログラマが書くコードは対象が違うものなので、出来たコードを並べて単純比較しても意味が無いと思ってる。自動生成するコードはバイナリと同レベルくらいのつもりで、基本的に読むものじゃない。
「自動生成でコードを書かなくて良くなる」なんて無いだろうと思ってます。自動生成されるコードと手書きのコード(この表現もなかなか微妙だなぁ……)は向いてる方向が異なりますから。自動生成元は(言語の体を成してないかもしれないけど)DSLでしかないですし、ならばその生成元は手書きのコードになるよね、と。
結局、自動生成によって切り崩されていくのは「プログラミングの単純作業」でしかなくて、考えなきゃいけない部分はそのまんま残ります。浮き彫りになる「システムの本質的な難しさ」をコンピュータで汎用的に処理する道具がプログラミング言語で、プログラマの仕事ってその辺の複雑さを何とかすること。だから無くなりようが無いんじゃないかなーと思ってたり。


追記と言う蛇足 (2013/1/8 19:50)

「自動生成されたコードはジェネレーションギャップパターンを使う」は正道です。
が、コードを生成すると上手く行きません。上手く行っているところもあるのは知ってますが、上手く行かない例があるので私は好みません。もちろん、使うべき場面では使います。こんなの当然の話だからわざわざ書きたくもないんですが。でもパターンの名前も知らない、説明も届かない、説明する機会も無い、そんな世界もあって。滅びれば良いのに、とは思いますよ?
それはさておき、私が言いたいのは「やっちゃいけないことが容易に出来る状況はクソだ」*1です。ジェネレーションギャップパターンは「生成されたコードを触らない」と言う決まり事の元でのみ成り立ちます。生成されるのがコードであれば、それを触ることが出来てしまいます。
馬鹿馬鹿しい実例を挙げます。コードを自動生成することにしました。編集されると前述のメンテ地獄が見えてるので困る。対策にルール決めて、他のコードと違う場所に置いて、「これは自動生成されたコードです。編集しないでください。」とファイルヘッダに出力するようにしました。いつのまにか、そのファイルが丸ごとコピーされて手で書き換えられて使われてました。その発想は無かった。でも出来るからやっちゃうんですよ。いとも容易く行われるえげつない(以下略)
……だから、好きじゃない。「悪いのはパターンじゃなくて人だ!」とか、そんなのはどうだって良いんです。言われても同意しかしません。どうでも良いことは置いといて、禁止とか言った所で容易に出来ることが問題なんです。
もしJavaでジェネレーションギャップパターンを適用するなら、生成するのはコードではなく、コンパイルしたclassもしくはjarとするべきです。そこで吐いたコードをそのままにしちゃいけない。これが「バイナリを吐きやがれ」です。きっと普通にやってますよね。
自動生成されるコードなんて、嫌いだ。

*1:もっとこなれたお洒落な表現があった気がするのですが、ど忘れしました。