Computer Science/Software Engineering

[소프트웨어 공학] 소개

brong 2023. 9. 23. 01:57
728x90

이번 포스팅에서 다루는 내용

소프트웨어 공학, 소프트웨어, 소프트웨어 개발 작업, 소프트웨어 공학의 접근방법, 소프트웨어 공학의 주제, SWEBOK

 

 

소프트웨어 공학에 대해 들어가며 간단하게 ... 

 

소프트웨어 공학

: 좋은 품질의 소프트웨어를 비용 효율적으로 개발하는 방법에 대해 배움

 

 

왜 배울까

프로그래머에서 소프트웨어 엔지니어

 

단순히 코딩 역량만 기르는 프로그래머가 아닌 개발의 전체 과정을 이해하고 수행할 능력을 기르고자 함! 

 

소프트웨어 공학의 목표

체계적이며 원리적인 접근 방법 -> 기간내에 품질 좋은 소프트웨어를 효율적(낮은 비용, 높은 생산성)으로 공급하기 

 

 

소프트웨어 공학이 중요해진 이유

  • 소프트웨어 규모 및 복잡도 증가
  • 고품질/고신뢰성 요구 : 소프트웨어는 모든 사업 발전의 원동력. 잘못 설계->큰 사고로 이어질 수 있음
  • 시장 적시성 요구/짧은 수명주기 : 빨리 나오고 빨리 사라짐. 개발과 진화의 명확한 구분이 줄어듦
  • 상황 변화에 따른 동적 적응 요구 : 새롭고 다양한 환경, 컨텐츠, 요구 사항에 맞게 적응해야 함

 

 

 

1️⃣ 소프트웨어


 

: 프로그램과 그 프로그램의 개발, 운용, 보수에 필요한 정보 일체

 

소프트웨어 != 프로그램

소프트웨어는 단순히 소스코드(프로그램)에 그치지 않고, 그에 필요한 문서(정보)들을 모두 포함한 개념이다.

 

생산물의 구조가 코드 안에 숨어있다 -> 개념적이고 무형적

 

 

다른 엔지니어링 결과물과 비교하여 소프트웨어가 갖는 특징

  • 복잡성 complexity : 수많은 내부 요소들의 상호작용. 수천만 라인의 코드들 
  • 순응성 conformity : 요구, 환경, 데이터 변화에 따라 적절히 변형됨
  • 변경성 changeability : 쉽게 바꿀 수 있음
  • 비가시성 invisibility : 구조가 눈에 안 보임

 

  • 복제용이성 : 무한대로 복제 가능
  • 비마모성

 

소프트웨어 종류

  • 주문형 소프트웨어 : 특정 고객 또는 기업의 요구를 만족시키기 위해 제작한 소프트웨어 (ex. 대학 행정 시스템)
  • 패키지형 소프트웨어 : 패키지화하여 상업적으로 판매하는 소프트웨어 (ex. 워드프로세서, 주문 관리 시스템)
  • 임베디드 소프트웨어 : 다른 시스템에 내장된 소프트웨어 (ex. 핸드폰, 자동차 등에)
소프트웨어 분류 사용되는 카피의 수 요구 하드웨어 성능 개발 인력
주문형 적음 낮음 많음
패키지 중간 높음 중간
임베디드 많음 중간 적음

 

시스템

: 필요한 기능을 실현시키기 위하여 관련 요소를 어떤 법칙에 따라 조합한 집합체

ex. 은행 전산 업무 시스템, 공항 수화물 처리 시스템

 

소프트웨어는 컴퓨터를 기반으로 하는 여러 시스템과 관계를 맺고 있음

-> 하드웨어, 데이터베이스, 서류, 절차, 사람(오퍼레이터) 등 여러 서브 시스템과 관련됨 

 

소프트웨어를 개발하는 일은 이러한 시스템에 속하는 여러 요소를 파악하고 그들의 관계를 설정하는 작업도 포함함 

 

시스템의 성질

  • 서브시스템 : 시스템은 밀접하게 관련되는 서브시스템들로 구성. 
  • 기능적 분할 : 규모가 작은 부속 서브시스템들로 나눌 수 있음
  • 시스템 경계 : 시스템과 주변 환경을 구분할 수 있는 경계가 있음. -> 입력과 출력이 만나는 곳
  • 자동화 경계 : 자동화된 부분과 수동 작업 부분을 나누는 경계 

 

 

2️⃣ 소프트웨어 개발 작업


소프트웨어를 만들어서 실제 사용하는 단계까지 가려면 여러 기본 활동이 필요함

  • 명세화 specification : 소프트웨어 기능, 성능, 원가, 리스크, 일정 등을 모두 합의 -> 요구사항을 엄격히 정리하여 개발
  • 구현 coding : 시스템의 명세를 주어진 여건에 맞게 설계하여 프로그래밍 언어로 변환. 주어진 설계에 마조계 구현 -> 검증, 휴지보수에 큰 영향
  • 검증 verification : 구현된 소프트웨어가 고객의 의도와 일치하는 지 확인. 
  • 유지보수 maintenance : 사용 단계에서 결함 수정 또는 요구 변화에 맞게 수정. -> 진화의 단계

 

