25개 애플리케이션으로 배우는 오픈 소스 소프트웨어 아키텍처

 

도서정보

에이미 브라운 (엮음) , 그레그 윌슨 (엮음) 지음

류성호, 김 마이클, 김성안, 박성철 외 8명 옮김

ISBN- 978-89-6626-126-0

188 * 240 mm  | 644쪽 |  36,000원

 

책소개

프로그래밍은 평생에 걸친 수련이 필요하다. 하지만, 프로그래밍 자체는 소프트웨어 아키텍처 설계와는 별개의 문제다. 많은 프로그래머가 보다 큰 규모의 설계 이슈에 대해 몇 년에 걸쳐 생각하고 씨름한다. 그런데 개별 프로그래머들은 역사적으로 뚜렷한 족적을 남긴 프로그램들을 접하거나, 노련한 업계종사자들이 해당 프로그램들에 대해 작성한 평가를 읽을 기회가 거의 없었다. 그 결과로 서로의 장점과 성공을 계승하지 못하고 서로 동일한 실수를 계속 반복해 왔다.

이 책은 이런 현상을 고쳐보고자 하는 노력의 일환이다. 각 장은 오픈 소스 소프트웨어의 아키텍처를 설명한다. 전체 구성은 어떻고, 각 하부 구조는 어떻게 상호동작하며, 왜 그런 방식으로 구축하게 되었으며, 다른 대규모 설계 문제에 적용될 수 있는 교훈은 어떤 것들이 있었는지 말이다. 각 해설은 해당 소프트웨어를 잘 아는, 복잡한 애플리케이션을 설계하고 다시 재설계하는 작업을 길게는 수십 년에 걸쳐 수행해 온 전문가들이 저술했다.

각 애플리케이션은 간단한 드로잉 프로그램에서부터, 웹 기반 스프레드시트, 컴파일러 툴킷, 그리고 수백만 라인에 이르는 시각화 패키지 등 매우 다양한 분야를 아우르고 있다. 일부는 몇 년밖에 되지 않은 반면, 어떤 것은 30주년을 바라보는 애플리케이션이다. 하지만 이 책을 저술한 43명의 필진 모두가 공통적으로 가지고 있는 바람인, 각 시스템 제작자들이 설계에 대해 오랫동안 열심히 고민해왔고 그 결과를 독자와 자발적으로 공유하고 싶다는 기대로 엮어졌다.

하둡과 같은 분산시스템에서부터 bash와 같은 셸에 이르기까지 다양한 대상들을 다루고 있는 만큼, 각 챕터마다 설명하는 방식들도 개성이 뚜렷하다. 하지만, 작업한 대상의 얼개를 설명할 때 어떤 내용들을 중심으로 설명하고 어떤 내용들을 생략했는지, 그리고 설계할 때 어떤 부분을 고민했으며 그에 따르는 장단점이 어떤 것이었는지 등을 살펴보면 흥미로울 듯하다. 특히 센드메일(Sendmail)이나 bash와 같이 오랜 역사를 가지고 있는 소프트웨어들의 경우 시간이 흐름에 따라 어떤 부분이 유지되었고 어떤 부분이 변경되었는지, 새로 만든다면 다르게 접근하고 싶은 부분은 어떤 것인지 등에 대한 설명을 듣는 것도 쉽게 접하기 어려운 부분이다.

 

저자 및 역자 소개

에이미 브라운

엮은이 에이미 브라운 Amy Brown은 워털루 대학교에서 수학으로 학사를 마쳤으며, 소프트웨어 산업에서 10년 동안 근무했다. 최근에는 저술과 책 편집 업무에 종사하고 있으며, 때때로 소프트웨어에 관한 책을 다루기도 한다. 토론토에서 자녀 두 명과 아주 나이 먹은 고양이와 함께 살고 있다.

그레그 윌슨

엮은이 그레그 윌슨 Greg Wilson은 25년 넘게 고성능 과학 컴퓨팅, 데이터 시각화, 컴퓨터 보안 분야에 종사해왔으며, 2008년 졸트상 수상작인 『Beautiful Code』를 포함한 여러 권의 컴퓨터 관련 서적과 어린이를 위한 두 권의 책을 저술했다. 1993년 에딘버러 대학교에서 전산학 박사 학위를 취득했다. 블로그 주소는 http://third-bit.com와 http://software-carpentry.org

류성호

