소프트웨어 공학이란?
소프트웨어의 개발, 운용, 유지보수 등 생명 주기 전반을 체계적이고 서술적으로 다루는 학문.
즉, 공학을 소프트웨어에 적용하여 소프트웨어의 생산성과 질을 높이고, 비용과 시간을 절약하고자 한다.
소프트웨어 공학이 중요한 이유
- 소프트웨어는 우리 사회의 모든 부분으로 확장되고 있음.
- 소프트웨어 공학은 큰 시스템 개발 과정에서 팀워크 향상에 도움이 됨
- 큰 시스템은 디자인하고, 구현하고, 테스트하는데 상당한 노력이 듬
- 개발자들은 코드를 분석, 디자인, 구현, 통합 그리고 테스트하는데 많은 시간을 소모함
- 따라서 소프트웨어공학을 통해서 효율적으로 협업을 진행할 수 있게됨
소프트웨어 개발 라이프사이클
소프트웨어 개발 라이프 사이클이 필요한 이유? : 팀에서 여럿이서 개발할 때 보다 효율적이고 체계적으로 소프트웨어를 개발하기 위해서 필요함!! 소프트웨어 개발 라이프 사이클은 크게 Software Development Process, Software Quality Assurance, Software Project Management 3가지 과정으로 나뉜다.
Software Development Process
최초 시스템의 컨셉을 목표 환경에 맞는 작동하는 시스템으로 변환하는 과정. 시스템을 디자인, 구현, 테스트, 배포하는 과정임.
- waterfall 방식 : 각각의 단계가 완료되고 나서 그 다음 단계로 넘어가게 되는 개발 방식 ex) 소프트웨어 필요성 및 디자인 정의 → 소프트웨어 필요 요인 분석 → 소프트웨어 디자인 → 코딩 & 유닛 테스트 → 통합과 통합 테스트 → 유지 보수
- Software Requirements Definition, System Design, and allocation : 전체 시스템에서 필요한 사항들이 실현 가능한지 정의하고 검토
- Software Requirements Analysis : 소프트웨어 시스템에 할당된 필요 요인들을 다듬는 과정. ex) 로그인 기능을 1번에서 정의했는데, 관리자 권한에 대한 구체적인 기능은 생각안함. 2번에서 이를 구상하는 것임
- Software Design : 소프트웨어 아키택처나 전체적인 시스템의 구조를 결정하는 과정. ex) N-tier 아키택처를 적용한다면, Database Layer/Network Layer/Controller Layer 등을 분리함으로써, 특정 레이어에 변화가 있더라도 잘 적응할 수 있음
- Implementation, Testing, Maintenance : 3번에서 설게한 디자인을 바탕으로 코드를 설계하고, 테스트하고, 서로의 코드를 리뷰하고, CI/CD하는 과정임
Software quality assurance(SQA)
개발한 것들이 정상적으로 잘 작동하고, 개발한 소프트웨어가 소프트웨어의 필요 요인과 퀄리티 기준을 잘 만족하는가 확인하는 과정. 즉, Software Development Process에서 1~4번의 과정들이 정확하게 잘 수행됐는지 검증하는 과정임.
Software project management
Software Development Process나 SQA 활동들이 제한된 스케쥴내에서나 예산 제약 하에 이루어졌는지 감시하는 과정
- Effort estimation : 개발과 SQA를 수행하기 위한 인적 자원과 기간을 위해 필요한 노력들. ex) 몇명의 개발자가 필요한가?, 각각의 기간은 얼마나 되는가?
- Project planning and scheduling : 프로젝트의 목표, 중요한 부분, 프로젝트 일정, 팀의 예산 등 전반적인 계획
- Risk management : 인적자원이 팀을 떠나거나, 프로젝트가 늦춰지는 등 예기치 못하는 위험 상황 등의 위험한 요소 조정
- Project administration : 프로젝트가 계획대로 실행되는지, 새로운 상황에 적응을 잘하는지 모니터링, 팀원 일정 조율 등
- Software configuration management (SCM) : 개발 과정에서 수많은 소프트웨어 부산물들이 나오는데, 이런 여러 구성 요소들이 각각의 요구사항을 잘 충족하고 있는지, 테스트는 잘 되고 있는지 전반적인 소프트웨어 구성을 관리하는 것
객체지향 소프트웨어 공학
- 1980년대 객체지향 설계에 대한 필요성이 대두되었고, 이러한 설계를 위해 UML 다이어그램이 채택되었음
- UML 다이어그램은 필요 요구사항 분석 단계에서 개발팀이 비즈니스 로직이 어떻게 작동하는지 다이어그램으로 쉽게 볼 수 있도록 했음
- 객체지향 설계를 활용함으로써 애자일하게 개발이 가능하고, 변화에 쉽게 대응할 수 있음. 기존의 waterfall 방식은 필요 사항이 시장의 변화로 인해서 지속적으로 변화하는 현대 사회에는 부적합함. 그래서 OO 개발 과정의 필요성이 대두되었음.
- OO가 전통적인 접근을 해결할 수 있는가? : 이미 너무 많은 시스템들이 OO와 전통적인 방식이 섞여서 개발되었고, 많은 기업들이 아직도 구식의 방법을 사용중이며, scientific computing 같은 분야에서는 아직 전통적인 방식이 더 유용하기 때문에 OO와 전통적인 접근은 앞으로도 계속 공존할 것임.
소프트웨어 공학 vs 컴퓨터 과학
- 컴퓨터 과학 : 알고리즘, 자료구조, DB, 운영체제 등의 규율들을 의미함. 컴퓨터과학들은 컴퓨터의 자원이나 성능 향상을 목표로 하고 발전하고 연구해온 학문임.
- 소프트웨어 공학 : 컴퓨터 과학과 다르게 PQCT(Productivity, Quality, Cost, Time to market)를 강조함. 소프트웨어 공학의 영향은 컴퓨터 과학과 다르게 즉각적으로 나타나진 않지만, 서서히 그 결과가 보일 것임.
- 컴퓨터 과학 vs 소프트웨어 공학 : 컴퓨터 과학은 반드시 최상의 결과를 취득하려는 학문이라면, 소프트웨어 공학은 개발 시간과 노력을 감소시킬 수 있는 적당히 좋은 해결책을 연구하는 학문임. 컴퓨터과학은 오직 기술적은 관점에만 집중하는 학문이라면, 소프트웨어 공학은 기술적인 관점 외에도 집중하는 학문임. (비즈니스 요구, 필요 요구사항 및 제약에 대해서 고려함)
- 하지만 그럼에도 불구하고 컴퓨터 과학과 소프트웨어 공학은 화학과 화학공학, 전자와 전자공학처럼 관계가 깊음. 즉, 컴퓨터 학은 소프트웨어 공학의 기초가 되고 소프트웨어 공학이 더 큰 범위임.
'CS > 소프트웨어공학' 카테고리의 다른 글
[소프트웨어공학] Chapter 3 - System Engineering (0) | 2024.03.31 |
---|---|
[소프트웨어공학] Chapter 2 - Software Process and Methodology (3) | 2024.03.18 |