카테고리 보관물: Books

안드로이드 멀티스레딩

오늘 안드로이드 멀티스레딩 책을 선물 받았다. 이 책의 제목은 “Efficient Android Threading” 이다. 번역서에 영문 제목을 그대로 사용하고 있어서 책을 받아 든 순간 원서인가? 라는 느낌을 살짝 받았다. 이 책의 제목을 굳이 번역해 보자면 “효율적인 안드로이드 스레드”라고 할 수 있겠다. 이 책의 제목만으로 안드로이드에서 스레드를 효율적으로 사용하는 기법에 대한 내용을 살펴볼 수 있을 것으로 기대하게 된다. 이 책은 처음 원서로 접했을 때도 관심이 있었고, 더욱이 같이 일하는 동료가 번역해서 더 기대하고 읽어보게 되었다.

이 책의 저자는 안데스 예란손(트위터)이고, 구글링 해보면 외부 활동을 많이 하신 분은 아닌듯 하다. 이 분의 유투브 발표영상(https://www.youtube.com/watch?v=_q12gb7OwsA)도 참고하면 좋겠다.

이 책은 2개의 파트로 크게 구분하고 있다. 첫 번째 파트는 안드로이드 프로세스와 스레드에 대한 기본 지식에 대한 내용을 살펴볼 수 있다. 두 번째 파트는 본격적으로 안드로이드 스레드와 사용방법 그리고 비교적 효율적인 방법에 대한 내용을 살펴볼 수 있다.

파트의 구성인 개별 장의 내용에 대해서 간략하게 살펴보면 다음과 같다.

1장에서 안드로이드를 구성하는 구성요소(액티비티, 브로드캐스트 리시버, 서비스, 컨텐트 프로바이더)를 살펴본다.

파트 1 : 기초
– 2~6장까지 구성되어 있고, 개별 장은 다음의 내용으로 구성되어 있다.
2장에서는 안드로이드 스레드의 기본인 자바에서 사용하는 스레드에 대해서 살펴본다. 자바 스레드에 대한 내용이 좀 부실해서 다른 책을 읽어서 잘 알아둘 필요가 있다.
3장에서는 안드로이드 프레임웍을 사용하는 앱이 사용하는 리눅스 프로세스와 스레드를 살펴본다.
4장에서는 스레드 간의 통신하는 방법으로 파이프, 공유 메모리 그리고 핸들러를 살펴볼 수 있다. 이 장에서 핸들러는 안드로이드 내부에서 일반 스레드가 UI 스레드에 데이터를 전달하는 기본 방법으로 자세히 알아둘 필요가 있다.
5장에서는 안드로이드 앱의 프로세스 간 통신 방법을 알 수 있다. RPC를 사용하는 방법
6장에서는 메모리 누수에 대한 내용을 살펴본다. 결론으로 내부 클래스는 정적으로 사용한다. 그리고 안드로이드 메모리 누수도 자바의 일반적인 메모리 누수와 같아서 자바의 메모리 누수에 대한 내용을 살펴볼 필요가 있다. 그리고 안드로이드에서 많이 발생하는 Bitmap의 메모리 누수에 대한 내용이 없는 게 아쉽다.

파트 2 : 비동기 기법
– – 7~15장까지 구성되어 있고, 개별 장은 다음의 내용으로 구성되어 있다.
7장에서는 스레드 생명주기에 대해서 살펴보고 있고, 액티비티와 프래그먼트에서 사용되는 스레드를 살펴볼 수 있다.
8장에서는 핸들러 스레드(HandlerThread)를 사용하는 형태를 확인할 수 있다.
9장에서는 Executor 프레임웍을 살펴보고 있다. 이 프레임웍은 자바 5.0에서 추가된 전형적인 생산자/소비자(Producer/Consumer) 패턴 처리를 쉽게 지원한다. 자바언어를 기본으로 동작하는 많은 환경(JVM위에서 동작하는 스크립트 언어 포함)도 병행(Concurrent) 처리를 위해서 Executor 프레임웍을 사용하기 때문에 개인적으로는 안드로이드 스레드를 이해하는데 가장 중요한 기술적 배경을 살펴볼 수 있다.
10장에서는 AsyncTask에 대한 내용을 살펴보고 있다. 이 클래스는 사용하기 편리해서 안드로이드 앱이 비동기로 태스크를 처리하는 데 가장 많이 사용되고 있다. 가장 많이 사용하고 있는 이 클래스는 잘 알아둘 필요가 있다.
11장에서는 서비스.
12장에서는 인텐트 서비스.
13장에서는 AsyncQueryHandler.
14장에서는 로더(Loader)를 살펴보자. 로더는 허니콤 이후에 추가된 클래스로 기존에 사용하던 비동기 태스크를 액티비티나 프레그먼트의 생명주기와 같이 연동해서 사용하는 방법에 대해서 살펴볼 수 있다.
15장에서는 비동기 기술을 어떻게 선택할 것인지를 확인할 수 있다. 이 장의 내용은 좀 추상적인 면이 있어서 안드로이드에서 여러 가지 스레드 사용을 경험해 보고 상황에 맞는 스레드를 사용하면 되겠다. 개인적으로는 로더와 AsyncTask를 같이 사용해서 비동기 태스크를 처리하는 걸 추천한다.

이 책의 장단점을 살펴보자.

장점
이 책은 앱을 더 잘 만들 수 있는 안드로이드 스레드의 기본과 +알파를 제공한다.
많은 안드로이드 책들이 UI를 기준으로 쓰여 있어서 UX를 잘 만들기 위한 성능 개선에 대한 내용은 쉽게 접하기 힘든 부분이라서 이 책에 대한 내용이 매우 좋다.

단점
안드로이드 스레드를 사용하는 기본 내용에 충실하게 내용을 기술하고 있다.
제목에 걸맞는 “효율적인 안드로이드 스레드”에 대한 내용은 약간 부족하지 않나 싶다.
편집이 약간 아쉽다.

이 책은 처음부터 읽는 것을 추천하지만, 개인적으로는 11, 12, 13 그리고 15장은 해당 구성요소를 사용하거나 AsyncQueryHandler를 사용하는 경우에 읽어봐도 무방할 것으로 본다.

이 책을 읽으시는 초보 개발자분은 자바 스레드 책과 같이 읽어보면 좋을 것 같다.
그리고, 중/고급의 개발자에게는 다시 한번 안드로이드 앱이 동작하는 프로세스/스레드에 대한 기본 지식과 안드로이드 스레드를 잘 사용하기 위한 지식을 다시 한번 생각해 볼 수 있어서 좋을 것 같다.

해커와 화가(Hackers & Painters)..

해커와 화가

해커와 화가(Hackers & Painters)는 폴 그레이엄)이 저자이다. 폴 그레이엄이 해커이자 화가라서 저자 자신의 생각과 경험담을 쓴 내용이라 책의 제목이 해커와 화가인 것 같다.

