Media Log

세상을 뒤흔든 프로그래머들의 비밀 - 6점
에드 번즈 지음, 김도균 옮김/정보문화사

이 책은 여러 해커들에 대한 인터뷰를 담고 있다.
예전에 소개하기도 했던 책인 세상을 바꾼 32개의 통찰과 비슷한 종류의 책이다.

세상을 뒤흔든 프로그래머라고 제목이 지어지긴 했지만, 사실 제임스 고슬링 정도를 제외하고는 세상을 뒤흔들었다고 할만한 프로그래머는 별로 없다.
리누스 토발즈 정도는 되야 세상을 흔들었다고 할만할텐데 말이다.

게다가 거의 Java 쪽 사람들이라서 여러 분야의 해커 이야기를 기대했던 사람들에게는 조금 실망스러울 수도 있겠다. 그나마 앤드류 헌트나 데이비드 토마스 정도가 내게 익숙한 이름이고 나머지 사람들은 별로 들어보지 못한 이름들인데, 이것은 내가 Java를 많이 접해보지 않았기 때문일 수도 있겠다.

책의 제목처럼 여러 훌륭한 프로그래머들에게는 어떤 공통점이 있는지를 알아보는 것이 이 책의 목적이자, 인터뷰의 질문들이다.

이 책에서 언급되는 훌륭한 프로그래머들의 공통점을 정리하면 다음과 같다.

기본기에 충실하다.
 - 시스템의 동작 방식을 로우레벨 수준에서 잘 이해하고 있다.

호기심이 왕성하고 끈기가 있다.
 - 끊임없이 궁금해하며, 그런 궁금증을 풀어가는 과정에서 어려움에 봉착해도 쉽게 포기 하지 않는다.

막히면 잠시 쉬면서 해결책을 찾는다.
 - 잠시 다른 일을 하면서 불현듯 해결책을 떠올려 본 것은 많은 사람이 경험해본 일 일 것이다. 이들은 이런 경험이 많아서 그런지, 막히더라도 절대 초조해하지 않고 마치 자신이 곧 그 문제를 해결할 수 있음을 알고있는 것만 같았다. 여기서 '잠시'라는 시간은 하루 혹은 일주일 정도를 쉰다는 것은 아니다. 제임스 고슬링은 10분 혹은 1시간 정도를 다른 일을 하다 보면 마법같이 해결책이 나온다고 한다.

마지막으로 도구를 잘 다루는 것이 꼭 필요한 요소는 아니지만 대부분의 훌륭한 프로그래머들은 에디터나 개발관련 툴을 아주 잘 다룬다.

책 내용 중에 페이팔의 젊은 창업자인 친구 하나가 파이썬(문제를 해결 하는 방법은 한 가지여야 한다)과 펄의 철학(문제를 해결 하는 방법은 여러가지여야 한다)을 이야기 하면서 언젠가 귀도와 래리월이 논쟁하는 것을 본 적이 있다고 했는데, 정말 재밌었다고 한다. 하기사 그 정도 수준의 고수들이 논쟁하는 것을 보는 것은 흔치 않은 기회이고 재미있는 일임에 분명하다.
나는 래리월이 아주 젊잖고, 귀도가 다혈질인 사람일 것으로 상상되는데, 이 친구는 그 반대였다고 얘기한다.
정확히 어떤 내용인지 너무도 궁금해져서 구글을 통해 찾아봤지만, 찾을 수가 없었다.

나 역시 다른 사람들의 프로그래밍 습관을 지켜보며 어떤 차이점이 있나 하고 살펴보고는 하는데, 그 중 뛰어난 프로그래머 한 명에게서 특이할만한 사항을 발견했다.

코드를 작성하고 있는 동안에, 컴파일 혹은 빌드를 자주 하지 않는다.

