////
Search
Duplicate

2. 소프트웨어 개발의 이해를 돕기 위한 비유

컴퓨터 과학에는 bug, crash, fatal error 등 다른 분야에서 차용한 다채로운 표현이 많다.
이런 이유로 우리는 비유를 통해 소프트웨어 현상을 설명할 수 있다. 더 나아가 소프트웨어 개발 프로세스의 이해를 돕는데 그러한 비유를 사용할 수 있다.

1. 비유의 중요성

유추란 어설프게 아는 주제를 더 잘아는 비슷한 주제와 비교해 이해함으로써 결과적으로 덜 친숙한 주제도 친숙하게 받아들일 수 있게끔 하는 행위다. 비유를 이렇게 사용하는 것을 모델링이라고 한다.
일반적으로 모델은 직관적이고 전체 개념의 윤곽을 잡을 수 있다는 장점이 있다. 모델은 특성과 관계, 추가적으로 연구할 영역을 제시해준다.
모델이 잘못된 연구 영역을 제시해주는 경우도 있는데, 그런 경우 비유가 도를 넘어선 것이다. 과학자들이 에테르를 찾고 있던 것도 모델을 지나치게 확대 해석했기 때문이다.
비유를 얼마나 잘 이해하느냐가 소프트웨어 개발을 얼마나 잘 이해하느냐를 결정한다.

2. 소프트웨어 비유 사용법

소프트웨어 비유는 탐조등이다. 답을 어디서 찾아야 하는지 말해주기보다는 어떻게 찾을지 알려준다. 비유는 알고리즘보다 발견적인 학습으로서 더 많은 역할을 담당한다.
알고리즘은 특정 작업을 수행하기 위한 잘 정의된 명령의 집합이다. 알고리즘은 예상 가능하고 결정적이며 바뀌지 않는다.
발견적 학습은 답을 찾는 데 도움을 주는 기법이다. 발견적 학습은 무엇을 찾는지가 아니라 어떻게 찾는지를 말해주기 때문에 그 결과가 쉽게 바뀐다.
알고리즘과 발견적 학습의 차이는 미묘하고 두 용어가 어느정도 겹치는 부분이 있다. 이 책의 목적에서 두 용어의 주요 차이점은 해결첵에 대한 직접성의 정도이다.
알고리즘은 직접 방법을 알려준다.
발견적 학습은 그 방법을 스스로 찾는 방법을 알려주든지 적어도 어디서 찾을 수 있는지는 얘기해준다.
프로그래밍에서 가장 어려운 분야는 문제를 개념화하는 것이며 프로그래밍에서 발생하는 가장 많은 오류가 개념적인 오류다.
프로그램은 저마다 개념적으로 고유하므로 모든 경우에 대한 해결책을 얻을 수 있는 추상적인 방법을 만들기는 어렵거나 아예 불가능하다.
따라서 일반적으로 문제에 다가가는 방법을 이해하는 것이 특정 문제에 대한 구체적 해결법을 아는 것만큼이나 유용하다.
소프트웨어 비유를 어떻게 사용할까? 그것을 프로그래밍 문제와 프로세스를 이해하는 데 활용하라.

3. 일반적인 소프트웨어 비유