역자 류성호는 KAIST 인공지능 연구실에서 박사과정을 마쳤으며, 졸업 후 삼성전자와 NHN에서 근무했다. 네이버의 음성 비서 서비스인 ‘링크’의 음성인식 개발을 담당하였으며, 현재 아마존에서 Speech/Machine learning scientist로 재직 중이다.

김 마이클

역자 김 마이클은 소프트웨어 시스템 아키텍트. 서강대를 졸업했고 미국 실리콘 밸리에서 Deloitte Consulting, Agilent Technologies 및 Symantec Corp. 등 글로벌 포춘 상위 기업에서 시스템 아키텍트 및 컨설턴트로 20년 정도 근무했으며 대부분의 소프트웨어 분야에 경험을 가지고 있지만 DevOps를 통한 생산성 혁신이 최근의 관심 분야이다. 3자녀를 둔 아빠이며 1999년에 거듭난 그리스도인이다.

김성안

역자 김성안은 대학원에서 소프트웨어 공학을 전공했고, 대학원과 첫 회사에서 이클립스 기반의 도구를 개발했다. 지금은 쿠팡에서 아이폰 애플리케이션을 개발하고 있다. 『프로그래밍 루아(2014)』 『아이패드를 제대로 활용하는 앱 개발(2011)』 『Git, 분산 버전 관리 시스템(2010)』 『프로그래밍 jQuery(2008)』를 공역했다.

박성철 

8bit 애플 2 호환기로 시작해 지금까지 30년 넘게 SW 개발 주변을 겉도는 경도 히키코모리이다. 평생 혼자 살 운명이었으나 천사를 만나 가장 역할을 부여받고 서울 근교에서 아들 하나와 함께 행복한 가정을 꾸리고 있다. 별생각 없이 시작한 회사를 10년 만에 말아 먹은 흑역사를 뒤로하고 지금은 SK플래닛에서 멋진 개발자들과 즐거운 퀘스트를 수행 중이다. 소프트웨어 개발 현장을 개선하는 데 관심이 많다.

서지혁 

건국대학교에서 생명과학을 공부하며, 스마트스터디에서 소프트웨어 엔지니어로 일하고 있다. 참여한 주요 프로젝트로는 Earth Reader, Crosspop 등이 있다.

설현준 

부산광역시 출생으로, 중학교 때 도미해 코넬 대학교에서 컴퓨터공학과를 졸업하고, 동 대학교 대학원에서 컴퓨터공학 전공으로 공학석사 학위를 취득했다. 2011년 이후로 NAVER에서 소프트웨어 개발과 음성 합성/음성인식 연구를 맡았고 2014년부터 현재까지 Apple, Inc.에서 엔지니어로 근무하고 있다.

임성현

소프트웨어 공학을 전공하였고, 현재 소프트웨어 품질 엔지니어로 일하고 있으며, 고객에게 박수 받는 제품을 만드는 꿈을 가지고 있다. 기술만큼이나 사람에게 관심이 많아, 다른 개발자들과 이야기하기를 좋아하고, 대학생의 졸업 작품을 지도하는 IT 한이음에서 8년째 멘토를 진행하고 있다. 중학생 딸, 아들과 함께 프로그래밍 할 때 제일 행복하다.

정진수 

성균관대학교 전자전기컴퓨터공학부 학사 및 석사학위를 받았다. 학창시절에 삼성소프트웨어 멤버십,KT 연구소 인턴 등을 거쳤다. 졸업 후 병역특례로 인프라웨어에서 모바일 브라우저 엔진 개발 프로젝트 및 신사업 개발 프로젝트에 참여하였고, 카카오 게임사업부에서 게임하기 및 관련 서비스들을 개발하다가 현재는 새롭게 시작하는 프로젝트에 참여하고 있다. RubyOnRails와 Scala 및 새로운 등장하는 기술들에 관심이 많고, 인간이란 존재, 역사를 통한 교훈, 운명에 대한 고찰 등 스타트업에서 요구하는 차별화된 엔지니어가 되기 위한 비기술적 주제들에 대해서도 깊은 관심을 가지고 있다. 현재는 용인에서 사랑스런 아내, 토끼 같은 두 아이와 함께 행복하게 살고 있다.

조상민 

