소프트웨어 공학

소프트웨어 공학(Software Engineering)은 신뢰할 수 있고 유지보수 가능한 소프트웨어를 경제적이고 체계적으로 개발·운영하기 위해 공학적 원리와 방법을 적용하는 학문이자 실무 분야이다. 개별 프로그램의 작성뿐만 아니라 문제와 요구사항의 분석, 시스템 구조의 설계, 구현, 시...

영문명Software Engineering
분류공학, 컴퓨팅
주요 대상소프트웨어 시스템과 개발·운영 과정
주요 활동요구사항 분석, 설계, 구현, 검증, 배포, 운영, 유지보수
관련 분야컴퓨터 과학, 시스템 공학, 프로젝트 관리, 품질 관리
용어 정착1968년 NATO 소프트웨어 공학 회의

소프트웨어 공학(Software Engineering)은 신뢰할 수 있고 유지보수 가능한 소프트웨어를 경제적이고 체계적으로 개발·운영하기 위해 공학적 원리와 방법을 적용하는 학문이자 실무 분야이다. 개별 프로그램의 작성뿐만 아니라 문제와 요구사항의 분석, 시스템 구조의 설계, 구현, 시험, 배포, 운영, 유지보수, 품질 관리와 프로젝트 관리에 이르는 소프트웨어의 전체 생명주기를 다룬다.

소프트웨어는 물리적인 제품과 달리 복제 과정에서 거의 마모되지 않지만, 요구사항과 실행 환경이 계속 변하고 구성 요소 사이의 관계가 복잡해지면서 설계 결함, 보안 취약점, 성능 저하와 유지보수 비용이 누적될 수 있다. 소프트웨어 공학은 이러한 복잡성을 통제하기 위해 명확한 요구사항, 모듈화된 구조, 추상화와 정보 은닉, 버전 관리, 코드 검토, 자동화된 시험, 지속적 통합, 운영 관찰과 같은 기술적·조직적 수단을 함께 사용한다.

소프트웨어 공학의 대상은 실행 코드에 한정되지 않는다. 요구사항 명세, 아키텍처와 설계 문서, 시험 자료, 빌드 및 배포 설정, 데이터 모델, 사용자 문서, 운영 절차와 변경 이력도 소프트웨어 시스템을 구성하고 유지하는 중요한 산출물로 다뤄진다. 개발자는 이러한 산출물과 소스 코드를 함께 관리하며, 시스템이 요구된 기능과 품질 속성을 충족하는지 지속적으로 확인한다.

소프트웨어 공학은 컴퓨터 과학과 밀접하지만 중심 관점에는 차이가 있다. 컴퓨터 과학이 계산의 원리, 알고리즘, 자료구조와 계산 가능성 등을 연구한다면, 소프트웨어 공학은 그러한 지식을 이용하여 실제 환경에서 장기간 사용되는 소프트웨어 시스템을 여러 사람이 계획하고 구축하며 변화시키는 과정에 초점을 둔다. 동시에 시스템 공학, 인간-컴퓨터 상호작용, 사이버 보안, 데이터베이스, 컴퓨터 네트워크, 프로젝트 관리와도 긴밀하게 연결된다.

“소프트웨어 공학”이라는 표현은 1960년대 대규모 소프트웨어 프로젝트에서 일정 지연, 예산 초과, 낮은 신뢰성과 유지보수의 어려움이 반복되던 상황에서 널리 주목받기 시작했다. 1968년 서독 가르미슈에서 열린 NATO 회의는 소프트웨어 개발 문제를 공학적 관점에서 논의하고 이 용어를 확산시킨 중요한 계기로 평가된다.[1]

오늘날 소프트웨어 공학은 하나의 고정된 개발 절차를 뜻하지 않는다. 순차적으로 단계를 진행하는 폭포수 모델, 반복과 점진적 전달을 강조하는 애자일 소프트웨어 개발, 개발과 운영을 연결하는 DevOps, 안전성과 규정 준수를 중시하는 고신뢰성 개발 등 서로 다른 접근이 시스템의 규모와 목적에 맞게 사용된다. IEEE Computer Society의 SWEBOK는 요구사항, 설계, 구축, 시험, 유지보수, 형상 관리, 관리, 프로세스, 모델과 방법, 품질, 보안과 운영 등을 소프트웨어 공학의 주요 지식 영역으로 정리한다.[2]

