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

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

== 용어 ==
'''소프트웨어 위기'''라는 용어는 [[F. L. 바우어]]가 처음 1968년 독일 [[가미시]]에서 열린 첫 번째 나토 소프트웨어 공학 학회<ref>[http://homepages.cs.ncl.ac.uk/brian.randell/NATO/NATOReports/index.html NATO Software Engineering Conference 1968<!-- 봇이 따온 제목 -->]</ref>에서 사용되었다. [[에츠허르 데이크스트라]]의 1972년 [[튜링상|ACM 튜링상]] 수상 연설<ref>{{웹 인용
| url = http://www.cs.utexas.edu/users/EWD/ewd03xx/EWD340.PDF
| 제목 = ''겸손한 프로그래머''
| 확인날짜= 2009-06-30
| 저자 = 에츠허르 데이크스트라
}}</ref>에서도 이 용어가 등장하였다.

{{인용문|소프트웨어 위기의 주요한 위기는 컴퓨터 성능이 몇수십배나 더 강력해졌기 때문입니다! 심하게 말하면: 컴퓨터가 없었을 때는 프로그래밍에는 전혀 문제가 없었습니다; 느린 컴퓨터 몇 개 뿐이었을 때는 프로그래밍이 조금 문제가 되었고, 이제는 거대한 컴퓨터에 프로그래밍도 비슷하게 거대한 문제가 되었습니다.|[[에츠허르 데이크스트라]]|[[에츠허르 데이크스트라#에츠허르 데이크스트라 씀|겸손한 프로그래머 (EWD340)]]|[[Communications of the ACM]]}}

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

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

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

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

== 임베디드 시스템 소프트웨어 위기 ==
최근 소프트웨어를 포함하는 임베디드시스템이 증가하면서 관련 사고와 문제가 증가, 사회적으로 작지 않은 영향을 끼칠 가능성이 증가하는데, 이도 소프트웨어 위기와 관련되어 있다.<ref name="Aoyama 2004">{{웹 인용
| url = http://www.seto.nanzan-u.ac.jp/~amikio/NISE/jp/confs/ICSE04-Panel-Aoyama-2004-05.pdf
| 제목 = 일본내 소프트웨어 공학의 도전
| 확인날짜 = 2009-06-30
| 날짜 = 2004-05-26
| 저자 = Mikio Aoyama
| archive-date = 2005-12-21
| archive-url = https://web.archive.org/web/20051221213134/http://www.seto.nanzan-u.ac.jp/~amikio/NISE/jp/confs/ICSE04-Panel-Aoyama-2004-05.pdf
| url-status = dead
}}</ref><ref>{{저널 인용
  | 저자 = 홍성수
  | 제목 = Coping with Embedded Software Crisis using Real-Time Operating Systems and Embedded Middleware
  | 출판사 = IEEE
  | 날짜 = August 2000
  | 위치 = 제주
  | url = http://redwood.snu.ac.kr/bbs/download.php?id=Conference&page=1&sn1=&divpage=1&sn=off&ss=on&sc=on&select_arrange=headnum&desc=asc&no=22&filenum=1
  | 형식 = PDF
  | doi = 
  | id = 
  | 확인날짜 = 2009-06-30
  }}{{깨진 링크|url=http://redwood.snu.ac.kr/bbs/download.php?id=Conference&page=1&sn1=&divpage=1&sn=off&ss=on&sc=on&select_arrange=headnum&desc=asc&no=22&filenum=1 }}</ref>

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

=== 대책 ===
* 단기적 경쟁 입찰 보다는 장기적 전략 필요
* 소프트웨어 공학의 근본적 문제점을 재조명
** 요구사항, 재사용, 척도, 시각화, ...
* 소프트웨어 시험 자동화<ref name="Underseth070608">{{웹 인용
 |url          = http://www.eetasia.com/ART_8800467647_480400_NP_83e83a67.HTM
 |제목       = Addressing the hidden embedded software crisis in the industry
 |확인날짜 = 2009-06-30
 |날짜       = 08 Jun 2007
 |저자       = Mark Underseth
 |보존url    = https://web.archive.org/web/20080830084211/http://www.eetasia.com/ART_8800467647_480400_NP_83e83a67.HTM#
 |보존날짜 = 2008-08-30
 |url-status = dead
}}</ref>
* 규모 가변성 프로세스와 인프라 도입<ref name="Underseth070608"/>
* Microsoft Windows CE와 임베디드 리눅스 등 IT계열에 더 가까운 OS를 탑재하여 IT계통 개발 방안의 도입을 더 쉽게 하여 IT계열 소프트웨어 엔지니어의 활용도를 늘린다.
* 여러 회사에서 펌웨어를 공통화하여 공동개발한다.
* 인재 파견 회사에서 임베디드 엔지니어 양성 프로그램을 실시한다.

== 같이 보기 ==
* [[인공지능 겨울]]

== 참고 문헌 ==
<references/>

{{컴퓨터 과학}}

[[분류:소프트웨어 공학]]
[[분류:에츠허르 데이크스트라]]
[[분류:소프트웨어 품질]]