조엘 온 소프트웨어

조엘 온 소프트웨어조엘 온 소프트웨어 by Joel Spolsky

지인에게 생일 선물을 주느라 ‘조엘 온 소프트웨어’를 사면서 내 것도 함께 두권을 샀다. 원래 생일 선물 같은 걸 챙기는 타입은 아니지만, 내 생일 때 받아먹은 터라.

‘조엘 온 소프트웨어’는 이미 구독하고 있었을 뿐만 아니라, 몇몇 글들은 이미 읽어본 터여서 대충 넘어가면서 토요일 하루만에 읽을 수 있었다. 전체적인 내용은 기본적인 소프트웨어 엔지니어링의 주장에 충실하면서 Mythical Man-MonthPeopleware에 준하는 내용이었다. 물론, 그런 것과는 별로 관련없는 업계의 동향에 관한 내용과 전략에 관한 내용도 있긴 했다. 다른 점이라면 좀 더 재미있고 친근하게 설명한달까. 마치 누군가의 블로그를 보는 것처럼. (당연하다!) 칭찬할만 점은 어느 하나의 기술이나 의견에 치우치지 않고 균형잡힌 시각을 보여준다는 것이다. 어느 정도 권위가 있는 엔지니어들의 글을 보면 항상 느낄 수 있는 것이기도 하다.

번역은 – 그동안의 IT 관련 서적들의 번역 품질에 비해 – 매우 훌륭했다. 하지만, 역시 조엘의 유머를 우리말로 옮겨놓으니 재미가 떨어지는 것이 사실이었다. 역자주에서도 꼼꼼히 원작의 오류를 정정하거나 독자들이 모를만한 사실들을 언급해두고 있었던 점은 칭찬하고 싶다.

좀 마음에 안드는 점은 역자의 블로그 내용이나 번역 경험담을 중간중간에 넣어놓은 것이었다. 블로그 내용 같은 경우에는 원작의 내용과 관련된 내용이었는데, 조엘이 기술한 것 이상의 내용은 없었기 때문에 무의미한 것이었고, 번역 경험담은 역자 후기 정도에나 들어갈 내용이지, 중간중간에 들어가서 주의를 산만하게 만들만한 가치를 가진 것은 아니라고 생각한다. 분명히, 훌륭한 역자는 원작의 난해한 부분을 설명해주거나 새로운 방식으로 해석해줌으로써 원작과 다른 새로운 가치를 만들어낸다. 하지만, 조엘온소프트웨어 번역판에 삽입된 역자의 글들은 그럴만한 가치는 없었다고 생각한다.

Update 2005/09/09: 역자의 블로그 내용과 번역 경험담에 대한 의견 추가.

조엘 온 소프트웨어 더 읽기"

친절한 금자씨 OST

dcf 파일을 던져주는 친구 녀석 때문에 우연히 멜론에 들어갔다가, 친절한 금자씨 OST를 발견하고는 바로 멜론 서비스를 결제해버렸다. 이로써 렛츠뮤직 (한동안 안들어갔더니 서비스가 제대로 안되고 있는 것 같다), 쥬크온, 멜론 세가지 서비스의 사용자가 되어버렸다.

친절한 금자씨 OST CD로도 사줄 예정.

친절한 금자씨 OST 더 읽기"

친절한 금자씨

복수 삼부작의 완결편

박찬욱 감독의 "복수는 나의 것", "올드 보이"를 본 사람이라면 복수 삼부작이 나오지 않을까 예측해보는 건 당연하다. 알다시피 친절한 금자씨는 그 삼부작의 완결에 해당하는 작품이다.

세개의 작품을 늘어놓고 보면, 얘기하는 방식에 있어서 어떤 스펙트럼이 보인다. "복수는 나의 것"이 일어난 사건을 그대로 보여주는 사실적인 이야기 방식이었다면, "올드 보이"로 오면 이미지와 상징을 통한 이야기를 한다. "친절한 금자씨"는 한층 더 강렬한 이미지를 사용하여 상징을 표현하려 하는 것 같다. 그러한 이미지들이 많이 등장하다보니 전작들보다 좀 더 화려하고 즐거운 분위기.

전작들을 본 사람들이라면, 전작들에 출연한 배우와 대사를 알아보는 것도 작은 재미.

박찬욱은 최고의 감독?

대사, 의상, 화면 구성, 음악 어느 하나 할 것 없이 최고였다. 한국에 이만한 감각을 가진 감독이 몇이나 있을까.

