책 감상: 알고리즘 트레이닝 Short Coding

이 책을 다 읽어본 것은 아니지만 몇 문제들을 보고 나서 감상문 하나 적어본다.

나는 탑코더나 ACM 프로그래밍 대회에서 우수한 성적을 거둔 사람이 꼭 훌륭한 프로그래머 혹은 소프트웨어 엔지니어라고 생각하지 않는다. 극히 좁은 범위로 한정된 문제를 빠른 시간에 푸는 능력이 복잡하고 규모가 큰 소프트웨어 설계에 그대로 적용되지 않기 때문이다. 지엽적인 문제에 대해 코딩을 재빨리 하는 능력이 과연 뛰어난 프로그래머를 가리는데 좋은 수단인지는 여전히 의문이다.

이 책을 처음 봤을 때도 좀 부정적으로 들여다봤다. 이 책은 ACM 문제와 같은 작은 코딩 문제를 수단과 방법을 가리지 않고, 컴파일러의 괴상한 특징까지 이용해, 가독성과는 안드로메다만큼이나 떨어져있는, 그야말로 짧은 코드를 만들어내는 것 자체가 목적이다. 여기에 쓰인 테크닉이 실제 개발에 쓰이기는 솔직히 쉽지 않다. 팀원 중 한 명이 코드 짧게 한다고 이 책에서 나오는 괴상한 for 루프 방식으로 코드 짜면 한 방 쥐어 박을 것이다.

한 마디로 "이 짓거리를 왜 하는거야?" 라고 중얼 거리며 부정적으로 책을 보기 시작했다. 그러나 어느 정도 읽고 나니 이런 부정적인 생각이 상당히 많이 가셨다. 이 책은 Short Coding 보다도 앞에 수식어로 붙은 '알고리즘 트레이닝'에 훨씬 더 큰 중점이 있는 책이다.

이 책은 주어진 문제를 가지고 일단 직관적으로 코딩을 한다. 그리고 여기서 코딩 테크닉을 이용하거나 더 나아가 새로운 알고리즘을 개발해 코드를 줄인다. 이 과정이 자세히 잘 나와있고 매우 흥미롭다. 이 책의 초점은 여기에 있는 것이다. 이 생각하는 방법을 엿 볼 수 있고 앞으로 나가기 전에 따로 생각할 수도 있어 그야말로 '알고리즘 트레이닝'이 된다. 비록 최종 결과물로 나온 괴상하고 알아보기 매우 힘든 짧은 코드 자체는 실제 개발 현장에서는 거의 쓰일 일이 없지만, 여기까지 도달하기까지의 사고 과정은 충분히 볼 가치가 있다.

원래 이 책은 일본인 저자가 쓴 책이다. 일본어와 한국어가 많이 닮아 있어서 그런지 번역도 매끄럽고 마치 우리나라 저자가 바로 쓴 것 같다. 요즘 경기가 불황이다보니 책도 많이 팔리지 않는다고 한다. 2만 7천원이면 저렴한 가격도 아니다. 그래도 피자 두 판 가격이면 된다. 늘 느끼지만 음반 한 장, 책 한 권을 피자 가격과 생각하면 별로 비싸다는 생각이 안 든다. 이 책이 피자 두 판 보다는 가치가 있는 것은 확실하니까. 정말 오타쿠가 연상될 정도의 기가막힌 테크닉과 잔머리를 보면서 웃음이 떠나지 않는 책이다.

 

몇 가지 기가 막혔던 부분들

1. 숫자 30000을 코드로 쓰면 5바이트가 필요하다. 저자는 이걸 줄이기 위해 기상천외한 방법을 동원하는데, 이 3만을 16진수로 바꾸면 7530h가 되고 75는 소문자 u에, 30은 숫자 0의 아스키코드가 된다. 그래서 이 30000을 'u0'로 표현해서 1바이트를 줄이고 있다. 예를 들어, A[30000]을 A['u0']으로 줄이는 것이다.

