1. 소프트웨어 개요
소프트웨어의 구성
- Code : 프로그램의 일부
- Program : 실행 가능한 컴퓨터 명령어
- Software : 프로그램 + 프로그램 개발에 사용된 문서 정보 ( 디자인, 프로젝트 계획, 분석 자료 등... )
소프트웨어의 성질
- 복잡성 ( Complexity ) : 각각의 모듈이 특징을 지녀, 스케일이 커질수록 복잡해진다.
- 적합성 ( Conformity ) : 개발의도에 맞는 소프트웨어가 개발되어야 한다.
- 가변성 ( Changeability ) : 소프트웨어는 끊임없이 변경될 것을 요구받는다.
- 불가시성 ( Invisility ) : 소프트웨어의 구성을 파악하기 어렵다.
오류율 ( Failure rates )
- 하드웨어는 개발 과정에서 오류율이 높다가, 개발 완성단계에서 안정되고, 마모(Wear out)되면 다시 상승하는 형세.
- 소프트웨어는 개발 과정에서 오류율이 높다가, 개발 완성단계에서 안정되지만, 오류나 내용 변경과 같은 Side effect에 의해 오류율이 다시 높아질 수 있음.
소프트웨어의 종류
- Custom Software : 단일 사용자를 위해 제작되는 소프트웨어 ( 단일은 개인 뿐 아니라 단체 등도 의미할 수 있음 )
- Package Software : Commercial Off-The-Shelf, COTS 라고 표현되며, 누구든 사용 가능한 소프트웨어 (상용제품)
- Embedded Software : 특정 하드웨어를 위한 소프트웨어
- SaaS ( Software as a Service ) : 사용자가 설치하지 않고 사용할 수 있는 서비스 소프트웨어 ( ex: Gmail 같은.. )
소프트웨어 공학론 (Software Engineering)
"소프트웨어 공학론은 1960년대 대규모의 복잡한 소프트웨어를 개발하는 것에 대한 어려움 (Software Crisis)로 인해 등장하게 되었다."
- High cost : 한 달에 한 사람이 300~1000 라인의 코드를 개발한다.
-> 이 때, 코드 줄수를 LOC (Lines of Code, =FP), 한 사람이 한 달에 하는 양을 MM (Man-Month, =PM)이라고 한다.
-> 위의 설명의 경우 '300~1000 LOC / MM'
- Project Delay : 1983~2009년의 약 13k개의 프로젝트를 분석한 결과. 프로젝트 사이즈가 커질수록 취소되거나 딜레이된 프로젝트의 수가 많아졌다.
-> On-Time ( 제시간 출시 ) > Canceled ( 취소됨 ) > Delayed ( 지연됨 ) > Early ( 일찍 출시됨 )
- Software Defects / Low Reliability : 버그로 인한 사고 발생 가능성 등.. 결함이나 낮은 신뢰성을 해결해야 한다.
-> 1996년 Ariane 5 로켓 발사 실패 사건 등에서 알 수 있다.
- Maintenance : 새로운 기능 요구, 하드웨어의 업그레이드, 작동 상 결함, 요구사항 변경 등.. 유지보수가 필요하다.
-> 유지보수 비용과 개발비용은 8:2 에서 6:4 정도로 유지보수 비용이 많이 들어간다.
소프트웨어 공학에서의 목표
- 소프트웨어의 개발, 운영, 유지보수, 폐기에 대한 체계적인 접근 방법을 만든다. (by IEEE Computer Society)
- 공학적, 과학적, 수학적 원리를 통해 경제적이고 높은 퀄리티의 SW를 만든다. (by Watts Humphrey)
소프트웨어의 문제
1. 규모(Scale)
- 규모가 큰 소프트웨어를 개발할 때, 관리와 개발이 체계적이고 형식적이여야 한다.
- kLOC(Kilo LOC)에 따라 규모를 정의한다.
-> small, medium, large, very large 등으로 구분하며 10^n kLOC 이다.
2. 품질과 생산성 ( Quality of Productivity )
- ISO/ICE 25010 표준에 따라 품질을 판정해야 한다.
= Functionality : 기능이 충분한가?
= Reliability : 안정적으로 작동하는가?
= Usability : 편리한가?
= Efficiency : 효율적인가?
= Maintainability : 유지보수가 쉬운가?
= Portability : 다른 컴퓨팅 환경으로 쉽게 이식할 수 있는가?
= Security : 권한 내에서 작동하는가?
= Compatibility : 호환성이 좋은가?
3. 일관성과 재현성 ( Consistency & Reproducibility )
- 어느 개발자가 오더라도 일관적인 방법으로 개발에 참여할 수 있어야 한다.
4. 변경 ( Changes )
- 쉽게 바꿀 수 있어야 한다.
=> 이 문제를 해결하기 위해서는 어떻게 해야하는가?
- 소프트웨어 개발 절차를 제대로 둔다. ( 요구사항 분석 > 설계 > 코딩 > 테스트 )
- SQA(Software Quality Assurance) 에 따라 설계대로 개발되었는가?(Verification)와 사용자의 요구사항이 충족되었는가?(Validation)를 검증하는 시험을 거친다.
- 절차대로 제대로 진행되고 있는지를 확인한다.
SWEBOK ( Software Engineering Body of Knowledge, IEEE & ACM )
- 소프트웨어 공학의 범위를 정하는 내용을 담고 있다.