1장. 위대한 소프트웨어는 여기에서 시작된다
자, 그럼 위대한 소프트웨어는 어떻게 만들까요? 어디서부터 시작할 지 아는 것이 쉽지는 않습니다. 프로그램이 실제로 해야 할 일을 제대로 하나요? 중복되는 코드 같은 것들은 어떻게 하나요? - 중복된 코드는 문제인데요, 맞죠? 무엇을 먼저 해야 하는지 알고, 전체 개발 프로세스에 어긋나지 않게 개발하는 것은 매우 어렵습니다. 하지만, 걱정하지 마세요. 이 장을 끝낼 때쯤이면, 위대한 소프트웨어를 어떻게 만들지 알게 되고, 여러분의 프로그램 개발 방식이 향상되는 길로 들어설 것입니다. 마지막으로, 왜 OOA&D가 중요한 지 이해하게 될 것입니다.
2장. 그들에게 원하는 것을 주세요
모두들 고객을 만족시키고 싶어합니다. 여러분은 벌써 좋은 소프트웨어를 만드는 첫 번째 단계는 소프트웨어가 고객이 원하는 기능을 수행하도록 하는 것임을 알았습니다. 그런데 어떻게 고객이 정말로 원하는 것을 알아내죠? 그리고 어떻게 고객이 진정 원하는 것을 고객 스스로 알고 있는지 확인하죠? 이 부분이 바로 요구 사항의 수집이 필요한 부분입니다. 이 장에서는, 여러분이 고객이 원하는 것을 만들어 주어 고객을 만족시키는 방법을 배웁니다. 이 장을 마치고 나면, 당신의 모든 프로젝트는 만족 보장프로젝트가 될 것이며, 매번 위대한 소프트웨어를 만들 수 있을 겁니다.
3장. 당신을 사랑해요. 당신은 완벽해... 그런데 이건 좀 바꿨으면
고객이 원하는 것을 알았다고 생각하죠? 너무 이릅니다. 여러분은 고객과 협의하여 요구 사항을 수집했고, 유스케이스를 작성하였으며, 좋은 프로그램을 전달하였습니다. 이제 칵테일을 마실 시간인가요? 맞습니다... 고객이 자신이 실제 원했던 것이 처음 자신들이 얘기했던 것과 다르다고 판단하기 전까지는 말이죠. 고객은 여러분의 프로그램을 맘에 들어 하지만 이제 충분히 좋은 것이 아닙니다. 실제로 요구 사항은 항상 변하고 이 변화에 대처해 고객을 만족시키는 것은 여러분에게 달려 있습니다.
4장. 여러분의 소프트웨어를 실제 세상으로...
이제 실제 프로그램을 개발할 때가 되었습니다. 여러분의 프로그램은 여러분의 개발 컴퓨터에서 뿐만 아니라, 실제 고객이 사용할 때도 잘 동작해야 합니다. 이 장은 여러분의 소프트웨어가 실세계에서도 잘 동작하는지 확인하는 것에 대한 것입니다. 문서의 분석을 통해 유스케이스를 추출하는 방법, 유스케이스를 클래스들과 메소드들로 변환하는 방법을 배웁니다. 이를 모두 마치면, 여러분은 "이제 됐어, 내 소프트웨어는 세상을 맞을 준비가 됐어"라고 말할 수 있습니다.
5장. (part1) 변하지 않는 것은 없다
변화는 피할 수 없습니다. 지금의 소프트웨어가 아무리 좋더라도, 곧 변해야 할 것입니다. 소프트웨어를 변경하기 쉽게 만들지 않으면, 고객의 변하는 요구 사항을 수용하는 것이 더욱 어려울 것입니다. 이 장에서는, 예전에 기타를 팔던 친구를 찾아가서,그때 만들었던 소프트웨어를 더 좋게 만들어 보고, 작은 변화가 어떻게 큰 문제로 발전할 수 있는지 볼 것입니다. 사실, 문제를 크게 들추어내어, 두 장에 걸쳐 해결할 것입니다.
(막간) 객체 지향 대참사!
(part2) 여러분의 소프트웨어를 운동시켜서 튼튼하게 만드세요
여러분은 몸이 더 유연했으면 하고 바랬던 적이 있나요? 여러분의 프로그램을 변경할 때 문제가 생기면, 소프트웨어가 더 유연하고 튼튼해질 필요가 있다는 의미입니다. 여러분의 프로그램을 유연하게 하는 것을 돕기 위해, 분석도 좀 해야 하고, 디자인도 좀 해야 하고, 객체지향 원리가 어떻게 프로그램을 유연하게 할 수 있는지도 배울 것입니다. 그리고 마지막으로, 어떻게 높은 응집도(cohesion)가 결합도(coupling)에 도움이 되는지도 알게 될 것입니다. 재미있을 거 같죠? 페이지를 넘겨 유연하지 않은 프로그램을 고치는 부분으로 돌아갑시다.
6장. "내 이름은 아트 반델리... 나는 건축가예요"
정말 뭔가 큰 것을 만들어야 할 차례입니다. 준비되었죠? 여러분의 객체지향 도구 상자에 많은 도구들을 채워 넣었습니다. 하지만 해결할 문제가 커서 정말 규모가 큰 프로그램을 만들어야 한다면, 그 도구들을 어떻게 사용하겠습니까? 사실, 이미 여러분은 큰 문제의 해결에 필요한 모든 내용을 배웠습니다. 이 장에서 도메인 분석, 유스케이스 다이어그램 같은 새로운 도구들도 배우겠지만, 그러한 새로운 도구들조차도 여러분이 이미 알고 있는 내용을 바탕으로 만든 것들 입니다 - 고객에 귀 기울이기 그리고 코드의 작성 전에 무엇을 만들 것인지 이해하기 같은 것들처럼요. 준비하세요... 아키텍트가 되어 볼 차례입니다.
7장. 혼란스러운 세상에 질서를
어디부턴가 시작해야 합니다, 하지만 올바른 곳에서시작해야 합니다! 여러분은 프로그램을 여러 개의 작은 문제들로 나누는 방법을 알고 있지만, 이는 곧 작은 문제들이 많다는 것을 의미합니다. 이 장에서 우리는 여러분이 어디서부터 시작할지 알아내는 것을 도와서, 쓸데없는 일로 시간을 낭비하지 않게 할 것입니다. 흩어져 있는 작은 문제들을 가져다 질서가 잡힌, 잘 설계된 프로그램으로 바꾸는 방법을 알아낼 차례입니다. 그러면서, 아키텍처에 대한 세 가지 중요한 질문들을 배우고, 1980년대의 멋진 전쟁 게임보다 위험 요소가 얼마나 더 많은지 알게 될 것입니다.
8장. 독창적인 디자인은 정도껏
모방은 바보 같은 짓을 하지 않기 위한 가장 진지한 방안입니다. 오랫동안 여러분을 괴롭히던 문제를 완전히 새롭고 독창적인 방법으로 해결하는 것만큼 좋은 것은 없습니다 - 여러분이 해결하기 전에 이미 다른 사람이 같은 문제를 해결하였고 그 방법이 여러분의 방법보다 훨씬 낫다는 것을 알기 전까지는요! 이 장에서는, 사람들이 여러 해 동안 생각해 낸 디자인 원리들을 살펴보고, 그러한 원리들을 통해 어떻게 더 좋은 프로그래머가 될 수 있는지 볼 것입니다. 여러분의 방법으로 해결한다는 생각은 좀 접어 두세요; 이 장에서는 일을 더 지혜롭고, 더 빠르게 하는 방법에 관해 얘기합니다.
9장. 소프트웨어는 여전히 고객을 위한 것입니다.
이젠 여러분이 얼마나 신경을 많이 쓰고 있는지 고객에게 보여줄 시간입니다. 잔소리 심한 상사? 걱정하는 고객? "제시간에 그 일을 끝낼 수 있습니까?"라고 계속 질문하는 이해 당사자들. 아무리 잘 설계된 코드라도 고객을 기쁘게 할 수 없습니다; 뭔가 동작하고 있는 것을 보여 주어야 합니다. 이제 여러분은 견고한 객체지향 프로그래밍 도구들을 갖추었으므로, 어떻게 여러분의 소프트웨어가 동작한다는 것을 고객에게 입증할지 배울 차례입니다. 이 장에서는, 소프트웨어의 기능을 파헤치는 두 가지 방법을 배우고, 고객이 벅찬 가슴으로 "맞아요, 당신이 확실히 이 일에 꼭 맞는 개발자예요!"라고 말하게 할 것입니다.
10장. 종합하기
우리 아직 거기 있습니까? 우리는 소프트웨어를 향상시키기 위한 많은 개별적인 방법들을 다뤘습니다. 그러나 이제 그것들을 종합할 차례입니다. 이것이 여러분이 지금까지 기다려온 것입니다: 우리는 여러분이 지금까지 배워온 모든 것을 가져다가, 그것이 어떻게 위대한 소프트웨어를 작성하는 데 계속 사용할 단일 프로세스의 일부가 되는지 보여줄 것입니다.
부록 A. 10개의 핵심 토픽 (우리가 다루지 않았던)
맞습니다. 550 페이지 분량을 소화했는데도, 아직 공부하지 않은 내용이 많습니다. 마지막 열 개의 주제들은 간단한 내용이지만, 이 각각에 대해 좀 더 정보를 주지 않고 우리 객체 마을을 떠나게 하고 싶지 않았어요. 하지만, 이제 대참사 광고 시간에 할 얘기가 많이 생겼고... 그리고 누가 가끔 흥미 있는 OOA&D 관련 얘기하는 것을 좋아하지 않겠어요?게다가, 이것을 마치고 나면 남겨진 것은 부록 하나... 찾아보기... 그리고 아마 광고도 좀 있겠죠.. 그리고 나면 여러분은 정말 이 책을 마치게 됩니다. 약속드리죠!
부록 B. 객체지향 언어로 말하기
외국 여행갈 채비를 하세요. 객체들은 자기들이 하기로 되어 있는 일만 하고, 애플리케이션들은 모두 잘 캡슐화 되어있고(이 의미가 정확히 뭔지 곧 알게 될 거예요), 디자인은 재사용성과 확장성이 좋은 객체 마을에 방문할 차례입니다. 그런데 가기 전에 우선 알아야 할 몇 가지 것들과 배워야 할 몇 가지 언어 관련 기술들이 있습니다. 하지만 걱정 마세요, 금방 그것을 알게 되어, 객체 마을의 잘 설계된 지역에 여러 해 살고 있었던 것처럼 객체지향 언어를 사용하게 될 것입니다.