소프트웨어 위기

소프트웨어 위기()란 소프트웨어 공학 초기에 사용되던 용어로 정돈된 주제가 되기 이전에 사용되었다. 이 용어는 급격한 컴퓨터 계산 용량과 문제의 복잡성이 급격히 증가함에 따라 발생한 충격을 서술하기 위하여 사용되었다. 본질적으로, 이는 정확하고 이해할 수 있고, 검증 가능한 컴퓨터 프로그램을 작성하는 것이 얼마나 어려운가를 뜻한다. 소프트웨어 위기의 뿌리는 복잡성, 기대, 그리고 변화이다.

상충하는 요구조건들은 항상 소프트웨어 개발 과정에 지장이 되어 왔다. 예를 들어, 사용자는 많은 수의 기능을 요구해온 반면 구매담당자는 일반적으로 소프트웨어의 가격과 개발 시간을 최소화하기를 원했다.

 용어 
소프트웨어 위기라는 용어는 F. L. 바우어가 처음 1968년 독일 가미시에서 열린 첫 번째 나토 소프트웨어 공학 학회NATO Software Engineering Conference 1968에서 사용되었다. 에츠허르 데이크스트라의 1972년 ACM 튜링상 수상 연설에서도 이 용어가 등장하였다.

 원인과 증상 
소프트웨어 위기의 원인은 전반적인 소프트웨어 프로세스의 복잡성과 소프트웨어 공학이 전문분야로서 상대적으로 미성숙한점에 관련되어 있다.
 소프트웨어 규모의 대규모화, 복잡화에 따른 개발비용 증대
 하드웨어 비용에 대한 소프트웨어 가격 상승폭 증가
 유지보수의 어려움과 개발정체 현상 발생
 프로젝트 개발 및 소요예산 예측의 어려움
 신기술에 대한 교육 및 훈련의 부족

위기는 여러 가지 증상으로 나타났다:
 프로젝트 예산이 초과되었다.
 프로젝트 일정이 지연되었다.
 소프트웨어가 비효율적이었다.
 소프트웨어 품질이 낮았다.
 소프트웨어가 요구 사항을 만족시키지 못하는 일이 빈번히 일어났다.
 프로젝트는 관리 불가능했고 코드 관리는 힘들었다.
 소프트웨어가 고객의 손에 전달 되지 못했다.

소프트웨어 위기를 "길들이고자" 다양한 과정과 방법론이 지난 수십 년간 개발되어 다양한 수준의 성공을 보였다. 그러나, 널리 양해된 견해는 "만병 통치약은 없다" 즉, 단일한 접근 방식으로 프로젝트 초과와 실패를 모든 경우에서 방지할 수 있는 것은 없다는 것이다. 일반적으로, 소프트웨어 프로젝트가 대규모이고, 복잡하고, 요구 조건이 명확하지 않고, 낯선 측면을 내포할 경우 여전히 사실상 커다랗고 예측 불가능한 문제에 취약하다.

 대응 방안 
여러 소프트웨어 공학 수단을 더 적극적으로 활용하는 것이 한가지 해결책이 될 수 있다.
 객체 지향 프로그래밍, 캡슐화
 구조적 프로그래밍
 통합 개발 환경, 신속 응용 프로그램 개발
 소프트웨어 콤포넌트화
 소프트웨어 프로토타이핑
 애자일 개발 프로세스
 반복형 개발
 버그 / 이슈 관리 시스템, 버전 관리 시스템
 디자인 패턴
 Model+View+Controller
 가비지 콜렉션
 멀티스레드 프로그래밍

 임베디드 시스템 소프트웨어 위기 
최근 소프트웨어를 포함하는 임베디드시스템이 증가하면서 관련 사고와 문제가 증가, 사회적으로 작지 않은 영향을 끼칠 가능성이 증가하는데, 이도 소프트웨어 위기와 관련되어 있다.

 원인 
 임베디드시스템에는 실시간성 하드웨어에 대한 이해를 비롯, 다양한 분야에 대한 고도의 스킬이 필요하나 전산개발자에 대한 열악한 처우로 다수의 이직자가 발생, 베테랑이 부족한 가운데 필요 기술 수준은 상승하고 있다.
 휴대전화, 디지털 가전등의 예에서 보듯이 소프트웨어 규모가 비약적으로 증대하고 있으나 하드웨어 자원의 제약과 실시간성 구현의 문제로 IT 업계에서 지금까지 이용되어 왔던 방안들이 그대로 적용되기는 쉽지 않다.
 이공계기피 현상, 가전기기의 블랙박스화로 전자공학과 하드웨어 관련 흥미를 쌓을 기회가 감소하고 있다.

 대책 
 단기적 경쟁 입찰 보다는 장기적 전략 필요
 소프트웨어 공학의 근본적 문제점을 재조명
 요구사항, 재사용, 척도, 시각화, ...
 소프트웨어 시험 자동화
 규모 가변성 프로세스와 인프라 도입
 Microsoft Windows CE와 임베디드 리눅스 등 IT계열에 더 가까운 OS를 탑재하여 IT계통 개발 방안의 도입을 더 쉽게 하여 IT계열 소프트웨어 엔지니어의 활용도를 늘린다.
 여러 회사에서 펌웨어를 공통화하여 공동개발한다.
 인재 파견 회사에서 임베디드 엔지니어 양성 프로그램을 실시한다.

 같이 보기 
 인공지능 겨울

 참고 문헌 

분류:소프트웨어 공학
분류:에츠허르 데이크스트라
분류:소프트웨어 품질
분류:1968년 신조어