씽크프리(주)에서 워드프로세서를 개발했고, (주)와이더댄 리서치센터와 (주)NHN 기술혁신센터, (주)생각제곱을 거쳤으며, 현재는 (주)SK플래닛에서 개발자로 일하고 있다. 『Java 세상을 덮친 이클립스』 『생각하는 프로그래밍』 『프로그래밍 심리학』 『패턴을 활용한 리팩터링』을 함께 짓거나 옮겼다.

최용호 

소프트웨어 공학을 전공하고, 시스템 프로그래밍, 네트워크, 보안, 웹 분야에서 개발, 기획, 분석, 컨설팅 등 다양한 업무를 수행했다. 그리고 JavaScript, PERL5, VB, ASP, J2EE & Java 해킹, Internet Winsock, 자바 병행 프로그래밍, CCNA, CCNP, CCIE, 소프트웨어 공학, 경영, 검색 엔진 최적화, 보안 분야 책들을 번역/집필했다. 현재 BPAN.COM에서 일하고 있다.

허태명 

평생 코딩하며 사는 것을 꿈꾸는 개발자이다. 현재 삼성전자에서 서버 개발 업무를 하고 있다. 그동안 주로 웹 서비스와 서버 개발 업무를 했지만 Fullstack Developer가 되기를 꿈꾸며 개발 관련한 모든 분야에 관심으로 꾸준히 공부하고 있다. 새로운 기술이 나오면 공부해서 실무에 성공적으로 적용했을 때 큰 행복을 느끼는 천생 개발자이지만 집에서는 사랑하는 아내의 남편이자 장난꾸러기 아들 둘의 아빠이다.

현수명 

장인 개발자를 꿈꾸는 개발자로, 함께 배우고 토론하며 지식 공유하기를 좋아한다. 신나고 즐겁게 개발하기 위해 노력 중이며, 습득한 지식은 블로그(soomong.net)를 통해 공유한다

 

목차

옮긴이의 글
서문

1장 CMake
1.1 CMake 역사와 요구사항
1.2 CMake의 구현 방식
1.3 교훈

2장 LLVM
2.1 빠르게 살펴보는 고전적 컴파일러 설계 방식
2.2 기존 구현 사례들
2.3 LLVM IR
2.4 LLVM에서의 3단계 컴파일러 설계 구현
2.5 이식이 용이한 LLVM 코드 생성기의 설계
2.6 그 밖의 흥미로운 기능들
2.7 회고와 향후 방향

3장 NoSQL 생태계
3.1 NoSQL이란?
3.2 NoSQL의 데이터와 질의 모델
3.3 데이터 내구성(Durability)
3.4 스케일링을 통한 성능 향상
3.5 일관성
3.6 마치며

4장 VTK
4.1 VTK란 무엇인가?
4.2 아키텍처
4.3 회고와 앞으로의 기대

5장 그래파이트(Graphite)
5.1 데이터베이스 라이브러리: 시계열 데이터를 저장
5.2 백엔드: 그저 저장소 서비스일 뿐
5.3 프론트엔드: 온디멘드 그래프
5.4 대시보드
5.5 뻔했던 병목지점
5.6 입출력 최적화
5.7 실시간성 회복
5.8 커널과 캐시 그리고 대재앙
5.9 클러스터링
5.10 회고
5.11 오픈 소스

6장 리악(Riak)과 얼랭/OTP(Erlang/OTP)
6.1 간략한 얼랭 소개
6.2 프로세스 뼈대
6.3 OTP 비헤이비어
6.4 다른 작업자 비헤이비어들
6.5 관리자
6.6 리악에서의 복사와 통신
6.7 결론과 교훈

7장 머큐리얼(Mercurial)
7.1 버전 관리의 간략사
7.2 데이터 구조
7.3 버전 관리 구조
7.4 일반 구조
7.5 부가기능
7.6 교훈

8장 바이올렛(Violet)
8.1 바이올렛 소개
8.2 그래프 프레임워크
8.3 JavaBeans 프로퍼티의 사용
8.4 장기 저장
8.5 Java WebStart
8.6 Java2D
8.7 자체 구현한 스윙 프레임워크
8.8 Undo/Redo
8.9 플러그인 구조
8.10 결론

9장 배시(Bourne-Again Shell, Bash)
9.1 서론
9.2 구문 단위와 기본형
9.3 입력 처리
9.4 구문 분석
9.5 단어 확장
9.6 명령 실행
9.7 교훈
9.8 마치며

