Dr. Damian Conway 인터뷰 - aero님의 블로그에서...

keedi의 이미지

aero님의 블로그에서 Damian Conway 박사의 인터뷰를 읽었습니다.
(저런 분의 강의를 한번 들어볼 수 있다면 싶을 정도로 정말 멋진 사람이죠 :-)

역시 guru들은 말하는 것도 생각하는 것도 다르군요.
정말 초공감하면서 읽었습니다.

chromatic씨의 블로그에서도 자주 본 이야기지만...
사람들은 자신의 무지를 도구의 탓으로 돌리는 경향이 있는 것 같습니다.

인터뷰 중간에 나오는

Quote:
“SATIS OCULI, OMNIS CIMICES BREVES SUNT”

이런 라틴어... 대부분 읽을 수 없겠지요.

Quote:
my $text = do { local $/; <$file> };

마찬가지로, 대부분의 사람들은 위의 구문을 읽지 못할 뿐만 아니라
Perl의 문법은 지저분하다고 폄하까지 합니다.
사실 Perl을 욕하는 사람들의 99프로 이상은 Perl을 모르고 있다는 거죠!
(적어도 우리나라는 그렇더군요 :-)

하지만 저는 대부분의 사람들의 의견에 절대로(!) 동의할 수 없는 것이,
Perl의 문법, 문화를 아는 사람이라면 저 Power Slurping 코드는
감동의 연속이라고 생각하기 때문입니다.

마지막으로 그의 타이핑 시간 포함 60초 짜리 문제 해결 능력을 보고
또 한 번 감동 받았습니다.

use List::Util 'shuffle';
 
        print and readline STDIN
                        foreach shuffle
                            12001..13000,
                            14001..15000,
                            40001..41000,
                            67001..68000,
                            96001..97000;

그래... 구루는 저런거야...

JEEN의 이미지

60초만에 코딩하다니....

슈로대의 "히라메키"나... 뉴타입의 "찌리링~"같은 포스가 느껴지는 것은 왜일까요...

guru가 되지 못할 지언정, guru의 뒤꿈치라도 밟아보고 싶군요.

--------------------------------------------------------------------------------
use perl;

use perl;

keedi의 이미지

사실 코드 자체의 난이도가 높다거나
문제 자체의 난이도가 높다거나 하는 것은 아니죠.

하지만 JEEN님 말씀처럼 뭐랄까, 문제를 듣자마자,

Quote:
어? 그래? 그럼 이렇게 하면 되겠네~ :-)

하고 슥슥 적어 버리는 Damian 박사의 그 찰나를 상상해보면...
언제나 기본이 중요하다는 것을 다시 한 번 생각하게 됩니다.

- 세월이 흘러도 변하지 않는 기본적인 전산학 지식의 견고함
- 즐겨쓰는 언어가 제공하는 기능에 대한 온전한 이해
- 즐겨쓰는 언어를 국어를 써내려가듯이 물흐르듯 작성할 수 있는 익숙함

장수가 문무를 겸비하듯, 세 가지를 겸비해야겠다는 자세로 생활합니다만,
사실 Perl을 몇 년째 쓰면서 저런 비슷한 코드를 써보지도 못했네요.
하지만 저런 멋진 코드를 한번이라도 보고나면 확실히 코드 작성할 때
조금씩 달라지는 것 같습니다. (서당개 3년이면 풍월...?)

Perl Guru들의 코드가 하는 일에 놀란다기 보다는
(솔직히 아직도 부족한 점이 많아 여전히 놀라고 있습니다. :),
그들이 문제를 해결하는 방식과 그것을 Perl로 표현하는 방법에 놀라곤 합니다.

철 지난 모듈이나, Perl.com의 몇 년 지난 아티클 조차
(오죽하면 Still More Perl Lightning Articles 의 제목의 기사도 있겠어요.)
언제나 반짝거릴 수 있는 것은 바로 그러한 점 때문이겠죠.