심각한 분위기에서 관객들의 웃음을 유도하는 박찬욱 감독의 단골 기법은 너무 능수능란해서 식상할 정도였다.

완벽한 복수자 캐릭터 금자씨

13년 동안의 복수 계획은 그야말로 완벽 그 자체다. 이러한 과정 자체를 보는 것도 하나의 즐거움이겠지만, 아무래도 복수의 절정은 그야말로 복수의 대상을 극한의 고통에 빠뜨리는 그 순간이다. 금자씨의 복수는? 역시 완벽하다. 금자씨가 직접 백 선생에게 주는 물리적인 고통은 극히 일부에 불과함에도 불구하고, 아마도 백 선생은 극한의 고통을 겪었을 것이다. 그야말로 완벽한 복수자 아닌가.

하지만, 플롯상에서 금자씨의 복수 계획은 너무 일찍 노출되고, 복수의 형태 자체가 그렇게 참신한 것도 아니고, 그렇다고 복수의 세세한 표현이 크게 충격적이지도 않음에도 불구하고 너무나 긴 시간을 할당한 것은 상당히 불만스러웠다. 전작들에서의 고어한 표현들에 대한 관객들의 비판들이 박찬욱 감독에게도 영향을 미친걸까 하고 생각할 정도였으니.

이영애

영화가 시작했을 때만해도 과연 이영애가 복수자의 캐릭터로 어울릴까 약간 의심하고 있었는데. 영화를 볼 수록 나긋나긋하고 조근조근한 목소리에 누구나 호감을 가질 수 있는 얼굴을 가진 이영애가 아니었다면 과연 누가 저 역을 소화할 수 있었을까 싶은 생각이 들었다.

노란색 죄수복의 이영애, 물방울 무늬의 원피스와 썬글래스 차림의 이영애, 잠옷 차림의 이영애, 가죽 코트 차림과 붉은색 아이섀도우의 이영애 모두 예뻤다. 그녀는 너무 예뻐서, 화면 한 구석에 이영애가 서 있기만 해도 화면 전체가 예뻐 보일 지경이었다.

복수에 관하여? 인간 군상에 관하여

스토리가 진행되면서 영화는 백 선생(최민식 분)은 어느 누구도 감히 용서할 수 없는 죄를 지은 사람이란 것을 보여준다. (식탁에서의 섹스 장면은 억지스러울 정도?) 이것은 금자씨가 무슨 형태로 복수를 하든 죄책감을 느끼지 않아도 되는 자유를 보장해준다. 물론, 죄책감의 주체는 관객이다. 박찬욱 감독은 우리들을 양심의 우리에서 풀어준 후에, 자 어떻게 할꺼냐 하고 물어본달까. 금자씨로부터 복수를 의뢰받은(?) 평범한 모습의 부모들은 어쩌면 관객들 자신을 대입시키기 좋으라고 등장시킨 분들 일지도 모른다.

영화가 막을 내릴 즈음 눈이 오는 장면에서, 제니는 입을 벌리면서 하얀색 (두부 모양의) 케익을 먹고 하얗게 된 혀를 보여준다. 아무것도 먹지 않은 근식이 보통의 혀를 보여준다. 피로 만든(?) 케익을 먹은 금자씨는 당연히 붉게 물든 혀를 보여주어야 하지 않은가 싶더니, 그녀는 입을 꼭 다물고 그녀의 혀를 보여주지 않는다. 모든 사람들은 태어날 때 같은 색깔의 혀를 가지고 태어난다. 하지만, 세상을 살아가다보면 그렇게 여러가지 색깔의 혀를 가진 사람들이 생기게 되고 때로 그 중에는 자신의 혀를 내보이고 싶지 않은 사람도 있는 것이다.

친절한 금자씨 더 읽기"

fread/ifstream::read/mmap performance comparison

예전에 comp.lang.c++.moderated에서 iostream performance가 fread를 사용하는 것에 비해서 나쁘다라는 글을 읽고 해당 테스트 케이스를 사용하여 실제로 테스트해 보았다. 테스트 케이스는 일정 크기의 파일 내에서 특정 레코드를 찾아내는 코드로, 읽기 오퍼레이션에 대한 성능 테스트에 가깝다.

결론은 fread와 ifstream::read는 별 차이가 없고, mmap은 엄청나게 빠르다는 것이다. gcc 버전에 따라 약간의 우위를 보이는 것이 흥미롭다.

