あなたの書いたコードには 5つの欠点がある

後輩がコードを書いているのを見て思いついたことだ。

GTKで、ボタンが押されたのとはなされたのが同じ場所であったら処理をするというコードを書く必要があった。それに対して以下のようなコードを書いて、どうでしょうと見せに来た(まあ、擬似的なものだ)。

static int x, y;

gboolean button_pressed(GtkWidget *w, GdkEventButton *event)
{
  y = event->y; x = event->x;
  return FALSE;
}

gboolean button_released(GtkWidget *w, GdkEventButton *event)
{
  if (event->y == y && event->x == x) do_it(w);
  return FALSE;
}

見る人が見ればわかるかもしれないが、このコードにはまずいことがある。まず座標を == で比較しているので、1dotでもぶれたら動かない。本当はここで望まれる処理は、押したときと離したときの座標が特定の同じアイテムの上に乗っていれば発動すべきものであったのだ。

まあ、これ以前にも最初は releasedのときにとにかく発動するようなコードを書いてきて、それをいやらしくねちねち指摘してこういうコードまでいたったんだが。

プログラマをやる以上、自分の書いたコードには欠点がある、と思って行動してほしい。最初のコードを書いた時点で、「自分は離されたら動き出すように書いたけど、押されたのと離された位置がまったく違う場合はどうなるんだろう? そういう動作をユーザがやる可能性はあるんだろうか?」と考えてほしい。

俺なんかは、人間がいやらしくできているので、そういう隙間にすぐに思い至る。思い至りすぎていつまでもコードが完成しなかったりするのだが。

そういう意味で、「自分の書いたコードの欠点が常に5個は上げられるようにならないとプログラマとして一人前じゃない」という言葉を提唱したい。

たとえば、上のコードについてほかにいくつ欠点が挙げられるだろうか?

  • x, yという static変数名は短すぎる
  • そもそも static変数でいいのか? object内に持つべきじゃないか?

ぐらいは考えられる。あとは、重箱の隅をほじるようでもいいので考えてみてほしい。

まあ、そんなことをやっているといつまでたってもコードが完成しなくなりそうだ。そこは現状必要とされる完成度や時間、そういったものをもって判断すべきなのだろう。そこでの判断こそ、コーディングの本当の能力が発揮される場所なのかもしれない。人間が必要な領域である。

ちなみに、敷衍して文書にもいえるんじゃないか。この entryについても 5つの欠点は挙げられるようじゃないとだめかなあ。まあ、30分で書いたからいいじゃないか、と自分を慰めるしだいである。