배움에 목마르지만 게으른 사람들에게 Perl 커뮤니티는
가만히 앉아서 구할 수 있는 리소스의 천국이라고 생각합니다. :)

---------------------------
Smashing Watermelons~!!
Whatever Nevermind~!!

Keedi Kim

----
use perl;

Keedi Kim

익명 사용자의 이미지

구루도 인정하는 것인가요?
Perl은 쓰기용 언어이지 읽기용 언어가 아니라는 점을...

적어도 24가지의 케이스문 작성방법 -_-ㅋ

keedi의 이미지

재미있군요~ :-)

Perl을 쓰기 전용으로 쓸 수 밖에 없는 사람은
무슨 언어를 써도 쓰기 전용으로 쓸 확률이 높다고 생각합니다.
반대로 C, C++, Java, Python, PHP, Ruby 등 다른 언어를
가독성 좋게 작성할 수 있는 사람은 Perl 또한 가독성있게 작성할테구요.

예전 유명한 프로그래밍 대회에서 어셈을 이용한 OOP 프로그램으로
3등을 했던 일을 기억 하시나요? (물론 구글 팀 중 하나였습니다. :)
그사람의 언어에 대한 무지함을 언어 자체의 능력의 한계라는
잣대로 보는 것은 언제나 그러하듯 지리한 논쟁입니다.

그리고 대부분의 많은 언어가 Switch 문을 흉내낼 수 있습니다.
게중에는 이미 존재하기 때문에 흉내낼 필요가 없기도 하죠.
모두가 생각하시듯 가장 단순한 예는 if문의 반복 일 것입니다. :-)

Perl의 24가지 switch 문이 의미하는 것은
크게 가독성을 해치지 않는 수준에서
그 자체의 자유로운 hacks을 이용해서 동일 기능을
사용할 수 있다 정도라고 생각합니다.

음~ Perl 코어 모듈에 Switch.pm 모듈이 포함 된지가 꽤 오래된 것을
생각한다면 Perl에서 switch를 쓸 수 없다는 말은 사실 틀렸습니다.
perl 엔진에 switch 내장 함수가 존재하지 않는다고 하면 음~ 맞는 말이지만요.

재밌게도 Switch 모듈을 작성한 분은 이야기에서 언급한 Damian Conway 박사입니다.

기술적으로 몇가지 더 부연하자면,
Switch 는 Perl의 재미있는 특징인 Source Filter라는 기법을 이용한 것이고,
이 Source Filter는 일종의 전처리 처리기인데
덕분에 Perl을 가지고 놀고 싶은 Hacker에게
이 기법은 제법 괜찮고 재미있는 장난감이 됩니다.

물론 단점이 있습니다만, 이것은 써보신 분은 아시겠죠. :-)
표준 모듈이 아니어도 괜찮다면 여전히 CPAN에는
Switch::Perlish라는 멋진 모듈 역시 존재합니다.

11월 쯤에 나올 Perl 5.10에는
Perl 6의 진보적인 기능들이 제법 백포팅 되는데,
Switch 구문이 Source Filter가 아닌
native하게 구현되었다는 점이 특징 중 하나입니다.

Perl의 Switch나 Switch::Perlih 는 마약처럼 강력해서
switch 문에 맛들여서 한번 쓰기 시작하면,
다른 언어에서 switch를 쓰려면 답답해서
도저히 참을 수 없는 지경이 되더군요. :)

---------------------------
Smashing Watermelons~!!
Whatever Nevermind~!!

Keedi Kim

----
use perl;

Keedi Kim

익명 사용자의 이미지

그런가요?... 말한 의미가 잘못 전달된 듯도 싶군요.

몰론 각각의 방법으로 가독성있게 작성할 수 있습니다.