개발 작업

1. 계획을 세우고 

2. 명세화 -> 설계 -> 코딩 -> 검증 -> 유지보수를 반복

 

 

개발 작업의 특징

  • 명세화 어려움 : 고객의 의도를 처음부터 명확히 이해하기 어려움
  • 재사용 어려움 : 미리 재사용할 부품 만들기 어려움
  • 예측 어려움 : 업무 절차, 법규, 하드웨어 등 외부 요소에 영향을 받기 때문에 프로젝트 규모 예측 어려움
  • 유지보수 어려움 : 다른 사람이 개발한 코드를 보고 고치기 어려움
  • 고품질 어려움 : 완벽한 테스트는 불가능. 오류가 있다는 건 보일 수 있어도 오류가 없다는 건 증명 못 함

 

소프트웨어 위기 software crisis

  • 1960중, 소프트웨어 수요가 급격히 증가하고 복잡성 증가. but 기본 방법이 충분하지 않아 발생한 문제
  • 유지보수 비용 증가, 초과 근무, 비효율적, 낮은 품질, 일정 초과 ...
  • 소프트웨어 공학이 나오게 된 배경
  • 원인: 요구 증가, 복잡도 증가, 난이도 증가. 그러나 같은 인력, 같은 방법, 같은 도구 -> ㅠㅠ 

 

 

3️⃣ 소프트웨어 공학의 접근법


계획이나 절차 없이 소프트웨어를 개발하면 어떻게 될까? 

즉흥적인 소프트웨어 개발 -> 코딩과 수정 무한 반복

완전 나잖아

 

이렇게 하면...

-> 개발 지연, 예산 초과, 낮은 품질, 유지보수 곤란, 재작업 발생 🤮

-> 이럴 때 필요한게 소프트웨어 공학^^

 

소프트웨어 공학

  • 소프트웨어의 개발과 운영, 유지보수, 소멸에 대한 체계적인 접근 방법
  • 일회성이 아닌 반복해서 사용 가능한 방법 

 

소프트웨어 공학의 목표

  • 복잡도 낮춤 : 큰 문제 -> 작은 문제 여러 개
  • 비용 최소화 : 불필요한 작업, 중복 작업 ㄴㄴ
  • 개발 기간 단축 : 계획 -> 기간 단축
  • 대규모 프로젝트 관리 : 공학적 접근 -> 큰 프로젝트 관리
  • 고품질 소프트웨어 : 테스트 -> 결함 제거
  • 효율성 : 표준화를 통해 효율성 

한 마디로, 

품질 좋은 소프트웨어를 최소의 비용으로 계획된 일정에 맞추어 개발하는 것!

-> 품질, 생산성, 일정 ! 

 

 

 

4️⃣ 소프트웨어 공학의 주제


품질, 생산성, 일정 등의 목표 달성을 위해 다루어야 하는 분야 

  • 단계적 프로세스 : 정해진 순서의 작업을 수행. 
  • 품질 보증 : 개발 산출물이 요구 사항과 일치하는지, 품질 수준에 맞는지 검사.
  • 프로젝트 관리 : 개발, 품질 보증 작업을 관리 감독. 예측, 계획, 리스크 관리 -> 주어진 비용, 일정 안에서 완성

 

단계적 프로세스

소프트웨어 개발을 코딩에 치중하지 않고 요구분석, 설계, 코딩, 테스팅 등 정해진 절차를 따라 작업하는 것

단계적 프로세스 없이 소프트웨어 개발하면 -> 코딩에 치중 -> 코딩-수정 무한 반복 

 

소프트웨어 위기를 해결하지 위한 소프트웨어 공학의 핵심 접근법 

 

 

소프트웨어 개발 주기

  1. 계획
  2. 분석
  3. 설계
  4. 구현
  5. 테스팅 및 통합
  6. 유지보수

반복

 

 

품질 보증 (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 방법, 도구, 프로세스는 즉시 측정 ㄴㄴ
  • 기술 외적인 측면도 고려함 - 비즈니스, 인간공학 등 

 

소프트웨어 공학에는 컴퓨터 과학의 이론과 기술적 기초(컴퓨터 기능)가 적용됨. 거기에 고객과 그 관련된 문제까지 적용된 것이 소프트웨어 공학이다

 

물리학과 전자 전기 공학 관계 같은 것

 


정리...

 

소프트웨어 공학은 품질 좋은 소프트웨어를 최소의 비용으로 계획된 일정에 맞추어 개발하기 위한 체계적인 방법을 다루는 분야

이를 위한 세 가지 주제 - 단계적 프로세스, 품질 보증, 프로젝트 관리