-> 블로그 이전

[SE] 소프트웨어란?

2022. 5. 11. 20:03Major`/소프트웨어 공학

4차 산업혁명에 들어서면서 모든 분야에서 IT기술이 사용되고 있고 그에 따라서 컴퓨터는 현재 사회의 모든 분야에서 사용되고 있다

 

"컴퓨터"라는 기계의 잠재력을 살려주는 것이 "소프트웨어"라고 할 수 있다

 

소프트웨어는 컴퓨터를 편리하고 안전하게 작동시킬 수 있는 프로그램으로써 하드웨어의 동작을 제어하는 수많은 명령어로 구성되어 있다

 

소프트웨어가 사회적으로 주는 영향이 커짐에 따라서 당연히 수요가 급증하고 있다. 따라서 소프트웨어 개발은 굉장히 중요한 문제이다

 

소프트웨어 개발은 단순히 cs지식과 코딩만 잘한다고 되는 것이 아닌 설계 및 테스트 / 응용 분야에 대한 이해 / .. 등등 고려해야할 요소들이 굉장히 많다

 

소프트웨어 공학의 주 목적은 주어진 비용과 자원 안에서 최대한 품질이 좋은 소프트웨어를 생산하는 것이다

 

규모가 커지면 커질수록 매우 많은 사람들이 협력을 해서 소프트웨어 개발을 할 것이고 프로그래밍 자체보다는 개발 과정과 계획 그리고 사용한 도구들이 소프트웨어의 생산성과 품질에 큰 영향을 끼치게 된다


소프트웨어?

소프트웨어의 대표적인 특징은 다음 4가지라고 볼 수 있다

 

※ 복잡성 (Complexity)

소프트웨어는 자동화하려는 대상이 복잡할 뿐만 아니라 수많은 내부 요소들로 이루어졌기 때문에 상호작용 또한 많다

 

※ 순응성 (Conformity)

소프트웨어는 요구/환경/데이터의 변화에 따라서 적절히 변경되는 특징을 가지고 있다

 

※ 변경성 (Changeability)

소프트웨어는 문자로 구성된 "프로그램"이므로 쉽게 변경할 수 있고 유지보수 단계에서 당연히 user들에게 더 편리한 쪽으로 변경이 될 것이다

 

※ 비가시성 (Invisibility)

소프트웨어는 구조가 실질적으로 코드 안에 숨어있기 때문에 쉽게 드러나지 않는다

 

 

시스템

소프트웨어는 독립적으로 존재할 수 없고 컴퓨터를 기반으로하는 여러 시스템과 관계를 맺고 있다

 

예를 들어서 은행의 업무 전산화에 사용되는 소프트웨어는 {현금 자동 인출기, DB, 은행 업무 절차, 은행원} 등 여러 서브 시스템과 유기적으로 상호작용하고 있다

각 서브시스템은 다른 서브시스템으로부터 영향을 주고 받음으로써 상호작용하고 이러한 서브시스템들이 하나로 통합되어서 거대한 시스템을 이루게 된다

 

결국 소프트웨어를 개발한다는 말은 이러한 시스템 내부에 존재하는 서브 시스템들을 깊게 파악하고 그들간의 관계를 설정하는 작업이라고 볼 수 있다

 


소프트웨어 개발 작업

개발 작업은 크게나눠서 4단계로 이루어졌다고 볼 수 있다

 

1. 명세화 (Specification)

소프트웨어 제품은 일반적으로 고객이 요구하는 제품의 작동 방식 / 성능 요구 등을 합의한다

더불어서 명세에는 기능이나 성능 뿐만 아니라 제품의 원가 / 위험 / 일정 등 제약 사항도 포함해야 한다

 

따라서 "명세화"는 소프트웨어 제작 단계 이전에 요구사항을 엄격하게 정리해서 개발할 때 실패할 가능성이 거의 없도록 할 수 있다 

 

2. 구현 (Coding)

구현은 시스템에 대한 고객의 명세를 주어진 여건(인원, 자원, ...)에 맞게 설계해서 프로그래밍 언어로 변환하는 행위이다

 

여기서 가장 중요한 것은 주어진 설계에 대해서 최선의 노력/방법으로 구현하는 것이다

 

구현을 잘해야 나중에 검증 & 유지보수 단계에서 드는 노력을 현저히 줄일 수 있다

 

3. 검증 (Verification)

검증은 구현한 소프트웨어가 고객의 needs에 정확히 충족되는지 파악하는 작업이다

 

여기서는 구현한 프로그램을 직접 실행시켜서 예상되는 결과를 체크할 수 있고 아니면 실행 전에 Primitive Code를 Inspection해서 요구 사항과 일치하는지 확인할 수 있다

 

4. 유지보수 (Maintenance)

구현과 검증이 끝나고 실제 고객에게 구현한 소프트웨어를 제공했다고 끝나는게 아니다

개발 이후 사용단계에서 결함이 발생하게 된다면 update해주는게 당연한 일이다

그리고 고객이나 시장의 요구 변화에 맞게 소프트웨어를 수정하는 경우도 존재한다

 

 

하지만 인간은 기계가 아니고 소프트웨어의 특징 중 하나인 "비가시성"으로 인해서 모든 단계를 완벽하게 해결할 수는 없다

※ 명세화의 어려움

고객의 의도를 처음부터 정확히 설명하고 이해하기는 쉽지 않은 일이다

따라서 소프트웨어 개발은 직접 보고 사용하기 전까지는 필요한 것들을 정의하기가 굉장히 어렵다

 

※ 재사용의 어려움

미리 재사용될 부품을 만들기가 어렵다. 

건축이나 기계공학쪽은 그냥 미리 만들어서 조립하는 일이기 때문에 생산성이 높다

 

하지만 소프트웨어는 전에 만들어 놓은 컴포넌트가 새롭게 개발하는 소프트웨어에 맞지 않을 확률이 대단히 높다

 

※ 예측의 어려움

극단적인 예로써, 갑자기 태풍이 오거나 개발 도중에 전기가 나가거나 갑자기 고객의 요구가 바뀌거나 ...이러한 예상하지 못한 여러가지 외부 요소들의 영향을 소프트웨어 개발에서는 많이 받기 떄문에 사전 견적이나 프로젝트 규모를 예측하기가 쉽지 않다

 

※ 유지보수의 어려움

건물이나 자동차의 경우는 어디가 문제인지 꽤 쉽게 파악이 가능하기 때문에 원인을 찾고 고치는 것이 그렇게 어렵지는 않다

 

하지만 소프트웨어는 다른 사람이 개발한 소스 코드를 이해하기가 힘들 수도 있고 이해하는 시간이 오히려 수정하는 시간보다 오래걸릴 수 있다

그리고 이해하고 고쳤다고 해서 완벽하게 해결되는 것이 아니라 다른 부분에서 새로운 오류가 발생할 수도 있다

 

※ 고품질의 어려움

소프트웨어는 몇만/몇십만줄의 코드들이 서로 유기적으로 작용해서 동작하는 시스템이다

따라서 한줄의 코드를 수정하더라도 테스트할 내용이 몇십배 몇만배로 많아지고 모든 실행 조합을 전부 테스트하는 것은 사실상 불가능하다

 


SE 접근방법

경험이 없는 초보자의 경우 개발을 하라고하면 무작정 코딩만 하는 경우가 대다수일 것이다

당연히 소프트웨어 개발에서 가장 시간이 오래걸리고 가장 중요한 것이 코딩이긴 하지만 시작부터 코딩을 하게된다면 코딩 중 오류에 대해서 나중에 발생하는 오류처리에 대한 비용이 굉장히 커질 수 있다

 

따라서 "계획 & 절차"가 굉장히 중요하다고 볼 수 있다

 

즉흥적인 소프트웨어 개발은 코딩과 수정 (Code & Fix)가 계속 반복된다

이러한 즉흥적 소프트웨어 개발은 다음과 같은 문제점에 노출된다

  • 개발 지연 & 예산 초과
  • 낮은 품질
  • 유지보수 곤란
  • 재작업

이러한 문제점들을 해결하기 위해서 계획과 절차를 초반에 잘 짜야 한다

 

결국 소프트웨어 개발에 공학적 접근 방법을 적용하는 궁극적 목표는 다음과 같다

복잡도 낮추기
비용 최소화
개발 기간 단축
대규모 프로젝트 관리
고품질 소프트웨어
효율성

"품질 좋은 소프트웨어를 최소의 비용으로 계획된 일정에 맞춰서 개발"하면 이러한 목표들에 도달할 수 있을 것이다

 

 

 

품질 & 생산성 & 비용이라는 목표 달성을 위해서 SE는 크게 3가지 작업으로 나눌 수 있다

 

1. 단계적 프로세스

단계적 프로세스란 무작정 코딩만 하지말고 요구분석 / 설계 / 코딩 / 테스팅 등 정해진 절차를 따라서 작업하는 것이다

이렇게 단계를 나누는 이유는 문제를 해결하기 위해서 다루는 관점이 서로 다르기 때문이다

실질적인 소프트웨어 개발주기는 2 ~ 5라고 볼수 있다

단계 초점 주요작업 & 기술 결과물
분석 시스템을 위해서 뭘 만들거냐 - 분석 전략 수립
- 요구 결정
- 유스케이스 분석
- 구조적 모델링
- 동적 모델링
요구분석 명세서
설계 뭘 만들지 정했으면
시스템을 어떻게 구축할거냐
- 설계 전략 수립
- 아키텍처 설계
- 인터페이스 설계
- 프로그램 설계
- DB, File 설계
설계 명세서
구현 시스템의 실제 코딩과 단위 테스트 - 프로그래밍
- 단위 테스팅
- 시스템 안전화 & 유지보수
새로운 시스템 
&
유지보수 계획
테스팅 시스템이 요구에 맞게 실행되는가 - 통합 테스팅
- 시스템 테스팅
- 인수 테스팅
- 시스템의 설치
- 프로젝트 관리 계획
테스팅 결과 보고서

 

2. 품질 보증 (QA : Quality Assurance)

소프트웨어는 대부분 사람의 실수에 의해서 오류가 발생한다. 따라서 소프트웨어는 결함이 많이 존재할 수 있고 그에 따라서 고장이 나면 심각한 피해를 유발할 수 있다

 

따라서 개발작업과는 별개로 품질을 높이기 위한 노력이 필수적이다

품질 보증은 개발하고 있는 소프트웨어가 고객의 니즈와 품질 수준을 만족시키는지 검토 & 확인 & 테스팅하는 것이다

 

▶ 검토 (Verification)

각 단계의 작업이 제시된 절차와 방법에 맞게 진행되었는지 체크

 

▶ 확인 (Validation)

개발 완료된 결과물이 품질 수준에 맞게 생산되었는지 검사

 

▶ 테스팅

구현된 소프트웨어를 실행시켜서 예상한 결과를 도출해내는지 확인

 

 

3. 프로젝트 관리

대부분의 소프트웨어 제품은 고객의 요구사항에 맞게 맞춤형으로 제작된다

하지만 IT 기술의 빠른 발전으로 인해 하나의 제품에 대한 개발자의 경험이 다른 제품을 개발할 때는 적용되지 않을 수 있다

 

이러한 특수성으로 인해서 프로젝트를 효율적으로 관리하는 것은 필수적이다

3가지 요소인 {범위, 시간, 비용}은 서로에게 영향을 줄 수 있다. 이 3가지 조건은 프로젝트마다 다르고 적절히 관리해서 프로젝트 결과에 영향을 미치지 않도록 해줘야 한다