소프트웨어란?
우리 삶 주변, 문화, 상업적 부분에서도 많은 부분을 접하고 있는데,
- 사회 기반 시설(Infrastructures)과 공익사업(Utilities)은 컴퓨터 시스템에 의해서 컨트롤 되고, 대부분의 전기를 이용하는 제품은 소프트웨어를 내재하고 있습니다
- 공업시설(Industrial manufacturing)과 유통은 금융시스템(Financial System)처럼 철저히 컴퓨터화되어 있습니다
- 음악 산업, 컴퓨터 게임, 영화, 유튜브 같은 엔터테인먼트 산업 또한 소프트웨어가 빠질 수 없습니다
소프트웨어 시스템은 추상적이고 무형입니다
- 제품의 특성, 물리적 법칙, 제조 과정의 제약을 받지 않습니다
- 물리적 제약이 없기 때문에, 소프트웨어 시스템이 극도로 복잡해지고. 이로 인해 이해하기 어렵고 변경하는데 많은 비용이 들게 됩니다
소프트웨어 실패란
우리 주변에서는 소프트웨어 프로젝트가 실패하는 경우를 쉽게 볼 수 있습니다. 특히 프로젝트 규모가 커지고 기간이 길어지거나 많은 인원이 참여할수록 실패 확률이 증가합니다. 이는 소프트웨어 개발이 복잡한 과정을 거치며 여러 요인들이 연관되기 때문입니다. 예를 들어, 개발 일정이 지연되거나 요구사항이 변경될 경우, 프로젝트가 더 복잡해지고 이를 처리하기 위해 추가적인 비용이 발생할 수 있습니다. 이러한 상황에서는 효율적인 프로젝트 관리와 충분한 팀 협업이 필요합니다.
- 소프트웨어의 수요는 많지만, 시장에서 요구되는 품질을 만족하지 못했을 때
- 계획된 예산보다 많은 비용을 사용했을 때
- 약속된 기한내에 제품을 출시하지 못했을 때
이외에도 너무 많은 사례가 존재합니다
소프트웨어 엔지니어링이란?
초기 구상 단계부터 운영과 유지 보수까지 포함하는 소프트웨어 생산에 모든 관점과 연관된 학문입니다
(ex 고객이 비즈니스 목적으로 의뢰를 하고 개발자와 서로 조율해 가며 소프트웨어를 만들어감)
소프트웨어 제품의 특징
유지성(Maintainability)
- 소프트웨어는 해당 유형의 사용자에 의해 수용될 수 있어야 합니다. 이해하기 쉽고, 사용하기 쉽고, 기존 시스템과 호환성 있어야 합니다
의존성과 보안(Dependability and security)
- (확실성) 시스템 장애 시에 물리적 또는 경제적 손실이 없어야 하고,
- (보안성) 악의적 사용자가 시스템에 접근하거나 피해를 줄 수 없어야 합니다
- 신뢰성, 보안성, 안전성을 포함합니다 Reliability, Security, Safety
효율성(efficiency)
- 메모리나 CPU 타임 등의 시스템 자원을 낭비해서는 안되고
- 응답성과 처리시간 메모리 활용 등을 포함합니다
- Responsiveness, Processing Time, Memory Utilization
용인성(Acceptability)
- 소프트웨어는 고객의 변경 요구에 맞도록 진화할 수 있게 작성되어야 합니다
두 종류의 소프트웨어 제품
- 일반적인 소프트웨어 제품 ex) 마이크로소프트, Salesforce Automation
이와 같은 소프트웨어는 제품의 명세를 개발 조직이 결정하고 오프마켓에서 누구든지 구매할 수 있는 제품입니다
- 맞춤형 제품(특정 소비자를 위한)
소프트웨어 명세를 고객이 소유하고 결정
소프트웨어 약화
- 소프트웨어는 하드웨어와 다르게 마모(wear out)되지 않는다. 이 이론에 따른다면 Fig. 1과 같은 이상적인 그래프가 그려집니다
- 하지만 소프트웨어는 약화(Deterioration)됩니다.
- 예를 들어보겠습니다. 우리한테 연필이 있고, 우리가 이 연필을 매일 사용한다고 하면, 연필은 짧아질 것입니다
- 소프트웨어는 계속 사용하다가 어디 넣어두고 20년 후에 꺼내서 사용해도 정상적으로 작동될 것입니다.
- 하지만 분명 주변 환경의 변화로 호환성 문제나 현재에는 거의 사용되지 않는 코드로 인해 오류가 있을 겁니다
- 이런 것들이 소프트웨어 약화의 요인이 됩니다
엔지니어링 규율(Engineering discipline)
소프트웨어 엔지니어는 제품을 만들어 작동하게 합니다
그리고 적절한 이론들과 방법들이 없다 해도 항상 문제점을 보완하려고 노력해야 합니다
적절한 이론, 방법, 도구 등을 적용하여 조직, 재정 등 제약 안에서 해결책을 찾아야 합니다
소프트웨어 생산의 모든 관점
소프트웨어 개발의 기술적인 과정들뿐만 아니라 소프트웨어 프로젝트 관리와 도구의 개발, 방법, 이론등을 포함합니다
소프트웨어 엔지니어링의 중요성
개인과 사회가 소프트웨어 시스템에 의존적이므로 안정적이고 신뢰할 수 있는 제품을 빠르게 만들 필요가 있습니다
소프트웨어 엔지니어링 방법과 기술을 사용하는 것이 비용적으로 적게 들어갑니다
대부분의 큰 비용은 소프트웨어를 수정할 때 발생합니다
참조
https://www.abctech.software/2017/08/09/software-fail/