주먹구구식 개발로 인한 소프트웨어 위기, 소프트웨어 공학의 시작
주먹구구식 개발 - 과거 패러다임
과거 소프트웨어의 경우 규모가 크지 않은 소규모 작업이 다수였다. 그도 그러할 것이 불과 20년 전만 하더라도 하드웨어가 고품질의 소프트웨어를 받쳐줄 만큼 충분히 좋지 않았기 때문이다. 그래서 개집을 짓듯이 생각하는 대로 바로 개발을 해도 큰 문제가 없었다.
이렇게 생각하는 대로 만들어 내는 것을 '주먹구구식 모델' 또는 '즉흥적 소프트웨어 개발'이나 '코딩과 수정 모델'이라고 한다.
주먹구구라는 말은 주먹을 쥐었다 폈다하며 구구셈을 따지는 방법에서 유래한 말로, 개발을 할 때 공식적인 가이드라인이나 절차없이 생각나는 대로 기능을 개발하고 이를 수정하며 만드는 형식이다. 이를 그림으로 나타내면 아래와 같다.
이 글을 읽으면서 마음 속으로 뜨끔한 사람들이 많을 것이다. 대다수의 초보자들은 이와 같은 방식으로 개발을 진행하기 때문이다.
이러한 모델은 초보 개발자들이 간단한 프로그램의 기능을 구현하는 데 있어서는 사용이 가능하지만 실제 개발 현장에서 이러한 방식을 사용하기에는 많은 문제가 있다. 이 모델과 같이 개발을 진행한다면 프로젝트의 전체 범위를 알 수도 없고, 정해진 개발 순서도 없어서 개발 도중 프로젝트 진척 상황을 거의 파악할 수 없다. 또한 각 단계별로 무엇을 만들었는지에 관한 산출물(product)도 없어 유지보수가 매우 어렵다. 전공자라면 '스파게티 코드'라는 용어를 들어본 적이 있을 것이다. 스파게티 코드는 이러한 방식으로 개발을 했을 때 가독성이 높았던 프로그램이 점점 프로그램의 구조가 나빠져 더 이상 알아보기 어려운 코드들을 뜻한다.
소프트웨어 위기
위의 방식과 같이 개발을 하던 시기에서 시간이 지남에 따라 점차 고성능의 하드웨어가 등장하고, 사용자들의 눈높이가 높아지며 점점 더 높은 품질의 소프트웨어 요구가 증가하게 된다. 즉, 사용자의 요구가 증가하여 소프트웨어의 복잡도와 난이도가 높아졌다. 그런데 주먹구구식으로 개발하던 개발자들은 그대로 개발을 하고 같은 도구를 사용해서 개발을 하게 된다. 이에 따라 소프트웨어 예산 문제, 효율성 문제, 품질 문제, 관리 등 다양한 문제가 발생하게 됬는데 이러한 상황을 '소프트웨어 위기'라고 한다. 이 소프트웨어 위기를 해결하기 위해 나온 학문이 '소프트웨어 공학'이다.
조금 더 쉬운 예를 들어 보겠다. 개집이나 단독주택을 짓는 것은 그래도 일반인이 조금만 노력해서 관련 분야를 공부해보면 지을 수 있다.
하지만 아파트를 건축해야 한다고 생각해보자. 정해진 기간안에 많은 인력이 참여해서 지어야 하는데 주먹구구식으로 짓다가 문제가 생기면 고치고 해서야 되겠는가? 이를 방지하고자 나온 학문이라고 생각하면 된다.
소프트웨어 공학 - 새로운 패러다임 등장
흔히 소프트웨어 공학은 컴퓨터 과학과 비교된다. 컴퓨터 과학은 컴퓨터의 본질적인 성능 개선, 최적화, 자원 공유, 알고리즘, 원리 등을 다루는 학문이고 소프트웨어 공학은 컴퓨터 과학을 활용해서 정해진 기간과 주어진 비용 내에서 주어진 문제를 해결하는 방법을 다루는 학문이다.
그렇다면 소프트웨어 공학이 정확히 어떤 것을 다루는 것인가?
소프트웨어 위기를 떠올리면 쉽게 생각할 수 있다. 소프트웨어의 위기를 극복하기 위해 나온 학문이기 때문에 이때 발생한 문제점을 극복하기 위한 것이 목표이고 이러한 방법들을 모두 배운다고 생각하면 된다. 요약하면 아래와 같다.
- 복잡도 낮춤
- 비용 최소화
- 개발 기간 단축
- 대규모 프로젝트 관리
- 고품질 소프트웨어
- 효율성
앞으로 살펴 볼 다양한 주제들은 단계적 프로세스 또는 소프트웨어 생명주기(software life cycle)에 따라서 각 단계별로 세세히 살펴보고자 한다. 이 소프트웨어 생명주기는 아주 기본적인 것이니 소프트웨어 공학을 학습하겠다고 다짐한 이들은 반드시 암기하길 바란다.
쉽게 외우려면 '분설구테유' 또는 '분설코테유'와 같이 특정 글자만 따서 외우면 쉽게 외워진다. 나중에 외우지 말고 지금 이 순간 10번 분설구테유, 분설구테유, ...를 소리내어 읽고 기억하자.
요구분석 → 설계 → 구현(coding) → 테스팅 → 유지보수
'Software Engineering' 카테고리의 다른 글
[애자일 방법론] 스크럼 기법(Scrum) (1) | 2023.10.05 |
---|---|
[소프트웨어 공학] 유스케이스 다이어그램(use case didagram) (1) | 2023.10.05 |
[소프트웨어 공학] 프로토타이핑 모델(Prototyping Model) (0) | 2023.09.24 |
[소프트웨어 공학] 폭포수 모델(Waterfall Model) (0) | 2023.09.24 |
[소프트웨어 공학] 소프트웨어란 (0) | 2023.09.07 |