나는 언젠가는 꼭 함수형 언어를 한 번 공부해보고 싶었는데, 그 시간이 생각보다 일찍 찾아왔다.
처음 얼마간 이 책을 공부하면서는 정말 미칠 것만 같았다. 배열도 없고 자료구조에 랜덤액세스로 접근할 수도 없으며 변수에 값을 재할당 할수조차 없으니 불편함이 이만저만이 아니다. 이 모든 것을 재귀적으로 생각하고 표현해야 하는데(간단한 루프조차도), 그것은 고1때 점화식을 공부하면서 수학을 포기해버린 나에게는 참 고통스러운 일이었다.
우리들은 ACM 문제들을 주 마다 하나씩 풀어보고 있는데, 모임이 있는 목요일까지는 아주 고통스러운 나날들이다. 나는 마치 예전 처음 C언어를 공부할 때 Linked List를 작성하면서 코드를 썼다 지웠다 쩔쩔매던 그 시절로 돌아간 것만 같다. 구조체 안에 자신을 가르키는 포인터가 있다는 것은 나를 아주 미치게 만들었었다. 정말 그 당시와 비슷한 기분이다.
다음번 과제는 'The Cat in the Hat' 이라는 문제인데, C로 작성된 코드가 인터넷에 있어서 얼랭으로 다시 작성해봤다. 보고 그대로 옮기는 것 조차 쉽지 않다. 아직 함수형 프로그래밍에 익숙하지 않아 몇몇 부분은 마치 C로 작성한 것 같은 느낌을 준다.
%highest common factor
hcf( N ) -> hcf( N, 2, 0, [], [] ).
hcf( 1, I, P, FL, CL ) -> [ FL ++ [I], CL ++ [P] ];
hcf( N, I, P, FL, CL ) when ( N rem I ) =:= 0 -> hcf( N div I, I, P + 1, FL,
CL );
hcf( N, I, 0, FL, CL ) -> hcf( N, I + 1, 0, FL, CL );
hcf( N, I, P, FL, CL ) -> hcf( N, I + 1, 0, FL ++ [I], CL ++ [P] ).
result(N, K) -> result(N, 0, K, 0, 0).
result(N, I, K, SUM_LAZYCAT, SUM_HEIGHT) when I < K ->
result(N, I + 1, K, SUM_LAZYCAT + pow(N, I), SUM_HEIGHT + (
pow(N, I) * pow(N+1,K-I) ) );
result(N, _I, K, SUM_LAZYCAT, SUM_HEIGHT) -> [SUM_LAZYCAT, SUM_HEIGHT +
pow(N,K)].
f(K, I, COUNTLIST) when I < length(COUNTLIST) ->
A = gcd( K, lists:nth(I+1, COUNTLIST) ),
f( A, I+1, COUNTLIST );
f(K, _I, _COUNTLIST) -> K.
g(FN, CN, I, K, N) when I < length(CN) ->
g( FN, CN, I+1, K, N * ( pow(lists:nth(I+1, FN),
lists:nth(I+1,CN) div K) ) );
g(_FN, _CN, _I, _K, N) ->
N.
one(L) -> one(L, 0, 0).
one(L, CNT, SUM) when (L rem 2) =:= 0 -> one( L div 2, CNT + 1, SUM + L );
one(L, CNT, SUM) -> [CNT, SUM + L].
Visual Studio를 설치 할 때 항상 Visual Basic Cristal Reports 라는 프로그램이 눈에 띄었었는데, 뭐하는 프로그램인지를 몰라서 나는 매번 설치에서 제외하곤 했었다.
얼마전에 새 책 목록을 받아 보다가 낯익은 이름이 있길래 드디어 이것이 뭐하는 프로그램인지 알아볼 기회다하고는 책을 구해보게 되었다.
나는 크리스탈 레포트가 MS에서 만든 프로그램인 줄로만 생각했었는데, 그냥 번들로 함께 딸려오는 제품이었다. 비주얼 스튜디오 뿐만 아니라 이클립스나 볼랜드의 제품에서도 역시 사용 할 수 있다.
크리스탈 레포트가 뭐하는 프로그램인지 간단히 설명하면, 임의의 데이터 베이스에 접속해서 데이터를 가져와서 가공하고 보기 좋게 보고서를 만들어 주는 프로그램이다. C#이나 VB.NET 그리고 Visual Basic으로 애플리케이션의 이벤트 처리를 할 수 있는 프로그래밍 인터페이스를 제공해서 조금 더 다이나믹하고 유연한 보고서를 만들 수 있다.
회사에서 서비스를 개발하다 보면 기획자들에게 통계 데이터를 보내줘야 할 일이 종종 있는데, 나는 데이터베이스에 대충 쿼리에서 결과를 엑셀 프로그램에 툭 붙여넣어 보내주고는 한다. 나는 국민학교 때부터 그림에는 영 소질이 없었는데, 지금도 프리젠테이션에 관련된 애플리케이션은 다 싫다.(Visio나 파워포인트, 엑셀, 워드 등) 이런 프로그램을 사용할 때 나는 아주 저질적인 결과물을 내놓곤 하는데, 다행히 날 컴맹으로 당연시 하는 우리 여기획자들 덕분에 맘 편하게 보고서를 작성할 수 있다. 하지만 입장을 바꿔서, 내가 상사라면 나처럼 보고서를 작성하는 녀석에게는 '저 새끼가 분명 일할 마음이 없는거야...' 라고 생각이 들지도 모르겠다.
어쨌거나 요즈음에는 그런 면에서도 조금 노력이 필요하다는 생각이 들어서 나는 이 책이 너무 반가웠다. 나도 멋진 보고서를 만들 수 있을테니깐.
몇 일전에 컴퓨터를 포맷할 일이 있어서 VS2008를 새로 설치하면서는 이 크리스탈 레포트를 포함시켜서 설치를 했다.
그리고 이 책과 함께 몇 가지 실습을 따라해보았는데, 프로젝트를 만들자마자 프로그램이 뻗고, 수도 없이 나오는 위자드에서 finish 버튼만 누르면 비주얼 스튜디오가 뻗어버려서 아주 짜증이 났다. 최신 버전인데도 이런데 VS2005 였을 때나 다른 제품은 아마도 더했을 것이다.
어쨌거나 내가 서비스하고 있는 데이터베이스에 연결해서 간단히만 이것 저것 만져보았다. 애플리케이션을 EXE 형태로 만들 수도 있고, 웹 애플리케이션으로 만드는 것도 가능하다. 우리는 지금 하고 있는 서비스를 관리하기 위한 애플리케이션을 ASP.NET으로 만들어서 사용하고 있는데, 크리스탈 레포트를 사용해서 만들 수도 있겠구나 생각이 들었다. 하지만 코드양은 조금 줄일 수 있을지 몰라도, ASP.NET으로 모든 것을 제어하는 것 보다는 훨씬 할 수 있는 것이 적을 것이다. 데이터를 갱신하거나 삭제하는 작업보다는 SELECT 위주의 통계 애플리케이션이 이 프로그램에 더 적절하다.
나는 크리스탈 레포트가 무엇인지 알아보기 위한 용도로 이 책을 읽어서 대충대충만 살펴봤는데, 중간에 Visual Basic은 없는게 낫지 않나 하는 생각도 들었다. 이 책은 Windows via C++과 같은 많은 고급 기술을 담고 있는 책보다 훨씬 낮은 레벨의 지식을 담고 있는 반면에 두께는 더 두껍다. 시대에 맞게 정말 필요한 내용만을 담아 거품을 좀 뺐으면 사용자가 좀 더 부담을 덜 갖고 편하게 이 책을 봤을텐데 말이다.
어쨌거나 이 책은 수요가 그렇게 많지 않은 분야에 대해 저자가 열심히(자료도 별로 없는 가운데) 연구해서 쓴 책일 것이므로 고맙게 생각해야한다. 좋은 애플리케이션에 대해 가르쳐준 저자에게 감사를 표한다.
인터뷰를 진행하는 사람은 제시카 리빙스턴인데, 어디서 많이 본 이름이다 싶었더니 폴 그레이엄의 에세이 하단에 항상 등장하는 이름이었다.
폴 그레이엄의 글 아래에는 항상 감사 글이 달려있는데(아마도 글을 발행하기 전에 감수해준) 이 여자의 이름은 모든 글에 빠지지 않고 등장에서 기억에 남아있다.
이 책에 나오는 32명의 해커에 역시 폴 그레이엄도 나오는데, 현재는 Y 어쩌구 하는 스타트업 투자 회사에서 이 여자와 함께 일하고 있는 것 같다.
번역자는 GE나 Sun과 같은 화려한 회사에서의 경력을 자랑하는 김익환 선생님이다.
얼마전에는 우리회사에 오셔서 소프트웨어 공학에 대한 강의를 해주셨는데, 아주 좋은 시간이었다.
이 책은 소설이 아니라 그냥 인터뷰만을 담고 있을 뿐인데도 책이 상당히 두껍다.
나는 500페이지가 넘어가는 책을 별로 안 좋아하는데, 모양새도 잘 안나고 가방에 넣고 다닐 때 무겁기 때문이다.
이런 해커들의 이야기들 담은(흥미진진한) 책은 이동하면서 마음 편히 보기에 아주 좋은데, 책이 두꺼워서 집에서만 봤다.
하필이면 32명인가, 32비트 시대라서 그런가. 16명 정도만 골랐으면 더 좋았을텐데 말이다.
어쨌거나,
애플의 스티브 워즈니악
루비 온 레일스의 데이비드 하이네마이어 핸슨
지금은 마이크로소프트의 에이스로 군림하고 있는 레이오지 등.
최고의 제품들과 최고의 해커들에 대한 생각을 엿보는 것은 정말 즐거운 일이 아닐 수 없다.
강컴에서 호평들이 많아 이 책을 선택해서 봤는데, 책 이름과 같이 정말 스피드하게 배워나갈 수 있었다. 필요한 부분만 깔끔하게 설명하고 빨리 진행되는 방식이 아주 마음에 든다.
나는 대학시절에 Java 1.4 책을 한 번 본 것이 전부여서 @ 어노테이션이나 for 문 안에서 : 으로 이터레이팅 하는 문법들이
아주 해괴망칙하게 보이곤 했었는데, 이 책에서는 간략하게지만 내가 궁금해 했던 그런 새롭게 추가된 기능들에 대해서 설명되어 있어
좋았다.
하지만, 스피드하게 배우는 것은 한계가 있는 법. 조금 더 진지하게 Java의 깊숙한 부분을 배워 보려는 사람들은 Thinking in Java와 같은 다른 책을 찾아보는 것이 더 좋을 것이다.
작년 가을 즈음 회사에서, 갑자기 자바로 프로그램을 만들어야 할 상황이 내게 닥쳤다. 이 때 나는 대학 때 만들어본 고작 2000 ~ 3000 줄 정도의 비행기 게임이 자바 경험의 전부였었는데, 아무 것도 모른채로 무작정 프로젝트를 시작했고 그것은 하루 하루 부담스럽고 고통스러운 시간들로서 내게 다가왔다.
우리 회사에는 자바 프로그래머가 전혀 없어서 나는 아주 기본적인 것들까지도 인터넷을 통해 정보를 얻었어야 했는데(애플릿은 뭐고 서블릿은 뭔지, 1.5를 써야하는지 6을 써야하는지, 심지어는 SE를 다운 받아야하는지 EE를 받아야 하는지까지도), Sun의 문서들과 포럼, 그리고 유즈넷을 들락거리면서, 인터넷을 통해 공부하는 것이 책으로 공부하는 것보다 얼마나 어려운 것인지 절실히 깨닫게 되었다. 물어볼 사람이 옆에 있다는 것이 얼마나 행복한 것인지도 말이다.
어쨌거나 급하고 초조한 마음과 함께 나혼자 진행한 프로젝트는 책으로 지식을 쌓지 못한채 인터넷을 통해서 얻은 제대로 익히지도 못한 지식들로, 검색과 질문과 코딩의 반복, 또 삽질과 문제 해결 그리고 새로운 고비의 반복들을 거쳐 힘들게 완성시켰다.
아름다운 명서에 넣기는 뭐해서 가볍게 읽기 좋은책으로 카테고리를 정하긴 했지만 실제로 이 책이 그렇게 가볍게 읽을만한 책은 아니다.
맨 마지막 장인 6장에 가서야 구글의 시스템, 개발 언어 등 많은 사람들이 원하는 이야기들이 소개되며, 그 전까지는 맘 편히 볼만한 내용들은 별로 없다.
나는 회사에서 가상 파일 시스템을 구현하는 일을 맡고 있는데,
그래서 역시 이 책의 3장에 나오는 GFS(구글 파일 시스템)부분이 가장 인상깊었다.
거기에는 지금까지 우리가 생각은 해왔지만, 구현하기 힘들다는 이유로
그리고 개발 시간이 오래걸린다는 이유로 도망쳐왔던 많은 아이디어들과
심지어는 생각해보지도 못했던 여러 기술들이 구현되어 있었다.
이 책을 읽으면서 줄곧 들었던 생각이 있다.
나는 무엇을 그렇게 무서워 하고 있는가?
이 프로젝트를 과연 내가 해낼 수 있을까?
이 복잡한 알고리즘을 과연 버그 없이 구현할 수 있을까?
다른 방식으로 구현하면 몇몇 단점들이 있긴 하지만,
훨씬 쉽고 빨리 만들수 있으니 그 방법으로 사람들을 설득하자. 하는 썩어빠진 마음가짐.
실제로 이런 어려운 문제들을 멋지게 구현해낸 이들을 보면서, 나는 많은 반성을 했다.
주위에 도움을 받을 수있는 훌륭한 해커들이 있다는 것은 이런 두려움을 없애주는 가장 큰 힘이다.
내가 어려운 문제에 봉착해서 머리를 싸매고 있을 때, 해결책을 제시해주는 그들에게 진심으로 감사한다.
나는 파이썬을 리눅스 서버를 관리하는 유틸리티성 목적으로 사용하곤 하는데 그것은 마침 이 책의 제목과 딱 들어맞았다.
파이썬에는 훌륭하고 쓰기 편한 좋은 모듈들이 많이 있는데, 나는 그런 것들을 잘 꾀고 있질 못해서 이미 있는 모듈인지 모르고 간단하게 구현해서 쓰다가 나중에 그런 모듈이 있다는 것을 알고는 다시 코드를 고친 적들이 몇 번 있었다.
이 책은 나같은 프로그래머들에게 도움을 준다. 하지만 파이썬 전문가들이라면 이미 이 책에서 소개하는 모듈들을 잘 알고 있을 것이다.
좋은 라이브러리와 애플리케이션들을 많이 알고 있다는 것은 프로그래머에게 있어서 아주 중요하다. 프로그래밍 테크닉 뿐만 아니라 이런 지식을 얻기 위해서 시간을 투자하는 것은 충분히 가치가 있는 일이다.
나는 주로 라이브러리나 애플리케이션들의 공식 홈페이지, 개인 블로그들 그리고 포럼의 글들을 RSS로 받아보면서 이런 지식들을 얻곤 하는데, 이 책에서 또한 몰랐었던 몇몇 유용한 모듈들을 알 수 있게 되었다.
그러나 이 책이 모듈만을 소개하는 책은 아니다. 시스템 관리자라면 누구나 한 번쯤 데몬이 죽었을 때 혹은 디스크 용량이 부족할 때 알림 문자나 메일을 받을 수는 없을까? 패키징 관리를 좀 더 편리하게 할 수는 없을까? 여러 서버에 동시에 같은 파일을 올리기가 너무 귀찮은데 편하게 할 수 있는 방법은 없을까? 와 같은 생각들을 해보았을 것이다.
이 책에서는 바로 그러한 고민들을 풀어주는 예제 코드들과 유용한 모듈을 소개한다. 시스템 관리자들은 주로 쉘 스크립트와 네트워킹 그리고 트러블 슈팅 정도만을 공부하곤 하는데, 조금 더 시간을 투자해서 파이썬이나 펄과 같은 언어를 익혀둔다면 전보다 훨씬 훌륭한 고급 관리자가 될 수 있을 것이다.
아래는 이 책에서 나오는 내용들이다. 재미있는 내용이 꽤 많이 있다. 최근 책이라 심지어는 Google Apps Engine이 소개되기도 한다.
나는 특정 언어나 분야에 상관없이 두루두루 넓게 공부하는 것이 프로그래밍하는 데 많은 도움이 된다고 생각한다. 어떤 사람들은 한 우물만 파서( 예를 들어 C/C++ ) 거기에서 전문가가 되는 것이 진짜 최고라고 얘기하곤 하지만, 내 생각은 그렇지 않다. 내가 본 해커들은 다들 컴퓨터 과학 전반의 분야들을 두루 이해하고 있었다.
GET 메소드와 POST 메소드가 뭔지도 모르는 최고의 C 프로그래머를 본 적이 있는가? Java와 C#을 못다루는 최고의 C++프로그래머를 본 적이 있는가? 리눅스에서 코딩을 못하는 최고의 윈도우 프로그래머를 본 적이 있는가?
비록 실제 프로젝트에서 사용하지 않을 지라도 다른 분야의 무엇인가를 꾸준히 공부하는 것은 해커의 필수 요건 중 하나이다. 그리고 그렇게 공부하는 것을 즐긴다면 훨씬 좋을 것이다. - 논란의 여지는 있지만 아마도 수학적 능력은 필수 요건은 아니다. 공통 수학의 정석을 이해할 수 있는 두뇌라면 STL 컨테이너들의 내부 동작이나 알고리즘과 함수객체 정도를 이해하는 데는 아주 충분하다. 실제로 언어의 설계자들이나 많은 해커들이 수학은 그다지 중요하지 않다고 말하는 것을 보아왔다.( 하지만 우습게도 그들은 하나같이 수학의 천재들이다. 빌어먹을 )
어쨌든 이렇게 다른 언어나 플랫폼에 대해 공부한 경험은 실제로도 많은 도움이 된다. 예를 들어 나는 대학에 다닐 때에 C#의 컬렉션들을 다루는 것이 너무 어려웠는데, C++의 STL을 공부하면서부터 comparer나 predicator들을 이용하여 자료구조를 제어하는 방법을 이해하게 되었다. 또한 다시 STL을 사용하게 되었을 때 C#의 이런 경험들이 예전보다 functor에 대해 좀 더 깊게 이해할 수 있게 만들어주었고, 이런 경험은 또 파이썬에서 lamda 표현식을 공부할 때 나를 찾아와 도움을 주었다.
그래서 나는 새 책이 나오면 이것 저것 닥치는 대로 다 골라서 집 앞에 있는 도서관에 신청 을 한다.
이 책은 작년 겨울에 Ajax를 이해하고 싶어 빌렸었던 읽기 좋은 분량의 얇은 책인데, 김태영씨가 쓴 책이라 역시 좋았다. 사실 다른 두꺼운 Ajax 책도 몇 권 빌려 봤었던 것 같은데 뭐가 그리 딱딱한지 정말 재미가 없었다.
김태영의 책은 정말 소설책 읽듯이 재밌다. 언제나 그렇듯이 심화된 내용은 전혀 없지만 초보자들에게 기본 원리를 이해시키는 데는 아주 좋다. 나는 이 분이 맨날 집에서 놀면서 책만 써줬으면 좋겠다.( 농담이다. )
조엘 온 소프트웨어로 국내에 널리 알려진 조엘 스폴스키의 다른 책이다.
이 책은 조엘이 쓴 책이 아니라 다른 블로거들의 글을 조엘이 소개해주기만 한다.
나는 조엘 온 소프트웨어를 먼저 읽고 이 책을 나중에 읽었는데, 재미로만 본다면 이 책이 더 좋았다.
다음은 이 책의 목차인데 제목만 봐도 벌써 흥미진진한 내용들이 많이 보인다.
1 스타일은 언어 요소다
2 멍청한 사용자 인터페이스 부문 최우수상, 윈도우 검색
3 프로그래머 아웃소싱의 단점
4 엑셀은 데이터베이스가 아니라구요!
5 ICSOC04 강연 한 토막
6 환상 속에 고립된 소셜 소프트웨어
7 비정상적으로 행동하는 애플리케이션을 막지 않는 이유는?
8 환상적인 사용자 인터페이스
9 캐나다 인터넷을 WIPO의 손아귀에서 구출하라
10 EA: 휴먼 스토리
11 타입검사와 테스트
12 프로세싱
13 위대한 해커
14 도스창을 날려 버린 주소창
15 스타벅스에서 2단계 커밋을 사용하지 않는 이유
16 열정
17 C++, 잊혀진 트로이 목마
18 전구 하나 바꾸는 데 마이크로소프트 직원 몇 명이 필요할까?
19 엉망진창 꼬여버린 상황 돌파하기
20 래리의 소프트웨어공학 법칙 제2조: 테스터를 단순한 잣대로 평가하지 마십시오
21 팀 보상 제도
22 맥 워드 6.0
23 소셜 소프트웨어, 내부의 적을 경계하라!
24 사용자 집단 분석: 플레이밍을 방지하는 소셜 소프트웨어 설계
25 간격 좁히기, 제1부
26 간격 좁히기, 제2부
27 직원 채용에 대한 제언
28 파워포인트 재구성
29 (여우 캐릭터와 함께하는) 빠르고 쉬운 루비 강좌
가장 좋았던 내용은 역시13장에서 소개되는 폴 그레이엄의 에세이인 위대한 해커였다.
나는 이 책을 도서관에서 빌리면서 해커와 화가라는 책을 같이 빌렸었는데, 이 책을 먼저 읽고 해커와 화가를 읽으면서 거기에 똑같은 글이 있어서 좀 놀랐었다.
뭐 어쨌든, 이 책에는 위대한 해커 말고도 재밌는 내용들이 잔뜩 들어있다.
조엘의 책은 다 읽어봤는데, 그 중에 똑똑하고 100배 일 잘하는 개발자 모시기:조엘 온 소프트웨어 시즌 2 이 책 만 빼고 나머지 2권은 아주 재밌었다.
이 빌어먹을 책은 회사 돈으로 샀는데, 읽어보고는 돈이 아까워서 미안할 정도였다.
조엘 온 소프트웨어에 이미 다 있는 내용을 그대로 갖다 붙여 놓고는 13000원이나 받아먹다니!
이미 More Joel on Software 라는 조엘의 새로운 책이 출간되었는데( 제목은 스캇 마이어스의 책 제목을 흉내내서 지었음이 분명하다.) 번역서가 나오면 읽어 볼 예정이다. 이 책 또한 기대가 된다.
다음은 이 책 2판의 목차인데, 레퍼런스 용 책 답게 문법 설명은 최대한 간결하게 하고 다양한 부록을 절반 이상이나 할애하고 있다.
1 A Tutorial Introduction 1 2 Lexical Conventions and Syntax 13 3 Types and Objects 19 4 Operators and Expressions 43 5 Control Flow 55 6 Functions and Functional Programming 63 7 Classes and Object-Oriented Programming 71 8 Modules and Packages 77 9 Input and Output 83 10 Execution Environment 93 A The Python Library 99 B Extending and Embedding Python 297 C: Summary of Changes 331
문법 설명이 너무나 간결해서 프로그래밍 언어를 처음 배우려는 사용자에게는 좋지않다. 아직까지도 대부분의 사람들은 파이썬을 자신의 첫 언어로 배우지 않는다. 이 책은 다른 언어를 좀 공부했다가 Python을 배워보려는 프로그래머들에게 효율적으로 파이썬을 가르켜주는 아주 좋은 책이다. 이 책을 보면서 마치 Learn Visual Basic 6.0을 읽을 때와 비슷한 기분이 들었다. 아직까지 읽어본 파이썬 책은 그다지 많지 않지만, 그 중에서 가장 깔끔했다.
2001년에 이 책의 2판이 발행되었고, 비교적 최근인 2006년에 3판이 발행되었다. 파이썬은 버전이 바뀔 때마다 문법이 조금씩 달라지기도 하고 변화되는 부분이 많으므로 최신 에디션으로 구해보는 것이 좋다. 이 책의 저자처럼 파이썬 책을 쓰는 사람이나, 기존 프로젝트를 포팅해야 하는 사람들에게 이런 변화는 어쩌면 울화통 치밀게 짜증나는 일 일지도 모르겠다.( 물론 즐겁게 받아들일꺼라 생각한다. ) 나는 파이썬의 이런 발 빠르고 과감한 변화를 너무나도 좋아한다. 사실 파이썬으로 이미 커다란 프로젝트를 만들어 놨다면 귀도 반 로섬을 빌어먹을 개자식이라며 욕할지도 모르겠지만, 뭐 만들어 놓은 것이 없으니깐^^ 그저 파이썬 3000이 두근두근 기다려질 뿐이다.
이 책은 파이썬의 기본서이다. 2007년 10월에 이 책의 3번째 에디션이 나왔는데, 이제 곧 파이썬 3.0이 나오고 나면 금방 4판을 내지 않을까 싶다. 파이썬은 국내 저자가 쓴 책도 별로 없지만, 번역서 또한 거의 없는 것이 슬픈 현실이다.
이 책은 다행히도 번역서가 있다. 이강성 교수가 번역해서 국내에는 '파이썬 시작하기'라는 이름으로 소개되었는데, 아마도 1판일 것이다. 1판은 너무 오래된 책이긴 하지만, 그래도 이 번역서가 파이썬 자체를 공부하는데는 우리말로 된 책 중에서 가장 좋은 책이라고 생각한다.
이 책은 인터넷 스크립팅이나 시스템 프로그래밍을 파이썬으로 어떻게 하는가 같은 내용은 전혀 없으며 오직 파이썬 언어 자체만을 이야기 한다. 파이썬을 좀 더 공부하고 싶다면 같은 저자가 쓴 Programming Python을 참고하면 될 것이다. 이 책도 역시 최근에 3번째 에디션이 나왔고, 파이썬의 거의 모든 부분을 다루며 예제 코드도 엄청 많다.( 하지만 번역본이 없다. )
파이썬을 좀 잘해보고 싶은데, 빌어먹을 영어와 자꾸 부딪히게 되니 죽을 맛이다. 빨리 파이썬이 널리 알려져서 좋은 책들을 많이 번역되었으면 좋겠다.
목차는 다음과 같다.
1부. 핵심 언어1장. 시작 2장. 자료형과 연산자 3장. 기본문 4장. 함수 5장. 모듈 6장. 클래스 7장. 예외
2부. 바깥 층8장. 내장 도구 9장. 파이썬으로 하는 공통 작업 10장. 프레임워크와 응용 프로그램
돌아보니 회사에 들어와서 MFC로 윈도우 애플리케이션을 만드는 일이 아직까지는 가장 많이 했던 일이었던 것 같다. 5달 쯤 전에, C++로 프로그래밍하는 것이 너무 지겹고 또 어려워서 좀 더 쉬운 방법이 없을까 하고 고민을 많이 했었는데, 그 때 시도해봤던 방편 하나가 Visual Basic 6 이었다. 서버 애플리케이션이 아니라 고객들에게 배포해야 하는 애플리케이션들이었기 때문에 선택의 폭은 그렇게 넓지 않았다. C#이나 VB.NET으로 윈폼을 작성해서 배포하려면 아마 윈도우7이 나올 때 쯤 까지는 기다려야 하지 않을까?
새로운 언어를 배운 다는 것은 어쩌면 프로그래밍을 하면서 가장 신나는 일 일지도 모른다. 뭐 어쨌든 VB6의 사고 방식을 접해보고 싶어서 이 책 저 책 많이도 빌려봤다. 그 때 아쉬웠던 점은 잘 쓰여진 VB6 책을 찾기가 너무 힘들었다는 것이다. 거의 대부분의 국내 책들이 문법조차 얼렁 뚱땅 넘어가고 Visual Studio에서 자동화된 코드를 어떻게 생성하는지에 대한 부분만을 설명하고 있었다.
지금 소개하는 이 책은 우연히 발견했는데, 너무 간결해서 좋았다. '필수적인', '간결함'. 그것이 이 책을 표현하기 가장 좋은 단어들 이다.
나는 On Error 구문이 어떻게 동작하는지, 그리고 문법은 어떻게 되는지가 궁금 했었는데 이 책에서는 깔끔하게 잘 설명이 되어있다. -다른 책들에는 On Error에 설명이 전혀 없는 책들도 많다. :( 문법 부터 예제까지 필수적인 것들만 간결하게 설명하고 넘어가는 것이 이 책의 가장 큰 매력이다.
어쩌면 윈도우 프로그래밍을 조금은 해봤기 때문에 이 책의 간결함이 더 읽기 쉽고 좋게 느껴졌는지도 모르겠다. 하지만, 완전 초보자가 VB6을 배운다고 하더라도 이 책이 그저 그런 다른 책들 보다는 훨씬 도움이 될 것 같다.
이 때 VB6으로 간단한 애플리케이션을 만들어 보면서 내가 배웠던 가장 큰 한가지는, 아직까지 배포용 윈도우 애플리케이션을 만드는데 있어서 최고의 선택은 바로 MFC라는 것. 간단한 애플리케이션이라면 문제 없겠지만, 좀 더 정교하고 구조화된 프로그램을 원한다면 VB6은 좋은 선택이 아닌 듯 하다.^^
두번째 줄에서 s1을 s2에 복사하면서 복사 생성자가 호출 된다.
그냥 생성자가 아니라 CString::CString( const CString& ) 의 시그내쳐를 가진 복사 생성자 말이다.
하지만 코드를 이렇게 작성한다면,
CString s1(_T("string"));
CString s2;
s2 = s1;
위와 같은 경우에는 s2를 기본 생성자를 통해 객체를 생성한 뒤 operator=() 을 통해서 s1을 s2에 복사한다. 그러므로 위 코드에서는 복사 생성자가 호출 되지 않는다.
간단한 내용이지만, 생성자에서 멤버를 new하고 소멸자에서 그 멤버를 delete하는 경우에 복사 생성자를 정의해주지 않으면 복사 될 때 프로그램은 죽는다.
복사 생성자를 정의하지 않았을 때 컴파일러가 알아서 복사 생성자를 만들어 주지만 멤버에 포인터가 있다면 그 포인터 값을 그대로 복사하도록 코드를 생성한다.
이런 식으로 말이다.
class A
{
public:
//somemethod();
private:
int* pPointer;
};
블락이 끝날 때에 프로그램은 죽는다.
- 사실 죽는다는 표현 보다는 정의되지 않은 동작을 수행한다. 라고 하는 것이 좀 더 정확하다. 하지만 일반적으로 거의 모든 경우에 뒤진다. :)
왜냐하면 obj1을 생성 할 때 불리는 기본 생성자에서 멤버 변수에 메모리를 동적 할당했고,
obj1을 obj2에 복사하면서는 복사생성자를 통해 obj2를 생성했는데, 이때는 pPointer에 새로운 메모리를 할당한 것이 아니라 obj1의 멤버 변수 pPointer의 주소만을 복사했기 때문이다.
블락이 끝나면서 소멸자가 호출 될 때는 각 객체의 소멸자가 모두 호출 되면서 pPointer를 해제하려고 한다.
하지만 2번째 delete할 때 이미 해제한 포인터를 다시 delete하려고 하므로 오류.