Media Log

윤성우의 열혈 TCP/IP 소켓 프로그래밍 - 9점
윤성우 지음/오렌지미디어
이 책은 대학시절 네트워크 프로그래밍을 처음 공부하면서 봤던 책이다. 당시에도 그랬고 아직까지도 네트워크 프로그래밍 서적으로는 상당히 많이 팔린 책 중 하나인데, 작년쯤 개정판이 나왔다.
나오자마자 사놓고서는 여태껏 게으름 피우고 있다가 이제야 쭈욱 읽어봤다.

책의 표지도 그렇고 글쓴이의 문체 또한 조금 가벼운 느낌이 있어서 프로그래밍을 처음 시작하는 초보자들이나 읽어봐야할 책이라는 생각이 들수도 있다. 하지만 그렇지는 않다. 마치 어려운 내용은 다 빼고 쉬운 내용만을 설명한 것처럼 책이 술술 읽히는데, 저자가 설명을 쉽게 하는 재주가 있기 때문이지 중요한 내용들이 빠진 것은 아니다.
책장을 넘기는 내내 명불허전이라는 생각을 했다. 정말 좋은 책이다.

개정판에서는 epoll이 추가되어서 좋았다. 항상 말로만 들어보고 뭔가 너무 궁금했었다.
설명이 몇 페이지 없긴 하지만 처음부터 책을 잘 읽었으면 어렵지 않게 이해할 수 있다. IOCP를 사용해본 적이 있다면 더 쉽게 이해할 수 있을 것이다.
개인적으로 이 책의 IOCP의 설명보다는 제프리 리쳐의 Windows via C/C++의 설명이 훨씬 좋았다. 더 체계적이고 놓쳐서는 안될 세심한 부분들까지 완벽하게 다룬다. IOCP를 다루는 몇몇 책들 중에서는 제프리의 책이 가장 훌륭하다고 생각한다.

그동안 네트워크 프로그래밍을 꽤 오랫동안 안다루기는 했는가보다.
책을 읽다보니 기본적인 부분들을 포함해 많은 부분을 잊고 살고 있었는데, 이제 다시 머리 속이 채워진 느낌이다.
너무 재밌게 읽었고, 더 알고 싶은 부분도 많아서 또 다른 좋은 네트워크 책으로 보충할 생각이다.
난 정말 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도 어서 나와서 좀 더 편한 프로그래밍 세상이 되었으면 좋겠다.



국내에 좋아하는 프로그래밍 서적 집필자들이 몇 명 있는데 그들은 김상형, 이재규, 김태영 그리고 윤성우이다.
이들의 공통점은 국내의 몇 안되는 베스트 셀러 및 스테디 셀러 작가라는 점이다.
아마도 그 이유는 글로써 어려운 내용을 쉽고 재밌게 전달하는 능력을 갖추고 있기 때문일 것이다.

작년에 이 책이 나오자 마자 책 주제와 저자 이름만 보고 바로 구해서 읽었었는데, 그 이름 값은 충분히 했다. 책을 다 읽고 감동해서 윤성우씨한테 고맙다는 메일을 보냈는데 답장이 와서 좋아했던 기억이 난다.

이 책은 Jeffrey Richter의 Programming Application 의 내용과 흡사한데, Jeffrey Richter의 책 만큼 깊게 접근 하지는 않지만 본질들을 잘 다루고 있고, 재미있게 쓰여져 있어서 읽는 내내 너무 좋았다.

특히 커널 오브젝트와 핸들 테이블에 대한 내용은 이 책의 백미인데, Jeffrey의 책에서도 잘 다루고 있지만 나는 오히려 우리말로 쓰여진 이 책에서 훨씬 더 많은 내용을 이해할 수 있었다.

-Jeffrey Richter의 책은 4판이 번역서가 있긴 하지만 읽기가 힘들어서 5판의 번역서가 어서 나오길 기대하고 있다.

이 책의 목차는 다음과 같다.

1부. 컴퓨터 구조와 프로그래밍 모델
1장. 컴퓨터 구조에 대한 첫 번째 이야기
2장. 아스키코드 vs 유니코드
3장. 64비트 기반 프로그래밍

2부. 프로세스와 IPC
4장. 컴퓨터 구조에 대한 두 번째 이야기
5장. 프로세스의 생성과 소멸
6장. 커널 오브젝트와 오브젝트 핸들
7장. 프로세스간 통신(IPC) 1
8장. 프로세스간 통신(IPC) 2
9장. 스케줄링 알고리즘과 우선순위

3부. 멀티 쓰레드와 동기화
10장. 컴퓨터 구조에 대한 세 번째 이야기
11장. 쓰레드의 이해
12장. 쓰레드의 생성과 소멸
13장. 쓰레드 동기화 기법 1
14장. 쓰레드 동기화 기법 2
15장. 쓰레드 풀링(Pooling)

4부. 메모리 관리와 I/O
16장. 컴퓨터 구조에 대한 네 번째 이야기
17장. 구조적 예외처리(SHE) 기법
18장. 파일 I/O와 디렉터리 컨트롤
19장. 비동기 I/O와 APC
20장. 메모리 관리(Virtual Memory, Heap, MMF)
21장. Dynamic Linking Library