0. 소프트웨어 공학이 필요한 이유
1968년 한 회의에서 처음으로 제안된 개념인 소프트웨어 공학이 등장했습니다. 그 당시 하드웨어의 기능은 급격히 발전하고 있었지만, 소프트웨어 개발은 상대적으로 지지부진한 상태였습니다. 이에 대한 해결책으로, 공학적 접근이 필요하다는 인식 하에 '소프트웨어 공학'이라는 용어가 도입되었습니다.
현재 우리가 사용하는 거의 모든 것이 소프트웨어에 의해 운영되고 있으며, 소프트웨어 자체도 다양한 타입으로 발전하였습니다. 소프트웨어 엔지니어링은 단순히 기술적인 문제뿐만 아니라 윤리적인 측면도 중요시되며, 잘못된 소프트웨어 설계는 조직이나 국가에 심각한 영향을 미칠 수 있습니다.
건축에서의 예를 들어보면, 일반적인 작은 주택이나 개집과 같은 간단한 구조물을 건축할 때는 고도의 공학적 지식이 필요하지 않을 수 있습니다. 이러한 작업들은 비교적 간단하고 복잡하지 않기 때문에 특별한 공학적 접근 없이도 충분히 수행이 가능합니다. 하지만, 두바이의 높은 건물과 같은 대규모 건축 프로젝트의 경우에는 상황이 전혀 다릅니다. 이런 프로젝트에서는 첨단의 공학 기술과 복잡한 설계가 필요하고, 많은 수의 전문가들이 협력하여야만 성공적으로 건축을 완료할 수 있습니다.
이와 유사하게, 소프트웨어 개발 분야에서도 비슷한 상황을 볼 수 있습니다. 단순한 소프트웨어 프로젝트를 진행할 때는 소프트웨어 공학의 복잡한 접근법을 필요하지 않을 수도 있습니다. 그러나 회사의 대규모 시스템 개발이나 많은 사람들의 접속을 요구하는 중요한 프로그램이라면, 소프트웨어 공학의 방법론을 적극적으로 활용하여 더욱 체계적이고 공학적인 접근을 하는 것이 필요합니다. 이는 복잡한 소프트웨어 시스템을 효과적으로 개발하고 관리하기 위해 필수적이게 되었습니다.
1. 소프트웨어 정의
소프트웨어 공학에 대한 정의는 다양하며, 각기 다른 학문적 배경과 산업 요구에 따라 여러 방식으로 설명됩니다. 기본적으로 소프트웨어 공학은 소프트웨어의 개발, 운영, 유지보수 및 폐기와 관련된 체계적인 방법론을 제공하는 공학 분야로 인식되어 왔습니다. 한 정의는 "고품질의 소프트웨어 제품과 서비스를 경제적으로 제공하는 기술과 관리적 접근 방식의 집합"으로 소프트웨어 공학을 묘사하기도 합니다.
특히 가장 기본적으로 느껴지는 정의는 소프트웨어 공학을 "효과적이고 효율적인 소프트웨어 시스템의 개발과 유지를 위한 원칙과 방법을 연구하는 학문"입니다. 소프트웨어를 만들 때 효율성과 원칙의 고려는 필수이기 때문입니다.
이렇게 어떤 과점에서 바라보느냐 따라 다양하게 정의되는 소프트웨어 공학은 단순히 프로그래밍 기술을 넘어선, 프로젝트 관리, 품질 보증, 소프트웨어 테스팅, 사용자 경험 디자인 등 다양한 요소를 포괄하는 복합적인 학문임을 반영합니다. 소프트웨어 공학의 궁극적인 목표는 신뢰할 수 있고 사용하기 쉬우며, 효과적으로 유지 관리할 수 있는 소프트웨어를 개발하는 것입니다. 이를 위해 이론적, 실용적 지식이 모두 필요하며, 이 과정에서 다양한 이론적 모델과 실제 적용 사례를 학습하게 됩니다.
2. 소프트웨어 비용
방금 전 소프트웨어 공학의 정의에서 '효율성'의 고려는 필수라고 말했습니다. 이처럼 소프트웨어 비용 또한 어떻게 정의하느냐 따라 천차만별입니다. 소프트웨어 비용은 종종 전체 시스템이나 하드웨어 비용을 초과할 정도로 높아질 수 있습니다. 이는 소프트웨어에서 개발뿐만 아니라 유지보수 단계에서 더 많은 시간과 비용이 소요되는 경우가 있고 실제로도 많기 때문입니다. 이러한 이유로 소프트웨어 공학에서는 비용 효율적인 개발 방법에 대한 논의가 매우 중요하게 다뤄집니다.
소프트웨어 프로젝트에서 비용, 품질, 시장 진입 시간은 세 가지 중요한 요소로 간주됩니다. 이 중에서도 특히 비용 문제는 많은 기업들과 개발자들에게 큰 관심사입니다. 비용을 관리하고 최적화하기 위해 소프트웨어 공학에서는 다양한 전략을 사용합니다. 예를 들어, 초기 설계 단계에서 체계적인 분석과 계획을 통해 불필요한 재작업을 줄이고, 효율적인 자원 배분을 도모함으로써 전체적인 비용을 절감할 수 있습니다.
또한, 유지보수 비용을 줄이기 위해 코드의 재사용성을 높이고, 가독성 좋은 문서화를 진행하는 것도 중요한 전략 중 하나입니다. 이러한 접근 방식들은 프로젝트의 전체 수명주기 동안 발생할 수 있는 비용을 줄이는 데 기여하며, 결국 비용 효율적인 소프트웨어 개발을 가능하게 합니다. 이런 비용 관리 기법은 품질이나 시장 진입 시간을 희생하지 않으면서도 개발 프로젝트의 경제성을 높이는 데에 중점을 둡니다.
2-1. 개발 프로세스에 따른 소프트웨어 비용
이후에 개발 방법 프로세스에서 배울 두 모델의 소프트웨어 비용이 어떻게 구성되어 있는지 간략하게 알아보려고 합니다.
첫번째 모델인 워터폴 모델(Waterfall Model)은 소프트웨어 개발 과정을 선형적이고 순차적인 접근 방식으로 보는 개발 방법론입니다. 이 모델에서는 각 개발 단계가 이전 단계가 완료된 후에야 시작될 수 있으며, 각 단계는 뚜렷하게 구분되고, 엄격하게 통제됩니다. 이 접근법은 '요구 사항 및 설계', '구현', '테스트'의 세 부분에 비용을 각각 40%, 20%, 40%로 배분하는데, 이는 각 단계를 신중하게 수행하고, 변경 사항을 최소화하는 데 중점을 두는 구조입니다.
반면 반복적 개발 모델(Iterative Development)은 프로젝트를 빠르게 시작하고, 초기에 개발된 소프트웨어 버전을 기반으로 사용자의 피드백을 통해 점진적으로 개선해 나가는 접근 방식입니다. 이 모델에서는 '사양 설정', '반복적 개발', '시스템 테스팅'에 비용을 10%, 50%, 40%로 할당하며, 특히 개발 단계에서 사용자의 요구와 시장의 변화에 신속하게 대응할 수 있는 유연성을 제공합니다. 반복적 개발은 변경에 유연하고, 사용자의 요구사항을 지속적으로 통합하면서 리스크를 관리하고, 새로운 기술을 통합하는 복잡한 프로젝트에 적합한 모델로, 이 방식은 워터폴 모델과 달리 디자인과 개발을 구분하지 않고, 개발 과정에서 지속적으로 디자인을 개선해 나가는 점이 특징입니다.
결국 이 구분이 시사하는 점은 프로젝트의 성격, 요구사항의 명확성, 기술적 리스크, 시장의 변동성 등을 고려하여 두 모델 중 하나를 선택하거나 필요에 따라 두 접근 방식을 적절히 혼합하여 사용하는 것이 최선의 전략일 수 있습니다.
워터폴 모델은 요구사항이 확실하면서 변동성이 적은 프로젝트에 적합하며, 큰 규모 시스템에서 잘 사용될 것입니다. 반면, 반복적 개발은 요구사항이 불확실하고 변동성이 큰 프로젝트, 혁신성이 큰 프로젝트에서 더 적합할 것으로 보입니다. 소프트웨어 비용은 어떤 개발을 하느냐 따라 정말 달라집니다. 따라서 이를 확실하게 구분하고 실제로도 잘 활용하기 위해서 소프트웨어 공학을 공부하는게 도움이 될 것으로 기대됩니다.
'Software Engineering' 카테고리의 다른 글
[소프트웨어 공학] Waterfall 모델과 Incremental Development (0) | 2024.04.15 |
---|---|
[딥러닝] 비선형 함수 (0) | 2024.04.14 |
[소프트웨어 공학] Specification 명세화의 4단계 (0) | 2024.04.14 |
[소프트웨어 공학] Verification과 Validation의 차이 (0) | 2024.04.13 |
[소프트웨어 공학] 소프트웨어 종류(Type)와 고려해야 할 핵심 구성요소(Component) (0) | 2024.04.13 |