fread/ifstream::read/mmap performance comparison 더 읽기"

Language Oriented Programming

Language Oriented Programming: The Next Programming Paradigm by Sergey Dmitriev

Part 1에서는 Language Oriented Programming (이하 LOP)이란 paradigm이 어떻게 나오게 되었는가를 설명하고 있다. 지난 번에 소개했던 Martin Fowler의 글과 내용은 거의 중복된다.

To achieve this independence, I need the freedom to create, reuse, and modify languages and environments. For this freedom to be practical, it needs to be easy to archive.

OOP나 DSL과 같은 높은 레벨의 abstraction을 제공하는 것은 생산성 향상에 있어서 중요한 의미를 가질 것이라는 것까지는 누구나 공감할 수 있는 내용일 것이지만, 그냥 지나치기 어려운 대목은 아무래도 DSL을 쉽게 만들 수 있도록 함으로써 그러한 이익을 극대화할 수 있다는 논리일 것이다. 물론, LOP의 성공 여부는 그것이 얼마나 쉬워질 수 있느냐하는 문제일 것이다. 얼마나 쉬워질 수 있는가에 대한 설득력 있는 논리가 부족한 것이 약간 아쉽다.

Part 2에서는 JetBrains의 Meta Programming System (이하, MPS)에서 어떻게 Language Oriented Programming을 구현했는가에 대해서 설명하고 있다. 즉, DSL을 쉽게 만드는 것이 중요하다는 것을 강조하는 것이 Part 1이라면 어떻게 쉽게 만들 수 있도록 할 것인가를 보여주는 것이 Part 2의 내용이다. MPS는 현재 JetBrains가 개발한 상용 Java IDE인 IntelliJ IDEA의 플러그인으로 구현되어있다. MPS는 Early Access Program을 통해서 개발중인 제품이 공개되고 있기 때문에 튜터리얼 (스크린샷 포함)을 약간 따라가보았다. DSL을 설계하기 위해서는 기본적으로 Structure Language, Editor Language, Transformation Language/Template을 사용하여 DSL을 표현해야하는데, 이러한 과정이 GUI를 통해서 이루어지는 것이 상당히 흥미로웠다.

The ideas underlying LOP and MPS are not new, and have actually been around for more than 20 years. The term Language Oriented Programming itself has been around for at least 10 years. What is new is that these ideas have silently saturated the software development community, and their time has finally come.

결론 부분에서 얘기하는 것과 같이 현재에 주목을 받고 있는 여러가지 기술들은 대부분 옛날에 만들어진 개념으로부터 출발하고 있다. 하지만, 그것이 주목을 받는데에는 거기에 근접한 기술들이 충분히 성숙해야할 뿐만 아니라 그 기술을 사용하는 사람들로부터 유효한 기술이라는 공감대를 형성하는 것이 필요하다. LOP가 과연 그들이 얘기하는 것처럼 OOP를 대체하는 시대를 뛰어넘는 기술일까? 지켜볼만한 가치는 있는 것 같다.

Language Oriented Programming 더 읽기"

The Design of C++0x

The Design of C++0x는 Bjarne Stroustrup이 CUJ 2005년 5월호에 기고한 글이다. C++0x 디자인의 기본적인 정책에 대해 설명하고 있다.

먼저 C++0x에서의 언어 디자인에 관해서는 최대한 호환성을 고려할 것이지만, 충분한 이익을 얻을 수 있는 부문이라면 호환성에 있어서의 작은 희생도 감수하겠다고 얘기하고 있다.

C++0x will be almost 100-percent compatible with the existing Standard C++. … We aim for compatibility but realize that there may be cases where a large advantage is worth paying for by small incompatibilities.

그리고, C++의 강점은 일반성(generality)라고 얘기하고 있고, 이러한 장점을 강화하는 방향으로 갈 것이라고 얘기하고 있다.

