소프트웨어 공학
소프트웨어 공학은 소프트웨어를 개발하는 데 필요한 모든 지식들과 기술들을 다루는 학문을 말한다. 그냥 개발하는 게 아니라 이론과 방법, 도구들을 활용해서 전문적이고 효율적인 소프트웨어를 개발하는 방법을 다루는 학문이다. 이렇게 개발된 소프트웨어를 계속 유지보수할 수 있는 방법 또한 배운다.
소프트웨어 공학은 다음과 같은 특성이 있는 프로젝트에 주로 사용된다.
소프트웨어의 종류
소프트웨어는 크게 두가지로 나뉜다.
-
Generic Software : 요구사항없이 개발자(개발하고 싶은 사람들)가 자신의 목적을 위해서 개발한 소프트웨어. 오피스, 한글 등 특정한 목적 없이 만들어진 우리가 흔히 다운받는 소프트웨어들이 해당된다. 개발자에게 소프트웨어에 대한 권리가 있다.
-
Customized Software : 고객이 특정한 목적을 위해서 개발자에게 만들어 달라 한 소프트웨어. 고객이 사용하기 위해 만들어졌으며, 일반 사람들은 잘 사용하지 않거나 못한다. 고객에게 소프트웨어에 대한 권리가 있다.
소프트웨어의 속성
소프트웨어는 굉장히 많은 속성이 있다. 그중에서도 모든 소프트웨어에 꼭 필요한 필수 속성 4가지를 알아보자.
-
Maintainability(유지 관리성) : 소프트웨어는 고객의 요청에 따라서 바뀌거나 유지될 수 있어야 한다. 굉장히 중요한 속성인데, 소프트웨어가 필요에 의해 바뀌는 것은 불가피(inevitable)하기 때문이다.
-
Dependability(고신뢰성) : 소프트웨어는 높은 신뢰성, 보안성, 안전성 등등을 가져야 한다. 이러한 고신뢰성의 요소에는 여러가지가 있는데, 시스템에 따라서 다르게 정의된다. 그렇기 때문에 프로그램을 만들기 전 고신뢰성의 요소를 정하고 들어갈 필요가 있다.
-
Efficiency(효율성) : 소프트웨어는 자원들이 낭비되지 않게 해야한다. 자원들은 돈과 시간 등이 있으며, 사람이 효율성있게 역할을 맡고 일을 수행해야 한다는 의미이기도 하다. 구동 시간, 메모리 효율, 민감도 등이 효율성을 낭비하지 않을 수 있게 해준다.
-
Acceptability(수용성) : 소프트웨어는 유저들이 잘 받아들이고 사용할 수 있도록 설계되어야 한다. 이해하기 쉽고 사용하기 쉽게 제작되어야 한다.
소프트웨어 공학의 일반적인 활동(순서)
-
Software Specification : 고객과 개발자 사이의 요구사항을 확인하고, 해야 할 업무들을 확정한다.
-
Softward Develop : 소프트웨어를 개발한다.
- Architecture Design, Detailed Design and Implementation
- CTIP (Continuous Test and Integration Platform)
-
Sortware Validation : 소프트웨어가 고객의 요구에 들어맞는지(요구를 충족하는지)를 확인한다.
- Software V&V (Verification & Validation) , Testing
-
Software Evolution : 고객의 요구나 시장의 필요에 따라서 소프트웨어를 수정한다.
소프트웨어 프로젝트의 실패(The Software Crisis)
1960년대에 메인프레임이 등장하면서 사람들은 여러가지를 할 수 있게 되었다. 이 시대의 시스템을 imformation processing system이라고 한다. 초기에는 여러 사람들의 의견 통합이 잘 되지 않았고, 당연하게도 소프트웨어의 실패가 늘어났다.
- 시스템이 커지면서 복잡도가 늘어났고, 소프트웨어의 각 부분이 빠르게 전달되기만 했다.
- 소프트웨어 방법론을 사용하지 않아서 사람들간의 통일된 방법이 생기지 않아 이해하기 어려웠다.
이 현상들을 Software projects failures(The Software Crisis)라고 한다. 이러한 현상들을 해결하기 위해 대두된 것이 소프트웨어 공학(Software engineering)이다. 여기서 폭포수 모델이 나왔다.
소프트웨어 공학의 다양성(Software Engineering Diversity)
소프트웨어 시스템은 하나만 있는 것이 아니다. 요구 사항에 따라서 매우 많은 갈래의 소프트웨어가 나올 수 있다. 이것을 하나의 방법만으로 해결하려 하면 문제가 생길 수 있다.
No silver bullet for software engineering
그러므로 소프트웨어를 설계할 때 많은 요소를 고려해야 한다.
- 개발되는 앱의 종류 - (the type of application being developed)
- 고객의 요구 - (the requirements of the customer)
- 개발 팀의 환경 - (the background of the development team)
Software Application Types
개발되는 앱의 종류들을 정리해보자
- Stand-alone applications : 네트워크 접속 없이 사용할 수 있는 앱
- Interactive transaction-based applications(Web-based System) : 네트워크 섹션에 접속하여 서로 상호작용할 수 있는 앱션에 접속하여 서로 상호작용할 수 있는 앱
- Embedded control systems : 하드웨어에 포함되어 있어서 하드웨어를 제어하는 시스템
- Batch processing systems : 주어진 순서 그대로 진행하는 시스템
- Entertaninment systems : 게임같은 재미 요소를 가진 시스템
- Systems for modeling and simulation(M&S) : 아날로그와 디지털을 연결하여 사용하는 시스템. 오락실에서 하는 총 게임이나 경주 게임 같은 것이 대표적인 예시
- Data collection systems : 데이터를 모으는 시스템
- Systems of systems(CPS) : 스마트시티, 스마트팩토리. 더 큰 시스템. 하드웨어들이 많이 있고, 하드웨어 안에 소프트웨어가 있고, 그 소프트웨어들을 관리하는 관리자가 있고... 등등 여러가지 소프트웨어들이 모여서 하나의 전체 소프트웨어를 만드는 것을 의미함.
소프트웨어 공학의 기초 법칙
소프트웨어 공학은 어떤 종류의 프로그램을 개발하든 기초적인 법칙이 있다.
- 잘 관리된 개발 프로세스(폭포수 모델, 에자일 방법론, DevOps 등등)를 가지고 개발되어야 한다. 소프트웨어 생명 주기 모델(Software Development Life-Cycle)이 여기에 해당된다.
- 고신뢰성(Dependability)과 성능(performance)은 모든 시스템에서 중요하다. 고신뢰성은 높은 신뢰성, 보안성, 안전성 등등 여러가지가 있는데, 시스템에 따라서 다르게 정의된다. 성능이 좋아지면 대부분의 경우 고신뢰성은 낮아진다. 또한 고신뢰성 안에서의 요소들 각각도 다른 요소에 따라 높아지거나 낮아지므로, 효율적으로 확보하는 것이 중요하다.
- 요구사항을 잘 정해야 하며, 이해하고 관리하려고 노력해야한다. 그렇기 때문에 고객(client)과의 소통이 중요하다. 고객의 요구사항을 정확히 이해하고 힘든 부분을 이해시키는 것은 서로에게 도움이 된다.
- 가능하면 처음부터 만들지말고, 검증이 된 시스템들을 재사용하는 것이 좋다.
웹 기반 소프트웨어 공학
웹은 여러가지 어플리케이션들을 구동시킬 수 있는 플랫폼으로 발전했다. 웹 서비스는 어플리케이션을 웹에서 구동할 수 있게 하고, 클라우드 시스템을 통해서 "클라우드"에서 구동 가능하게 한다.
웹 기반 시스템
- 소프트웨어 재사용(Software reuse)
- 시스템을 만들 때 각각의 요소들이 어떻게 연결될지를 생각해야하고, 그 요소들이 재사용 될 수 있어야 한다.
- 점진적이고 민첩한 발전(Incremental and agile development)
- 웹 기반 시스템은 점진적으로 발전되고 제공된다.
- 서비스 기반 시스템(Service-oriented systems)
- 사용자가 직접 데이터나 요소들을 만드는 것이 아니라, API같은 요청들을 이용하여 가져온다.
- 많고 효율적인 인터페이스(Rich interfaces)
- AJAX나 HTML5 같은 인터페이스들은 웹에서 많은 것들을 할 수 있게 해준다.
정리(10가지 질문)

