01 intro
1. 소프트웨어
- 소프트웨어 공학의 목표: 최소의 비용으로 고품질의 소프트웨어를 적시에 공급하는 것
- 소프트웨어
- 프로그램 + 프로그램의 개발, 운용, 보수에 필요한 정보 일체
- 개념적이고 무형적 (생산물의 구조가 코드 안에 숨어 있음)
- 소프트웨어의 특성
- 비가시성\(_{Invisibility}\)
- 복잡성\(_{Complexity}\)
- 순응성\(_{Conformity}\)
- 복제 가능\(_{Duplicability}\)
- 시스템: 필요한 기능을 실현시키기 위하여 관련 요소를 어떤 법칙에 따라 조합한 집합체
- 시스템의 성질
- 서브시스템: 한 시스템의 요소들은 밀접하게 연관되어 있다.
- 기능적 분할: 시스템은 규모가 작은 부속 시스템들로 나눌 수 있음
- 시스템 경계: 시스템과 주변 환경을 구분할 수 있는 경계가 있음(입력과 출력이 만나는 곳)
- 자동화 경계: 시스템이 자동화된 부분과 수동 작업 부분을 나누는 경계
2. 소프트웨어 공학의 필요성
화성성역의궤와 소프트웨어 공학
- 화성성역의궤
- 수원화성을 축성한 그 건설 과정 및 기타 제반사항들을 모두 글과 그림으로 기록하여 남긴 책
- 당시 축성 과정에서 사용된 각종 공사법, 무기 대응방안, 기자재의 상세한 모습과 사용방법 등…
-
수원화성을 수백여 년 전에 지어졌던 성을 100% 그대로의 모습으로 복원 가능한 이유는 화성성역의궤가 존재하기 때문
- 최종 산출물: 실행 가능한 프로그램
- 최종 산출물을 만들기 위해 처음부터 끝까지 사용된 기록물들을 소프트웨어 또는 문서라고 한다.
소프트웨어와 화성성역의궤 사이의 관계를 서술하시오
화성성역의궤는 수원 화성을 축성한 건설 과정 및 기타 제반사항들을 모두 글과 그림으로 기록하여 남긴 책으로, 화성성역의궤가 있었기에 지금의 수원 화성이 존재하는 것이다. 이처럼 소프트웨어를 설계할 때 과정을 기록해두지 않는다면 프로그램도 의미가 없다고 할 정도로 중요한 것이다. 또한, 과거에 작성한 화성성역의궤를 다시 이용한 것처럼 소프트웨어도 재사용이 가능하다.
- 소프트웨어 공학은 소프트웨어에 있는 심각한 직접적인 손해 또는 간접적인 손해가 따를 수 있는 문제를 해결
- 소프트웨어 제품은 고객의 문제를 해결하기 위해 구축, 비즈니스를 운영하기 위하여 사용
- 소프트웨어가 제대로 작동하지 않으면 재정적 손실이 크고 사용자가 불편을 겪음
고비용
- LOC\(_{Lines \ of \ Code}\): 소프트웨어의 규모를 측정하는 데 가장 널리 사용
- MM\(_{Man-Month}\) : 소프트웨어 개발에 드는 비용
- 생산성 : MM당 생산하는 프로그램의 LOC
- 5만줄의 프로그램 – 4천만원 내지 1억 2천 정도의 비용
-
소프트웨어 위기 현상
- 하드웨어 발전 속도가 소프트웨어 발전 속도보다 월등히 빠르기 때문이다.
소프트웨어 위기 현상의 이유(소프트웨어의 특징)
개발 지연과 낮은 신뢰도
- 계획에서 벗어난 컴퓨터 관련 개발 프로젝트
- 예상대로 작동하지 않는 사례
- 하드웨어와 다름
- 설계, 개발 과정에 유입된 오류에 의한 것
유지보수와 재작업
- 유지보수가 필요한 이유
- 시스템에 남아 있는 오류가 있기 때문에
- 소프트웨어는 업그레이드(성능 향상)가 흔하기 때문에 수정이 필요
- 소프트웨어 개발의 문제점
- 의도하는 바가 잘 드러나지 않음 → 요구를 파악하기 어려움
- 개발을 진행하면서 요구가 변경되고 재작업이 필요
3. 소프트웨어 공학이란?
- 소프트웨어 공학 : 소프트웨어의 개발과 운영, 유지보수, 소멸에 대한 체계적인 접근 방법
-
체계적인 접근 : 소프트웨어 개발에 사용되는 방법이 일회성이 아닌 반복 사용이 가능함
→ 신뢰성이 보장되고 검증됨
-
- 고강도의 소프트웨어는 사용자의 문제를 해결
- 사용자의 요구를 만족시키기 위해 소프트웨어를 체계적으로 개발
품질과 생산성
- 엔지니어링 작업에서는 비용, 일정, 품질과 같은 변수가 중요
- 생산성과 품질은
trade-off
관계이다.- 생산성 \(\uparrow\), 품질 \(\downarrow\)
- 생산성 \(\downarrow\), 품질 \(\uparrow\)
- 비용
Man-Month
로 측정
- 일정
- 짧은
time-to-market
- 짧은
- 품질을 나타내는 속성
- 기능성\(_{functionality}\)
- 신뢰성\(_{reliability}\)
- 사용 용이성\(_{usability}\)
- 효율성\(_{efficiency}\)
- 유지 보수성\(_{maintainability}\)
- 이식성\(_{portability}\)
소프트웨어 공학의 접근 방법
- 프로젝트를 수행하는 동안 얻은 품질과 생산성은 여러 가지 요인에 좌우됨
- 품질을 좌우하는 세가지 : 인력, 프로세스, 기술
-
프로젝트 삼각 균형
-
- 소프트웨어를 개발하는 프로세스를 소프트웨어와 분리
- 소프트웨어 공학은 소프트웨어 제작 과정에 집중
- 알고리즘, 운영 체제, 데이터베이스 등은 소프트웨어 제품 자체에 초점
- 소프트웨어 엔지니어링 작업의 종류
- 소프트웨어 개발 프로세스 – 시스템에 대한 비전과 개념을 목표로 하는 컴퓨터 환경에 실행되는 소프트웨어로 바꾸는 작업
- 품질 보증 – SQA(Software Quality Assurance) 개발 작업이 적절히 수행되었는지 확인
- 프로젝트 관리 – 개발과 품질 보증 작업을 관리하고 감독
단계적 개발 프로세스
- 단계적 개발 프로세스를 따르는 이유
- 소프트웨어의 문제를 나눠 여러 개발 단계에서 다른 관점을 다루기 때문
- 개발하는 동안 정해진 시점에 품질과 진행을 체크할 수 있음
- 요구분석 : 소프트웨어 시스템이 풀어야 할 문제를 이해하기 위한 작업
- 문제를 분석 : 문제와 그 배경을 잘 이해하고 개발할 시스템의 요구 찾기
- 요구를 정리 : 요구명세서\(_{requirement \ specification}\)
- 시스템의 기능 이외에도 설계에 영향을 주는 모든 요인을 문서에 기술
- 설계
- 요구를 어떻게 만족시킬 것인지
- 기본(구조) + 상세
- 코딩
- 시스템 설계를 프로그래밍 언어로 변환
- 코딩 작업 중에는 읽기 쉽고 이해하기 쉬운 프로그램이 되어야함 → 변경하기 쉬워져야 하기 때문
- 단순함과 명확성을 추구
- 테스팅: 소프트웨어의 결함을 찾아냄
- 소프트웨어 개발 단계에서 사용되는 중요한 품질 제어 수단
- 프로그램에 포함된 요구, 설계, 코딩 오류를 밝힘
- 단위 테스팅\(_{unit \ testing}\): 모듈이나 컴포넌트를 개별적으로 시험
- 통함 테스팅\(_{integration \ testing}\): 모듈 사이의 연결을 시험
- 일반적인 개발 단계는 아래 4 단계를 거친다고 보면 된다.
- 분석 - 요구 명세서
- 설계 - 설계 명세서
- 구현 - 새 시스템, 유지 보수 계획
- 테스팅 - 테스팅 결과 보고서
품질 보증
- 품질 보증 : 개발되고 있는 소프트웨어가 요구와 품질 수준을 만족시킬 것이라는 것을 보장하는 작업
- 검토\(_{verification}\)
- 개발 작업이 프로젝트를 위해 선택된 프로세스와 방법에 맞게 수행되었는지 체크
- 요구된 소프트웨어 결과물이 품질 수준에 맞게 생산되었는지 검사
- 확인\(_{validation}\): 개발 프로세스에 의하여 생성된 결과물의 정확성을 체크
- 정적 확인\(_{static \ validation}\): 소프트웨어를 실행시키지 않고 결과물의 정확성을 체크
- 동적 확인\(_{dynamic \ validation}\): 소프트웨어를 실행시켜 잘 작동하는지 확인 테스팅
- 동적 확인 작업, 테스트 결과가 예상되는 결과와 일치하는지 체크
댓글남기기