출판사마다 작업의 방식이 다를 수 있고, 집필자마다 순서가 다를 수 있다. 절대적인 방법이 아니라는 것을 알아두기 바란다. 그리고, 순서대로 읽어주기 바란다.
그럼 세번째... 어떻게 시작해야 할 지에 대해서 알아보자. 집필을 하기 위해서 먼저 해야 하는 것은 "목차"를 만드는 것이다. 다른 것이 우선 아니냐고?
아니다.
먼저 목차를 만들어야 한다. 물론 목차를 만들기 전에는 앞에서도 이야기 했지만, 무엇에 대해서 책을 쓸 지에 "주제"를 선정하고, 자료를 모으는 작업은 선행되어야 한다. 하지만, 이 작업은 책을 쓰지 않는다고 하더라도 누구나 본인이 하는 작업을 정리 할 때 필요한 작업이다.
그래서, 본격적인 집필 시작은 목차를 만드는 작업이라는 것이다.
목차는 뭐 상세 목차까지 적어주면 되겠지만, 그럴 필요는 없이 그냥 대분류 목차로 적어도 15~20개 정도 적어 두면 된다. (되도록이면 엑셀로) 만약 처음 집필하는 분이시라면, 상세 목차도 적어두면 좋을 것이다.
목차가 이쁘게 잘 선정 되었다면, 그 다음에는 출판사에 Contact 하는 것이다. -주변에 아는 사람이나 친구, 친구의 친구가 출판사와 아는 사람이거나, -친구중 저자가 있을 경우에는 그 아는 사람 통해서 Contact하는게 좋다.
만약 지인이 없어도 그냥 출판사에 Contact 해도 뭐라고 할 사람 아무도 없다.
메일로 연락해도 되고, 전화로 해도 되고, 만나도 된다. 아마도 여러분이 제시한 주제, 목차, 구성이 마음에 든다면 직접 만나서 이야기 하자고 할 것이다.
참고로 Blog2Book 자바 성능을 결정짓는... 책의 경우에는 A모 출판사에서 두명의 리뷰어에게 목차 리뷰를 받은 후 빠꾸를 먹었다. (이런책은 아무도 필요 없다는 어떤 리뷰어의 리뷰와 함께... 논란의 여지가 있을 수 있어 말씀드리지만, 다른 한분은 목차가 괜찮다고 하셨지만, 책의 주제를 다른방향(Advanced Java ? 뭐 그런 방향...)으로 바꾸어 보라는 의견을 주셨다.)
하지만 운 좋게도, 그 빠꾸를 먹은날 한빛미디어에 책을 서너권 집필한 저자와 만났는데, 그분이 직접 출판사와 연결 시켜 주셨다. 그때 그 지인이 이야기한 중요한 이야기는 "책을 쓰려고 할때, 자신이 원하는 방향의 책이 아니면 쓰지 않는 것이 나아요. 이책임(그땐 직급이 책임(과장)이었다.)님은 튜닝 책을 쓰려고 한거지 다른 책을 쓰려고 한게 아니잖아요..." 라는 말이다. 그 말에 용기를 얻고 한빛 담당자분과 만나서, 목차를 약간 수정하고 집필하기로 했다. 안 그랬으면, 아마도 그 책은 세상에 나오지도 못했을 것이다.
이 이야기를 왜 하냐면, 여러분들이 직접 쓰고 싶은 책이 있다면, 출판사 하나에서 빠꾸 먹었다고 포기하지 말라는 것이다.
그런데, 어느 출판사나 이익을 내야하기 때문에, 1000부도 팔릴 것 같지 않은 그런 책을 내지는 않는다. 다시 말하면, 여러분들도 사지 않을 그런 책은, 다른 사람도 안산다는 것이다.
필자는 이번에 테스트 책을 썼지만, 원래는 테스트 책을 쓸 생각도 없었다. 그냥 Rex Black 아저씨 책 중 기본이 되는 몇권중 한권을 번역하려고 했었다. 하지만, 그 결과는 4개 출판사에서 그러한 번역서는 시장성이 없다는 이유로 빠꾸 먹었다. - -; 그 4개 출판사와 Contact하는 중에 심심해서 적어 놓은 것이 이번에 나올 Blog2Book Test책의 목차다.
그것도 그냥 책 쓸려고 한 것도 아니고, 그냥 목차만 만들어 놓고 한번 정리해 보면 좋겠다고 생각하고, 출판사 담당자에게 그냥 함 보라고 보여 줬던 것이 화근(?)이 되었다. (그 담당자가 윗분에게 보여드리고, 그분이 한번 진행해 보라는 지시가 떨어져서리...)
여하튼, 출판사에서 OK하면, 책을 누가 보고, 누가 사고, 어떤 내용인지에 대한 소개서를 쓰고, 샘플챕터 하나 써서 내라고 한다.(아무리 목차가 좋아도 글이 맘에 안들면 안되니까...) 그리고 나서 마음에 들 경우, 계약금 받고 (보통 신사임당 10장에서 세금 좀 띄고) 계약서를 쓴다.
그런데, 여기서 한가지 유의할 점은, "뭐 그럴 필요 있나? 다 쓰고 나서 가져가지" 라는 생각을 할 수도 있을 것이다. 그런데, 샘플 챕터를 제출하는 이유는 필자의 어떤 점들을 고쳐야 할지를 확인하는 데에도 의의가 있다.
그렇게 다듬고, 나머지 부분을 작성하는 것과 모두 작성해 놓고 문체나 책의 방식을 수정하는 것은 엄청난 차이가 있을 것이다. (뭐 "난 상관 없어~~" 라는 분들은 그냥 다 써놓고 출판사를 만나도 된다.)
자바의 GC 방식에는 여러가지가 있지만, 최근에 나온 기술에는 G1이라는 것이 있다. 최근에 나온 JDK 6.0 update 14에는 early access 로 G1을 사용할 수 있도록 했다. G1을 적용하기 위해서는 java start option에 -XX:+UnlockExperimentalVMOptions -XX:+UseG1GC 라고 명시해 주면 된다.
추가로 G1을 사용할 때 GC로 인한 최대 대기시간을 지정하기 위한 -XX:MaxGCPauseMillis=<X> 옵션을 추가할 수 있으며, -XX:GCPauseIntervalMillis=<X> 옵션을 통해서 GC 대기 사이의 간격을 지정할 수 있다. 그런데 여기서 중요한 것은 이 옵션은 Goal 이다. Promise나 guarantee 가 아니라는 것이다. (목표일 뿐이고, 이건 약속이나 보장한다는 것이 아닐 뿐이고~~)
G1이 다른 GC와 다른 것은 GC를 담당하는 New와 Old의 장벽이 사라졌다는 것~~~ 자세한건 아래 링크의 비됴나 문서를 함 보시길~~~
오늘 팀장님께서 복사한 문서를 한번 읽어 보라고 주셨다.
9개의 자바 성능 팁에 대해서 아~주 간단하게 정리되어 있는 문서다. (2페이지에 걸친...)
그 장의 첫번째 구문에는 Michael A. Jackson 이라는 할아버지가 쓴 글귀가 있다.
The First Rule of Optimization : Don't do it
The Second Rule of Optimization (for experts only) : Don't do it yet.
이 문서가 언제 쓴 문서인지는 모르겠지만.... 이 글귀는 약간 이해는 안된다. ^^;
Tip #1 : Object creation is bad
Tip #2 : static is good ==> I don't think so 다.
Tip #3 : Table switch good, lookup switch bad
Tip #4 : Small methods are good methods
Tip #5 : Exceptions are exceptional
Tip #6 : Use decorator patterns with care
Tip #7 : instanceof is faster on classes
Tip #8 : Use synchronized minimally
Tip #9 : Beware external libraries
먼저 위의 인터뷰 내용을 읽어보자.
Garbage First Collector가 뭔지 대충 감을 잡을 것이다.
분명 대부분 안읽어 보시겠지만....적어도 아래 줄들은 일어 주기 바란다.
G1=next-generation low-pause garbage collector
G1 will ultimately replace the Concurrent Mark-Sweep (CMS) garbage collector
G1, even though it is generational, there is no physical separation between the two generations.
Three Objectives of G1 The first objective is consistent low pauses over time.
The second objective is to avoid, as much as possible, having a full GC.
The final objective is good throughput.
if you care about getting the job done as quickly as possible, and don't care much for how long your application is going to be stopped by the garbage collector, the throughput collector is the best choice.
if you have a batch job that is going to take a few minutes or a few hours and you want it to be done as quickly as possible, then a throughput collector is clearly the best choice.
But, if you are working on a very interactive job that needs to interact with people, other applications, or users through web pages, then a low latency garbage collector is the best choice.
Why does garbage collection take so long? ==> Garbage collection is very memory-bound. And memory speeds these days are quite slow compared to CPU speeds
그리고, 저 이너뷰 한 사람이 사진을 잘 찍는가본데, 사진과 개발과의 상관관계를 아래와 같이 이야기 했다.
You need to be committed and to be patient and try out things again and again, to make sure that you get it just right. I see some parallels between photography and development.
마지막엔 그가 이야기하는 아름다운 코드란....
Beautiful code is code that is simple, easy to understand, and efficient
란다.
물론 JVM 옵션 튜닝만 한다고 해서 답은 안나오겠지만,
튜닝할게 더이상 없다면, JVM 버젼 upgrade 및 옵션 튜닝을 해야 할 것이다.
아래는 이 글의 목차다.
뭐 다 읽기 귀찮으신 분들은 4.2 부터 적용해 보시면 된다.
1 Introduction
1.1 Goals
1.2 This is a Living Document
1.3 How to Use this White Paper
2 Best Practices
2.1 Use the most recent Java™ release
2.2 Get the latest Java™ update release
2.3 Insure your operating system patches are up-to-date
2.4 Eliminate variability
3 Making Decisions from Data
3.1 Beware of Microbenchmarks!
3.2 Use Statistics
3.3 Use a benchmark harness
4 Tuning Ideas
4.1 General Tuning Guidelines
4.1.1 Be Aware of Ergonomics Settings
4.1.2 Heap Sizing
4.1.3 Garbage Collector Policy
4.1.4 Other Tuning Parameters
4.2 Tuning Examples
4.2.1 Tuning Example 1: Tuning for Throughput
4.2.2 Tuning Example 2: Try the parallel old generation collector
4.2.3 Tuning Example 3: Try 256 MB pages
4.2.4 Tuning Example 4: Try -XX:+AggressiveOpts
4.2.5 Tuning Example 5: Try Biased Locking
4.2.6 Tuning Example 6: Tuning for low pause times and high throughput
4.2.7 Tuning Example 7: Try AggressiveOpts for low pause times and high throughput
5 Monitoring and Profiling
5.1 Monitoring
5.2 Profiling
6 Coding for Performance
7 Pointers
8 Feedback and the Java Performance Community
왜 페이지 캐시가 필요한지는 대부분 아시겠지만,
예를 들어서 간단하게 말씀드리면...
온라인 쇼핑몰에서 대분류, 중분류, 소분류로 상품의 목록이 나오고
해당 상품의 개수가 나와있다고 가정해보자.
만약 이런 페이지의 캐시를 지정하지 않았다면, 페이지를 호출할 때마다 해당 카테고리의 상품 개수를 가져오는 쿼리가 계속 수행될 것이다.
그런데 캐시를 사용한다면???
거의 HTML을 읽어오는 속도로 메모리에서 데이터를 읽어 올 수 있으므로,
해당 화면이 엄청나게 자주 불리는 초기화면이거나 include되는 화면이라면 WAS 와 DB 사용량이 현저하게 줄어들 수 있다.
추가로 I/O 도 줄어들 수 있을 것이다.
댓글을 달아 주세요
총 2권을 내실 예정이신가요?
일정 문제도 있고,
책의 부피 문제도 있어서,
총 2권으로 나옵니다.
다른 자바 기본서처럼 가격을 낮추고 싶은데, 쉽진 않네요.
참고로 총 1200 페이지 넘습니다.
요즘따라 기본으로 돌아가자라는 생각을 많이 합니다. 지금 가지고 있는 자바책도 두께가 살짝 얇아서 레퍼러스 도서가 하나 있었으면 좋겠다 라는 생각도 있구요. 서점에서 살펴본뒤 구매하도록 하겠습니다.
고생헤서 쓰신만큼 책 많이 팔렸으면 좋겠습니다. 힘내세용!
Vol.1 은 기초 문법만 있습니다.
따라서, 원하시는 레퍼런스 용이라면 Vol.2가 더 적합하실 수도 있습니다.
Vol.1 먼저 한번 훑어보시구요. ㅎㅎ