2. scanf로 값을 읽다가 EOF를 만나게 되면 -1을 반환한다. 그래서 파일 끝까지 읽는 for 루프를

for(;scanf("%f",&a)!=-1;)

정도로 표현할 수 있을 것이다. 그러나 ~ 연산을 이용하면 코드를 3바이트나 줄일 수 있다. -1에 대해 ~ 연산을 하면 0이 된다. -1은 모든 비트가 다 켜져있고 이것의 1's complement를 구하는 ~를 취하면 0이 된다. 그래서

for(;~scanf("%f",&a);)

로 줄일 수 있다. 이 정도 테크닉은 테크닉 축에도 들어가지 않는 일상적인 코드가 된다.

3. 피보나치 수열을 푸는 코드(237 페이지)도 무척이나 재밌다. 일단 처음 보게 된 것은 피보나치 수열을 행렬 곱셈을 통해 구할 수 있다는 사실이었다. 난 이거 처음 봤는데... 놀라웠다.

그러니까 n 만큼 행렬 곱셈을 하면 피보나치 수가 나온다는 것이다! 이건 큰 수에 대해 피보나치 수를 구할 때 시간을 대폭 단축 시킬 수 있다. n이 만약 65536이라면 이 곱셈을 65536번을 할 필요도 없고, 오른쪽 행렬을 M이라고 한다면 M^2를 16번만 곱하면 되기 때문이다. 이런 방법으로 M^2, M^4, M^8 등에 대해 미리 lookup table을 만들면 매우 빠르게 수 억에 해당하는 n에 대해서도 값을 계산할 수 있게 된다. 이 문제 뒷 부분에도 코드를 줄이기 위해, 비록 수학의 증명과 같이 엄밀하지는 않지만, 기발한 아이디어가 동원되고 있다.

 

아쉽거나 부족한 점

1. 한가하게 이 책을 처음부터 정독할 시간이 부족해서 띄엄띄엄 발췌해서 보고 있다. 그러다보니 약간 이해에 애로를 겪는 부분이 많다. 242 페이지에 있는 피보나치 코드를 보면

for(;scanf("%d",&n),~n;)

과 같이 괴상한 루프가 보였다. for에서 루프 탈출문을 검사하는 코드가 ,로 연결되어 있었다. 이런 테크닉은 이미 앞 부분에 설명이 되어 이 챕터에서는 설명을 빠뜨리고 있다. 그래서 처음부터 책을 읽지 않았다면 여기에 쓰인 테크닉을 이해하기 위해서 책 앞 부분을 들춰야하는 번거로움이 좀 있었다. 여기에 쓰인 테크닉을 정리해서 색인으로 만들었으면 좀 더 좋았을 것 같다.

2. 코드의 폰트가 썩 맘에 들지 않는다. 한빛 웹블로그에 관련 글을 보면 폰트에 대한 고민을 읽을 수 있었다. Myriad Pro라는 가변폭 글꼴을 그것도 볼드체로 해서 나와서 처음에는 당혹스러웠다. 특히 가변폭 글꼴이라 "코딩에는 무조건 고정폭이지!" 라는 선입관과 충돌하여 적응하는데 좀 시간이 걸린다.

3. 책의 종이 재질에 대한 글도 잘 나와있는데, 나는 Short Coding에 쓰인 백색모조지를 별로 좋아하지 않는다. 너무 프린트 A4 용지 같은 느낌이 와서 그냥 프린트로 쓱 출력한 느낌이라고 할까?

 

p.s. 한빛 출판사 홈페이지의 전문가 Zoom In에 어떤 분이 이 책을 평하길:

Short Coding은 건강한 코드를 생산하는 작업이다. 코드량을 줄여 건강하고 날씬한 코드를 만드는 일이다. 생성된 코드를 다듬고 다듬어 효율적이면서 직관적인 알고리즘을 만들어 내는 작업이니 어찌보면 리팩토링의 범주에도 들지 않겠는가?

