본문 바로가기
프로그래밍

소프트웨어 공학이란 무엇인가?

by bantomak 2023. 10. 20.
반응형

소프트웨어 공학(Software Engineering)

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

 

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

 

역사

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

 

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

 

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

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

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

 

세부 분야

소프트웨어 공학은 10개의 분야로 나뉜다.

 

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

 

생각해볼 부분

소프트웨어 개발은 상대적으로 젊은 분야이긴 하지만 이를 체계적인 이론으로 구축하고 연구하기 위한 많은 노력이 이루어졌다. 우리가 업무나 공부를 해나갈 때 소프트웨어 공학에서 어떤 분야에 속한 부분을 공부하고 있는지 인지한다면 좀 더 명확한 시야를 가지게 되지 않을까라는 생각을 해봤다.

 

출처

 

소프트웨어 공학 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 소프트웨어 공학에어버스 A-380은 상당한 양의 소프트웨어를 사용하여 "종이 없는" 조종석을 창조하였다. 소프트웨어 공학으로 항공기 소프트웨어를 이루는 수

ko.wikipedia.org

댓글