소프트웨어 공학

소프트웨어 공학(-工學, )은 소프트웨어의 개발, 운용, 유지보수 등의 생명 주기 전반을 체계적이고 서술적이며 정량적으로 다루는 학문이다; 즉, 공학을 소프트웨어에 적용하는 것이다.

소프트웨어 공학의 영어 낱말 software engineering이라는 용어가 처음 나타난 곳은 1968년 나토 소프트웨어 공학 학회로, 당시에는 소프트웨어 위기에 관해 사람들이 주의를 기울여 생각할 것을 장려하기 위해서였다.

그 이후로, 하나의 직업으로서, 또한 학문의 한 분야로서 꾸준히 품질, 비용, 유지 보수성, 빌드 속도가 개선된 소프트웨어를 창조하는데 전념해 왔다. 이 분야는 그 자매 분야인 공학에 비해 아직도 상대적으로 젊은 분야로, 소프트웨어 공학'이란 실제로 무엇이며 전통적인 공학의 정의에 부합하는지에 대한 논의가 이루어지고 있다. 소프트웨어를 단순히 프로그래밍으로만 보는 한계를 벗어나는 것으로부터 유기적으로 성장한 분야이다. 최근의 흐름으로는 관점 지향(Aspect), 애자일(Agile), 모델 주도(Model-Driven) 등이 있다.

역사 

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

프로그래밍 언어는 1950년대 나타나기 시작하였으며 이는 또한 추상화를 향한 또 하나의 큰 한걸음이 되었다. 주요 언어 즉 포트란, 알골, 코볼 등이 1950년대 말 배포되어 과학, 알고리즘, 경영상의 문제를 각각 취급하였다. 에츠허르 데이크스트라는 그의 씨앗과 같은 논문 "Go to 문은 해로운 것으로 생각된다"를 1968년 발표하였고 데이빗 파르나스는 열쇠가 된 개념인 모듈성과 정보 은폐를 1972년 소개하여 프로그래머들이 영원히 증가하는 소프트웨어 시스템의 복잡성을 다루는 것에 도움을 주었다. 하드웨어를 관리하는 소프트웨어 시스템인 운영 체제 또한 소개되었고, 그 중 가장 눈에 띄는 것은 1969년에 등장한 유닉스였다. 1967년에는 시뮬라 언어가 객체 지향 프로그래밍 패러다임을 소개하였다.

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

오픈 소스 소프트웨어는 90년대 초 나타나기 시작하여 리눅스와 "바자 bazaar" 또는 분산형 소프트웨어 개발을 소개하였다. 그러고 나서 인터넷과 월드와이드웹이 90년대 중반을 강타하여 소프트웨어의 공학을 다시 한번 뒤흔들었다. 시스템 설계 방식의 시계추가 분산 시스템쪽으로 기울었고 자바 프로그래밍 언어가 가상 머신으로 추상화의 또 한발짝을 내디뎠다. 참여한 프로그래머들의 공동 작업으로 마련된 애자일(Agile) 성명서는 더 날렵한 개발 프로세스로 더 저렴하고 신속한 개발을 지향하였다.

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

교육 
프로그래밍에 관한 지식이 소프트웨어 공학자가 되기 위한 주요한 선수 요건이다. 그러나 그것만으로는 부족하다. 많은 소프트웨어 공학자들은 컴퓨터 과학 학위를 가지고 있으며 진정한 소프트웨어 공학자의 부족을 지적하는 의견 도 있다. 왜냐하면 소프트웨어 공학 프로그램이 고등 교육에 빠져 있었기 때문이다. 그러나 새로이 소프트웨어 공학 학위가 특히 학부 이후 학위로 소개되었다. 표준 국제 학부 교육과정은 CCSE에서 정의한 바 있다.

2004년 IEEE 컴퓨터 학회는 SWEBOK을 내놓았고 소프트웨어 공학자가 알아야할 지식의 범위에 대한 표준 ISO/IEC 24773으로 채택되었다.

유럽 위원회는 에라스무스 문두스 프로그램 안에 소프트웨어 공학 유럽 석사 학위를 유럽내외로부터의 학생들에게 제공하고 있다.. 이는 복수 전공 프로그램으로 유럽 내의 4개 학교가 관련되어 있다.

세부 분야 

소프트웨어 공학은 10개의 분야로 나뉜다.
 소프트웨어 요구사항: 소프트웨어 요구 사항의 추출, 분석, 명세, 검증. 소프트웨어 요구공학(Software Requirements Engineering)분야가 독립적으로 존재함.
 소프트웨어 설계: 보통 전산 지원 소프트웨어 공학 (CASE) 도구로 이루어지고, UML과 같은 표준 형식을 사용.
 소프트웨어 개발: 프로그래밍 언어로 소프트웨어를 구축.
 소프트웨어 시험
 소프트웨어 유지 보수: 소프트웨어 시스템은 때때로 처음 완료된 후 긴 시간이 지난 후에 문제를 일으켜 향상시켜야 할 필요가 있음.
 소프트웨어 형상 관리: 소프트웨어 시스템은 매우 복잡하므로, 그 형상(버전과 소스 제어)이 표준화되고 구조적인 방법으로 관리 받아야 함.
 소프트웨어 공학 관리: 프로젝트 관리에 매우 밀접하나, 다른 관리 분야와는 다른, 소프트웨어 고유의 미묘한 뉘앙스가 있음.
 소프트웨어 개발 프로세스: 소프트웨어를 구축하는 과정에 관하여 실무 종사자들 사이에서는 열띤 논쟁이 오가고 있으며 주요한 패러다임은 애자일 프로세스와 폭포수 프로세스임.
 소프트웨어 공학 도구, CASE 참조.
 소프트웨어 품질

같이 보기 

 컴퓨터 과학
 소프트웨어 개발
 소프트웨어 품질 보증
 소프트웨어 시험
 시스템 분석

참고 문헌