A라는 사람이 1이라는 방법으로 가독성있게 작성한 것을
B라는 사람이 읽어야 하는데 B는 그동안 1이라는 방법으로 써본 적이 없습니다.
B는 그 동안 자기가 좋아해 왔던 2라는 방법을 사용해 왔기 때문에 말입니다.

이게 다른 언어에서는 이상한 얘기처럼 들리지만 Perl에서는 일어날 수 있습니다.

그 이유는 Perl은 A라는 사람이 좋아하는 방식, B라는 사람이 좋아하는 방식을 모두 잘 지원해 주어서
A와 B 모두에게 코드를 작성하는 즐거움을 주었기 때문입니다.

하지만 B가 A의 코드를 읽어야 할때
B는 1이라는 그동안 쓰지 않았던 방법을 읽어야 하며 심한 경우 새로 배워야 합니다.
이 배워야 한다는 부분을 가지고 "프로그래머의 무지를 가지고 도구를 탓한다."라고 한다면 뭐 그렇게 말할 수도 있겠지만요.

간단히 정리하면 어느 언어나 가독성을 위해 정하는 규칙이 있을 겁니다.
들여쓰기는 텝으로 하지마라. 스페이스 몇칸으로 한다. 괄호는 여기에 붙힌다. 등등 말이죠.

그런데 펄로 이런걸 정하려고 한다면
아마 그 분량이 프로그래밍 언어 책하나 써야하는 정도일지도 모릅니다.
1강 제어문은 이렇게 한다.
2강 함수는 이렇게 한다.
3강 객체는 이렇게 한다.
4강 ...

그런의미에서 했던 얘기였습니다.

M.W.Park의 이미지

이론의 여지가 있을 수 있지만...
언어로 사고한다는 견해를 가진 사람이라면 (즉, 언어의 형식이나 표현력의 한계가 사고를 제한할 가능성이 있다고 본다면),
다양한 표현이 가능한 쪽이 더 낫다(유연한 사고에 알맞다)는 편에 설 것입니다.

또한 생성 문법론적인 측면에서 보자면, 일정한 규칙집합을 적용하여 생성되는 거의 무한한 문장들을 그 언어의 사용자는 불편없이 이해하고 소통할 수 있습니다. 불편을 느낀다면 모국어 수준의 언어 사용자가 아니겠지요.

-----
오늘 나의 취미는 끝없는, 끝없는 인내다. 1973 法頂

-----
오늘 의 취미는 끝없는, 끝없는 인내다. 1973 法頂

keedi의 이미지

자세히 올려주신 이야기들, 맞는 말씀이라고 생각합니다.
그리고 어느정도는 동감하고, 또 어느정도는 그렇지 않기도 하구요.
이런 부분들은 좁힐 수 있는 부분도 아니고 그럴려고 해서도 안되겠지요. :)

정말 말씀하신대로 Perl Best Practice는 프로그래밍 책 한권의 분량의 코딩 가이드라인 이야기 입니다.
그럼에도 불구하고 서평 쓴 사람마다의 후한 점수를 보면... 알 수 있겠지만
단지 가이드 라인만 제시하는 것이 아니라 Perl Culture와 생각할 거리를 던져 주는 좋은 책이죠.

“여러분의 프로그래밍 언어는 마법의 힘을 가졌나요?” 란 글을 재미있게 읽었습니다.
해당 글에서 링크가 걸린 “세상에서 제일 유지보수가 쉬운 프로그래밍 언어” 역시나
좀 길긴 하지만 유용한 글입니다.

그리고 노련한 Perl Programmer가 되려면, 1도, 2도 알아야 한다고 생각합니다.
말씀하신대로 쓰기만 하려면 자신만의 문법 일부와 즐겨쓰는 스타일만 알아도 충분하겠죠.
언어를 배울 때 가장 처음에 하는 것이 암기임을 생각할 때 감수해야할 것 같네요.
단순히 스크립트 언어라고 쉽게 보고 왔다가 데여서 그만두는 경우는 제법 보았습니다.

