토요일, 10월 26, 2013

[독서광] 자바 병렬 프로그래밍

일단 프로그래밍 문제 하나 풀어보자. 다음 예제에서 숨겨진 Iteration을 찾을 수 있겠는가?

package net.jcip.examples;

import java.util.*;

import net.jcip.annotations.*;

/**
 * HiddenIterator
 * 
 * Iteration hidden within string concatenation
 *
 * @author Brian Goetz and Tim Peierls
 */
public class HiddenIterator {
    @GuardedBy("this") private final Set set = new HashSet();

    public synchronized void add(Integer i) {
        set.add(i);
    }

    public synchronized void remove(Integer i) {
        set.remove(i);
    }

    public void addTenThings() {
        Random r = new Random();
        for (int i = 0; i < 10; i++)
            add(r.nextInt());
        System.out.println("DEBUG: added ten elements to " + set);
    }
}

안 그래도 머리 아픈 독자 여러분들께 처음부터 코드를 불쑥 내밀어 대단히 죄송하다. 정답은 가장 마지막에 보여주기로 약속드리며 본론으로 들어가보자. 자바 프로그래머에게 권장할 책 세 권을 뽑으라면 두 번 생각하지 않고, 밥 아저씨의 'Clean Code(번역서: 클린 코드)', 조슈아 블로치의 'Effective Java(번역서: 이펙티브 자바)', 그리고 브라이언 게츠, 더그 리, 조슈아 블로치 등 막강한 저자들이 연합한 'Java Concurrency in Practice(번역서: 자바 병렬 프로그래밍)'을 고르겠다. 세 책 모두 깊이와 재미와 정확성을 모두 갖춘 보기 드문 특성을 제공하며 자바 뿐만 아니라 다른 프로그래밍 언어를 배우는 사람들에게도 많은 도움을 주는 내용을 담고 있다. 색인 작업까지 완료되었기에 조만간 복간판이 나올 '클린 코드'는 이미 이 블로그에서 몇 번 소개했므로 오늘은 넘어가고, '이펙티브 자바'는 조만간 소개해드리기로 하고, 오늘은 처음부터 끝까지 병렬에 목숨을 거는 '자바 병렬 프로그래밍'을 소개하겠다. '클린 코드'와 '이펙티브 자바'에서도 병렬 프로그램에 대한 내용이 일부 나오기는 하지만 병렬 프로그래밍 자체가 방대하고 복잡하다 보니 아무래도 다루지 않는 부분이 더 많기 마련이다.

자 그렇다면 오늘 소개할 '자바 병렬 프로그래밍'의 특징은 무엇일까? 이 책의 최대 장점은 바로 단순 API 설명을 넘어 병렬 프로그래밍의 기본 이론(_기본_이라 얕보면 절대 안 된다. 원래 기본이 제일 어려운 법이니...), API의 설계 사상과 동작 방식, 나쁜 프로그래밍 방법과 좋은 프로그래밍 방법, 아키텍처와 설계 방법, 성능과 확장성을 위한 프로그래밍 방법, 병렬 프로그래밍 테스트 방법, JVM의 내부 동작 방식과 메모리 모델 등을 빠짐없이 다룬다는 데 있다. 처음 이 책을 접하고 500페이지가 넘어가는 두꺼운 분량에 압도될 수도 있겠지만, 좋은 영화는 상영시간도 짧다고 느끼듯 다 읽고 나서 되돌아보면 엄청난 내용을 다루는 이 책이 결코 두껍지 않다는 사실을 느끼게 될 것이다. 자바는 처음부터 스레드와 동기화가 프로그래밍 언어에 속한 1등급 시민이므로 많은 내부/외부 라이브러리가 스레드에 안전하게(또는 특정 상황에서만 스레드에 안전하게) 작성되어 있으므로 API만 적당히 잘 사용하면 되지 않겠느냐는 생각이 들지 모르겠지만, 이 책을 읽다보면 지금까지 저지른 악행(응?)에 등골이 오싹해지고 소름이 끼치는 순간이 몇 번 온다고 장담해드리겠다.

개인적으로 이 책에서 가장 마음에 들었던 부분은 '3부 활동성, 성능, 테스트'다. 물론 다른 부분도 좋지만 특히 3부는 '락'을 중심으로 활동성, 성능, 확장성을 설명하고 있으므로, 단순히 동기화 모델로서 '락'을 넘어 새로운 시각으로 '락'을 바라보게 도와준다. 이 책을 읽고 나면 소스 코드에서 암시적인 락을 잡는 synchronized나 명시적인 락을 잡는 각종 키워드/API 함수를 볼 때마다 다양한 각도에서 이리 뜯고 저리 뜯어보는 좋은 습관이 들지도 모르겠다. 3부 후반에 설명하는 테스트 방법 역시 실전에 도움을 주는 구체적이고도 좋은 내용으로 채워져 있으므로 성능 문제로 고민하는 개발자분들께 많은 도움이 될 것이다.

마지막으로 번역 상태를 살펴보자. 인터넷 서평을 보니 번역이 나쁘다고 말하시는 분이 많았는데... 까칠한 B급 프로그래머 입장에서 보면 특별한 문제 없이 잘 읽혔다. 십중팔구 번역서가 어려우면 원서를 읽어도 어려울테니 굳이 진땀 흘려가며 두꺼운 원서를 독파하려 애쓸 필요는 없어 보인다.

보너스: 신형 홈페이지는 아직 작업을 진행하고 있지만, 옛날 홈페이지는 살아있으므로 소스 코드 등을 살펴보기 바란다. 참고로 에이콘 출판사 번역서 페이지에서도 전체 소스 코드를 내려받을 수 있다.

결론: 중급 이상 자바 프로그래머에게 강력하게 추천한다!

뱀다리: 처음 제시한 문제의 정답은 'System.out.println("DEBUG: added ten elements to " + set);'에 숨어 있으며, set을 출력하기 위해 Iterator를 돌린다. 아무리 간단한 프로그래밍이라 해도 병렬 특성이 들어가면 복잡해지므로 주의에 주의를 거듭해야 한다. T_T

EOB

댓글 없음:

댓글 쓰기