- 소프트웨어란 무엇인가? : 컴퓨터 프로그램과 문서들의 조합이다. 사용자나 시장의 수요에 의해 만들어진다.
- 무엇이 좋은 소프트웨어인가? : 사용자의 요구를 잘 구현해야한다. 또한 유지보수 가능하고, 고신뢰성이며, 재사용 가능해야한다.
- 소프트웨어 공학은 무엇인가? : 소프트웨어 공학은 소프트웨어를 만드는 방법에 대해 연구하는 학문이다.
- 소프트웨어 활동의 기초는 무엇인가? :
- Software Specification
- Softward Develop
- Sortware Validation
- Software Evolution
- 소프트웨어 공학과 컴퓨터 과학의 차이는 무엇인가? : 컴퓨터 과학은 이론과 기초를 연구하는 학문이며, 소프트웨어 공학은 소프트웨어를 만드는 방법에 대한 학문이다.

- 소프트웨어 공학과 시스템 공학의 차이는 무엇인가? : 시스템 공학은 하드웨어, 소프트웨어, 과정에 대한 모든것을 다루는 학문이다. 소프트웨어는 시스템 공학의 하위 학문이다.
- 소프트웨어 공학이 맞이한 문제는 무엇인가? : 시대에 따라서 다르지만, 다양성을 챙기며 복사하는 법, 수행 시간의 감소, 저신뢰성 프로그램의 개발 등이 있다.
- 현재는 AI에 대한 문제가 주된 문제로 자리잡고 있다.
- 소프트웨어 공학의 비용(자원 소모)은 어느정도 비율인가? : 소프트웨어 개발이 60%정도, 테스트가 40% 정도의 비용을 차지한다.
- 소프트웨어를 만드는 제일 좋은 방법과 기술은 무엇인가? : 그런 거 없다. 고객의 요구와 여러가지 요소에 따라 적절한 방법을 선택해야 한다.
- 웹 기반 서비스가 소프트웨어 공학에 어떤 영향을 주었는가? : 분산 시스템이 주류가 되었으며, 하나의 시스템(web)에서 많은 일들을 할 수 있게 되었다.