Perl의 경우 알아야 할 것이 많다는 것은 정말 사실입니다.
하지만 알아야 할 것을 익히고 났을 때는...
그때는 한단계 성장한 시점이겠죠. :-)

---------------------------
Smashing Watermelons~!!
Whatever Nevermind~!!

Keedi Kim

----
use perl;

Keedi Kim

aero의 이미지

어떻게 보면 맞는 말입니다. 위에서 keedi님이 언급하신
Perl Best Practices(PBP)같은 책도 나와 있으니
하지만 Conway 박사님이 다음과 같이 언급한바도 있듯이

"다르게 말하면 Perl로 유지보수가 힘든 코드를 만들 수 있습니다. 그건 C,C++,Java,C#,Python,Frotran,Ada,Eiffel 등등 모두다 마찬가지입니다. 하지만 또다른 의미로 Perl의 우수한 유연성은 어떠한 다른 언어들보다 아주 더 유지보수성 좋은 코드를 만들 수 있다는 것을 의미합니다."

그래서 나온것이 Perl::Critic(http://search.cpan.org/dist/Perl-Critic/) 이라는 모듈/유틸리티 입니다.
이것은 PBP에 나오는 코딩규약을 어느 정도 수준을 지정하여 강제할 수 있게 해줍니다.
미리 모든 규약을 알 필요가 없습니다. 채크 돌리고 위반사항이 나오면 설명대로 그대로 고쳐 주면됩니다.

요즘엔 큰 오픈소스 Perl프로젝트에서는 Perl::Critic 채크를 통과하지 않으면 commit도 못하게 하는곳도 있는걸로 알고 있습니다.

그 뿐만 아니라 어느 개발단위에서 쓰이는 자신들만의 코딩 규약이 있다면 추가 할수 도 있습니다.

http://perlcritic.com/ 에 가시면 웹상에서 바로 Perl::Critic을 테스트 해볼 수 있습니다.

만약 brutal 레벨까지의 채크를 통과하는 수준이면 어느 언어로 만든 코드보다 일관성 있고 유지보수성이 높을겁니다.

keedi의 이미지

brutal... 후덜덜... __;;;

---------------------------
Smashing Watermelons~!!
Whatever Nevermind~!!

Keedi Kim

----
use perl;

Keedi Kim

alfalf의 이미지

말씀하신대로 Perl을 사용하면서 코딩규약을 강제하기 위한 모듈을 사용하는 경우와 언어 자체가 일정한 코딩 규약을 강제하는 경우(예: Python) 사이에는 어떤 차이가 있을까요? 혹시, 전자와 같은 방법이 오히려 자유롭다는 Perl 언어의 특성을 회손하는 것을 아닐까 하는 생각이 듭니다.

aero의 이미지

그것은 언어설계자의 철학의 차이라고 봅니다.
Perl의 창시자 Larray Wall은 언어학전공자 입니다.
그래서 Perl은 우리가 일반적으로 말하는 자연어의 특성을 다소 지니고 있습니다.
예를들면 $_은 it정도의 의미이고 이것은 우리가 말 중간에 필요없는 말은 생략해도 의사소통에 문제가 없듯이 암묵적으로 생략을 하기도 합니다.
사람이 어떤 모국어를 배우면 나이가 들수록 구사하는 어휘나 표현력이 증가합니다.
하지만 나이가 든 사람도 어린이 수준의 말을 구사할 수 있습니다.
Perl은 한가지 일도 여러가지의 방법으로 수준에 맞춰서 할 수 있는 유연성과 표현성을 중시한거죠.
우리가 실생활에서 사람들이 나름대로의 수준과 개성을 가지고 제각각으로 말해도 의사소통에 별문제가 없지만 어떤 공문이나 법률같은것을 만들고 문서화 한다고 하면 개개인의 개성을 중시하기 보다는 누가봐도 이론의 여지가 없도록 최대한 Formal한 문체와 문법을 적용해서 작성합니다. Perl::Critic은 Perl의 원래 취지를 회손하는것이 아니라 그런것이라고 보면 됩니다.

반면 Python 창시자 Guido는 수학전공자 입니다.
그의 그러한 학문적 배경이 Python을 만들때 많이 영향을 끼쳤겠죠.

예전에 제가 번역했다가 날려먹은 Larry Wall의 강연내용이 있는데
다행이 yundream 님이 가져다 스크랩 해놓으셨더군요
http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/Perl/PerlPresentFuture
이걸 한 번 읽어보시길..

익명 사용자의 이미지

평소 일상언어를 자유롭게 사용하다가도
어떤 공문이나 법률관련 문서에 사용하는 언어에 대해서는 재학습이 필요하다는 점은
프로그래밍 언어에도 반영한 것이라면 개인적으로 그렇게 좋다고 느껴지진 않습니다.

어려운 법률용어와 일상언어의 거리감에서 오는 문제점은 실생활에서도 자주 드러나니까요.
(그런 부분때문에 변호사들이 밥먹고 사는 것이지만...)

아무래도 개인적인 철학이 언어학보다는 수학쪽인가 봅니다.

aero의 이미지

제가 예를 그렇게 든것이지만 다시 배워야 한다 거리감이 있다 그러는건 너무 나가신것 같네요 :)
아래 제가 Conway박사님의 코드를 좀더 명시적으로 바꾼 예를 보시면 거기서 쓰이는 keyword 나 문법이 뭐 새로운게 없습니다.
오히려 더 쉽고 명확한 문법으로 이해가 쉽게 풀어서 쓴겁니다.
Formal하다고 해서 그게 더 어려운 문법이나 어휘를 쓰는게 아니라는거죠.