이 책은 그의 사이트(http://www.paulgraham.com/articles.html)에 연재한 글을 엮어서 만들어졌다. 저자는 실리콘 밸리의 창업 사관학교(?)라 불리는 Y Combinator(http://ycombinator.com)의 공동 창업자이다. 이 책은 절판이 돼서 구하기 힘들었는데, 작년에 이 책을 회사의 동료를 통해서 어렵게 구했다. 이 책의 부제는 “Big Ideas from the Computer Age” 이다. 개인적으로 “컴퓨터 시대의 훌륭한 생각들”이라고 나름의 번역을 해 본다.

현재 해커와 화가 개정판(?)이 나와있다.

요즘은 완전한 기술서적보다는 개발자로서 응당 살아야 하는 삶을 살다가 다른 분야나 계속 개발을 하면서 느끼는 소회나 앞으로의 방향 그리고 개발을 업무로 살면서 다른 분야와의 공통 요소나 개발자 기반으로 사회나 다른 분야에 대한 통찰과 같은 글들에 손에 간다.

이 책을 읽으면서, 조엘 스폴스키의 책 “조엘 온 소프트웨어”가 생각이 났다. 두 책의 구성도 비슷하고 책의 내용도 코딩만 주로 하는(나같은..^^;;) 개발자들에게 좀 더 세상을 바라보는 식견과 더 일을 잘하기 위한 방법등을 제시해 주는 고마운 책들이다. 개인적으로는 조엘 온 소프트웨어가 비교적 개발이나 개발 프로세스등에 더 포커스를 두고 있어서 더 도움이 되었던 느낌(역시 비슷한 느낌에서는 첫 경험이…)이다.

이 책은 폴 그레이엄이라는 사람의 다른 분야와 개발자의 영역에 대해서 공통으로 느낄 수 있는 식견과 창업을 통한 경험적인 내용이 주를 이루고 있다. 주로 개발자나 화가와 같은 창조자(?)의 시점에서 창조를 해 나가면서 겪은 경험이나 혁신의 과정을 통해서 창조해 가는 과정을 담고 있다. 그래서, 창조하기 위해서 불필요한 프로세스에 대한 것들을 제거하고, 최상의 창조물을 만들기 위한 여러 가지 방법을 제시하고 있다. 또한, 프로그래밍 언어에 대한 그의 취향이 듬뿍 담겨서, 논쟁의 소지도 충분히 있어 보인다. LISP에 대한 애착이 강하다 보니, 다른 언어 특히 Java에 대한 반감이 느껴지기도 한다.

이 책을 다 읽고 나서의 첫 느낌이 “다시 읽어야겠다” 이다. 내공이 부족해서 두번 세번 읽어보면 지금의 느낌이 아니라 다른 무언가가 더 느낄 수 있을 것 같은 기대감이 든다.

린 스타트업(The Lean Startup)..

린 스타트업(The Lean Startup)은 창업을 하든, 팀에서 제품이나 서비스를 개발하든 적용해 볼 가치가 있는 방법인 것 같다.

린 스타트업은 프로젝트가 가지고 있는 가설을 제대로 검증해서 프로젝트의 가치를 입증하는 방법론이다. 개인적으로 프로젝트를 진행하면서, 프로젝트가 가지는 가설(사업팀의 사업의도나 기획팀의 서비스의 가치 등)에 대한 검증을 제대로 검증하는 프로세스를 가져본 적은 없는 것 같다. 검증이라는 프로세스를 통해서, 프로젝트가 가지는 가치의 모델을 설계하고, 설계한 가치 모델의 달성 여부를 기록하고, 실패한 경우에 실패 요인을 분석한다면, 다음 혹은 다 다음번 프로젝트는 성공의 길로 들어슬 것 같은 착각도 든다.. ^^

린 스타트업에서 가장 강조하는 내용이 실험을 통한 가설의 검증이다. 그리고 소프트웨어 분야에서는 애자일 개발 방법론이 린 사고에 뿌리는 두고 있다고 하고, 애자일 개발 방법론이 낭비를 없애는데 초점을 맞추고 있다고 말한다. 하지만 내 관점에서, 소프트웨어뿐 아니라 다른 분야의 프로젝트 관리에서 방법론이란, 프로젝트가 가지고 있는 리스트 관리가 핵심이고, 애자일 방법론들이 비교적 다른 방법론에 비해서 짧은 주기의 개발 사이클로 프로젝트의 리스크를 낮추고 있고, 결과적으로 낭비를 줄인다고 본다. 단적인 예로, 스크럼의 핵심인 번다운 차트가 낭비를 줄여주는가? 리스크를 줄여주는가? 만 고민해 봐도 그렇다.

개인적으로 이 책에서 가장 좋았던 내용은, 문제가 생겼을 때 왜? 를 5번 질문해 보도록 가이드 하는 것이다. 나도 왜?라는 질문을 좋아하는 편이고, 왜?라는 질문을 통해서 문제의 핵심을 볼 수 있어서 그렇다고 본다.

자, 이제 프로젝트를 진행하면서 프로젝트의 가설(가치)을 정해보고, 가치 모델(검증의 척도)도 만들어 보고, 문제가 생기면 왜?를 5번 질문해보며.. 린 하게 프로젝트를 진행해 보장.. ㅋㅋ

자바 병렬 프로그래밍 : 멀티코어를 100% 활용하는..

이 책은 자바로 멀티 스레드를 조금 더 공부하기 위해서 꼭 필요한 책이라고 생각한다.
이 책에 대해서 간단하게 딴죽을 걸고 넘어가자면, 병렬보다는 병행이 더 좋지 않을까 하는 것과 용어 선택이 조금 이상한 부분들이 좀 있다는 것(?) 정도이다.

이 책의 저자중의 한 명인, Doug Lea 교수님은 자바의 java.util.concurrent 패키지의 아버지라 말할 수 있을 정도로, 자바 멀티 스레드를 병행 프로그래밍의 여러 상황에 적절하게 대응하고 개발하기 쉽게 확장한 바에 가장 큰 역활을 한 분이다.

그래서, 나는 이 분이 쓰신 Concurrent Programming in Java(1996, 1999) 책은 자바 스레드 분야의 최고의 명저라고 생각한다. 국내에서는 “자바 병행 프로그래밍 : 디자인 원리와 패턴”으로 번역판이 나와 있다. 위의 Concurrent Programming in Java를 이어받은 최근의 역작이 바로 Java Concurrency in Practice(자바 병렬 프로그래밍)라고 생각한다. 자, 왜 이렇게 저자가 많은 이유를 살펴보자.

이 책의 저자들은 공통점이 하나 있는데, 다들 JCP의 JSR-166 : Concurrency Utilities 의 전문가들이다. Joshua bloch(조쉬아 블러시)는 현 그룹의 구성원으로 이름이 없지만, 초기 그룹 구성원으로 이름을 볼 수 있다. JSR-166은 java.util.concurrent를 제안하고 만들어낸 그룹으로 아래의 사람들이 자바에서는 최고의 멀티 스레드 전문가들이라고 할 수 있겠다.
* Brian Goetz(브라이언 게츠)
* Tim Peierls(팀 피얼스)
* Joshua bloch(조쉬아 블러시)
* Joseph Bowbeer(조셉 보위어)
* David Holmes(데이빗 홈즈)
* Doug Lea(더그 리) : JSR-166의 리더
 
따라서, 이 책이 왜 자바 스레드 분야의 명저가 됐는지 쉽게 이해할 수 있겠다. 이 책은 제목에 Practice가 들어가 있어서 그런지, 자바로 멀티 스레드 프로그래밍을 하면서 겪을 수 있는 상황과 그 상황의 대처방법을 자세히 기술하고 있다.
 
책 내용을 개략적으로 살펴보면..
1장에서는 자바 언어의 스레드와 스레드를 제대로 사용하기 위한 기본적인 지식에 대해서 설명하고 있다.
2장에서는 스레드로 프로그래밍하는 예를 설명하고 있다.
3장에서는 스레드로 가용성과 확장성을 어떻게 가져갈 것인지에 대한 내용인데, 개인적으로는 1장 2장을 충실하게 읽었다면 굳이 필요성을 못 느낄 수 있는 내용이 될 수도 있을것 같다.
4장에서는 락을 세밀하게 명시적으로 잘 쓰자 정도(?).. 그 이유는 다른 주제들은 꼭 스레드 이슈만인 것도 아닌거 같아서..
 
마지막으로, 자바로 멀티 스레드 프로그래밍을 하신다면 꼭 추천하고 싶은 책이다.

소프트웨어 생명 연장을 위한 원칙.. Code Simplicity

이 책의 저자는 버그질라 프로젝트를 유지하면서 쌓아온 소프트개발의 방향에 관해서 이야기를 하고 있다. 역자가 서문에 밝혔듯이 다 알고 있는 내용을 담고 있다. 이 책은 소프트웨어 엔지니어들이 일상의 업무에서 느끼고 있는 소프트웨어 개발을 잘 하고 오래 유지하기 위해서 필요한 것들을 체계적으로 정리를 했다.

여러 가지 개념에 대해서 나오지만, 제일 중요한 개념으로 “가치”를 들 수 있겠다. 책에서 가치는 “어디서든 누구에게나 변경이 도움을 줄 수 있는 정도”라고 정의하고 있다. 책의 전체적인 흐름은 소프트웨어 개발이나 유지보수가 과연 가치를 가져올 수 있는가에 초점을 맞추고 있다.

그래서, 소프트웨어 개발이나 유지보수가 가치와 어떤 관계를 가져야 하는지에 대한 정의를 보면 아래와 같이 정의하고 있다.

1. 변경에 대한 바람직함의 정도는 변경의 가치에 비례하고, 변경에 필요한 노력에 반비례한다.
위 정의를 좀 더 세분화해서, 아래와 같이 정의하고 있다.
2. 변경의 바람직함의 정도는 현재와 미래에 대한 가치와 정비례하며, 구현과 유지에 필요한 노력에 반비례한다.

소프트웨어 설계에서 미래에 정확히 어떤 일이 벌어질지 예측하지 않아도 지금 알고 있는 정보를 기반으로 좀 더 나은 미래를 위한 의사결정을 할 방법을 조합해서 소프트웨어를 발전시켜야 한다고 말하고 있다.

저자는 변경은 필연적이라 보고 있으며, 이것을 위해서 미래를 예측하고 소프트웨어를 개발하는 것이 도움이 되는 것이 아니라 위의 알고 있는 정보를 기반으로 합리적인 설계를 하고 구현하는 것이 다가올 미래의 대응을 위해서 충분하다고 말하고 있다.

소프트웨어 설계자들이 범하는 3가지 예를 나열하고 있다.

1. 필요 없는 코드를 작성한다.
2. 변경하기 어렵게 코드를 작성한다.
3. 아주 포괄적으로 작성한다.

내 경험상 필요 없는 코드까지 친절히 개발해 놓는 경우나 아주 포괄적으로 작성한 경우는 별로 보지 못했지만, 변경하기 어렵게 코드를 작성한 경우는 아주 많이 봤다. 그리고 유지보수를 하면서 점점 더 변경하기 어려운 코드로 변모해 가는 것을 자주 봐 왔다. 결국, 지속적인 노력(예로, 리펙토링과 같은 구조와 코드의 개선)이 없이는 소프트웨어는 죽어가고 있다.

그래서, 저자는 “점진적인 개발”과 “점진적인 설계” 방법을 조합해서 소프트웨어를 발전시켜야 한다고 말하고 있다.

6장 단순화에서 코드의 결점을 줄이기 위해서는 변경을 범위를 최소화해야 하는데, 최소화하는 방안으로 소프트웨어의 부분이 단순해야 한다고 말하고 있다. 단순화를 위해서는 설계의 일관성이 필요하고, 코드는 가독성이 높아야 한다고 한다. 어디서 많이 들어본 이야기다. OOP의 설계원칙을 잘 준수하고 코딩규약만 잘 지키면 달성할 수 있겠다.

7장 복잡성에서는 소프트웨어의 목적을 확대하려는 노력을 거부해야 한다고 한다. 이 내용은 소프트웨어의 목적과 위배가 되는 기능들의 추가를 막을 수만 있다면 복잡을 줄일 수 있다고 한다. 저자도 말하고 있지만, 개인적으로 제대로 이해를 하지 못하는 소프트웨어를 유지하면서 복잡성만 증가시킨 경험도 있고 해서, 개인적으로 소프트웨어의 개발은 리드 프로그래머의 역할이 매우 중요하다고 생각한다.

복잡성을 다루는 절에서는 부분을 단순하게 만들고, 고칠 수 없는 복잡성은 숨기라고 한다. 요건 OOP의 관점에서 인터페이스 기반의 설계를 통해서 인터페이스를 단순하게 만들고, 복잡성을 인터페이스 뒤에 숨기라고 이해를 했다.

재작성은 기존의 소프트웨어를 제대로 개선할 수 있다든가 리소스가 충분해서 여력이 있는 등의 조건을 만족하면 하고, 그렇지 않으면 하지 말라고 가이드를 하고 있다.

이 책을 한마디로 정의하면, “소프트웨어 엔지니어들이 필드에서 느끼는 설계/구현/유지보수와 같은 일상업무의 지침서”라고 할 수 있겠다.