기록공간

소프트웨어 공학이란? 본문

Software Engineering

소프트웨어 공학이란?

입코딩 2022. 1. 14. 16:42
반응형

개요

소프트웨어 공학(Software Engineering)은 소프트웨어를 개발하는데 있어서 필수적인 요소이다. 이를 전혀 고려하지 않고 무작정 개발에 뛰어들면 실패할 가능성이 매우 높다. 실제로 프로젝트에 대한 상세를 대충 구상하고 개발을 시작하면, 얼마안가 생각했던 방향과는 다른 방향으로 흘러간다. 이미 진행된 상황에서 이를 되돌리기는 매우 어렵다. 대규모 프로젝트를 진행하는 기업이 이런 상황이 발생하게 된다면 매우 큰 경제적, 시간적 손실이 발생한다. 이를 사전에 방지하고 좋은 소프트웨어를 효율적으로 개발하기 위해서는 소프트웨어 공학은 매우 중요하다.

 

소프트웨어를 개발하는 방법 중 하나인 애자일(Agile) 기법은 많은 유명 기업에서 채택하는 방법이다. 이러한 기업들이 왜 애자일 기법으로 개발하는지 이해할 필요가 있다. 이를 비롯해 효율적인 개발 방법과 구조, 윤리·도덕적인 부분까지 다뤄본다. 

 

소프트웨어 공학?

소프트웨어 공학은 소프트웨어를 개발하는데 있어서 어떻게 개발할지?, 무엇을 개발할지? 에서부터 시작한다. 이러한 질문에 대한 효율적인 방법과 도구 그리고 이론을 모두 포함한 개념을 소프트웨어 공학이라고 부른다. 소프트웨어 공학을 통해 무작정 개발을 시작하지 않고 기능적(Functional), 비기능적(Non-Functional)인 부분을 고려하여 체계적으로 진행한다.

 

소프트웨어 공학 정의 : 시스템 개발의 초기 단계부터 시스템이 사용된 후 유지보수되기까지의 소프트웨어 개발과 관련된 모든 측면

소프트웨어와 관련된 모든 측면은 단순히 기술적인 개발과정만을 뜻하지 않고 프로젝트 관리, 개발 도구와 메소드 등과 같이 소프트웨어 제작에 있어 도움을 줄 수 있는 모든 것을 의미한다.

 

소프트웨어 공학의 필요성

크게 두가지로 나눠볼 수 있다.

 

비용의 문제

현재 우리가 사용하는 PC 비용은 하드웨어보다 소프트웨어에 대한 비용이 더욱 커지고 있다. 여기서 말하는 비용이란 돈 뿐만 아니라 시간, 노력 등과 같은 개발에 필요한 모든 것을 뜻한다. 기술의 발전으로 소프트웨어 개발 비용 뿐만 아니라 유지 보수하는 비용도 꾸준히 증가하고 있는 추세이다. 소프트웨어 공학은 이같은 문제를 최소화하기 위해 효율적인 소프트웨어를 개발하는 것에 중심을 두고 있다.

 

시스템 복잡도 향상

기술의 발전으로 시스템의 복잡도는 상당히 증가하고 있다. 이전에 불가능한 기술들이 지금은 가능한 시대가 되었다. 예를들어 인공지능이나 빅데이터 같은 복잡한 기술을 적용한 소프트웨어를 빠르게 개발하여 고객에게 전달해야한다. 더 커진 시스템을 고객에게 빠르게 전달하려니 완성도가 떨어지고 개발이 실패하는 상황이 발생하기도 한다. 이를 방지하기 위해 미리 계획을 세워놓고 체계적으로 진행할 필요가 있다.

 

모든 프로젝트에 같은 기술이 사용되지는 않는다. 새로운 기술을 적용하여 메소드를 작성하려면 그에 따른 비용이 발생한다. 시간이 지날수록 비용이 증가할 수밖에 없는 구조이다. 하지만, 고객은 더 싸고 오래 쓸 수 있는 소프트웨어를 원한다. 이런 상황에서 우리는 소프트웨어 공학을 통해 빠르고 더 쉽게 개발할 수 있어야 한다.

 

좋은 소프트웨어

좋은 소프트웨어는 고객에게 필요한 기능과 성능을 전달할 수 있다. 또한 유지보수가 가능해야 하고, 신뢰할 수 있어야 하며, 유용해야한다.

 

특징을 알아보기에 앞서 우선 소프트웨어를 구체화 시킬 필요가 있다. 일반적으로 소프트웨어는 2가지 종류로 나눌 수 있다.

 

