소프트웨어공학의 개념
소프트웨어공학의 필요성
견고한(Industrial Strength) 소프트웨어
- 이식의 용이함, 사용의 편리함 등 품질 요소가 고려되어야 함
- 견고하지 않으면 사용자 불편을 넘어서 재산과 인명에 피해를 줄 수 있음
소프트웨어 개발의 문제점
고비용
- LOC(Line of Code): 소프트웨어 규모를 측정하는데 가장 널리 사용됨
- MM(Man-Month): 소프트웨어 개발에 드는 인적 비용
- 소프트웨어 생산성: MM당 생산하는 프로그램의 LOC
- 경험적 사례: 5만 라인은 4천만 ~ 1억 2천만원 정도의 비용이 듦(인건비)
지연과 낮은 신뢰도
- 계획에서 벗어난 컴퓨터 관련 개발 프로젝트
- 600여 회사를 조사하였더니 35% 이상
- 예상대로 작동하지 않는 사례
- 방위산업 보고에 따르면 70% 이상이 소프트웨어 오류에서 기인
- 아폴로 로켓의 초기 실패도 소프트웨어에서 기인
- 자동차 급발진 사고도 소프트웨어 문제일 가능성이 높음
- 하드웨어와 다름
- 전기 및 기계 시스템은 노후화에 의한 물리적 특성에 의해 오류가 발생함
- 소프트웨어는 노후화가 아닌, 주로 설계/개발 과정에 유입된 오류에 의한 것
유지보수와 재작업
- 제품처럼 부품 마모나 교체할 필요가 있어서 유지보수를 하는 것이 아님
- 시스템에 남아있는 오류가 있기 때문에 유지보수가 필요함
- 많은 오류가 시스템이 가동된 후에, 혹은 오랜 사용 후에 발견됨
- 오류가 아니더라도 소프트웨어는 자주 변경되며 자주 업그레이드 됨
- 하드웨어 등의 동작 환경이 변할 경우도 변경이 필요함
또 다른 문제점들
- 개발 예산이 초과되고, 일정이 지연되는 경우가 많음
- 과거 프로젝트에 대한 경험이 잘 축적되지 않을 뿐 아니라, 과거 데이터가 현재에 잘 적용되지 않는 경우가 많음
- 프로그래머 개인 역량에 따라 소프트웨어 개발 성패가 좌우됨 (프로그래머 개인 능력과 경험이 중요)
- 다른 공산품 같은 불량품 관리, 품질 보증에 대한 확실한 정량적 개념이 없음
소프트웨어공학의 정의
- Bauer: 컴퓨터 하드웨어에서 신뢰성 있게 운용되는 소프트웨어를 경제성 있게 개발하기 위해 공학적 원리를 응용하고 확립시킨 이론
- Boehm: 컴퓨터 프로그램을 설계하고 개발하며, 개발, 운용, 유지보수에 관련된 문서를 작성하는 데 필요한 과학적인 지식의 실용화
- Watts Humphrey: 질 좋은 소프트웨어를 경제적으로 생산하기 위하여 공학, 과학 및 수학적 원리와 방법을 적용하는 것
- F. Brooks: 품질, 효율, 비용에 관한 공학적인 접근 원리
- IEEE: 소프트웨어의 개발, 운용, 유지보수 및 폐기처분을 위한 체계적인 접근방안
- Fairley: 전산학, 경제학, 경영과학 및 의사소통기술과 문제해결을 위한 공학적인 접근방안을 토대로 소프트웨어 개발에 임하는 신기술 체계
소프트웨어공학의 특징
- 비교적 큰 규모의 소프트웨어 시스템을 대상으로 함
- 프로그래밍은 개인적인 작업이나 소프트웨어 공학은 팀을 이루어 하는 작업
- 소프트웨어의 제작부터 운영에 이르기까지 그 생산성을 높이기 위해 기술적인 분야는 물론 인간적인 요소에 대한 개발 및 운영의 방법론을 제공
- 소프트웨어공학은 개발 위주가 아니라 사용자의 요구를 전략적으로 계획하기 위한 준비 단계와 사용자가 시스템을 사용하고 효과를 얻을 수 있는 운용단계를 중시
프로세스 / 방법 / 도구
프로세스
- 어떤 목표를 수행하는 순차적인 단계로, 원하는 결과를 만들기 위하여 사람, 절차, 방법, 도구를 통합시키는 수단
- 소프트웨어를 공학화할 때 채택하는 접근법으로, 명확한 순서로 입력물(Input)을 원하는 결과(Output)로 전환하는 일련의 과정
- 유지보수하기 위하여 사용하는 활동, 방법, 기법 등이 일련의 순서를 가지는 집합
- 소프트웨어 프로젝트의 관리 및 제어를 위한 기반을 형성하고 기술적인 방법이 적용되고 작업 산출물(모델, 문서, 데이터, 보고서, 서식 등) 생성
프로세스의 분류
- 비정형(informal): 상세 프로세스 모델이 없으며 개발 팀은 그들만의 방식을 선택
- 프로토타입, 단기 lifetime 시스템, 소/중규모 시스템
- 관리(managed): 개발 프로세스를 이끌 프로세스 모델을 정의
- 대규모 시스템, 장기 lifetime 제품
- 방법적(methodical): 특정 개발 방법론이 프로세스를 지원
- well-understood application domain, re-engineered system
- 개선(improving): 자동화된 CASE 도구가 프로세스를 지원
방법(Method)
- 기법의 실용화 방안, 어떤 결과를 생성하기 위하여 적용하는 기법과 절차를 의미
- 구조적 분석·설계나 객체지향 분석·설계 등 개발·유지보수 절차와 문서화 등이 포함된 개념
- 커뮤니케이션, 요구분석, 설계 모델링, 프로그램 작성, 테스팅 그리고 지원을 포함하는 넓은 범위의 태스크들로 구성
방법론(Methodologies)
- 기법·방법·교육·자문 등을 포함한 실무적인 관점에서 하나의 체계로 묶어진 것
- 프로세스 중심 방법론
- 1970년대에 제시되어 지금까지 가장 많이 알려진 것
- 자료의 변환과정
- 프로세스를 강조하여 설계하는 방법(하향식)
- 자료흐름방법론, 절차식 방법론, 구조적 방법론
- 자료중심 방법론
- 먼저 자료 구조가 정의되면 데이터베이스에서 중요하게 사용되는 ER다이어그램을 토대로 프로세스를 파악(하향식)
- 정보공학 방법론
- 객체지향 방법론
- 자료와 프로세스를 묶어 생각하는 방법
- 1980년 후반부터 모듈화, 정보은닉, 재사용 가능성이 인정되면서 급속도로 전파(상향식)
구분 | 구조적 방법론 | 정보공학 방법론 | 객체지향 방법론 |
중점사항 | Process 중심 | Data 중심 | 객체 중심 |
관건 | 모듈화 | entity 식별 | object 식별 |
재사용 | 일부 모듈 재사용 가능 | 데이터의 재사용 가능 | 거의 모든 것이 재사용됨 |
목표 | 업무과정의 자동화 | 기업 전략정보 시스템 구축 | S/W 확장성 재사용성 |
주체 | 프로그래머 | 분석가 | 분석가/설계가/프로그래머와 협동 |
특징 | 단위시스템 중심의 사고 | 전체시스템의 통합성 | 반복적, 점증적인 개발, 재사용성 강조 |
품질 | 개발자의 능력이 프로그램의 품질을 좌우 | 프로그래밍은 자동화될 수 있다는 확신 | Visual Programming과 컴포넌트에 의한 빠른 개발 방식 |
생명주기 | Top-down | Top-down | Bottom-up |
소프트웨어공학의 주요이슈
주제 | 의미 | 사례 | 요리 비유 |
방법 | SW 개발에 사용하는 기법, 절차 | 구조적 분석, 객체지향 분석 | 익히는 방법 |
도구 | 자동화 개발 도구 / 시스템: CASE | 설계 도구, 프로그래밍 도구, 테스트 도구 등 | 요리 도구 |
프로세스 | 개발 공정의 순서 | 폭포수 모형, 프로토타입 모형 등 | 조리 순서 |
패러다임 | 개발 접근 방법, 개발 스타일 | 구조적 방법론, 객체지향 방법론 | 음식 스타일 |
소프트웨어공학의 역사
1960년대
- 1968년에 NATO 회의에서 '소프트웨어공학'이라는 단어를 탄생시키면서 소프트웨어 위기를 인식하기 시작
- 다익스트라는 이 무렵 GOTO문의 유해성의 제기
- 소프트웨어 개발에 구조적이고 공학적인 접근방안의 시도
1970년대
- 소프트웨어공학이 학문으로 정착되었으며, 소프트웨어 품질과 생산성 문제 대두
- 구조적 프로그래밍에서 더 나아가 구조적 분석 및 설계의 개념이 소프트웨어 위기의 극복 수단으로 각광 받기 시작
- 소프트웨어 생명주기(lifecycle)와 개발도구(tools)의 제안
1980년대 전반
- 소프트웨어 개발 기술의 발전
- 구조적 방법, Jackson 방법, Warnier-Orr 방법 등 분석·설계 방법들의 활용
- 시험, 유지보수, 프로젝트 관리, 개발환경 등
- 소프트웨어 공장 개념 탄생
1980년대 후반
- 객체지향 분석·설계·프로그래밍, 4세대 언어, 소프트웨어 재사용, CASE, 피플웨어, 정보공학, 품질보증, 형상관리, 프로토타이핑 등으로 개발 및 관리
- 소프트웨어 생산보다는 사람과 도구와 관리기술의 병행이 중요하다는 방법론 등장
정리
- 소프트웨어 공학은 과학적 사고를 소프트웨어 설계와 제작에 응용하며, 개발과 운영, 유지보수에 필요한 문서를 작성하는 모든 작업의 총칭으로 소프트웨어 공학자의 생산성 향상을 위한 도구와 방법론을 제공한다.
- 프로세스는 소프트웨어를 공학화할 때 채택하는 접근법으로, 명확한 순서로 입력물(Input)을 원하는 결과(Output)로 전환하는 일련의 과정이다.
- 방법(Methods)은 기법의 실용화 방안 즉, 어떤 결과를 생성하기 위하여 적용되는 기법과 절차를 의미하고, 방법론(Methodologies)은 기법·방법·교육·자문 등을 포함한 실무적인 관점에서 하나의 체계로 묶어진 것이다.
- 하나의 도구에 의해 생성된 정보가 다른 도구에 의해 사용될 수 있도록 도구들이 통합되면 소프트웨어 개발 지원 시스템이 구축된다.
- 소프트웨어 위기를 인식하기 시작(1960년대)한 후에 소프트웨어 공학이 학문으로 정착되었으며, 소프트웨어 품질과 생산성 문제 대두(1970년대)로 소프트웨어 공장 개념이 탄생(1980년대 전반)하였고, 1980년대 후반에는 객체지향, 정보공학, 품질보증, 형상관리, 프로토타이핑 등으로 개발 및 관리되었다.