소프트웨어 공학에서 공학적이라는 말은 모든 프로젝트에 무거운 절차와 문서를 적용한다는 의미가 아니다. 필요한 수준의 증거와 통제 방법을 선택하고, 비용·일정·기능·품질·위험 사이의 균형을 측정 가능한 방식으로 관리한다는 의미에 가깝다. 개인이 만드는 작은 프로그램에서도 버전 관리와 자동화된 시험을 적용할 수 있으며, 항공·의료·금융·통신과 같은 대규모 또는 안전 필수 시스템에서는 더욱 엄격한 검증, 추적성, 독립적인 평가와 표준 준수가 요구된다.

역사

소프트웨어 개발의 등장

소프트웨어 위기

NATO 소프트웨어 공학 회의

구조적 개발과 소프트웨어 방법론

객체 지향과 재사용

인터넷과 오픈소스 개발

애자일, DevOps와 현대 소프트웨어 공학

핵심 개념과 원리

복잡성 관리

추상화와 정보 은닉

모듈화와 관심사의 분리

결합도와 응집도

변경 가능성과 유지보수성

재사용과 일반화

신뢰성, 안전성과 보안

기술 부채

소프트웨어 생명주기와 개발 프로세스

계획과 타당성 분석

요구사항에서 운영까지의 흐름

순차적 개발

반복적·점진적 개발

프로토타이핑

위험 중심 개발

지속적 전달과 진화적 개발

프로세스 선택과 조정

요구사항 공학

요구사항 도출

기능 요구사항과 비기능 요구사항

요구사항 분석과 우선순위

요구사항 명세

검증과 합의

추적성과 변경 관리

소프트웨어 아키텍처와 설계

아키텍처와 상세 설계

품질 속성과 설계 결정

모듈과 구성 요소

인터페이스와 의존성

데이터와 상태 설계

아키텍처 패턴

설계 패턴

아키텍처 평가와 문서화

구현과 소프트웨어 구성 관리

프로그래밍 언어와 개발 환경

코딩 규칙과 코드 품질

코드 검토

리팩터링

버전 관리

브랜치와 변경 통합

빌드와 의존성 관리

릴리스와 형상 관리

소프트웨어 시험과 품질 보증

검증과 확인

단위 시험

통합 시험

시스템 시험

인수 시험

회귀 시험

정적 분석과 동적 분석

시험 자동화

품질 모델과 품질 측정

결함 관리와 원인 분석

배포, 운영과 유지보수

배포와 릴리스 전략

지속적 통합과 지속적 전달

관찰 가능성과 모니터링

장애 대응과 복구

성능과 용량 관리

소프트웨어 유지보수

레거시 시스템과 현대화

서비스 종료와 데이터 이전

소프트웨어 개발 방법론

폭포수 모델

반복적·점진적 개발

애자일 소프트웨어 개발

Scrum

Kanban

익스트림 프로그래밍

DevOps

사이트 신뢰성 공학

고신뢰성·안전 필수 개발

프로젝트와 조직 관리

범위, 일정과 비용

작업 추정

위험 관리

팀 구조와 역할

의사소통과 협업

문서화와 지식 관리

외주와 공급망 관리

성과 측정과 프로세스 개선

도구와 자동화

통합 개발 환경

버전 관리 시스템

이슈 추적 시스템

빌드 시스템

시험과 분석 도구

지속적 통합 시스템

배포와 인프라 자동화

생성형 인공지능과 개발 도구

보안, 안전과 전문 윤리

보안 중심 개발

위협 모델링

취약점과 공급망 보안

안전 필수 소프트웨어

개인정보 보호

접근성과 사용자 보호

전문적 책임과 윤리

라이선스와 지식 재산권

표준과 지식 체계

ISO·IEC·IEEE 표준

SWEBOK

소프트웨어 생명주기 표준

품질 및 프로세스 표준

산업별 규정과 인증

다른 분야와의 관계

컴퓨터 과학

시스템 공학

프로젝트 관리

인간-컴퓨터 상호작용

사이버 보안

데이터 공학

인공지능 공학

활용 분야

시스템 소프트웨어

웹과 클라우드 서비스

모바일 애플리케이션

게임과 실시간 소프트웨어

임베디드 시스템과 사물인터넷

기업용 소프트웨어

금융·의료·교통 시스템

과학 계산과 인공지능

장점과 한계

관련 문서

  1. NATO: Garmisch Conference and the emergence of software engineering
  2. IEEE Computer Society: Software Engineering Body of Knowledge