Generic products

개발되는 소프트웨어가 어떤 것을 해야할지 개발자가 결정해서 개발하는 소프트웨어를 뜻한다. 당연히 유지보수도 개발자에 의해 진행된다. 개발되는 소프트웨어는 특정 사용자가 사용하는 것을 목표로 하는 것이 아닌 대중들이 사용하길 원하는 소프트웨어이다.

 

Customized Products

특정 고객의 요구사항(Requirement)에 맞춰 개발되는 소프트웨어를 뜻한다. 유지보수 또한 고객의 요구사항에 맞추어 진행된다. 추후 프로그램이 업데이트 되면서 발생하는 변경사항들도 고객의 요구사항에 맞춰 진행한다. 이러한 소프트웨어는 개발 진행전에 고객과 충분한 커뮤니케이션이 필요하다. 

 

응용 프로그램은 다양한 종류로 분류할 수 있다.

 

  • Batch Processing System : 대용량 데이터를 처리하는 프로그램
  • Entertainment System : 유저가 즐길 수 있는 프로그램 (게임 등)
  • System for Modeling and Simulation : 시뮬레이션이나 모델링을 위한 시스템
  • Data Collection System : 다른 시스템에서 전달 받은 데이터들을 수집하는 시스템
  • System of System : 다양한 시스템끼리 구성되어 상호작용

이렇게 다양한 소프트웨어가 존재한다. 그렇다면 소프트웨어 공학에서 말하는 좋은 소프트웨어란 무엇일까?

 

은 소프트웨어가 반드시 가져야 할 특성

좋은 소프트웨어라는 것의 기준이 애매모호하기 때문에 여기서는 좋은 소프트웨어의 기준을 제시한다. 상황에 따라 속도가 빠른 소프트웨어가 좋을 수도 있고, 보안이 중요한 소프트웨어도 좋을 수 있다. 좋은 소프트웨어가 가져야 할 특성이라는 것은 특정 목적을 가진 소프트웨어가 가져야 할 특성과 다르다. 소프트웨어라면 가져야할 덕목이다. 소프트웨어 공학의 근복적인 원리를 확인해보도록 하자. 

 

유지가능성(Maintainability)

소프트웨어는 변화하는 상황 속에서 고객의 요구사항에 맞춰 진화할 수 있어야 한다. 즉, 유지가 쉬워야 한다는 것이다. 그리고 빠른 업데이트를 진행할 수 있어야한다.

 

신뢰성과 보안(Reliability and Security)

소프트웨어의 신뢰성은 믿을 수 있는 것을 포함해 보안과 안전을 모두 일컫는다. 소프트웨어는 절대 물리적, 경제적 손해를 유발하면 안된다. 어떤 이벤트에 대해 작동이 실패한 경우 경제적, 물리적 순해를 주면 안된다.

 

효율성(Efficiency)

소프트웨어가 작동할 때 메모리나 프로세서 같은 리소스를 사용하게 된다. 이 때, 리소스의 낭비를 유발해서는 안된다. 처리 시간, 메모리 사용에 있어서 효율적인 관리가 되어야 한다. 이말인 즉슨 복잡도를 관리해야 한다는 뜻이된다. 단순한 과정도 복잡한 프로세스를 거치게 되면 처리 시간이 올라가고 메모리를 많이 사용하게 된다.

 

접근가능성(Acceptability)
만들어진 소프트웨어를 아무도 사용하지 않으면 무용지물이다. 반대로 소프트웨어 사용자가 많아져도 너무 복잡하면 아무도 사용하지 않게 될것이다. 그래서 개발된 소프트웨어는 반드시 이해할 수 있어야 하며, 유용해야 한다. 즉, 시스템과 유저가 양립할 수 있어야한다. 이는 사용하기 쉬우며 다른 프로그램과의 충돌이 적은 소프트웨어를 뜻한다.


출처 : https://chanos.tistory.com/entry/Software-Engineering-%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4-%EA%B3%B5%ED%95%99%EC%9D%B4%EB%9E%80-%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4-%EA%B3%B5%ED%95%99%EC%9D%98-%ED%95%84%EC%9A%94%EC%84%B1-%EC%A2%8B%EC%9D%80-%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4%EC%9D%98-%ED%8A%B9%EC%84%B1

반응형

'Software Engineering' 카테고리의 다른 글

개발 환경(Development Environment)  (0) 2022.01.24
Comments