소프트웨어 공학
소프트웨어 공학(Software Engineering)은 신뢰할 수 있고 유지보수 가능한 소프트웨어를 경제적이고 체계적으로 개발·운영하기 위해 공학적 원리와 방법을 적용하는 학문이자 실무 분야이다. 개별 프로그램의 작성뿐만 아니라 문제와 요구사항의 분석, 시스템 구조의 설계, 구현, 시...
| 영문명 | Software Engineering |
|---|---|
| 분류 | 공학, 컴퓨팅 |
| 주요 대상 | 소프트웨어 시스템과 개발·운영 과정 |
| 주요 활동 | 요구사항 분석, 설계, 구현, 검증, 배포, 운영, 유지보수 |
| 관련 분야 | 컴퓨터 과학, 시스템 공학, 프로젝트 관리, 품질 관리 |
| 용어 정착 | 1968년 NATO 소프트웨어 공학 회의 |
소프트웨어 공학(Software Engineering)은 신뢰할 수 있고 유지보수 가능한 소프트웨어를 경제적이고 체계적으로 개발·운영하기 위해 공학적 원리와 방법을 적용하는 학문이자 실무 분야이다. 개별 프로그램의 작성뿐만 아니라 문제와 요구사항의 분석, 시스템 구조의 설계, 구현, 시험, 배포, 운영, 유지보수, 품질 관리와 프로젝트 관리에 이르는 소프트웨어의 전체 생명주기를 다룬다.
소프트웨어는 물리적인 제품과 달리 복제 과정에서 거의 마모되지 않지만, 요구사항과 실행 환경이 계속 변하고 구성 요소 사이의 관계가 복잡해지면서 설계 결함, 보안 취약점, 성능 저하와 유지보수 비용이 누적될 수 있다. 소프트웨어 공학은 이러한 복잡성을 통제하기 위해 명확한 요구사항, 모듈화된 구조, 추상화와 정보 은닉, 버전 관리, 코드 검토, 자동화된 시험, 지속적 통합, 운영 관찰과 같은 기술적·조직적 수단을 함께 사용한다.
소프트웨어 공학의 대상은 실행 코드에 한정되지 않는다. 요구사항 명세, 아키텍처와 설계 문서, 시험 자료, 빌드 및 배포 설정, 데이터 모델, 사용자 문서, 운영 절차와 변경 이력도 소프트웨어 시스템을 구성하고 유지하는 중요한 산출물로 다뤄진다. 개발자는 이러한 산출물과 소스 코드를 함께 관리하며, 시스템이 요구된 기능과 품질 속성을 충족하는지 지속적으로 확인한다.
소프트웨어 공학은 컴퓨터 과학과 밀접하지만 중심 관점에는 차이가 있다. 컴퓨터 과학이 계산의 원리, 알고리즘, 자료구조와 계산 가능성 등을 연구한다면, 소프트웨어 공학은 그러한 지식을 이용하여 실제 환경에서 장기간 사용되는 소프트웨어 시스템을 여러 사람이 계획하고 구축하며 변화시키는 과정에 초점을 둔다. 동시에 시스템 공학, 인간-컴퓨터 상호작용, 사이버 보안, 데이터베이스, 컴퓨터 네트워크, 프로젝트 관리와도 긴밀하게 연결된다.
“소프트웨어 공학”이라는 표현은 1960년대 대규모 소프트웨어 프로젝트에서 일정 지연, 예산 초과, 낮은 신뢰성과 유지보수의 어려움이 반복되던 상황에서 널리 주목받기 시작했다. 1968년 서독 가르미슈에서 열린 NATO 회의는 소프트웨어 개발 문제를 공학적 관점에서 논의하고 이 용어를 확산시킨 중요한 계기로 평가된다.[1]
오늘날 소프트웨어 공학은 하나의 고정된 개발 절차를 뜻하지 않는다. 순차적으로 단계를 진행하는 폭포수 모델, 반복과 점진적 전달을 강조하는 애자일 소프트웨어 개발, 개발과 운영을 연결하는 DevOps, 안전성과 규정 준수를 중시하는 고신뢰성 개발 등 서로 다른 접근이 시스템의 규모와 목적에 맞게 사용된다. IEEE Computer Society의 SWEBOK는 요구사항, 설계, 구축, 시험, 유지보수, 형상 관리, 관리, 프로세스, 모델과 방법, 품질, 보안과 운영 등을 소프트웨어 공학의 주요 지식 영역으로 정리한다.[2]
소프트웨어 공학에서 공학적이라는 말은 모든 프로젝트에 무거운 절차와 문서를 적용한다는 의미가 아니다. 필요한 수준의 증거와 통제 방법을 선택하고, 비용·일정·기능·품질·위험 사이의 균형을 측정 가능한 방식으로 관리한다는 의미에 가깝다. 개인이 만드는 작은 프로그램에서도 버전 관리와 자동화된 시험을 적용할 수 있으며, 항공·의료·금융·통신과 같은 대규모 또는 안전 필수 시스템에서는 더욱 엄격한 검증, 추적성, 독립적인 평가와 표준 준수가 요구된다.