C++’s emphasis on general features (notably classes) has been its main strength, and often its lack of specialized features (such as “properties” and threads0 has been seen as its main weakness. … Nevertheless, we must keep the focus on general features aimed at efficient abstraction; the huge diversity of the C++ community requires that. … The obvious areas where C++ could be improved for greater generality is through better support for generic programming and more flexible initialization/construction mechanisms. Is is also obvious that some support for concurrency is needed as many forms of concurrent, parallel, and distributed programming are becoming common.

프로그래머가 프로그래밍 언어를 대하는 태도에 관한 짤막한 의견.

You don’t want to become a language expert-you want to be (or become) an expert in your own field and know just enough of some programming language to get your work done.

type safety는 compiler optimization 등의 이점을 얻기 위한 중요한 C++의 특성임을 강조하고 있다. 언어의 변경을 위해서 완벽한 type safety를 얻기는 힘들지만, 표준 라이브러리를 통해서 이를 강화하겠다고 얘기하고 있다.

C++0x will not be able to close all the loopholes in the C++ type system, but it will not introduce new holes and it will provide ways of avoiding inherently unsafe facilities-primarily through the Standard Library providing (compile-time or run-time) type-safe alternatives.

C++의 중요한 원칙 중의 하나인 zero-overhead principle을 재확인하고 있다.

That is, the zero-overhead principle: “what you don’t use, you don’t pay for” and “what you use can be implemented without overhead compared with hand coding” is still the bedrock of C++.

라이브러리의 중요성.

A language cannot support everything, but conceivably, a large set of libraries could. … Library extensions will be preferred to language extensions.

표준 결정 과정에서 벤더들에 대한 고려(예를 들어 구현의 용이성)도 중요한 요소임을 강조하고 있다.

The development of C++0x must be timely and to gain acceptance from vendors, new language features must be easier to implement that the most difficult C++98 features. … we dislike dialects. … My suggestion is for programmers to avoid nonstandard features whenever possible.

C++ Programming Language를 읽어보신 분이라면, C++0x 또한 C++의 기본 철학에서 크게 벗어나지는 않는다는 것을 알 수 있을 것이다. 특히 눈에 띄는 점은 라이브러리에 대한 강조.

Whereas we’ll be cautious and skeptical about language extensions, we’ll be aggressive and opportunistic when in comes to new library-especially for libraries that extend the range of portable support for systems programming.

The Design of C++0x 더 읽기"

Static Typing Where Possible, Dynamic Typing When Needed

PDC 05에서 C# 3.0에 대한 발표가 예정되어있는 가운데, 흥미로운 paper가 있더군요. C# 3.0에는 type inference, contract, lazy evaluation이 들어갈지도 모를 일입니다.

Static typing is a powerful tool to help programmers express their assumptions about the problem they are trying to solve and allows them to write more concise and correct code. Dealing with uncertain assumptions, dynamism and (unexpected) change is becoming increasingly important in a loosely couple distributed world. Instead of hammering on the differences between dynamically and statically typed languages, we should instead strive for a peaceful integration of static and dynamic aspect in the same language. Static typing where possible, dynamic typing when needed!

Static Typing Where Possible, Dynamic Typing When Needed (pdf)

Dynamic Typing in C#

Static Typing Where Possible, Dynamic Typing When Needed 더 읽기"

우주 전쟁 War of the Worlds

The War of the WorldsThe War of the Worlds by H. G. Wells

내가 어릴 때 읽은 것이 문고판이 아닌가하는 의심도 들었고, 원작을 다시 한번 읽어보기로 했다. 저작권 시효가 만료되어서 – 100년도 더 오래전에 나온 작품이니 – 그런건지 여러 권이 나와있었다. 아무래도 원작의 삽화가 들어있다는 황금가지판이 마음에 들었다.

분량이나 내용면에서 어릴 때 읽은 거랑 별 차이가 없었던 것 같긴 하다. 새삼스럽게 이 책은 20세기 이전의 영국을 배경으로 쓰여졌고, 그 당시는 마차와 포병대가 있던 시절이었다는 것, 그리고 스필버그의 우주 전쟁은 현재에 맞게 각색된 것이라는 점을 깨달았다. 주인공은 목사와 포병, 그리고 길에서 만난 두 여인네들을 빼고는 다른 사람이랑 다니지 않는다. 영화의 오길비 (팀 로빈스 분)는 소설의 목사에 가깝지만, 포병의 캐릭터도 약간 포함하고 있다는 생각이 든다. 그리고, 소설엔 피를 화성인이 직접 섭취하는 걸로 나오고 화성 식물을 재배하기 위해서 뿌리는 것은 아니다. 역시 수류탄으로 삼발이를 파괴하는 건 스필버그의 작품이다.

영화 “우주 전쟁”의 결말 논쟁을 보다보면, 인류의 정복 전쟁에서 병균이 어떻게 활약했는 가 – 여기에 대해 궁금한 사람은 제레드 다이아몬드의 총,균,쇠를 읽어보라 – 를 들어 원작의 결말을 옹호하는 사람들이 있다. 그처럼 우주전쟁이 인류의 전쟁에 빗댄 정치적 의미를 가지고 있다는 점은 아래와 같은 대목에서 확연히 드러난다. 현대에 영화로 각색된 우주 전쟁이 미국의 제국주의를 비판하는 정치적 메시지를 담더라도 전혀 이상하지 않은 것이다. 만약 그랬더라면 얼마나 좋았을까.

하지만 화성인들을 잔악한 종족이라고 판단 내리기 전에, 우리는 사라진 아메리카 들소나 도도새와 같은 동물뿐 아니라 같은 인간이지만 지능이 낮은 종족에게 우리가 가했던 잔악하고 무자비한 폭력을 기억해야 한다. 태즈메이니아 사람들은 보통 사람들과 비슷하게 생겼음에도 불구하고 유럽 이민자들에 의해 50년 만에 절멸되었다. 만약 화성인들이 똑같은 생각으로 전쟁을 벌인다면, 우리가 그에 대해 불평을 늘어놓으며 자비의 전도사라도 되는 양 행동할 수 있을까?

인간과 화성인과의 관계는 주인공과 포병과의 대화에서 극명하게 드러난다. 이어지는 포병의 화성인이 점령한 지구의 미래에 대한 예측도 꽤 흥미롭다.

"이건 단지 인간과 개미의 관계와 같은 거예요. 개미들은 자신들의 도시를 건설하고, 삶을 살아가고, 전쟁을 하고, 혁명을 합니다. 인간이 그들을 내쫓기 전까지 말입니다. 그러나 인간이 내쫓으면 개미들은 쫓겨나게 되죠. 지금 우리가 바로 그 개미들입니다. 단지……"

내가 말했다.

"그래요. 우린 먹을 수 있는 개미들이죠."

에필로그에서 주인공은 우주 전쟁이라는 경험이 인류에게 준 의미를 설명해준다. (소설에서 주인공의 직업은 작가다) 마치 1차대전과 2차대전을 겪은 인류의 모습과 같지 않은가? 1차대전이 일어나기도 전에 쓰여진 소설에서 말이다.

어쨌든, 우리가 또 다른 침공을 예상하든 안 하든, 미래를 보는 인간들의 관점은 이번 사건으로 인해 많이 수정될 것이다. 우리는 이제 지구가 우리 인류만을 위한 안전하고 영속적인, 보호받을 수 있는 곳이 아니라는 사실을 알게 되었다. 우리는 갑자기 우주에서 나타날 수 있는 보이지않는 선한, 혹은 악한 존재에 대해서 결코 예측할 수 없다. 우주라는 광대한 구조 속에 살아가는 우리에게, 화성인의 침공이 궁극적으로 어떤 혜택을 준 것도 사실이다. 미래에 대한 강한 믿음을 잃게 만들었다는 것이 가장 커다란 결실일 것이다. 이 결실이 인간의 과학에 가져다 준 선물은 실로 어마어마하며, 이것은 공공 복리에 대한 개념도 더욱 증진시켜 주었다. 한없이 펼쳐진 우주를 가로질러, 화성인들은 그 개척자들의 운명을 지켜보고 깨달은 바가 있을 것이며, 그것을 기반으로 금성에서 안전한 정착지를 찾고 있을 것이다. 그렇다고 해도, 아직 몇 년 동안은 화성에 대한 세심한 관측을 조금도 늦추지 말아야 한다. 쏘아 올린 발사체나 유성은 인류의 자손에게 피할 수 없는 불안감을 가져다 줄 것이다.

사물을 보는 인간의 시야가 넓어졌다는 것도 결코 과장된 표현이 아니다. 우주선이 오기 전까지, 우리가 사는 작고 아름다운 혹성을 제외하고는 이 광할한 우주 속에 어떤 생명체도 존재하지 않는다는 인식이 널리 퍼져 있었다. 그런데 이제 우리는 더 멀리 내다보게 되었다. 만약 화성인들이 금성에 도달할 수 있었다면 인간이 그 일을 해내지 못할 이유가 없다. 그리고 언젠가 태양이 서서히 식어 들어가 지구에서 살 수 없는 날이 결국 오게 되면, 그 때 이 곳에서 시작한 생명의 끝은 우주로 뻗어 나가, 가능한 범위 안에 있는 자매 혹성으로 이주하게 될 것이다.

우주 전쟁 War of the Worlds 더 읽기"