그리고 Perl에 대한 오해는 Perl을 폄하하고 그 사용자와 신규유입 사용자층을 자신들의 언어로 끌어들이기 위해 선전하는 과정에서 과장된 점이 없지 않아 있습니다.

그런게 사실이라면 그 물량과 일관적인 분류와 관리, 자동 테스트 인프라, 재사용성에서 월등하고 다른 언어쪽에서도 부러워 하며 따라하려고 애쓰는 CPAN(http://search.cpan.org/) 같은 체계적인 Perl 모듈저장소가 존재할 수 없었겠죠.

http://search.cpan.org/recent 를 보면 하루에도 수십개씩 신규혹은 업데이트된 아주 다양한 모듈들이 활발하게 올라오고 있으며 CPAN을 따라하는 Ruby의 RubyGems, Python의 pypi, PHP PEAR 같은게 있지만 아직 CPAN 따라오려면 한참 먼 것 같더군요.

ssggkim의 이미지

Perl을 이해못하는 저로서는 왜 감동인지 잘 이해가...
간단하게라도 설명해 주실 분 없으실까요? :)

aero의 이미지

conway박사 인터뷰 마지막의 다음 문제에 대한 해결능력 때문입니다.

문제:
예를 들면, 몇 주 전에 저는 뉴질랜드의 리눅스컨퍼런스에 갔었는데 거기서 티켓추첨을 하기를 원했습니다. 문제는 티켓이 단일순서로 판매된 것이 아니였고 티켓을 모두 팔지도 못했습니다. 그래서 어떤 비연속적인 범위에서 추첨을 해야 하는데 해커컨퍼런스에 걸맞게 그들은 자연스럽게 이러한 작업을 해줄 프로그램을 만들어줄 자원자를 즉석해서 모집했습니다. 저는 그 자리서 Perl로 60초 안에 단지 두 개의 구문으로 다음과 같은 코드를 작성했습니다.

답:

 use List::Util 'shuffle';
 
        print and readline STDIN
                        foreach shuffle
                            12001..13000,
                            14001..15000,
                            40001..41000,
                            67001..68000,
                            96001..97000;