그는 우선 코드를 작성하기 전에 로직을 머리 속에 잘 정리해 놓은 뒤에, 글을 쓰듯이 코드를 빨리 써내려 나간다. 보통의 많은 사람들이 이 과정에서 문법적으로 오류는 없는지 컴파일을 해보고, 혹시 문제가 있으면 얼른 수정하고 다음 코드를 작성하고는 한다. 그는 다른 사람들과는 다르게 함수 1개를 작성하던 5개를 작성하던지간에 절대로 중간에 컴파일 해보지 않고 끝까지 코드를 써내려 간다. 코드를 다 만들었으면 이제 컴파일 해볼만도 한데 자신이 쓴 코드에 문제가 없는지 한줄 씩 다시 꼼꼼히 읽어보고 머리 속에서 프로그램을 돌려본 후에 그제야 컴파일을 해본다. - 여기서 컴파일 까지 한방에 깔끔하게 된다면 완벽하겠지만, 대부분 그렇게 되지는 않았다. :)

나는 이 방식이 집중력을 계속 유지할 수 있고, 버그 없는 코드를 만드는데 도움을 준다고 느껴져서 혼자서 연습을 하고 있는 중이다.
따라하다보니, 나는 내 기억력이 한계치에 도달해서 이전에 무슨 코드를 입력했었는지 기억이 안나려고 하는 즈음에 무의식적으로 빌드 키를 누르는 나를 발견했다. 그리고 이렇게 잠시동안 빌드가 되는 순간에 집중력이 무너져서 이전에 생각하고 있었던 여러 로직들 중 하나를 까먹게 되곤 하는데, 컴파일이 성공적으로 되어 버리면 이런 까먹은 부분이 생각이 안나고 그대로 묻혀버리는 경우가 있다. 물론 이런 것들은 사소하거나 혹은 심각한 버그로서 다시 자신에게 돌아오게 될 것이다.

머리가 특별히 좋다면 처음부터 모든 로직을 꾸역꾸역 넣어 두고 프로그램을 짤수도 있겠지만, 보통의 두뇌를 가지고 있다면 차근차근 로직을 메모한 뒤에 한 번에 쭉 써내려간 뒤, 다시 한 번 자신의 코드를 리뷰하고나서 컴파일 해보는 것이 더 나은 프로그래머가 되기 위한 좋은 연습이 될 수 있을 것이다.

크리에이티브 커먼즈 라이선스
Creative Commons License

http://www.benjaminlog.com/trackback/121 관련글 쓰기

  1. at 2010/03/31 15:30 [edit/del]

    비밀댓글입니다

    Reply

submit

stackoverflow.com은 프로그래밍 전문 Q/A 사이트이다.

조엘 온 소프트웨어로 우리에게 아주 친숙한 조엘Coding horror제프가 함께 만든 사이트인데, 정말 신선하고 많은 가치를 가진 사이트이다.

이 사이트는 완전히 무료인데, 만일 이전에 프로그래밍 관련 검색을 하다가 experts exchange 같은 유료 사이트를 보고 열 받은 적이 있다면 스택오버플로우를 사랑하게 될 것이다.

프로그래밍에 관련된 질문은 어떤 것이든 할 수 있는데, 질문을 올리고나서 잠시 기다렸다가 새로 고침 한 번 하고나면 답변이 올라와 있을 정도로 빠른 답변을(그리고 훌륭한) 얻을 수 있다.

이 사이트는 아주 훌륭한 시스템으로 돌아가는데, 국내에도 이런 사이트가 있다면 프로그래머들이 정말 좋아할 것이다. 나는 국내 사이트 중에서는
KLDP
KLDP
가 가장 수준있고 괜찮은 사이트라고 생각하는데, 만일 스택 오버플로우의 대안 사이트가 생긴다면 아마 그 곳을 더 좋아하게 될 것 같다.

사이트를 이용하기 위해서 다음의 몇가지를 숙지하고 있다면 좋을 것이다.

1. 네트워크, 서버, PC 관리등의 질문은 스택오버플로우가 아니라 Server Fault라는 자매사이트에 물어본다.
소프트웨어 또는 하드웨어 트러블 슈팅등은 Super User에 물어본다.
HTML/CSS 는 Doctype에 물어본다.

