프로그래밍 속 설계의 중요성을 강조하고, 제가 생각하는 설계 방법을 공유합니다.
내가 생각하는 설계의 중요성
프로그래밍에 있어서, 설계는 중요할 뿐 아니라 여러 장점을 가자고 있다. 설계는 프로젝트 진행과정이라고 간과하기 쉽다. 하지만 프로젝트 진행에 있어서 많은 도움이 될뿐만 아니라 개인에게도 아주 큰 도움이 된다고 생각한다.
설계도는 프로그램을 간단하게 도식화해 구조를 변경하거나, 파악할때 사용한다. 이때 간략화된 설계도를 기반으로 머리속에서 구체화된 프로그램의 흐름을 상상해야 한다. 이것만으로도 구조지식과 코드리딩 실력이 많이 성장한다. 이 지식과 경험은 단순히 설계할 때 뿐만 아니라, 함수/클래스를 구현할 때도 사용된다. 무의식적으로 매 작업마다 어떻게 구현할지; 무엇을 고려해야할지를 판단하는데 이때 정확도,속도,퀄리티까지 덩달아 향상된다.
설계를 잘하면 코딩을 잘하고, 코딩을 잘하면 설계를 잘하게 된다.
이 선순환이 실력을 향상시키고, 동기부여를 제공한다.
설계의 실제 효용
설계는 프로젝트의 진행 속도를 압도적으로 줄일 수 있다고 생각한다. 일단 먼저 구조를 고치기 위한, 리팩토링을 사전에 할 수 있다. 단위 하나를 기본으로 작업을 하기 때문에, 구현 중 구조적 문제를 알아차리고 고치기 쉽지 않다.
설계도를 기반으로 코드를 옮기기만 하면 된다. 단위와 단위를 연결시키고, 흐름의 파이프라인을 고려/구축을 이미 설계 단계에서 했기 때문에 구현에 들어가는 시간이 단축된다. 알게모르게 구현 중 해당 사항들을 수정하고, 고려하는 것이 피로하고 시간이 꽤 소모된다.
다른 사람과 작업할 때 커뮤니케이션 비용이 줄어든다. 현재 상황을 파악시키고, 작업 단위를 나눌 때 공통된 설계에서 작업한다. 각기 다른 프로그래머들의 상상속 흐름을 정렬하고, 동상이몽 비용을 막는다. 이것만으로도 실무에서는 비용을 크게 줄이고, 퀄리티를 높인다고 확신한다.
어떻게?
주의: 먼저 짚고 넘어가야 할것은 나는 설계도에서 모든 클래스/함수/흐름(화살표)가 표기가 안되도 된다고 생각한다. 더 나아가 모든 것을 표기하지 않아야 한다고 생각한다. 디테일을 표현할수록 복잡도가 상승하며, 구현 중 변경을 대응하기 어렵다. 구현과 다른 설계도를 마주하는 것만으로 피로감을 떠올린다.
이제 설계 방법을 설명하겠다. 그리고 설계도를 문서가 아닌, 그래프 데이터 구조로 생각한다. 클래스/함수는 노드가 되는 것이다.
먼저 요구사항을 나열하고 시작한다. 순서는 전혀 상관없다.
- 설계할 요구사항 하나를 정한다. 이를 클래스(노드)로 만든다.
- 노드(요구사항)을 구현하기 위한 항목 3개를 고려한다.
- 생성(할당, 호출) / 메인 / 소멸(초기화, 종료)
- 각 항목) 항목을 구현하기 위해 꼭 필요한 노드가 있다면 추가한다.
- 노드가 필요하지 않다면, 멤버/함수를 노드안에 넣는다.
- 3번에서 생성된 노드를 2번에 대입하여 다시 반복한다.
- 1에서 정한 요구사항에 필요한 노드가 더 없다면, 1번으로 돌아가 남는 요구사항 중 하나를 다시 고르며 반복한다.
주의
에서도 말햇지만, 설계 중 부가적인 것들은 꼭 넣지말자.- 디테일은 구현자에게 맡기자.
- 화면에 다 담기지 않을 정도라면, 덜어내자; 간소화하자;
- 1차적인 설계가 끝났다면, 의식의 흐름에서 벗어나 구조 전체를 살펴본다.
- 알고있는 지식내에서 리팩토링하고 디자인 패턴을 적용하면서 최적화한다.
위 방법이 다소 추상적, 상징적이어서 세세한 방법까진 알려주지 못했다. 사실 그건 개개인의 스타일의 영역이라 일일이 쓰기 애매하다. 말한 방법을 스스로 시도하고 적용해보면서, 자신만의 설계 방식을 구축해봐라.