이 의견에는 동의할 수 없다. Short coding에 나오는 코드는 건강한 코드와는 거리가 매우 멀다. 변태스럽고 편집증스러운 코드이다. 나는 긴 변수명과 긴 함수명을 좋아한다. 코드를 줄인다고 속도를 더 빠르게 하겠다고 /4를 >>2로 바꾸는 것도 안 좋아한다. 어차피 이 정도는 컴파일러가 알아서 해준다. 가독성과 짧은 코드는 거의 무관한 독립적인 관계이다. Short coding에서 최종적으로 만들어낸 짧은 코드는 전혀 직관적인 알고리즘도 아니고 (나쁘게 말하면 정답만 뱉어내는 특화된 코드) 리팩토링과도 전혀 관계 없다. 이 책의 가치는 위에서 이야기 했듯이 짧은 코드 자체가 아니라 거기까지 도달하는 과정에 있다.

by object | 2008/08/02 15:55 | 컴퓨터 | 트랙백(1) | 덧글(20)
트랙백 주소 : http://minjang.egloos.com/tb/2003405
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Tracked from 그니 at 2010/03/24 17:14

제목 : 책 감상: 알고리즘 트레이닝 Short Coding
책 감상: 알고리즘 트레이닝 Short Coding...more

Commented by lifthrasir at 2008/08/02 16:33
한때 코드 골프 질을 꽤나 해 댔던 사람의 입장에서 이런 책이 나왔다는 것 자체가 놀랍군요. 그것도 번역되었다니...
Commented by object at 2008/08/03 10:36
'타수'라는 말로 코딩 골프질이라는 말을 만들어 내더군요. 재밌습니다.
Commented by xeraph at 2008/08/02 22:57
지금 IE7로는 아예 페이지가 안 열리는데 확인 한 번 해보셔요;;
그나저나 이런걸 리팩토링의 범주에 넣으려고 하다니 충격과 공포 (..)
Commented by xeraph at 2008/08/03 10:33
SiteMeter 버그였네요 음--;
http://isc.sans.org/diary.html?storyid=4819
Commented by object at 2008/08/03 10:36
아 그런 일이 있었군요....
Commented by 행인2 at 2008/08/02 23:17
오오 .... 이런 괴작이 존재하긴 존재했군요.. 저는 Hacker's Delight 만 읽고도 문화충격에서 벗어나지 못했는데, 이것은 얼마나 괴상할지 알고싶지도 않군요. (뭐 그래도 한권 구해봐야지..)
Commented by object at 2008/08/03 10:36
상상을 초월합니다. 코딩을 좋아하시면 숏코딩과 상관없이 이 책은 한 번 볼만 합니다.
Commented by hoya at 2008/08/03 01:33
피보나치 수열 좀 멋진데요?
Commented by object at 2008/08/03 11:00
처음에는 거짓말 하는 줄 알았습니다.
Commented by coffeejava at 2008/08/03 13:52
재미 있어 보이는데요? 한권 주문 했어요~^^
Commented by 가나다 at 2008/08/03 19:15
저자는 변태...이겠네요;
Commented by 오스카 at 2008/08/04 11:29
흐음, Hacker's Delight에 필적할만한 책일 거 같은 느낌이... 한 번 읽어봐야겟군요. ㄷㄷㄷ
Commented by object at 2008/08/06 16:45
Hacker's Delight 이라는 책을 Knuth의 TAOCP Volume 0: Bit Manipulation으로 비유하는 사람이 있네요. 저는 첨 들은 책인데 코드를 보니 이건...
Commented by daybreaker at 2008/08/04 20:52
제 친구 중에 모군이 이런 류의 코딩을 아주 좋아(?)하죠; Code golf라고 해서 이런 기법들을 언어별로 겨루는 사이트도 있습니다.;; 컴파일러와 프로그래밍 언어에 관심이 많으시니 esoteric programming language들에 관한 정보도 좀 찾아보시면 식겁하실 듯.. =3=3
Commented by kors21 at 2008/08/05 00:05
Linear Algebra 시간에서 피보나치 수열 행렬로 푸는 부분이 나왔던게 기억나네요. (Linear Algebra (Strang 저))
Commented by object at 2008/08/05 03:11
그 책으로 선대를 배웠건만...
Commented by CECRI at 2008/08/07 01:24
오... 관심가는 책이네요 ㅎㅎ