2. 평판 시스템이 있는데, 이는 스택오버플로우가 얼마나 사용자를 신뢰하는지 측정하는 점수이다. 일단 시스템으로부터 신뢰를 얻고나면 다음과 같은 권한들을 얻을 수 있다.

15 Vote up
15 Flag offensive
50 Leave comments†
100 Vote down (costs 1 rep)
100 Edit community wiki posts
200 Reduced advertising
250 Vote to close or reopen your questions
250 Create new tags
500 Retag questions
1000 Show total up and down vote counts
2000 Edit other people's posts
3000 Vote to close or reopen any questions
10000 Delete closed questions, access to moderation tools
 you can always comment on your questions and answers, and any answers to questions you've asked, even with 1 rep.


10000이 넘고나면 신급 수준인데, 사이트 내에서 마치 root user인 것처럼 행동할 수 있다. 이런 재밌는 시스템 때문에 많은 사람들이 자신의 시간을 투자해서 좋은 답변을 제공하도록 동기를 부여한다.

뱃지제도도 있는데, 금뱃지를 하나 이상 달고 있는 사람들은, root급 혹은 준root급이다. 그들은 실력도 훌륭할 뿐더러 거의 이 곳에서 살고 있는 것만 같다.

2. 위키처럼 다른 사람의 질문이나 답변을 수정할 수 있다. 이것은 상당히 신선하다. 나는 다른 사람이 내 질문을 수정한 것을 보고 처음에 깜짝 놀랐는데, 생각해보니 아주 괜찮은 시스템이라고 여겨졌다. 나처럼 영어가 좀 짧은 경우에는 다른 사람이 교정해줄 수도 있다. 질문이 명확하지 않다면 다른 사람이 좀 더 이해하기 쉽게 수정해줄 수도 있다. 부적절한 태그를 달아놓았으면 이 역시 다른 사람이 수정해줄수 있다. 물론 이런 권한은 위에서 볼 수 있는 것처럼 어느 정도의 평판 점수가 필요하다.

3. 질문이나 답변을 수정하고 싶으면, 새로운 답글이나 코멘트로 달지 말고 자신의 원글을 수정하면 되며 또 그렇게 해야만한다.

4. 맘에 드는 답변에 점수를 부여할 수 있고 그 중 하나는 채택할 수도 있다.
채택된 답변과 점수가 높은 답변들이 상위에 보여진다.

5. 답변이 안달리면 자신의 점수를 조금 떼어내서 질문에 걸어 두어서, 답변을 유도해낼 수 있다.

6. 관심있는 주제나 실력있는 사람들의 답변이나 코멘트를 골라서 피드로 받아볼 수 있다.

제대로된 web 2.0 은 바로 이런 사이트가 아닐까 싶다. 기술적으로도 매우 훌륭하지만, 이런 좋은 시스템과 UI를 보면서 조엘과 그 친구들이 얼마나 영리하고 창의력이 있는지 느낄 수 있다.

오늘 본 글 중에 누군가가 프로그래밍 실력을 꾸준히 늘려가기 위해서 무엇을 하는게 좋겠냐고 물어봤는데, 그 답변이 참 걸작이다.

Read. Read blogs, white-papers (if thats your thing), books (read books by the truckloads), read anything and everything.

Write. Write down your views and opinions on whatever you are reading about. Make your point of view clear. Blogs are really excellent for this purpose.

Code. Write code every day. In your head, on paper, in a compiler. On a train in the rain on your way to Spain. Write code every day.

Talk. Talk with other programmers about programming. You will be amazed how often you A) never saw something from a particular angle, B) were flat out wrong, C) didn't know enough.

결국 가진 모든 시간을 프로그래밍에 투자하라는 내용인데 어떻게 보면 섬뜩한 내용 이기도 하지만, 한 편으로는 참 멋지다는 생각도 든다.
단, 아무리 프로그래밍을 사랑하더라도 소개팅 같은 곳에 나가서는 절대로 저따위 얘기를 해서는 안될 것이다.
크리에이티브 커먼즈 라이선스
Creative Commons License