소프트웨어 글쓰기: 코드 작성
소프트웨어 개발에 대한 가장 기초적인 비유는 코드 작성하기라는 표현으로부터 발생했다.
소프트웨어 개발을 글쓰기 작업으로 비유하는 것은 프로그램을 개발하는 것이 마치 편지 쓰기와 같다는 말이다.
소프트웨어를 글쓰기에 비유함으로써 다양한 아이디어를 얻을 수 있다.
개인 작업이나 소규모 프로젝트인 경우에는 편지 쓰기 비유가 적절하겠지만 다른 규모에서는 그것만으로 소프트웨어 개발을 제대로 설명하기가 어렵다.
또한 글쓰기 비유는 너무 단순하고 제약이 많아 소프트웨어 개발 프로세스에 큰 도움이 되지 않는다.
소프트웨어 농사: 시스템 키우기
소프트웨어 구축을 씨를 심고 곡물을 기르는 것에 비유하는 것이다. 한 번에 조금씩 하나를 설계하고 코드를 작성하고 테스트한 다음 그것을 시스템에 추가한다.
조금씩 단계별로 수행함으로써 한 번에 발생할 수 있는 문제를 최소화하는 것이다.
한 번에 조금씩 수행한다는 개념은 곡물이 자라는 방식과 유사한 점이 있지만 농사에 비유하는 것은 관련성이 약하고 많은 정보를 제공하지 못한다.
농사 비유의 약점은 그것이 소프트웨어 개발 방법을 직접 통제하지 못한다는 사실을 암시하기 때문이다.
소프트웨어 조개 양식: 시스템 증대
여기선 조개에 탄화칼슘을 서서히 추가해 진주로 만드는 방식을 설명한다. 증대의 사전적인 의미는 점진적으로 외부에서 첨가하거나 포함해 규모가 증가하거나 자라는 것이다.
어떻게 코드를 소프트웨어 시스템에 한 번에 조금씩 추가할 것인지를 비유한다.
증대와 밀접한 관련이 있는 다른 표현으로는 점증적, 반복적, 적응성 있는, 점진적 등이 있다.
점진적 개발에서는 우선 실행할 시스템을 가장 간단한 버전으로 만든다.
이후 조금씩 근육과 피부를 붙인다. 더미 클래스를 실질적인 클래스로 바꾸는 과정이 일어난다.
소프트웨어 건설: 소프트웨어 구축
소프트웨어를 짓는다는 이미지는 소프트웨어 글쓰기나 농사보다 더 유용하다.
그것은 소프트웨어 증대라는 개념과 맞아떨어지고 더 상세한 지침을 제공한다.
외에도 서로 다른 개발 접근 방법이 서로 다른 소프트웨어 프로젝트에 왜 이득을 주는지 설명하는 데도 도움을 준다.
창고나 공구 창고를 지을 때와 의료 센터나 원자로를 지을 때, 서로 다른 수준의 계획과 설계, 품질 보증을 사용한다.
소프트웨어에서도 일반적으로는 유연하고 가벼운 소프트웨어 접근 방법을 사용하겠지만 때때로 안전성 목표와 다른 목표들을 달성하기 위해서 엄격하고 무거운 접근 방법이 필요할 것이다.
변경 또한 건축 공사와 공통점이 있다.
6인치짜리 벽을 옮길 때 벽이 단순히 방 사이에 있는 칸막이일 때보다 내력벽일 때 더 큰 비용이 든다.
마찬가지로 프로그램에서 구조를 변경하는 것이 주변 기능을 추가하거나 삭제하는 것보다 더 큰 비용이 든다.
매우 큰 소프트웨어 프로젝트를 이해하는데 도움을 준다.
매우 큰 구조에서 실패로 인한 손해가 심하기 때문에 건축업자는 계획을 신중하게 세우고 검사해야 한다.
매우 큰 소프트웨어 프로젝트에서는 그냥 큰 프로젝트보다 훨씬 세밀한 계획이 필요하다.
건축 공사 비유는 여러 방향으로 확장될 수 있으며 이것이 바로 비유가 강력한 이유다.
소프트웨어 개발에서 일반적으로 사용되는 많은 용어(소프트웨어 아키텍처, 기초 클래스, 코드 분류)가 건축 공사 비유에서 나왔다.
소프트웨어 기법의 적용: 지적 도구 상자
고급 소프트웨어를 효과적으로 개발하는 사람들이 수많은 기법과 트릭, 노하우를 축적하는 데는 수년이 걸린다.
기법은 법칙이 아니라 분석 도구다. 훌륭한 장인은 일에 맞는 도구를 알고 그것을 제대로 사용하는 방법을 이해하고 있다.
개발자도 마찬가지다. 프로그래밍에 대해 더 많은 것을 배울수록 머릿속의 도구 상자는 더 많은 분석 도구로 가득차고 그것들을 언제, 어떻게 사용할지에 대한 지식으로 채워질 것이다.
도구 상자 비유는 모든 방법과 기법, 팁을 언제든지 사용할 수 있도록 균형 잡힌 시각을 유지하는 데 도움을 준다.
비유 결합
비유는 발견적 학습이기 때문에 상호 배타적이지 않다. 증대 비유와 건축 비유를 동시에 사용할 수 있다.
비유를 사용하는 것은 모호한 일이다. 비유를 통해 발견적 학습에 근안을 둔 통찰력을 얻기 위해서는 개념을 확장해야 한다.
하지만 비유를 지나치게 확장하거나 잘못된 방식으로 확장하면 엉뚱하게 판단할 수 있다. 강력한 도구를 잘못 사용할 수 있는 것처럼 비유도 잘못 사용할 수 있다.

요점 정리

비유는 알고리즘이 아니라 발견적 학습이다. 그래서 다소 엉성한 경향이 있다.
비유는 소프트웨어 개발 프로세스를 이미 알고 있는 다른 활동과 관련 지음으로써 그것을 이해하는데 도움을 준다.
어떤 비유는 다른 비유보다 낫다.
소프트웨어 구현을 건축 공사와 비슷하게 취급하면 신중한 준비 과정이 필요하다는 것을 알려주고 크고 작은 프로젝트 사이의 차이점을 보여준다.
소프트웨어 개발 실천법을 지적 도구 상자에 있는 도구로 생각하면 모든 개발자가 많은 도구를 갖고 있고 하나의 도구로 모든 일을 처리할 수 없다는 것을 말해준다.
문제마다 그에 맞는 도구를 선택하는 것이 효과적인 개발자가 되는 비결이다.
비유는 상호 배타적이지 않다 상황에 맞게 비유를 잘 결합해서 사용하라.