10장 버클리 DB(Berkeley DB)
10.1 버클리 DB의 시작
10.2 아키텍처 살펴보기
10.3 액세스 메서드들: Btree, Hash, Recno, Queue
10.4 라이브러리 인터페이스 레이어
10.5 내부 컴포넌트
10.6 버퍼 관리자: Mpool
10.7 로크(lock) 관리자
10.8 로그 관리자
10.9 트랜잭션 관리자
10.10 마무리

11장 비스트레일스(VisTrails)
11.1 시스템 개요
11.2 프로젝트의 역사
11.3 비스트레일스의 내부
11.4 구성요소와 기능
11.5 교훈

12장 센드메일(Sendmail)
12.1 옛날 옛적에…
12.2 설계 원칙
12.3 개발 단계
12.4 설계 결정
12.5 다른 고려사항
12.6 보안
12.7 센드메일의 진화
12.8 지금이라면 어떻게 했을까?
12.9 결론

13장 셀레늄 웹드라이버(Selenium WebDriver)
13.1 역사
13.2 용어 정리
13.3 프로젝트의 원칙들
13.4 복잡성과 상대하기
13.5 자바스크립트 라이브러리의 계층구조
13.6 원격 드라이버, 특히 파이어폭스
13.7 IE 드라이버
13.8 웹드라이버 RC
13.9 회고
13.10 향후 전망

14장 소셜캘크(SocialCalc)
14.1 WikiCalc
14.2 소셜캘크
14.3 명령어 실행 루프
14.4 테이블 편집기
14.5 저장 포맷
14.6 리치 텍스트 편집
14.7 실시간 협업
14.8 교훈

15장 스노우플록(SnowFlock)
15.1 스노우플록 개요
15.2 VM 복제
15.3 스노우플록의 접근법
15.4 아키텍처 VM 설명자
15.5 부모 측 컴포넌트
15.6 Clone-Side 컴포넌트
15.7 VM 복제 애플리케이션 인터페이스
15.8 결론

16장 애스터리스크(Asterisk)
16.1 주요 아키텍처 개념
16.2 애스터리스크 컴포넌트 추상화
16.3 스레드
16.4 통화 시나리오
16.5 마지막 설명

17장 오더시티(Audacity)
17.1 오더시티의 구조
17.2 wxWidgets GUI 라이브러리
17.3 ShuttleGui 레이어
17.4 TrackPanel
17.5 PortAudio 라이브러리: 녹음과 재생
17.6 블록파일
17.7 스크립팅
17.8 실시간 효과
17.9 요약

18장 웨스노스 전투(Battle for Wesnoth)
18.1 프로젝트 개요
18.2 웨스노스 마크업 언어
18.3 웨스노스의 유닛
18.4 웨스노스의 다중 사용자 구현
18.5 결론

19장 이클립스(Eclipse)
19.1 초기의 이클립스
19.2 이클립스 3.0: 런타임, RCP, 로봇
19.3 이클립스 3.4
19.4 이클립스 4.0
19.5 결론

20장 지속적 통합 시스템(Continuous Integration)
20.1 배경
20.2 아키텍처
20.3 향후 개선 방향

21장 지트시(Jitsi)
21.1 지트시의 설계
21.2 지트시와 OSGi 프레임워크
21.3 번들의 패키징과 실행
21.4 프로토콜 제공자 서비스
21.5 미디어 서비스
21.6 사용자 인터페이스 서비스
21.7 교훈
21.8 감사의 말

22장 천 파섹(Thousand Parsec)
22.1 우주 제국
22.2 천 파섹 프로토콜
22.3 지원 기능
22.4 교훈 1

23장 텔레파시(Telepathy)
23.1 텔레파시 프레임워크의 구성요소
23.2 Telepathy가 D-Bus를 사용하는 방식
23.3 연결, 채널 그리고 클라이언트
23.4 언어 바인딩의 역할
23.5 견고함
23.6 텔레파시 확장하기: 사이드카
23.7 연결 관리자 내부 개요
23.8 얻은 교훈

24장 파이썬 패키징(Python Packaging)
24.1 개요
24.2 파이썬 개발자의 부담
24.3 패키징의 현재 아키텍처
24.4 개선 표준
24.5 구현 상세
24.6 교훈
24.7 레퍼런스 및 기여자

25장 하둡 분산 파일시스템(Hadoop Distributed File System)
25.1 개요
25.2 아키텍처
25.3 파일 I/O 작업 및 복제본 관리
25.4 야후!의 사례
25.5 교훈
25.6 고마운 분들

참고자료