http://www.benjaminlog.com/trackback/120 관련글 쓰기

  1. 조엘 스폴스키의 강연 (StackOverflow.com)
    // 아안리양랑 2010/03/19 12:48 x
  2. 강력 추천! Stackoverflow.com
    // 남정현의 닷넷 블로그 2010/03/19 13:18 x
  3. Stackoverflow.com에서 탑랭커들의 답변만 피드로 받아보기
    // 김재호의 디지털보단 아날로그 2010/09/20 20:50 x
  4. stackoverflow.com에 채팅 기능 추가
    // 김재호의 디지털보단 아날로그 2010/10/24 11:35 x
  1. Favicon of http://decoder.tistory.com BlogIcon decoder at 2010/03/19 00:35 [edit/del]

    무료할 때 올라오는 질문/답변을 읽다 보면 시간도 훌쩍 가더군요. :-)

    Reply
  2. 김군 at 2010/10/21 12:26 [edit/del]

    궁하면 통한다고 하더니, 정말 좋은 정보 얻습니다.

    개발 관련 제대로 된 커뮤니티를 찾으려고 여기저기를 찾고 있었거든요.
    영어에 대한 장벽(?)이 있을 거라고 미리 겁을 먹지만, 영어도 공부하는 중이라 시간이 해결해 줄 것 같습니다.

    감사합니다.

    Reply

submit
난 정말 JAVA를 공부한 적이 없다구요 - 8점
윤성우 지음, 김문석 감수/오렌지미디어
이 책은 2009년 가을에 나온 비교적 최근의 자바 입문서이다.

나는 윤성우씨의 책을 아주 좋아하는데, 굉장히 쉽게 잘 읽히고 또 어려운 내용을 적절한 예를 들어서 쉽게 설명해주기 때문이다.
여태까지 나온 그의 책들은 모두 입문자를 위한 기초서적인데, 개인적으로는 조금 더 심도있는 내용을 다루어주었으면 하는 바램도 있다.

이 책은 책 제목에도 써있듯이 Java를 처음 접해보는 사람을 타겟으로 작성되었다.
대부분의 컴퓨터 언어 책들은 C언어와 비교를 하며 설명하곤 하는데, 이는 C를 알고 있는 사람들에게는 좋지만 그렇지 않은 사람들에게는 전혀 불필요한 설명일 수도 있다.
저자가 이런 독자들의 눈높이에 맞춰서 쉽게 쉽게 설명하려 애쓰는 부분들이 인상적이었고, 또 이것은 영리한 접근 방식이라 생각된다.

챕터마다 간단한 수준의 문제가 주어지고, 저자가 작성한 답안 코드가 있다.
연습문제 수준이 외국 서적들처럼 머리가 빠개지는 수준이 아니라서, 공부하는 학생들이 연습문제를 다 풀어 볼만 할 것 같다.

나는 책 앞의 절반은 다 건너뛰고 뒷부분만 읽어봤는데, 전체적으로 아주 만족스러웠다.
아마도 이 책은 자바의 기본기를 다지기에 가장 좋은 책이 아닌가 싶다.

여태껏 클래스패스나 패키지, 그리고 와일드카드를 사용하는 지네릭 문법은
다른 언어들을 사용해보면서 익혀둔 통밥으로만 대충 이해하고 살고있었는데, 책에 잘 설명이 되어있어서 좋았다.

자바의 I/O Stream 관련 클래스들은 사용할 때 마다 참 매력적으로 느껴진다.
아래 코드처럼 한 객체를 다른 객체와 연결하고 또 연결하고 하면서 프로그래밍 하는 것은 처음 자바를 하면서 많은 흥미를 제공해 주는 부분이면서 클래스를 어떻게 추상화 해야 하는지 가르쳐주기도 한다.
OutputStream os = new FileOutputStream("data.bin");
BufferedOutputStream bos = new BufferedOutputStream(os);
DataOutputStream dos = new DataOutputStream(bos);

