Time for a Holy War

Tags:

먼저, 그 구현이 거의 된게 없다는 Groovy와 요즘 한창 잘나가는 Ruby의 비교에 대한 글이 artima에 실려있습니다. 어디선가 Groovy 프로젝트 리더의 인터뷰를 봤었는데, 거의 ant의 task 확장의 예만 들고 좀 애플리케이션 같은 쪽에는 얘기가 없더군요. 더구나 자기 말로도 ‘serious’ 한데까지는 못쓴다고 인정하는 상태였습니다.

다음은 Michael Tsai가 포스팅한 Perl vs. Python vs. Ruby입니다. Python이야 구글로 간 귀도로 인해서 유명세를 한번 치뤘지만, 루비와 무엇이 다른가에 대한 언어적인 차이는 거의 없어보입니다. 하지만 VM 의 구현 레벨은 얘기가 전혀 다른 상태인 듯 하네요. 단! 올해 JavaOne에 JRuby 가 등장합니다. 흐흐. JRuby가 뜨면 대박납니다, 여러분. 제가 루비를 시작한 결정적 계기중 하나죠. (다른 하나는 metasploit이 펄에서 루비로 옮긴 것입니다.) 아무튼, Tsai는 세 언어의 비교를 위해 한가지 문제를 내고, 그 문제에 여러 코더가 달려듭니다. 파이썬과 루비에 대해서는 그다지 언급할 게 없지만 펄은 참 인상적인 패배를 보입니다.

Blazar라는 베테랑 펄 코더가 Tsai의 코드를 개선해 보입니다.

이랬던 코드가

#!/usr/bin/perl -w

use strict;

my @records = ();

foreach my $line ( <> )
{
    my @record = map {s/"//g; $_} split("\t", $line);
    push(@records, \@record);
}

my $EMAIL = 17;
my $CONTACTME = 27;
my $SKUTITLE = 34;

my @contactRecords = ();
foreach my $r ( @records )
{
    push(@contactRecords, [$$r[$SKUTITLE], $$r[$CONTACTME], $$r[$EMAIL]]);
}

@contactRecords = sort {$$a[0] cmp $$b[0]} @contactRecords;
@contactRecords = grep($$_[1] eq "1", @contactRecords);

foreach my $r ( @contactRecords )
{
    print join("\t", @$r), "\n";
}

이렇게 변했습니다

#!/usr/bin/perl
	
use strict;
use warnings;
	
my @records;
	
push @records, [ (/\"(.*?)\"/g)[17,27,34] ] while <>;
	
($\,$\")=($/,\"\t\");
	
print \"@$_\" for
sort { $a->[0] cmp $b->[0] }
  grep $_->[1] eq '1', @records;
	
__END__

굉장히 짧고 간략해보이죠? 그러나 Q라는 분이 다음과 같이 일침을 날립니다.

Blazar, while this is perfectly reasonable perl code for a seasoned veteran like you or me, it demonstrates perfectly why perl is such a horrible language for writing intuitive and maintainable code.

You cannot look at this code snippet and just “know” what it’s meant to do without reading ever single line and mentally parsing/executing it. Meaningful syntax and well named intermediate variables are essential to writing code that is “intuitive”. You shouldn’t have to comment every second line to make it clear why you are doing something.

You can write easily readable and maintainable perl code, but it’s something the language tries hard to prevent you from doing in it’s simplest form, as you have demonstrated.

Write Only Language의 전형을 보여준 베테랑 펄 코더 아저씨는 정규식 실력을 뽐내기 전에 ‘Don’t code, Write!’ 의 의미를 생각해봐야할 듯 합니다.

Comments

2 responses to “Time for a Holy War”

  1. nohmad Avatar

    Write Only Language라.. 적절한 표현 같네요. 그런데 저는 가독성을 강조하며 기호를 지나치게 멀리 하는 것 보다는, 이미 의미가 확립된 기호들은 적절히 활용하는 것이 간결함에 도움이 되고, 결과적으로 가독성 향상에도 도움이 된다고 생각합니다. 링크하신 Armstrong씨의 이전 글에도 루비의 기호들이 자연스럽게 번역이 된다고 말하는 부분이 있습니다. 저는 $LOAD_PATH 보다는 $:, $LOADED_FEATURES 보다는 $”, s = io.gets 보다는 io.gets 하고 $_를 참조한다든가, 이런 식의 축약어들이 숙련된 사람에게 코드를 간결하게 만들 수 있게 하는 좋은 재료가 된다고 생각합니다. 프로그래밍 언어가 항상 그 언어에 능숙하지 않은 사람들을 염두에 두고 표현을 제한하는 것은 좋지 않다고 생각하지 않습니다. 오히려 능숙한 사람에게 뭔가 ‘플러스’를 줄 수 있어야 한다고 생각합니다. Write Only Language라는 말에서 저는 writability와 readability가 조화를 이루는 것이 중요하다고 생각했습니다. 파이썬/자바는 너무 readability에만 치중한 면이 있다고 생각합니다. 저는 그런 점에서 적당히 섞여있는 루비가 잘 맞는 것 같습니다.

  2. MKSeo Avatar
    MKSeo

    네.. Read를 강조하면 Write 가 떨어지는건 사실인 거 같습니다. 저 개인적으로는 $_ 도 별로 좋아하지는 않아요.

Leave a Reply

Your email address will not be published. Required fields are marked *