소프트웨어와 소프트웨어 개발 - Software Engineering -
강의 개요 소프트웨어 소프트웨어 위기 소프트웨어 공학 좋은 소프트웨어의 조건 소프트웨어 개발 모형 소프트웨어 개발에 영향을 미치는 요소
소프트웨어 소프트웨어 소프트웨어 생산 사회적, 경제적인 소프트웨어 의존도 커짐 프로그램 + 프로그램의 개발, 운용, 보수에 필요한 정보 일체(소프트웨어 생산 결과물 일체) 소프트웨어 생산 소프트웨어는 프로그램의 동적인 실체 프로그램은 형식 언어로 표현된 지적 노동의 결과물 제조업 vs. 서비스업(소프트웨어는 제작이 아니라 창조적 노력이 포함된 개발) 닳아 없어지는 것이 아니라 소용없어 못쓰게 됨 논리적인 요소로 구성(유지 보수자 복잡) 소프트웨어 산업(국내는 12조 규모의 산업) 사회적, 경제적인 소프트웨어 의존도 커짐 dependability
소프트웨어의 특성 ~ilities 제품으로서의 품질 특성 비가시성(Invisibility) 테스트 가능(Testability) 복잡성(Complexity) 변경성(Changeability) 순응성(Conformity) 장수(Longevity) 복제 가능(Duplicability) 응용에 의존(Application dependability) 제품으로서의 품질 특성 좋은 소프트웨어라고 평가 할 수 있는 기준
소프트웨어 시스템 유기적으로 상호 작용하는 개체들의 모임 소프트웨어는 컴퓨터를 기반으로 하는 여러 시스템과 관계를 맺고 있음 특징 시너지 효과 역동적으로 발전, 변경 상충되는 요구와 이해 관계의 절충 소프트웨어 자체도 하나의 시스템
정보 시스템(Information System) 자료의 분류, 저장, 검색에 관점 데이터 베이스를 대화식으로 접근 조직의 문제 해결을 위한 도구 예 항공권 예약 시스템, 신용 카드 검색 서비스, 뱅킹 시스템 특징 대규모 자료, 정적이 아님 시스템 분석, 유지보수가 중요 MIS 운영, 관리, 의사결정을 위하여 정보를 제공하는 시스템
제어 시스템(Control System) 사건을 감지하여 처리하고 자동적으로 보고 센서의 감지 제어 기기의 상태 보고 오퍼레이터의 입력 처리 인터페이스 예 교통 제어 공정 제어 수치 제어 의료 시스템 무기 항공 제어
탑재 시스템(Embedded System) 계산이 주된 기능이 아닌 시스템의 한 구성요소 예 전자 기계 장치, 공정 제어 비행기 유도, 스위칭 시스템 환자 감시 시스템, 레이다 추적 시스템 특징 대규모, 장기 사용, 테스트하기 어려움 인터페이스가 복잡, 비동기, 병렬, 분산 대규모의 자료를 접근, 변경, 출력 실시간 제어, 인터페이스 엄격한 요구: 실시간 반응, 고장에 대한 안전, 신뢰성
소프트웨어의 위기(Software Crisis)
소프트웨어의 위기 (Software Crisis) 소프트웨어 공정의 문제점 비용 초과 기간 지연 성능 저하 비신뢰성 유지보수 불가능, 엄청난 유지보수 비용 소프트웨어 위기 소프트웨어의 요구와 그 공급 능력 간의 차이가 갈수록 심화 1965-1985 1983년의 증가율 요구의 증가 100배 12% 생산성 2배 4% 인력 공급 10배 4%
소프트웨어 공학 정의 질 좋은 소프트웨어를 경제적으로 생산하기 위하여 공학, 과학 및 수학적 원리와 방법을 적용하는 것 - Watts Humphrey, SEI 소프트웨어의 개발, 운용, 유지보수 및 소멸에 대한 체계적인 접근 방법 - IEEE Computer Society 품질, 효율, 비용, 인정에 관한 공학적인 접근 원리 - F. Brooks 목표 품질(Quality) 생산성(Productivity)
엔지니어링의 발전원리 [Shaw, 1996] 과 학 대량생산 엔지니어링 상업화 장인들의 기술
소프트웨어 공학이 다루는 주제 분 야 의 미 사 례 요리 비유 방법(method) 소프트웨어 제작에 사용하는 기법이나 절차 구조적 분석, 설계 방법 객체지향 분석, 설계 방법 익히는 방법 (구이, 찜, 훈제 등) 도구(tool) 자동화된 시스템 설계 도구 프로그래밍 도구 테스트 도구 요리 도구 (프라이팬, 압력 솥, 오븐 등) 프로세스(process) 도구와 기법을 사용하여 작업하는 순서 Unified Process eXtreme Programming 조리 순서(recipe) 패러다임(paradigm) 접근 방법, 스타일 구조적 방법론 객체지향 방법론 음식 스타일 (한식, 일식, 중식, 퓨전 등)
소프트웨어 품질 (Software Quality) 소프트웨어를 대하는 입장에 따라 품질에 대한 관점이 달라짐 최소 비용 생산성 융통성 기능의 정확성 이해 용이성 사용 용이성 일관된 통합 이식성 재사용성 유지보수성 상호 운용성 신뢰성 효율성 발주자 사용자 유지보수자
소프트웨어 품질 (Software Quality) 정확성(Correctness) 기능적으로 맞게 동작, 표준에 적합 요구 분석서의 기능과 일치하는지 점검 신뢰성(Reliability) 소프트웨어가 주어진 기간동안 제대로 작동할 확률 오류에 비례 정확성을 위한 필요조건 강인성(Robustness) 요구 명세에 표시하지 않은 상황(오류 입력)에서도 제대로 작동하는 성질
소프트웨어 품질 (Software Quality) 성능(Performance) 수행 속도 알고리즘의 시간 복잡도 시뮬레이션, 스트레스 테스트 사용 용이성(Usability) 시스템을 친근하게 느낄 수 있는 성질 사용 대상에 따라 달라질 수 있음 사용자 인터페이스, Human factor 유지보수성(Maintainability) 보수성: 정해진 기간에 소프트웨어 결함을 해결할 수 있는 성질 진화성: 잠재적 발전 가능성
소프트웨어 품질 (Software Quality) 재사용성(Reusability) 소프트웨어 부품(라이브러리, 클래스 등)의 성질 확장 가능성 - openness 적응성 - adaptability 이용 용이성 - closeness
프로세스 품질 개발하는 과정이 소프트웨어 품질에 많은 영향을 준다는 주장 개발 및 유지보수하는 프로세스의 품질이 프로덕트 자체의 품질 못지 않게 중요하나는 입장 향상 방안 특정 오류가 언제 어디서 발견되는가? 어떻게 하면 개발 과정에 오류를 조기에 발견할 수 있는가? 어떻게 하면 오류에 대한 내성이 있는 시스템, 즉 오류가 소프트웨어를 정지시키는 확률이 적은 시스템으로 만들 수 있는가? 프로세스가 좋은 품질을 보장하는 더 효율적이며 효과적인 다른 방법이 있는가?
소프트웨어 생산성(Software Productivity) 생산 과정(process)에 크게 영향 Process improvement 개발 경험의 성숙도에 의해 좌우 CMM(Capability Maturity Model): Level 1~5 생산성에 영향을 미치는 요소 프로그래머의 능력 팀 의사 전달 제품의 복잡도 기술 수준 관리 기술
소프트웨어 프로세스 모형 소프트웨어 라이프 사이클 개념화 단계 유아 및 성장기 성년기 쇠퇴기 개발 후 개발 단계
소프트웨어 프로세스 모형 개발 프로세스 개발 모형 실정에 맞는 개발 팀의 고유한 모형의 정립 필요 개발 단계(작업) 입력 자료 수행 결과 실정에 맞는 개발 팀의 고유한 모형의 정립 필요 소프트웨어 개발에 필요한 작업 요구 분석과 정의 시스템 설계 프로그램 설계 프로그램의 작성(구현) 테스트(단위 테스트, 통합 테스트, 시스템 테스트) 시스템 설치 유지보수
대표적인 소프트웨어 프로세스 모형 중요한 모형 폭포수 모형 프로토타이핑 모형 점증적 모형 나선형 모형 V 모형
폭포수모형(Waterfall Model) 계 획 요구 분석 설 계 구 현 시 험 인수설치
폭포수모형(Waterfall Model) 1970년대 소개 항공 방위 소프트웨어 개발 경험으로 습득 각 단계가 다음 단계 시작 전에 끝나야 함 순서적 - 각 단계 사이에 중복이나 상호작용이 없음 각 단계의 결과는 다음 단계가 시작 되기 전에 점검 바로 전단계로 피드백 단순하거나 응용 분야를 잘 알고 있는 경우 적합 한 번의 과정, 비전문가가 사용할 시스템 개발에 적합 결과물 정의가 중요 Method vs. Methodology
폭포수모형의 프로세스 프로세스 및 결과물 계획 요구 분석 설계 구현 시험 인수/설치 문제정의 타당성 분석 비용, 일정예측 계획서 DFD 자료사전 소단위명세서 요구 분석서 시스템구조설계 프로그램설계 UI 설계 구조설계서 상세설계서 프로그래밍 단위테스트 프로그램 통합시험 기능시험 성능시험 통합된 설치 인수 시험 설치된 소프트웨어 (활동) (결과물) P R D I T A
폭포수모형의 결과물(Deliverable)
폭포수모형의 장단점 단점 MIL-STD-2167 ISO 12207 처음 단계의 지나치게 강조하면 코딩, 테스트가 지연 각 단계의 전환에 많은 노력 프로토타입과 재사용의 기회가 줄어듦 소용 없는 다종의 문서를 생산할 가능성 있음 MIL-STD-2167 general system life cycle software development cycle ISO 12207
프로토타이핑 모형 Rapid Prototyping Model(RAD) 요구 분석 프로토타입 개발/개선 프로토타입 평가 구현 인수/설치
프로토타이핑 모형 시범 시스템의 적용 프로토타이핑 도구 공동의 참조 모델 제공 개발 단계에서 유지보수가 이루어짐 단점 사용자의 요구를 더 정확히 추출 알고리즘의 타당성, 운영체제와의 조화, 인터페이스의 시험 제작 프로토타이핑 도구 화면 생성기 비주얼 프로그래밍, 4세대 언어 등 공동의 참조 모델 제공 개발 단계에서 유지보수가 이루어짐 단점 오해, 기대심리 유발 관리가 어려움(중간 산출물 정의가 난해)
점증적 모형 개발 싸이클이 짧은 환경 개발 시스템 개발자 사용자 완성 시스템 빠른 시간 안에 시장에 출시하여야 이윤에 직결 개발 시간을 줄이는 법 – 시스템을 나누어 릴리스 개발 시스템 개발자 릴리스 1 구축 릴리스 2 구축 릴리스 3 구축 릴리스 1 사용 릴리스 2 사용 릴리스 3 사용 사용자 완성 시스템
점증적 모형 릴리스 구성 방법 단계적 개발 점증적 방법 – 기능별로 릴리스 반복적 방법 – 릴리스할 때마다 기능의 완성도를 높임 단계적 개발 기능이 부족하더라도 초기에 사용 교육 처음 시장에 내놓는 소프트웨어는 시장을 빨리 형성시킬 수 있음 자주 릴리스하면 가동 중인 시스템에서 일어나는 예상하지 못했던 문제를 신속 꾸준히 고쳐나갈 수 있음. 개발 팀이 릴리스마다 다른 전문 영역에 초점 둘 수 있음.
나선형 모형 (Spiral Model)
나선형 모형(Spiral Model) 소프트웨어의 기능을 나누어 점증적으로 개발 실패의 위험을 줄임 테스트 용이 피드백 여러 번의 점증적인 릴리즈(incremental releases) Boehm이 제안 진화 단계 계획 수립(planning): 목표, 기능 선택, 제약 조건의 결정 위험 분석(risk analysis): 기능 선택의 우선순위, 위험요소의 분석 개발(engineering): 선택된 기능의 개발 평가(evaluation): 개발 결과의 평가
나선형 모형(Spiral Model) 대규모 시스템 개발에 적합 반복적인 개발 및 테스트 단점 risk reduction mechanism 반복적인 개발 및 테스트 강인성 향상 단점 관리가 중요 위험 분석이 중요 새로운 모형
V모형
소프트웨어 프로젝트 성패에 영향을 미치는 요소 의사소통(Communication skill) 프로젝트의 성격 프로그래머의 역량(Maturity) 관리(Management) 팀의 프로젝트 경험(Experience)
Communication Skill 발주자와 개발자의 의사 소통 개발자들 사이의 의사 소통 인터뷰 기술 프로토타입 요구 취합 방법(설문지, 유저 그룹, 워크샵, ...) 정형적 방법 개발자들 사이의 의사 소통 Mythical man-month 문서화 기술회의
프로젝트 성격 응용분야 자료처리 중심, 제어 중심, 시스템 소프트웨어, 인공지능 크기, 복잡도
프로그래머의 역량 소프트웨어 개발 - 노동집약적 작업 프로그래머의 능력 Sackman의 실험 품질이나 일정에 영향 프로그래밍 능력 커뮤니케이션 능력 응용 분야에 대한 이해 프로세스, 도구에 대한 이해와 경험 Sackman의 실험 프로그래밍 생산성 - 1:25 디버깅 능력 - 1:28 품질이나 일정에 영향
프로젝트 관리 기술 소프트웨어 개발 관리 소프트웨어 프로세스 관리 CMM 모델 프로그래밍 경험 관리 능력 소프트웨어 프로세스 관리 일정 관리 예산, 인력 관리 형상 관리 품질 관리 CMM 모델 소프트웨어 품질 관리(Quality Assurance)