스트림 클래스들의 역할을 잘 이해하지 못하면 어떤 것을 어디에 껴넣어야 할지 햇갈릴 수도 있는데,
책에서 이 내용들을 아주 잘 설명해주고 있다.

이런 파일과 스트림에 대한 내용은 기본적인 내용이면서 가장 많이 쓰이는 중요한 부분인데 거의 마지막 챕터에 있어서 사람들이 잘 읽어보려나 모르겠다.

쓰레드와 동기화 챕터에서는 쓰레드에 대한 아주 간단한 기초 설명과 함께 동기화에 대한 기본 기법들을 설명한다.
나는 쓰레드를 멈추는 것과 재시작 하는 부분이 꼭 있기를 기대했는데 이 내용이 없어서 너무 아쉬웠다.

예전에 stop과 resume 메소드를 사용 하려고 봤더니 두 메소드 모두 deprecate되어있는 것이 아닌가.

Sun의 문서 중에

위와 같은 내용이 있는데, 왜 아직도 새로운 API를 제공하지 않는지 모르겠다.

책 마지막에는 스윙을 맛뵈기로 다루고 있는데, 스윙에 대한 윤성우씨의 생각이 살짝 언급되어 있다.

윤성우씨는 자바 클라이언트 애플리케이션에 대해서도 찬성하고 있는 입장이다.
나는 예전에는 자바로 만드는 클라이언트는 끝내주겠다 생각한적이 있었는데, 한 번 만들어보고 나서는 생각을 고쳐먹었다.

Once write Run everywhere라지만, 그냥 아무 생각 없이 코딩한다고 해서 모든 플랫폼에서 문제없이 잘 동작하는 것은 아니다.
우리가 윈도우 네이티브 클라이언트 애플리케이션을 작성할 때, 사용하려는 Windows API가 어떤 윈도우즈 버전부터 지원되는지 잘 알고 있어야 하고,
운영체제 버전별로 검사하는 코드 또한 들어가듯이 자바 API역시 지원되는 버전을 항상 다큐먼트에서 찾아봐야 하며, 예외처리도 해주어야만 한다.
또한 많이 쓰이는 특정 플랫폼을 위해 만들어진 전용 API를 사용해서도 안된다.

위 문제는 사실 아주 자잘한 문제이고, 가장 큰 문제는 애플리케이션을 실행시키기 위해서 JRE가 필요하다는 것이다.
한번만 설치하면 되는데 그게 뭔 대수냐 라고 생각하고 있다면, 그 프로그램은 이미 널리 퍼지기는 힘들다.
사용자들은 우리가 원하는대로 좀처럼 움직여주질 않는다.

누군가와 예전에 이런 얘기를 했었는데, 멀티 플랫폼에서 돌아가게 프로그램을 만들려면 차라리 C#이 가장 좋은 선택일지도 모른다는 내용이었다. 그리고 리눅스나 맥은 Mono를 통해서 돌린다. 이것은 꽤 괜찮은 생각일지도 모르며, 이미 이런 프로그램들이 많이 나와있다.(하지만 기대치 만큼 잘 동작하지는 않는 것 같다. 앞으로는 더 좋아지겠지만)

앞으로 Windows XP가 점점 자취를 감출 때 쯤이면 닷넷으로 클라이언트 애플리케이션도 개발할 수 있고, 디바이스 드라이버도 좀 더 편하게 만들 수 있을텐데 나는 이 날이 제발 빨리 왔으면 좋겠다.

아래 페이지는 그간 Java 언어의 변화를 잘 보여주고 있다.

Java7도 어서 나와서 좀 더 편한 프로그래밍 세상이 되었으면 좋겠다.

크리에이티브 커먼즈 라이선스
Creative Commons License

http://www.benjaminlog.com/trackback/119 관련글 쓰기

submit
WinDbg로 쉽게 배우는 Windows Debugging - 8점
김성현 외 지음/에이콘출판
회사에 처음 들어와서 윈도우즈 유저모드 애플리케이션들을 개발해온지 이제 3년이 조금 넘었다.
얼마전부터는 생전 처음으로 커널 레벨 코드를 작성하게 되었다.