위 코드를 실행시키면 불연속적인 숫자list를 무작위로 섞어서 엔터를 칠때마다
하나씩 뽑아내줍니다.

conyway 박사는 이 문제를 60초 안에 통찰하고 구현해냈다는데 있습니다.
당시의 그 분 머리속으로 들어가서 상황을 시뮬레이션 해보자면

흠 불연속적인 숫자list이라 그럼 중간중간 연속된 숫자범위는..연산자를 써서 리스트를 만들고
그것들을 ,연산자로 하나의 리스트로 만들면 되겠군.
12001..13000,
14001..15000,
40001..41000,
67001..68000,
96001..97000;

그 다음은 이것들을 무작위로 섞어야 하는데 저것의 갯수를 구해서 그 범위에서 난수를 발생시켜 뽑아내야 하는데 이건 삽질이야 이미 Perl에는 리스트를 무작위로 섞어주는(shuffle) 함수가 있는 List::Util 이란 모듈이 기본 Core모듈로 들어가 있으니까 내가 바퀴부터 다시 만들필요는 없지 그걸 그냥 쓰면 간단하겠네.

use List::Util 'shuffle';

shuffle [위의 숫자set]

이제 이것을 하나씩 차례로 추첨하듯이 보여주어야 하는데 한 번에 쭉 다 나와버리면 재미도 없고 스릴도 없겠지? 그래 찍고(print) 엔터를 칠때 마다(readline STDIN) 하나씩 보여 주도록 하는게 좋겠군.

print and readline STDIN foreach [무작위로 섞어진 숫자set]

아마 다른 언어로 위 문제를 똑같이 동작하도록 코딩해보신다면 더 와 닿을겁니다.

ssggkim의 이미지

친절한 설명 감사드립니다. :)

aero의 이미지

이걸 아마 제가 짠다고 하면 이렇게 만들었을 겁니다.
최대한 암묵적 생략을 자제하고 타 언어 사용자가 봐도 어느정도 이해가 가도록....

#!/usr/bin/perl
use strict;
use warnings;
use List::Util 'shuffle';
 
my @list = ( 12001..13000, 14001..15000, 40001..41000, 67001..68000, 96001..97000 );
 
foreach my $num ( shuffle( @list ) ) {
    print $num;
    readline STDIN;
}

하지만 여기에는 Conway 박사의 코드에서 느껴지는 마치 한 편의 시같은 절제와 운율의 미학이랄까 그런 느낌은 얻기 힘들겁니다.

Conway 박사는 같은 말이라도 고수의 Perlish한 감성으로 우아하게 표현해낸거죠 :)

paek의 이미지

Perl 을 배우시는게 감동인지 이해가 가리라 봅니다.

이보다 간단한 설명이라.. 글쎄요... 제 능력이 미천해서인지 모르지만, 힘들지 않을까? 라는 생각이..

--------------------------------------------------------
세상에서 나의 존재는 하나이다.
그러므로 세상에서 나는 특별한 존재이다.
-
책망과 비난은 변화가 아니다.
생각만으로 바뀌는것은 아무것도 없다.

--------------------------------------------------------

세상에서 나의 존재는 하나이다.
그러므로 세상에서 나는 특별한 존재이다.
-
책망과 비난은 변화가 아니다.
생각만으로 바뀌는것은 아무것도 없다.

hongminhee의 이미지

아 요즘들어 Perl 공부하고 싶다는 생각이 너무 크네요. 이 글보고 더 커졌어요.

keedi의 이미지

이번 주 부터 스터디를 본격적으로 진행하는데
생각있으시면 토요일에 나와보세요~ :-)

http://www.perlmania.or.kr:9000/trac/wiki/PerlmaniaStudy

---------------------------
Smashing Watermelons~!!
Whatever Nevermind~!!

Keedi Kim

----
use perl;

Keedi Kim