leesangwon0114

I am Research Engineer. Currently working in KT.

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

15 Aug 2017 » codecomplete

비유로 특정한 소프트웨어 현상을 설명하여 개발 프로세스의 이해를 돕는데 사용할 수 있음
비유를 반드시 이해할 필요는 없지만 소프트웨어 개발에 대해 더 명확하게 알고 싶을 때 필요

2.1 [비유의 중요성]

모델링 - 어설프게 아는 주제를 더 잘아는 비슷한 주제와 비교해 이해하여 결과적으로 덜 친숙한 주제를 잘 이해하는 것

과학의 역사는 비유라는 힘을 이용한 발견으로 가득
ex) 화학자 케큘레는 꿈에서 자신의 꼬리를 입에 물고 있는 뱀을 보고 벤젠의 특성을 설명
위와같이 일반적으로 모델은 생생하고 전체 개념의 윤곽을 잡을 수 있다는 장점이 있고, 특성, 관계, 추가적으로 연구할 영역을 제시해줌
모델이 잘못된 연구 영역을 제시할 때도 있는데 이 경우는 비유가 도를 넘어선 것임(지나친 해석)

소프트웨어 개발은 다른 과학보다 역사가 짧아 표준화된 비유를 가질만큼 성숙하지 않음
부족하고 모순된 비유도 많지만 비유를 얼마나 잘 이해하느냐가 개발을 얼마나 잘 이해하는지 결정

2.2 [소프트웨어 비유 사용법]

소프트웨어 비유는 지도라기 보다 탐조등 임 (답을 어디서 찾는지 보다 어떻게 찾을지를 알려줌)

비유는 알고리즘 보다 발견적인 학습으로서 더 많은 역할을 담당
알고리즘 - 특정작업을 수행하기 위해 잘 정의된 명령의 집합
비유와 알고리즘 차이점 : 해결책에 대한 직접성의 정도
알고리즘은 직접방법을 알려주고, 발견적 학습은 그 방법을 스스로 찾는 방법을 알려주든지, 적어도 어디서 찾을 수 있는지를 말해줌

프로그래밍 문제!

  • 정확하게 알려준다면 쉬워지고, 결과도 예측 쉬움
  • But, 프로그래밍 과학이 그 정도로 발전하지 않았고, 그렇게 되기도 쉽지 않음
  • 이유 : 프로그래밍에서 가장 어려운 분야는 문제를 개념화하는 것!
    프로그래밍에서 발생하는 많은 오류가 개념적인 오류이기 때문(프로그램은 저마다 개념적으로 고유해 모든 경우에 대한 해결책을 얻는 일반적인 방법을 만들기 어렵거나 불가능함)
  • 프로그래밍 문제와 프로세스를 이해하는데 비유를 사용할 것
  • 프로그래밍 활동에 대해 생각하고, 더 나은 작업수행 방법을 생각해내는데 도움을 받을 것

2.3 [일반적인 소프트웨어 비유]

1. 코드작성(편지쓰기)

소프트웨어 개발에 대한 가장 기초적인 비유는 코드 작성하기 라는 표현으로 부터 글쓰기 작업에 비유하여 마치 편지 쓰기와 같다는 말

소규모 프로젝트인 경우 적절하지만 다른 규모에는 제대로 설명하기 힘듬(대부분 다른 역할을 맡은 여러 사람이 참여하는 경우가 많음)

편지를 다 쓰고 나면 편지를 봉투에 담아서 보내 더는 내용을 변경할 수 없고, 사실상 완료
But, 소프트웨어는 변경하기 어렵지 않고, 완전히 완료되는 경우도 거의 없음

편지 쓰기 비유는 소프트웨어 프로세스가 신중한 계획 수립과 설계보다는 비용이 많이드는 시행착오에 달려 있다는 사실을 시사(휴지통에 버려진 반쯤 쓰다만 초안 더미)

2. 시스템 키우기(농사)

한 번에 조금씩 하나를 설계하고 코드를 작성하고 테스트한 다음 시스템에 추가(씨를 심고 곡물에 기르는 것)
조금씩 단계별로 수행함으로써 한번에 발생할 수 있는 문제를 최소화
조금씩 수행한다는 간단한 개념 이상으로 확장이 어려움

3. 시스템 증대(조개 양식)

증대 : 점진적을 외부에서 첨가하거나 포함해 규모가 증가하거나 자라는 것 어떻게 코드를 소프트웨어 시스템에 한번에 조금씩 추가할 것이 배워야 한다는 뜻
점증적 개발을 위해 우선 실행할 시스템을 가장 간단한 버전으로 만듬(더미클래스 호출)
더미클래스를 실질적인 클래스로 바꿈

4. 소프트웨어 구축(건설)

무엇을 구축하냐에 따라 종류와 정도가 다른 여러 단계의 계획 수립과 준비, 실행이 수반됨
건축가들 개발자들 일반적인 설계 후 승인 => 아키텍처 설계
기초공사를 하고 벽과 지붕을 올림 => 구현
거의 모든 부분이 완성되면 최고의 집을 위해 정원사, 도배업자를 부름 => 최적화
공사 점검 => 소프트웨어 검토 및 정밀 검사

집을 지을 때 세탁기, 건조기, 냉장고 등은 만들지 않음
마찬가지로 소프트웨어도 운영체제 수준 코드 or 기존 라이브러리를 만들지 않음
=> 이미 만들어져 살 수 있는 것을 코드로 작성하는 것은 무의미!
But, 최고금 가구의 집이나 주문제작과 같이 최고급 소프트웨어 제품을 만든다면 더 나은 속도와 정확성을 위해 자신만의 함수 필요

건축공사 비유는 여러방향으로 확장 가능하며 비유가 강력한 이유를 보여줌
소프트웨어 아키텍처, 구현, 기초클래스, 코드 분류 모두 건축 비유에서 나오게됨

5. 소프트웨어 기법의 적용(지적도구 상자)

휼륭한 장인은 일에 맞는 도구를 알고 그것을 제대로 사용하는 방법을 알고 있음
개발자도 프로그래밍에 대해 더 많은 것을 배울수록 머리속의 도구 상자는 더 많은 분석 도구로 가득 차고 그것들을 언제, 어떻게 사용할지에 대한 지식으로 채워짐

도구 상자 비유는 모든 방법과 기법, 팁을 언제든지 사용할 수 있도록 균형 잡힌 시각을 유지하는 데 도움을 줌