Stepwise Refinement
Dec 17, 14
프로그래밍을 하다 보면 단계적 정제stepwise refinement라는 개념을 접하게 된다.
프로그램은 결국 목표로 하는 동작이 있게 마련이다. "1부터 1000까지의 소수를 모두 찾고 싶다"수준의 문제에서부터 "전 세계의 모든 웹 문서를 검색하고 싶다"정도로 방대한 문제도 있을 것이다. 문제의 크기가 다른 것과 무관하게 모든 문제는 염두에 두고 있는 목표가 있고, 프로그래머는 이를 프로그램이라는 매개를 활용해서 현실화한다.
프로그램을 작성하는 과정은 일련의 "무엇을", "어떻게"의 과정이다. 풀고 싶은 문제의 크기가 너무 커서 한 번에 처리할 수 없다면 이를 부분 문제로 쪼개고 각 부분에 대한 문제를 풀어낸다. 풀고 싶은 문제를 명시하고 (무엇을) 이를 현실화하는 (어떻게) 답을 만드는 과정이 프로그래밍이다.
The successive versions appear as successive levels of elaboration. It is apparently essential for each level to make a clear separation between "what it does" and "how it works". The description of "what it does", the definition of its net effect requires the introduction of the adequate concepts and both examples seem to show a way in which we can use our power of abstraction to reduce the appeal to be made upon enumeration.1
이와 같은 문제 해결 방식은 아마도 추측건대 오랫동안 인류와 함께했을 것이다. 다만 프로그래밍이라는 작업의 탄생과 함께 그 개념이 더 구체화 되고 가치의 재평가가 이루어졌을 수는 있을 것 같다.
큰 작업이 벅차기에 작은 시작을 한다는 것도 이와 비슷한 맥락에서 볼 수 있다. 결국 작업이란 다양한 문맥에서의 문제 풀이이다. 한 번에 공략하기 힘든 문제는 이를 잘게 쪼개고 각각의 "무엇을"을 "어떻게"로 치환하는 과정이다.
A guideline in the process of stepwise refinement should be the principle to decompose decisions as much as possible, to untangle aspects which are only seemingly interdependent, and to defer those decisions which concern details of representation as long as possible.2
"어떻게"가 너무 어려워서 도저히 방법이 보이지 않을 때도 있다. 이럴 때에는 결국 다양한 방법을 통해서 해공간solution space을 탐색하는 수밖에 없어 보인다. 본인이 생각하기에 가장 좋은 휴리스틱으로 지역 최적해라고 생각되는 지점으로 달려갈 수밖에 없다.
EWD 227: Stepwise program construction by Edsger W. Dijkstra, 1968↩
Program Development by Stepwise Refinement by Niklaus Wirth, 1971↩