{{위키데이터 속성 추적}}
{{학문 정보
|학문명 = 소프트웨어 공학
|그림 = Airbus A380 cockpit.jpg
|그림크기 =
|그림설명 =에어버스 [[에어버스 A380|A-380]]은 상당한 양의 소프트웨어를 사용하여 "종이 없는" 조종석을 창조하였다. 소프트웨어 공학으로 항공기 소프트웨어를 이루는 수백만행의 소스코드를 변환하고 계획하였다.
|다른 이름 =
|연구 분야 =
|학문 분야 =
|주요 개념 =
|파생 분야 =
|창시자 =
|창시 시기 =
|관련 직업 =
}}
'''소프트웨어 공학'''(-工學, {{llang|en|software engineering}})은 소프트웨어의 개발, 운용, 유지보수 등의 생명 주기 전반을 체계적이고 서술적이며 정량적으로 다루는 학문이다; 즉, [[공학]]을 소프트웨어에 적용하는 것이다.<ref name="BoDu04">[[Software Engineering Body of Knowledge|SWEBOK]] {{서적 인용 | editors = Pierre Bourque and Robert Dupuis |   제목 = Guide to the Software Engineering Body of Knowledge - 2004 Version | publisher = [[IEEE Computer Society]] | year = 2004 | page = 1-1 | isbn = 0-7695-2330-7 | url = http://www.swebok.org | 저자 = executive editors, Alain Abran, James W. Moore ; editors, Pierre Bourque, Robert Dupuis.}}</ref>

소프트웨어 공학의 영어 낱말 ''software engineering''이라는 용어가 처음 나타난 곳은 1968년 나토 소프트웨어 공학 학회로, 당시에는 [[소프트웨어 위기]]에 관해 사람들이 주의를 기울여 생각할 것을 장려하기 위해서였다.<ref>{{저널 인용
  | 이름 = Naur
  | 성 = Peter
  | 공저자 = Brian Randell
  | 제목 = Software engineering: Report of a conference sponsored by the NATO Science Committee
  | publisher = Scientific Affairs Division, NATO
  | 날짜 = 7–11 October 1968
  | 위치 = Garmisch, Germany
  | url = http://homepages.cs.ncl.ac.uk/brian.randell/NATO/nato1968.PDF
  | format=PDF| doi = 
  | id = 
  | 확인날짜 = 2008-12-26}}
</ref>
<ref>{{웹 인용
| url = http://homepages.cs.ncl.ac.uk/brian.randell/NATO/NATOReports/index.html
| 제목 = The 1968/69 NATO Software Engineering Reports
| 확인날짜 = 2008-10-11 | 성 = Randell | 이름 = Brian | authorlink = Brian Randell
| 날짜 = 10 Aug 2001
| work = Brian Randell's University Homepage
| publisher = The School of Computer Sciences, Newcastle University
| quote = The idea for the first NATO Software Engineering Conference, and in particular that of adopting the then practically unknown term "software engineering" as its (deliberately provocative) title, I believe came originally from Professor Fritz Bauer.}}</ref>
그 이후로, 하나의 [[직업]]으로서, 또한 학문의 한 분야로서 꾸준히 품질, 비용, 유지 보수성, 빌드 속도가 개선된 소프트웨어를 창조하는데 전념해 왔다. 이 분야는 그 자매 분야인 [[공학]]에 비해 아직도 상대적으로 젊은 분야로, 소프트웨어 공학'이란 실제로 무엇이며 전통적인 공학의 정의에 부합하는지에 대한 논의가 이루어지고 있다. 소프트웨어를 단순히 [[프로그래밍]]으로만 보는 한계를 벗어나는 것으로부터 유기적으로 성장한 분야이다. 최근의 흐름으로는 [[관점 지향]](Aspect), [[애자일]](Agile), [[모델 구동형 아키텍처|모델 주도]](Model-Driven) 등이 있다.

== 역사 ==

1941년 현대 디지털 [[컴퓨터]]가 처음 나타났을 때, 연산 명령은 배선으로 주어졌다. 실무진이 금세 깨달은 것은 이러한 설계 방식이 유연하지 않다는 것이었고 "프로그램 내장 방식" 인 [[폰 노이만 구조]]를 개발하였다. 따라서 최초의 구분이 "하드웨어"와 "소프트웨어" 사이에 주어졌고, 전산의 복잡성을 다루기 위해 [[추상화]]가 동반되었다.

[[프로그래밍 언어]]는 1950년대 나타나기 시작하였으며 이는 또한 [[추상화]]를 향한 또 하나의 큰 한걸음이 되었다. 주요 언어 즉 [[포트란]], [[알골]], [[코볼]] 등이 1950년대 말 배포되어 과학, 알고리즘, 경영상의 문제를 각각 취급하였다. [[에츠허르 데이크스트라]]는 그의 씨앗과 같은 논문 "Go to 문은 해로운 것으로 생각된다"를 1968년 발표하였고<ref>{{저널 인용
 |성          = Dijkstra
 |이름       = E. W.
 |저자링크 = Edsger_Dijkstra
 |제목       = Go To Statement Considered Harmful
 |journal      = [[Communications of the ACM]]
 |volume       = 11
 |issue        = 3
 |pages        = 147–148
 |month        = March
 |year         = 1968
 |url          = http://www.acm.org/classics/oct95/
 |확인날짜 = 2008-12-26
 |doi          = 10.1145/362929.362947
 |확인날짜 = 2007-07-03
 |보존url    = https://web.archive.org/web/20070703050443/http://www.acm.org/classics/oct95/
 |보존날짜 = 2007-07-03
 |url-status = dead
}}
</ref> [[데이빗 파르나스]]는 열쇠가 된 개념인 [[모듈성 (프로그래밍)|모듈성]]과 [[정보 은폐]]를 1972년 소개하여<ref>
{{저널 인용
 |성          = Parnas
 |이름       = David
 |저자링크 = David Parnas
 |journal      = [[Communications of the ACM]]
 |volume       = 15
 |issue        = 12
 |쪽          = 1053–1058
 |url          = http://www.acm.org/classics/may96/
 |제목       = On the Criteria To Be Used in Decomposing Systems into Modules
 |month        = December
 |year         = 1972
 |확인날짜 = 2008-12-26
 |doi          = 10.1145/361598.361623
 |확인날짜 = 2008-12-26
 |보존url    = https://web.archive.org/web/20070820133530/http://www.acm.org/classics/may96/
 |보존날짜 = 2007-08-20
 |url-status = dead
}}</ref> 프로그래머들이 영원히 증가하는 [[소프트웨어 시스템]]의 복잡성을 다루는 것에 도움을 주었다. 하드웨어를 관리하는 소프트웨어 시스템인 [[운영 체제]] 또한 소개되었고, 그 중 가장 눈에 띄는 것은 1969년에 등장한 [[유닉스]]였다. 1967년에는 [[시뮬라]] 언어가 [[객체 지향 프로그래밍]] 패러다임을 소개하였다.

이러한 [[소프트웨어]]의 진보에 발맞추어 [[컴퓨터 하드웨어]]도 발전하였다. 1970년대 중반 [[마이크로컴퓨터]]가 소개되어 취미로 [[컴퓨터]]를 구하고 그 [[소프트웨어]]를 작성하는 것이 경제적으로 가능해졌다. 이는 또한 이제는 잘 알려진 [[개인용 컴퓨터]] 또는 PC와 [[마이크로소프트 윈도우]]로 이어졌다. [[소프트웨어 개발 프로세스]] 또는 SDLC 또한 나타나기 시작하여 1980년대 중반에는 중앙 집중화된 소프트웨어 개발을 위한 일치된 합의로서 자리매김하였다. 1970년대 말과 1980년대 초 시뮬라에서 영감을 받은 몇 개의 새로운 객체 지향 프로그래밍 언어가 나타났다: [[C++]], [[스몰토크]], [[오브젝티브-C]].

[[오픈 소스]] 소프트웨어는 90년대 초 나타나기 시작하여 [[리눅스]]와 "바자 bazaar" 또는 분산형 소프트웨어 개발을 소개하였다.<ref>[[에릭 레이먼드|Raymond, Eric S.]] ''[[성당과 시장|The Cathedral and the Bazaar]]''. ed 3.0. 2000.</ref> 그러고 나서 [[인터넷]]과 [[월드와이드웹]]이 90년대 중반을 강타하여 소프트웨어의 공학을 다시 한번 뒤흔들었다. 시스템 설계 방식의 시계추가 [[분산 시스템]]쪽으로 기울었고 [[자바 (프로그래밍 언어)|자바]] 프로그래밍 언어가 [[자바 가상 머신|가상 머신]]으로 [[추상화]]의 또 한발짝을 내디뎠다. 참여한 프로그래머들의 공동 작업으로 마련된 [[애자일_소프트웨어_개발#애자일 선언문|애자일(Agile) 성명서]]는 더 날렵한 개발 프로세스로 더 저렴하고 신속한 개발을 지향하였다.

현재의 소프트웨어 공학의 정의는 오늘날의 실무종사자들이 더 싸게 크게 빠르게 소프트웨어를 개발하고자 수많은 어려움을 뚫고 전진함에 따라 아직도 논쟁 중에 있다.

== 교육 ==
[[프로그래밍]]에 관한 지식이 소프트웨어 공학자가 되기 위한 주요한 선수 요건이다. 그러나 그것만으로는 부족하다. 많은 소프트웨어 공학자들은 [[컴퓨터 과학]] 학위를 가지고 있으며 진정한 소프트웨어 공학자의 부족을 지적하는 의견<ref>McConnell, Steve ([[July 10]], [[2003]]). ''Professional Software Development: Shorter Schedules, Higher Quality Products, More Successful Projects, Enhanced Careers''. {{ISBN|978-0-321-19367-4}}.</ref> 도 있다. 왜냐하면 소프트웨어 공학 프로그램이 고등 교육에 빠져 있었기 때문이다. 그러나 새로이 소프트웨어 공학 학위가 특히 학부 이후 학위로 소개되었다. 표준 국제 학부 교육과정은 [[CCSE]]에서 정의한 바 있다.

2004년 [[IEEE 컴퓨터 학회]]는 [[SWEBOK]]을 내놓았고 소프트웨어 공학자가 알아야할 지식의 범위에 대한 표준 ISO/IEC 24773으로 채택되었다.<ref>
{{웹 인용
| url = http://www.computer.org/portal/site/ieeecs/menuitem.c5efb9b8ade9096b8a9ca0108bcd45f3/index.jsp?&pName=ieeecs_level1&path=ieeecs/press/Oct08&file=software_certifications.xml&xsl=brief_display.xsl&
| 제목 = IEEE COMPUTER SOCIETY FIRST TO MARKET  WITH SOFTWARE CERTIFICATIONS THAT MEET NEW ISO STANDARD
| 확인날짜 = 2009-06-29
| date = 27 Oct 2008
| publisher = IEEE COMPUTER SOCIETY
| 보존url = https://web.archive.org/web/20081112193907/http://www.computer.org/portal/site/ieeecs/menuitem.c5efb9b8ade9096b8a9ca0108bcd45f3/index.jsp?&pName=ieeecs_level1&path=ieeecs%2Fpress%2FOct08&file=software_certifications.xml&xsl=brief_display.xsl&
| 보존날짜 = 2008-11-12
| url-status = dead
}}
</ref>

[[유럽 위원회]]는 [[에라스무스 문두스]] 프로그램 안에 [[소프트웨어 공학 유럽 석사]] 학위를 유럽내외로부터의 학생들에게 제공하고 있다.<ref>[http://ec.europa.eu/education/programmes/mundus/index_en.html EUROPA - Redirection<!-- 봇이 따온 제목 -->]</ref>. 이는 복수 전공 프로그램으로 유럽 내의 4개 학교가 관련되어 있다.

== 세부 분야 ==
[[파일:First Computer Bug, 1945.jpg|섬네일|260px|[[그레이스 호퍼]]가 [[하버드 대학교]]에 설치된 [[하버드 마크 II]] 컴퓨터로 작업하던 중, 동료들이 이 [[나방]]이 [[계전기]]에 끼어 연산을 방해하고 있던 것을 발견하였는데, 이에 그녀가 그들이 시스템에서 "벌레를 잡고 있다"고 표현하였다. 하여 [[소프트웨어 버그|버그]]라고 하는 유명한 단어가 탄생.]]
소프트웨어 공학은 10개의 분야로 나뉜다.<ref name="BoDu04"/>
* 소프트웨어 요구사항: [[소프트웨어]] [[요구 사항]]의 추출, 분석, 명세, 검증. 소프트웨어 요구공학(Software Requirements Engineering)분야가 독립적으로 존재함.
* [[소프트웨어 설계]]: 보통 [[전산 지원 소프트웨어 공학]] (CASE) 도구로 이루어지고, [[UML]]과 같은 표준 형식을 사용.
* [[소프트웨어 개발]]: 프로그래밍 언어로 소프트웨어를 구축.
* [[소프트웨어 시험]]
* [[소프트웨어 유지 보수]]: 소프트웨어 시스템은 때때로 처음 완료된 후 긴 시간이 지난 후에 문제를 일으켜 향상시켜야 할 필요가 있음.
* [[소프트웨어 형상 관리]]: 소프트웨어 시스템은 매우 복잡하므로, 그 형상(버전과 소스 제어)이 표준화되고 구조적인 방법으로 관리 받아야 함.
* 소프트웨어 공학 관리: [[프로젝트 관리]]에 매우 밀접하나, 다른 관리 분야와는 다른, 소프트웨어 고유의 미묘한 뉘앙스가 있음.
* [[소프트웨어 개발 프로세스]]: 소프트웨어를 구축하는 과정에 관하여 실무 종사자들 사이에서는 열띤 논쟁이 오가고 있으며 주요한 패러다임은 [[애자일 소프트웨어 개발|애자일]] 프로세스와 [[폭포수 모델|폭포수]] 프로세스임.
* 소프트웨어 공학 도구, [[CASE]] 참조.
* [[소프트웨어 품질]]

== 같이 보기 ==
{{위키공용분류}}
* [[컴퓨터 과학]]
* [[소프트웨어 개발]]
* [[소프트웨어 품질 보증]]
* [[소프트웨어 시험]]
* [[시스템 분석]]

== 각주 ==
{{각주|2}}

{{컴퓨터 과학}}
{{소프트웨어 공학}}
{{전거 통제}}

[[분류:소프트웨어 공학| ]]