•
컴퓨터 과학에는 bug, crash, fatal error 등 다른 분야에서 차용한 다채로운 표현이 많다.
•
이런 이유로 우리는 비유를 통해 소프트웨어 현상을 설명할 수 있다. 더 나아가 소프트웨어 개발 프로세스의 이해를 돕는데 그러한 비유를 사용할 수 있다.
1. 비유의 중요성
•
유추란 어설프게 아는 주제를 더 잘아는 비슷한 주제와 비교해 이해함으로써 결과적으로 덜 친숙한 주제도 친숙하게 받아들일 수 있게끔 하는 행위다. 비유를 이렇게 사용하는 것을 모델링이라고 한다.
•
일반적으로 모델은 직관적이고 전체 개념의 윤곽을 잡을 수 있다는 장점이 있다. 모델은 특성과 관계, 추가적으로 연구할 영역을 제시해준다.
◦
모델이 잘못된 연구 영역을 제시해주는 경우도 있는데, 그런 경우 비유가 도를 넘어선 것이다. 과학자들이 에테르를 찾고 있던 것도 모델을 지나치게 확대 해석했기 때문이다.
•
비유를 얼마나 잘 이해하느냐가 소프트웨어 개발을 얼마나 잘 이해하느냐를 결정한다.
2. 소프트웨어 비유 사용법
•
소프트웨어 비유는 탐조등이다. 답을 어디서 찾아야 하는지 말해주기보다는 어떻게 찾을지 알려준다. 비유는 알고리즘보다 발견적인 학습으로서 더 많은 역할을 담당한다.
◦
알고리즘은 특정 작업을 수행하기 위한 잘 정의된 명령의 집합이다. 알고리즘은 예상 가능하고 결정적이며 바뀌지 않는다.
◦
발견적 학습은 답을 찾는 데 도움을 주는 기법이다. 발견적 학습은 무엇을 찾는지가 아니라 어떻게 찾는지를 말해주기 때문에 그 결과가 쉽게 바뀐다.
•
알고리즘과 발견적 학습의 차이는 미묘하고 두 용어가 어느정도 겹치는 부분이 있다. 이 책의 목적에서 두 용어의 주요 차이점은 해결첵에 대한 직접성의 정도이다.
◦
알고리즘은 직접 방법을 알려준다.
◦
발견적 학습은 그 방법을 스스로 찾는 방법을 알려주든지 적어도 어디서 찾을 수 있는지는 얘기해준다.
•
프로그래밍에서 가장 어려운 분야는 문제를 개념화하는 것이며 프로그래밍에서 발생하는 가장 많은 오류가 개념적인 오류다.
◦
프로그램은 저마다 개념적으로 고유하므로 모든 경우에 대한 해결책을 얻을 수 있는 추상적인 방법을 만들기는 어렵거나 아예 불가능하다.
◦
따라서 일반적으로 문제에 다가가는 방법을 이해하는 것이 특정 문제에 대한 구체적 해결법을 아는 것만큼이나 유용하다.
•
소프트웨어 비유를 어떻게 사용할까? 그것을 프로그래밍 문제와 프로세스를 이해하는 데 활용하라.
3. 일반적인 소프트웨어 비유
•
소프트웨어 글쓰기: 코드 작성
◦
소프트웨어 개발에 대한 가장 기초적인 비유는 코드 작성하기라는 표현으로부터 발생했다.
▪
소프트웨어 개발을 글쓰기 작업으로 비유하는 것은 프로그램을 개발하는 것이 마치 편지 쓰기와 같다는 말이다.
◦
소프트웨어를 글쓰기에 비유함으로써 다양한 아이디어를 얻을 수 있다.
◦
개인 작업이나 소규모 프로젝트인 경우에는 편지 쓰기 비유가 적절하겠지만 다른 규모에서는 그것만으로 소프트웨어 개발을 제대로 설명하기가 어렵다.
◦
또한 글쓰기 비유는 너무 단순하고 제약이 많아 소프트웨어 개발 프로세스에 큰 도움이 되지 않는다.
•
소프트웨어 농사: 시스템 키우기
◦
소프트웨어 구축을 씨를 심고 곡물을 기르는 것에 비유하는 것이다. 한 번에 조금씩 하나를 설계하고 코드를 작성하고 테스트한 다음 그것을 시스템에 추가한다.
▪
조금씩 단계별로 수행함으로써 한 번에 발생할 수 있는 문제를 최소화하는 것이다.
◦
한 번에 조금씩 수행한다는 개념은 곡물이 자라는 방식과 유사한 점이 있지만 농사에 비유하는 것은 관련성이 약하고 많은 정보를 제공하지 못한다.
◦
농사 비유의 약점은 그것이 소프트웨어 개발 방법을 직접 통제하지 못한다는 사실을 암시하기 때문이다.
•
소프트웨어 조개 양식: 시스템 증대
◦
여기선 조개에 탄화칼슘을 서서히 추가해 진주로 만드는 방식을 설명한다. 증대의 사전적인 의미는 점진적으로 외부에서 첨가하거나 포함해 규모가 증가하거나 자라는 것이다.
◦
어떻게 코드를 소프트웨어 시스템에 한 번에 조금씩 추가할 것인지를 비유한다.
▪
증대와 밀접한 관련이 있는 다른 표현으로는 점증적, 반복적, 적응성 있는, 점진적 등이 있다.
◦
점진적 개발에서는 우선 실행할 시스템을 가장 간단한 버전으로 만든다.
◦
이후 조금씩 근육과 피부를 붙인다. 더미 클래스를 실질적인 클래스로 바꾸는 과정이 일어난다.
•
소프트웨어 건설: 소프트웨어 구축
◦
소프트웨어를 짓는다는 이미지는 소프트웨어 글쓰기나 농사보다 더 유용하다.
◦
그것은 소프트웨어 증대라는 개념과 맞아떨어지고 더 상세한 지침을 제공한다.
◦
외에도 서로 다른 개발 접근 방법이 서로 다른 소프트웨어 프로젝트에 왜 이득을 주는지 설명하는 데도 도움을 준다.
▪
창고나 공구 창고를 지을 때와 의료 센터나 원자로를 지을 때, 서로 다른 수준의 계획과 설계, 품질 보증을 사용한다.
▪
소프트웨어에서도 일반적으로는 유연하고 가벼운 소프트웨어 접근 방법을 사용하겠지만 때때로 안전성 목표와 다른 목표들을 달성하기 위해서 엄격하고 무거운 접근 방법이 필요할 것이다.
◦
변경 또한 건축 공사와 공통점이 있다.
▪
6인치짜리 벽을 옮길 때 벽이 단순히 방 사이에 있는 칸막이일 때보다 내력벽일 때 더 큰 비용이 든다.
▪
마찬가지로 프로그램에서 구조를 변경하는 것이 주변 기능을 추가하거나 삭제하는 것보다 더 큰 비용이 든다.
◦
매우 큰 소프트웨어 프로젝트를 이해하는데 도움을 준다.
▪
매우 큰 구조에서 실패로 인한 손해가 심하기 때문에 건축업자는 계획을 신중하게 세우고 검사해야 한다.
▪
매우 큰 소프트웨어 프로젝트에서는 그냥 큰 프로젝트보다 훨씬 세밀한 계획이 필요하다.
◦
건축 공사 비유는 여러 방향으로 확장될 수 있으며 이것이 바로 비유가 강력한 이유다.
◦
소프트웨어 개발에서 일반적으로 사용되는 많은 용어(소프트웨어 아키텍처, 기초 클래스, 코드 분류)가 건축 공사 비유에서 나왔다.
•
소프트웨어 기법의 적용: 지적 도구 상자
◦
고급 소프트웨어를 효과적으로 개발하는 사람들이 수많은 기법과 트릭, 노하우를 축적하는 데는 수년이 걸린다.
◦
기법은 법칙이 아니라 분석 도구다. 훌륭한 장인은 일에 맞는 도구를 알고 그것을 제대로 사용하는 방법을 이해하고 있다.
◦
개발자도 마찬가지다. 프로그래밍에 대해 더 많은 것을 배울수록 머릿속의 도구 상자는 더 많은 분석 도구로 가득차고 그것들을 언제, 어떻게 사용할지에 대한 지식으로 채워질 것이다.
◦
도구 상자 비유는 모든 방법과 기법, 팁을 언제든지 사용할 수 있도록 균형 잡힌 시각을 유지하는 데 도움을 준다.
•
비유 결합
◦
비유는 발견적 학습이기 때문에 상호 배타적이지 않다. 증대 비유와 건축 비유를 동시에 사용할 수 있다.
◦
비유를 사용하는 것은 모호한 일이다. 비유를 통해 발견적 학습에 근안을 둔 통찰력을 얻기 위해서는 개념을 확장해야 한다.
◦
하지만 비유를 지나치게 확장하거나 잘못된 방식으로 확장하면 엉뚱하게 판단할 수 있다. 강력한 도구를 잘못 사용할 수 있는 것처럼 비유도 잘못 사용할 수 있다.
요점 정리
•
비유는 알고리즘이 아니라 발견적 학습이다. 그래서 다소 엉성한 경향이 있다.
•
비유는 소프트웨어 개발 프로세스를 이미 알고 있는 다른 활동과 관련 지음으로써 그것을 이해하는데 도움을 준다.
•
어떤 비유는 다른 비유보다 낫다.
•
소프트웨어 구현을 건축 공사와 비슷하게 취급하면 신중한 준비 과정이 필요하다는 것을 알려주고 크고 작은 프로젝트 사이의 차이점을 보여준다.
•
소프트웨어 개발 실천법을 지적 도구 상자에 있는 도구로 생각하면 모든 개발자가 많은 도구를 갖고 있고 하나의 도구로 모든 일을 처리할 수 없다는 것을 말해준다.
◦
문제마다 그에 맞는 도구를 선택하는 것이 효과적인 개발자가 되는 비결이다.
•
비유는 상호 배타적이지 않다 상황에 맞게 비유를 잘 결합해서 사용하라.