Kim-Baek 개발자 이야기

클린 아키텍처 - 4장 구조적 프로그래밍 본문

개발

클린 아키텍처 - 4장 구조적 프로그래밍

김백개발자 2022. 2. 2. 16:58

구조적 프로그래밍의 발견

구조적 프로그래밍은 1960년대 네덜란드의 데이크스트라라른 프로그래머에 의해서 발견되었다. 이 때 프로그래밍은 진공관으로 이루어진 컴퓨터로 하던 시기였는데, 컴퓨터가 거대하고, 쉽게 손상되고 느리고 결과까지 믿을 수 없는 상태였다. 데이크스트라는 프로그래밍이 어렵고, 프로그래머가 프로그래밍을 잘하지 못한다는 문제를 인식했다. 그래서 조그만 세부사항이라도 간과하면 프로그램이 정상동작하지 않는 것을 볼 수 있었다.

데이크스트라는 프로그래머가 작성한 코드가 올바르게 동작하기를 원했고, 코드가 올바르게 동작한다는 사실을 수학적인 원리를 적용해서 풀려고했다.

수학적 증명

자세한 수학적인 기법은 설명하지 않지만, 예전에 배웠던 수학적 귀납법이 기억나는가? p(1)이 참이고, P(n)이 참이라는 것이 증명이 된다면 P(n+1) 도 참이다. 결국 자연수 n 에 대해서 모두 참이라는 것이다. 

이두희 귀납법

그래서 프로그램을 작은 단위로 분해해서 증명을 하려고 하는데, goto 문이 방해가 된다는 것을 깨달았다. goto문은 의미 그대로 goto를 만나면 내가 지정한 어디로 코드의 흐름이 넘어가는 것이다. 아무렇게나 지정을 할 수 있다보니, 제대로된 증명이 어려울 것이라는 것은 쉽게 예상이 된다.

goto문의 좋은 사용 방식은 if/then/else 와 do/while 과 같은 분기와 반복이라는 반순한 제어구조에서만 해당한다는 것도 알게 되었다. 이 두 개의 제어구조는 순차실행과 결합하면 특별해진다는 것을 알게된다.

순차구문은 단순한 열거법을 이용해서 입증할 수 있다. 분기의 경우도 각 분기를 통한 경로를 열거하면서 증명을 할 수 있다. 반복은 앞서 본 귀납법을 통해서 증명을 했다. 

이렇게 해서 코드를 모듈단위로 잘게 분해할 수 있게 되었고, 고수준의 기능을 저수준의 함수로 분해할 수 있었고, 이러한 기능은 제한된 제어구조 ( 이미 증명이 된 열거, 분기, 반복 )로 표현을 했다. 

하지만 수학적인 증명은 결국은 만들어지지 못했고, 다른 전략인 과학적 방법으로 넘어가게 되었다.

과학적 증명

과학은 근본적으로 수학과 다른게 올바름을 절대 증명할 수 없다는 것이다. 실험을 아무리 많이 하더라도 언젠가는 해당 법칙이 잘못되었다는 것으로 밝혀질 가능성이 항상 열려 있는 것이다. F=ma라는 법칙이 있지만, 언제든 반증이 가능하다는 것이다. 

과학적 방법은 서술된 내용이 사실임을 증명하는 방식이 아니라, 반대로 서술이 틀렸음을 증명하는 방식으로 동작한다. 엄청난 노력을 통해서 반례를 들 수 없는 서술이 있다면 어느정도 목표에 부합할만큼 참이다 라고 생각하는 것이다.

데이크스트라는 "테스트는 버그가 있음을 보여주는 것이지, 버그가 없음을 보여주는 것은 아니다"라고 했다. 그렇다고 테스트가 의미가 없는 것이 아니다. 우리는 최선을 다해서 테스트를 해서 올바르지 않다는 것을 증명을 하려고 하는데, 결국 이것에 실패함으로써 우리의 소프트웨어가 어느정도 올바르다라는 것을 보여주는 것이기 때문이다.

결론

구조적 프로그래밍은 반증 가능한 단위를 만들어내는 능력 덕분에 가치가 있다. 우리는 가장 작은 기능에서 가장 큰 컴포넌트까지 반증가능하도록 ( 테스트하기 쉽도록 ) 만들도록 노력해야 한다.

반응형
Comments