사실 C로 코딩하다 보면 심심할때 저런 변태 코드를 하나정도 만들어 보긴 하죠... 사실 루프속에서 탈출조건을 콤마로 연결하는건 자주 씁니다. 별로 가독성이 좋지 않을때도 있지만... 뭐 콤마 연산자는 뒤의 expression의 결과를 return하니까요..
Commented by 어라 ㅠㅠ at 2009/09/15 01:34
굉장하군요!! 이렇게 변태적일수가!
Commented by 행인1 at 2011/04/01 13:42
매우 오래된 글을 이제야 보게 되는군요.
저는 이 책을 최근에야 접해보게 되었습니다만.......
아쉬운 점1에 적어놓으신 for 의 종료 조건을 , 로 열결하고 있다... 에 대한 부분에 의의를 제기하고 싶은데요.

반드시 하나의 for 문에 하나의 변수만 사용해야 한다는건 없습니다.
학교 C 프로그래밍 시간때 이미 나온 내용인데, 중요하지 않다고 빠뜨리는 것 중 하나죠.

int x, y;

for (x = 0, y = 0; x<10, y < 20; x++, y+=2)
{
....

}

이런 문법은 C/C++ 기초문법을 배울 때 나오는 예제들인데요...

이 책은 어디까지나 C를 한번이라도 해본 사람들을 기준으로 썼기 때문에, 굳이 문법에 대한 설명을 해놓을 필요가 없다는거죠.
다시 말해 C 문법을 어느정도 알고나서 이 책을 봐야지 코드를 이해하는데 도움이 될 것 같아요
Commented by 김민장 at 2011/04/01 14:34
그렇네요. 댓글 보고 나니 제가 멍청한 실수를 했네요. 저도 매우 자주 "a=10, b=c;"와 같은 표현을 쓰는데 for 문 안에 있다보니 잠시 헷갈렸군요. 그냥 ;로 끝나는 statement-list가 올 수 있으므로 말씀대로 상관이 없습니다.

그런데 제가 제기한 문제는 '모호'하다는 점이죠. 특히 "x<10, y<20"언급하신 예제... 제가 C/C++을 15년 정도 하는데 저런 코드를 제가 본 적은 없군요; 그리고 for의 가운데는 boolean expression인데 여기에 ,가 있으면 어떻게 해석해야하나 모호한점이 있지요. 물론 수학에서 , 표현은 and 연산이라 두 조건이 모두 만족이 되어야 하지만, 저런 모호한 표현을 일반 코드에서 쓰는 것은 문제가 있습니다. 그리고 예제로 주신 코드는 사실 매우 불필요한 코드이죠. 유도 변수를 저렇게 두 개 쓰는게 합리적인지는 매우 의문이 듭니다.

:         :

:

비공개 덧글

<< 이전 페이지 다음 페이지 >>





by 김민장 2008 이글루스 TOP 100
최근 등록된 덧글
개발자 입장에서의 수많은 ..
by Jiyoon at 02/04
저도 아들 돌잔치때 돌잡이 ..
by 박상욱 at 01/18
미국 대학원 원서 작성중에 p..
by 태클사이야 at 01/13
TO: 박PD 로그인 하지 않아..
by 박응용 at 01/10
http://gigglehd.com/zbx..
by dhunter at 12/28
우와.. 좋네요. 태반이 ..
by 윤광배 at 12/17
항상 좋은 글 잘 보고 있습니..
by y2k at 11/23
글이 좋아서 제 블로그에 담..
by 쏭섭 at 11/23
최근 등록된 트랙백
조엘 스폴스키의 강연 (Sta..
by 인덕원칸타타
[Redis] sds.c를 분..
by 조급하지말고 천천히
메뉴릿
이글루 파인더

website counter

Add to Google

rss

skin by 이글루스