怠惰を促す言語とそうでない言語は確かにあるように感じている。

「怠慢はプログラマの美徳」というけれど - kwatchの日記
はてなブックマーク - novtanのブックマーク / 2008年04月28日
怠惰はプログラマの美徳であってそれを言語の機能に求めてはいけない。
「怠慢はプログラマの美徳」というけれど - kwatchの日記
例えば、スクリプト言語で次のような Hash や Dict を書いたとする。
data = [
  {'name'=>'Foo', 'age'=>20, 'email'=>'foo@mail.com'},
  {'name'=>'Bar', 'age'=>21, 'email'=>'bar@mail.net'},
  {'name'=>'Baz', 'age'=>22, 'email'=>'baz@mail.org'},
]
もしこれをみて何も感じないのであれば、スクリプト言語屋といえど Java 屋を笑うことはできない。

ここであなたは何かを感じ、

そして、こんなふうに書けないだろうかと一度は思うはずだ。
data = %h{
  ['name', 'age', 'email'],
  ['Foo',   20,   'foo@mail.com'],
  ['Bar',   21,   'bar@mail.net'],
  ['Baz',   22,   'baz@mail.org'],
}

とやりたくなった典型的なLLプログラマーは、こんな感じで作業する。

  1. とりあえず最初の通り書く。
  2. なにかを感じる。
  3. 以下のように書いてみる。たとえばperlならこんな感じ。
    my $data = [ map { {name=>$_->[0],age=>$_->[1],email=>$_->[2]} }
      ['Foo',   20,   'foo@mail.com'],
      ['Bar',   21,   'bar@mail.net'],
      ['Baz',   22,   'baz@mail.org'],
    ];
    
  4. で、実行してみる
  5. で、まだ満足が行かずさらにいじってみる。
    sub str2data{
      my ($keys, $str) = @_;
      my @result;
      for my $line (split /\n/, $str){
        next if $line =~ /^$/;
        my %hash;
        my @fields = split /\s+/, $line;
        $hash{$_} = shift @fields for (@$keys);
        push @result, \%hash;
      }
      \@result;
    };
    
    my $data = str2data([qw/name age email/], <<"EOT");
    Foo 20 foo@mail.com
    Bar 21 bar@mail.net
    Baz 22 baz@mail.org
    EOT
    
  6. また実行してみる
  7. だいたいこんなもんでOKというところでリリース。

ここで私が言いたいのは、id:kwatchの怠惰さが足りない、ということではもちろんない。

私が言いたいのは、LLの何がLightweightかということだ。

プログラマーは、0の段階でも3の段階でも6の段階でも「できた」と言い張ることが出来る。なぜなら、一応動くから。LLでなくても同様のステップを踏むことは不可能ではないが、ステップとステップの間の心理距離はずっと大きい。だから0から6に一足飛びに行こうとするか、0のまま諦めるかのどちらかになりがちだ。

LLでLightweightなのは、だから尻、である。ケツが軽いから、思い立った時に直せる。その結果をすぐに確認できる。確認できるからリリースできる。他者もすぐに改善案を思い立つし、思い立ったらすぐに添削できる。

LLで何がよいか、といえば、「これで一応出来上がり」という瞬間が、そうでないものよりも増えるということなのだ。「オレが書いたプログラムがちゃんと動いた」と実感できる瞬間が何倍にもなるのだ。

怠惰なプログラマの重い尻を上げるためには、プログラミング言語の尻は軽ければ軽いほどいいのだ。

Dan the Lightweight Programmer