이번 포스팅에서 다루는 내용
소프트웨어 공학, 소프트웨어, 소프트웨어 개발 작업, 소프트웨어 공학의 접근방법, 소프트웨어 공학의 주제, SWEBOK
소프트웨어 공학에 대해 들어가며 간단하게 ...
소프트웨어 공학
: 좋은 품질의 소프트웨어를 비용 효율적으로 개발하는 방법에 대해 배움
왜 배울까
프로그래머에서 소프트웨어 엔지니어
단순히 코딩 역량만 기르는 프로그래머가 아닌 개발의 전체 과정을 이해하고 수행할 능력을 기르고자 함!
소프트웨어 공학의 목표
체계적이며 원리적인 접근 방법 -> 기간내에 품질 좋은 소프트웨어를 효율적(낮은 비용, 높은 생산성)으로 공급하기
소프트웨어 공학이 중요해진 이유
- 소프트웨어 규모 및 복잡도 증가
- 고품질/고신뢰성 요구 : 소프트웨어는 모든 사업 발전의 원동력. 잘못 설계->큰 사고로 이어질 수 있음
- 시장 적시성 요구/짧은 수명주기 : 빨리 나오고 빨리 사라짐. 개발과 진화의 명확한 구분이 줄어듦
- 상황 변화에 따른 동적 적응 요구 : 새롭고 다양한 환경, 컨텐츠, 요구 사항에 맞게 적응해야 함
1️⃣ 소프트웨어
: 프로그램과 그 프로그램의 개발, 운용, 보수에 필요한 정보 일체
소프트웨어 != 프로그램
소프트웨어는 단순히 소스코드(프로그램)에 그치지 않고, 그에 필요한 문서(정보)들을 모두 포함한 개념이다.
생산물의 구조가 코드 안에 숨어있다 -> 개념적이고 무형적
다른 엔지니어링 결과물과 비교하여 소프트웨어가 갖는 특징
- 복잡성 complexity : 수많은 내부 요소들의 상호작용. 수천만 라인의 코드들
- 순응성 conformity : 요구, 환경, 데이터 변화에 따라 적절히 변형됨
- 변경성 changeability : 쉽게 바꿀 수 있음
- 비가시성 invisibility : 구조가 눈에 안 보임
- 복제용이성 : 무한대로 복제 가능
- 비마모성
소프트웨어 종류
- 주문형 소프트웨어 : 특정 고객 또는 기업의 요구를 만족시키기 위해 제작한 소프트웨어 (ex. 대학 행정 시스템)
- 패키지형 소프트웨어 : 패키지화하여 상업적으로 판매하는 소프트웨어 (ex. 워드프로세서, 주문 관리 시스템)
- 임베디드 소프트웨어 : 다른 시스템에 내장된 소프트웨어 (ex. 핸드폰, 자동차 등에)
소프트웨어 분류 | 사용되는 카피의 수 | 요구 하드웨어 성능 | 개발 인력 |
주문형 | 적음 | 낮음 | 많음 |
패키지 | 중간 | 높음 | 중간 |
임베디드 | 많음 | 중간 | 적음 |
시스템
: 필요한 기능을 실현시키기 위하여 관련 요소를 어떤 법칙에 따라 조합한 집합체
ex. 은행 전산 업무 시스템, 공항 수화물 처리 시스템
소프트웨어는 컴퓨터를 기반으로 하는 여러 시스템과 관계를 맺고 있음
-> 하드웨어, 데이터베이스, 서류, 절차, 사람(오퍼레이터) 등 여러 서브 시스템과 관련됨
소프트웨어를 개발하는 일은 이러한 시스템에 속하는 여러 요소를 파악하고 그들의 관계를 설정하는 작업도 포함함
시스템의 성질
- 서브시스템 : 시스템은 밀접하게 관련되는 서브시스템들로 구성.
- 기능적 분할 : 규모가 작은 부속 서브시스템들로 나눌 수 있음
- 시스템 경계 : 시스템과 주변 환경을 구분할 수 있는 경계가 있음. -> 입력과 출력이 만나는 곳
- 자동화 경계 : 자동화된 부분과 수동 작업 부분을 나누는 경계
2️⃣ 소프트웨어 개발 작업
소프트웨어를 만들어서 실제 사용하는 단계까지 가려면 여러 기본 활동이 필요함
- 명세화 specification : 소프트웨어 기능, 성능, 원가, 리스크, 일정 등을 모두 합의 -> 요구사항을 엄격히 정리하여 개발
- 구현 coding : 시스템의 명세를 주어진 여건에 맞게 설계하여 프로그래밍 언어로 변환. 주어진 설계에 마조계 구현 -> 검증, 휴지보수에 큰 영향
- 검증 verification : 구현된 소프트웨어가 고객의 의도와 일치하는 지 확인.
- 유지보수 maintenance : 사용 단계에서 결함 수정 또는 요구 변화에 맞게 수정. -> 진화의 단계
개발 작업
1. 계획을 세우고
2. 명세화 -> 설계 -> 코딩 -> 검증 -> 유지보수를 반복
개발 작업의 특징
- 명세화 어려움 : 고객의 의도를 처음부터 명확히 이해하기 어려움
- 재사용 어려움 : 미리 재사용할 부품 만들기 어려움
- 예측 어려움 : 업무 절차, 법규, 하드웨어 등 외부 요소에 영향을 받기 때문에 프로젝트 규모 예측 어려움
- 유지보수 어려움 : 다른 사람이 개발한 코드를 보고 고치기 어려움
- 고품질 어려움 : 완벽한 테스트는 불가능. 오류가 있다는 건 보일 수 있어도 오류가 없다는 건 증명 못 함
소프트웨어 위기 software crisis
- 1960중, 소프트웨어 수요가 급격히 증가하고 복잡성 증가. but 기본 방법이 충분하지 않아 발생한 문제
- 유지보수 비용 증가, 초과 근무, 비효율적, 낮은 품질, 일정 초과 ...
- 소프트웨어 공학이 나오게 된 배경
- 원인: 요구 증가, 복잡도 증가, 난이도 증가. 그러나 같은 인력, 같은 방법, 같은 도구 -> ㅠㅠ
3️⃣ 소프트웨어 공학의 접근법
계획이나 절차 없이 소프트웨어를 개발하면 어떻게 될까?
즉흥적인 소프트웨어 개발 -> 코딩과 수정 무한 반복
이렇게 하면...
-> 개발 지연, 예산 초과, 낮은 품질, 유지보수 곤란, 재작업 발생 🤮
-> 이럴 때 필요한게 소프트웨어 공학^^
소프트웨어 공학
- 소프트웨어의 개발과 운영, 유지보수, 소멸에 대한 체계적인 접근 방법
- 일회성이 아닌 반복해서 사용 가능한 방법
소프트웨어 공학의 목표
- 복잡도 낮춤 : 큰 문제 -> 작은 문제 여러 개
- 비용 최소화 : 불필요한 작업, 중복 작업 ㄴㄴ
- 개발 기간 단축 : 계획 -> 기간 단축
- 대규모 프로젝트 관리 : 공학적 접근 -> 큰 프로젝트 관리
- 고품질 소프트웨어 : 테스트 -> 결함 제거
- 효율성 : 표준화를 통해 효율성
한 마디로,
품질 좋은 소프트웨어를 최소의 비용으로 계획된 일정에 맞추어 개발하는 것!
-> 품질, 생산성, 일정 !
4️⃣ 소프트웨어 공학의 주제
품질, 생산성, 일정 등의 목표 달성을 위해 다루어야 하는 분야
- 단계적 프로세스 : 정해진 순서의 작업을 수행.
- 품질 보증 : 개발 산출물이 요구 사항과 일치하는지, 품질 수준에 맞는지 검사.
- 프로젝트 관리 : 개발, 품질 보증 작업을 관리 감독. 예측, 계획, 리스크 관리 -> 주어진 비용, 일정 안에서 완성
단계적 프로세스
소프트웨어 개발을 코딩에 치중하지 않고 요구분석, 설계, 코딩, 테스팅 등 정해진 절차를 따라 작업하는 것
단계적 프로세스 없이 소프트웨어 개발하면 -> 코딩에 치중 -> 코딩-수정 무한 반복
소프트웨어 위기를 해결하지 위한 소프트웨어 공학의 핵심 접근법
소프트웨어 개발 주기
- 계획
- 분석
- 설계
- 구현
- 테스팅 및 통합
- 유지보수
반복
품질 보증 (V&V)
- 검토 Verification : 각 단계의 작업이 제시된 절차와 방법에 맞게 진행되었는지 검사-> 방법적인 측면에서 옳은지
- 확인 Validation : 개발 완료된 결과물이 품질 수준에 맞는지 검사-> 결과물이 옳은지
- 테스팅 : 구현된 소프트웨어를 실행하여 실행 결과와 예상한 결과와 일치하는지 확인.
품질 좋은 소프트웨어는 뭘까? - 사용자 입장, 개발자 입장에 따라 중요하게 생각하는 게 다를 수 있음
품질 관련된 바람직한 소프트웨어 특징
- 유지보수성 : 소프트웨어를 이해하고 변경하기 용이한 성질
- 신뢰성 : 보안성, 안정성을 포함한 시스템의 믿을 수 있는 성질
- 효율성 : 시스템 자원을 낭비하지 않는 성질
- 유용성 : 사용자가 시스템을 쉽게 사용할 수 있는 성질
프로젝트별로 무엇이 더 중요한지 우선순위를 정함.
프로젝트 관리
소프트웨어 프로젝트의 제약 조건
- 범위
- 시간
- 비용
세 가지 조건은 프로젝트마다 다르며, 적절한 수준으로 관리하여 프로젝트 결과에 영향을 미치지 말아야 함.
서로 영향을 줄 수 있음. 적절히 수준을 맞춰서 품질 좋은 소프트웨어를 개발해야 함
프로젝트 관리 활동
- 프로젝트 계획 : 범위 설정, 타당성 검토, 일정, 팀/조직 수립
- 자원 관리 : 인력, 도구, 하드웨어 등을 산정하고 관리
- 리스크 관리 : 위험 요소를 예측하고 식별, 분석. 대비책도 준비해야함 -> 프로젝트 실패 방지
- 프로젝트 수행과 모니터링 : 작업 상태 파악, 위험 점검 및 조치 -> 계획에 따라 진행되고 있는지?
소프트웨어 공학 연구 결과
주제 | 의미 | 사례 | 요리에 비유 |
방법 method | 소프트웨어 제작에 사용하는 기법, 절차 | - 구조적 분석, 설계 방법 - 객체지향 분석, 설계 방법 |
익히는 방법(구이, 찜..) |
도구 tool | 자동화된 시스템 | - 설계 도구 - 프로그래밍 도구 - 테스트 도구 |
요리 도구(프라이팬, 압력밥솥) |
프로세스 process | 도구와 기법을 사용하여 작업하는 순서 | - Unified Process - eXtreme Programming |
조리 순서(레시피) |
패러다임 paradigm | 접근 방법, 스타일 | - 구조적 방법론 - 객체지향 방법론 |
음식 스타임(한식, 일식, 중식, 양식) |
소프트웨어 공학 지식 체계 SWEBOK
;Software Engineering Body of Knowledge
소프트웨어 개발 분야 엔지니어가 알아야 할 지식 체계!
IEEE 산하 소프트웨어 공학 표준위원회와 ACM이 규정
SWEBOK v3.0
- 10개의 주요지식 영역
- 공학측면 5개 영역: 요구사항, 설계, 개발, 테스트, 유지보수
- 관리측면 5개 영역: 형상관리, 관리, 프로세스, 도구/방법론, 품질
- 5개의 연관 학문 지식 영역
- 소프트웨어공학 전문가 역량: 전문성, 집단역학, 심리학, 소통기술
- 소프트웨어공학 경제학: 기초, 생명주기 경제한, 위험과 불확실성, 경제학 분석 방법론 등
- 컴퓨팅 기반: 문제해결 기술, 추상화, 프로그래밍, 자료구조/알고리즘 등
- 수학적 기반: 집합, 관계, 함수, 논리, 그래프, 확률 등
- 공학적 기반: 경험적 기법, 통계분석, 측정 등
5️⃣ 연관 분야
소프트웨어 공학
-> 소프트웨어를 개발하고 유지보수, 운영하는 데 필요한 체계적인 원리를 다루는 분야
핵심이 되는 엔지니어링, 관리 측면 이외에 연관된 분야와 지식들은?
연관 지식 영역
소프트웨어 공학은 크게 보면 두 가지 분야의 중간 가교 역할
1. 컴퓨터 공학의 원리나 기술과 관련된 여러 원리를 다루는 분야
-> 컴퓨터 공학 및 과학, 수학, 경제학, 프로젝트 관리, 시스템 공학, 품질 관리
2. 이를 적용하여 특정한 문제를 해결하는 응용 도메인 분야
소프트웨어 공학은 1번 분야 지식들을 통해 2번 분야의 결과물을 산출
컴퓨터과학(CS)과 소프트웨어공학(SE)
CS
- 계산 효율, 자원 공유, 정확성, 최적화, 성능 등을 강조함
- 정량적으로 즉시 측정 가능
- 기술적 측면에 집중함
SE
- 생산성, 품질, 비용, 시간 등을 강조함
- SE 방법, 도구, 프로세스는 즉시 측정 ㄴㄴ
- 기술 외적인 측면도 고려함 - 비즈니스, 인간공학 등
소프트웨어 공학에는 컴퓨터 과학의 이론과 기술적 기초(컴퓨터 기능)가 적용됨. 거기에 고객과 그 관련된 문제까지 적용된 것이 소프트웨어 공학이다
물리학과 전자 전기 공학 관계 같은 것
정리...
소프트웨어 공학은 품질 좋은 소프트웨어를 최소의 비용으로 계획된 일정에 맞추어 개발하기 위한 체계적인 방법을 다루는 분야
이를 위한 세 가지 주제 - 단계적 프로세스, 품질 보증, 프로젝트 관리
'Computer Science > Software Engineering' 카테고리의 다른 글
[소프트웨어공학] 품질 (0) | 2023.12.15 |
---|---|
[소프트웨어공학] 테스팅 (1) | 2023.12.15 |
[소프트웨어공학] UI 설계 (0) | 2023.12.15 |
[소프트웨어 공학] 개발 프로세스 모델 (1) | 2023.10.14 |
[소프트웨어 공학] 프로세스 (0) | 2023.09.29 |