3년이라는 시간은 길다면 길고 짧다면 짧은 시간이지만, 그동안 사용자 레벨 시스템에 대한 많은 부분을 배울 수 있었는데, 커널 레벨은 또 하나의 새로운 세계를 보여주는 느낌이다.

커널 레벨 프로그래밍을 하면서 윈도우즈 시스템의 깊숙한 부분들에 대해서 잘 몰랐던 부분들이 조금씩 명확해지는 기분은 아주 달콤하지만, 잘 설계된 하이레벨 언어들과 라이브러리들을 사용하지 못하고 또 사용자 레벨에서처럼 편하게 디버깅을 할 수 없다는 것은 많은 한숨이 나오게 하는 점이었다.

나는 마치 다시 신입사원 때로 돌아간 것만 같은 느낌인데, 당시에는 Win32 API도 거의 아는 것이 없어서 김상형님의 winapi.co.kr에서 Win32 API와 Window Messages들을 모두 출력해서 출퇴근길마다 읽고, 집에 들어가면 Windows API 정복이나 Windows via c/c++(당시에는 4판이었던), 디버깅 애플리케이션과 같은 좋은 책들을 읽으면서 지식을 쌓을 수 있었다.

반면에 불행히도 윈도우즈 디바이스 드라이버 프로그래밍을 다루는 책들은 그다지 많지 않다. 아니 거의 없다. 책을 쓰기도 어렵거니와, 수요가 워낙 적어서 잘 팔리지도 않을 것이기 때문이다.
그래서 가장 많이 참조하게 되는 것은 결국 MSDN인데, 나는 아직 영어를 정확하고 빠르게 읽을만한 수준이 되지 못해서 이런 한글 책이나 번역서에 항상 감사한다.

블루스크린이 뜨고 덤프를 보고도 문제를 찾아내지 못하면서, 나는 디버깅을 조금 더 잘 할 수 있어야겠다는 생각을 갖게되었는데, 이 책이 내게 아주 많은 도움을 주었다.

특히 Bug Check 0xCE는 바로 그저께 닥친 문제였는데, 이 책을 차근차근 읽으면서 어렵지 않게 해결할 수 있었다. 책을 읽지 않고 코드만 바라봤다면 계속 흰머리만 하나씩 늘어갔을 것이다.

나는 이 책을 이틀동안 읽었는데, 얇은 책이라고는 하지만 기술서적이 이틀동안에 읽혀진다는 것은 그만큼 읽기 편하게 쓰여졌다는 뜻이기도 하다. 물론 예전에 존로빈스의 디버깅 애플리케이션을 읽으면서 배웠던 지식들도 도움이 많이 되었다.

이 책은 대체적으로 쉽게 잘 쓰여졌다만 설명이 부족한 부분들이 몇몇 있고, 덤프 코드와 설명을 빨리 매치 시키기가 어려운 단점이 있다. 만약 덤프 코드 앞에 라인번호을 붙여놓고 라인 번호와 함께 설명했다면 훨씬 읽기가 좋았을 것이다. b0f128a4 어쩌구 하는 어지러운 주소값을 라인번호도 없이 눈으로 찾아야하는 것은 읽는이로 하여금 쓸데없는 집중력을 소비하게 만든다.

어쨌거나 이 책을 다 읽고나서 바로 이틀 전인 그저께 모습보다 나는 훨씬 많이 발전했는데, 이 책의 가격이 좀 비싼감이 들긴 하지만(500페이지 분량에 35000원이다) 내가 얻은 결과에 비하면 충분한 값어치를 하고도 많이 남은 셈이다.

2년여 동안 고생해서 좋은 책을 써주고, 내게 많은 지식을 얻게해준 저자들에게 감사를 표한다.
크리에이티브 커먼즈 라이선스
Creative Commons License

http://www.benjaminlog.com/trackback/118 관련글 쓰기

submit