[소프트웨어공학] 1. 소프트웨어 공학의 목적
소프트웨어 공학을 공부하는 이유
소프트웨어 공학은 어떻게하면 좋은 소프트웨어를 빠르게 만들 수 있을지 고민하는 과정에서 등장했다.
그리고 소프트웨어 엔지니어링 자체로 많은 사람들이 연구하고 있는 하나의 분야가 되었다.
그런데 하드웨어는 '하드웨어 공학' 이라는 말이 없다.
하드웨어도 '좋은 하드웨어를 빠르게 만드는 방법' 과 같은 고민점이 있을 것 같은데, 왜 '하드웨어 공학'이라는 말이 없을까?
그건 소프트웨어와 하드웨어의 로직의 복잡도 차이 때문이다.
규모가 매우 큰 소프트웨어는 코드 라인 숫자가 1~200만 줄이 넘어간다.
그리고 그렇게 수많은 코드가 모여 동작하면서 아무런 문제가 없어야 한다.
이건 엄청난 일이다.
반면 하드웨어는 정해진 공간 안에 회로를 설계해서 넣어야하다보니 논리적인 복잡도가 증가하는 한계가 존재한다.
하드웨어와 밀접한 운영체제만 하더라도, 그 운영체제의 모든 로직과 논리적 복잡성을 하드웨어로 구현하는 것은 불가능하다.
따라서 이렇게 복잡한 소프트웨어를 개발할 때 '잘' 개발하기 위한 이론과 방법이 여러가지 등장하였다.
규모가 큰 소프트웨어는 절대 혼자서 개발할 수 없다.
따라서 여러 사람들이 모여 분업하여 개발하게 되는데, 이 과정에서 내가 작성한 코드를 다른 사람이 사용하고, 다른 사람이 작성한 코드를 내가 사용하는 일이 비일비재하게 일어난다.
(꼭 팀 내에서 협업하는 것이 아니더라도 웹에서 다른 사람이 작성한 오픈소스를 다운받아 사용하는 상황도 존재할 수 있다.)
이런 상황에서 다른 사람이 작성한 코드를 읽어보니 변수명도 형식도 제각각이라 컨벤션도 안 맞고, 과거 버전에서만 돌아가고, 해당 코드의 동작이나 사용법에 대한 문서도 없다면 결국 내가 직접 소스코드를 읽고, 이해하고, 수정하는 과정을 반복해야 한다.
하지만 규모가 큰 소프트웨어라면 이렇게 수정했을 때 어떤 사이드 이펙트가 발생할 지 예측하는 것도, 발생했을 때 수정하는 것도 어렵다.
따라서 좋은 코드, 퀄리티가 높은 소프트웨어를 만들려면 컨벤션이 잘 맞춰져 있고, 전체적인 구조가 설계되어 있고, 문서화도 잘 되어있어야 한다. 체계적으로 구조화가 되어 있기 때문에 어떤 기능을 수정하려고 해도 어디를 수정해야 할 지, 수정했을 때 그 영향이 어디까지 퍼져나갈지에 대한 예측이 비교적 쉽기 때문이다.
정리하면 좋은 소프트웨어란 재사용(reuse)하기 쉽고, 유지보수(maintenance)가 용이한 소프트웨어를 말한다.
재사용하기 쉽다는 뜻은 다른 사람이 작성한 코드를 전부 이해하지 않아도 그냥 가져다 쓰기만 했는데 잘 동작하는 것을 기대할 수 있다는 뜻이다.
유지보수가 용이하다는 것은 새로운 기능이 추가되고, 이전 기능이 수정되어야 할 때, 해당 기능을 개발했던 사람이 아니더라도 수정하기가 쉽고, 그 영향도 적다는 뜻과 같다. (이를 가리켜 '모듈화' 되어있다고도 말한다.)
재사용하기 쉽고, 유지보수가 용이한 소프트웨어를 개발하기 위해서는 다음의 요소들이 중요하다.
1. 개발 프로세스 설계
2. 소프트웨어 모델링과 설계
그리고 이 요소들이 개발자의 역량을 결정하는 요소가 될 것이다.
소프트웨어를 설계한다는 것는 객체지향 관점에서 소프트웨어의 기능을 구현하는데 필요한 클래스와 해당 클래스가 가진 public 함수들을 정리하는 것과 같다. (interface 설계, 나중에 자세히 정리한다.)
그리고 이렇게 정의한 public 함수들을 채우는 것이 소프트웨어의 '구현' 이다.
다양한 언어, 다양한 플랫폼과 개발 도구를 사용해보는 것도 물론 중요하지만, 이 요소들은 모두 언제든 바뀔 수 있는 가변적인 요소다.
우리가 키워야하는 중요한 능력은 구현이 아니다. 중요한 것은 설계하는 능력이다.
잘 설계된 소프트웨어가 재사용하기 쉽고 유지보수하기 좋은, 퀄리티 높은 소프트웨어가 된다.
그리고 이런 능력을 길러야 AI 시대에 AI 에게 뒤처지지 않고 AI를 도구로서 활용하는 사람이 될 수 있다.
내 머릿속에 설계도와 원하는 방향이 그려져 있는 상태에서 AI 에게 물어보고 지시한다면, AI 가 잘못된 방향으로 대답하더라도 정정할 수 있다. 하지만 설계를 할 줄 모르는 사람이 AI를 사용한다면 그저 AI가 제시하는 방향을 따라 대신 걷기만 하는 존재가 될 것이다.
또한 AI는 기존의 데이터를 기반으로 앞으로의 데이터를 추론하는 모델이다.
즉, 기존에 없던 새로운 데이터나 개념을 만들어내지 못한다.
따라서 어떤 문제 상황에서 창의적으로 대응할 수 있는 사람들이 AI를 잘 활용할 수 있을 것이다.
이제부터는 실제로 큰 규모의 소프트웨어를 설계하는 과정을 따라서 요구사항 파악하고, 분석하고, 상세 내용을 설계하고 구현하는 과정으로 구체적인 방법을 정리해 나갈 예정이다.