본문 바로가기

공부기록/아키텍처

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

프로그램은 어렵고, 프로그래머는 프로그래밍을 잘하지 못한다 → 증명이라는 수학적 원리를 적용하여 이 문제를 해결하고자 했다. 입증된 구조를 사용하고, 이들 구조를 코드와 결합시키며, 그래서 코드가 올바르다는사실을 스스로 증명하게 되는 방식.

 

기본적인 증명을 작성할 수 있는 기법을 보여줘야 한다는 사실을 깨달았다. 이 연구를 진행하면서 goto 문장이 모듈을 더 작은 단위로 재귀적으로 분해하는 과정에 방해가 되는 경우가 있다는 사실을 발견. 모듈을 분해할 수 없다면, 분할 정복 접근법을 사용할 수 없음.

 

goto문의 좋은 접근 방식은, if/then/else와 do/while과 같은 분기와 반복이라는 단순한 제어 구조에 해당한다는 사실을 발견했다. 모듈이 이러한 제어 구조만을 사용한다면 증명 가능한 단위로까지 모듈을 재귀적으로 세분화하는 것이 가능해보였다.

 

모든 프로그램을 순차, 분기, 반복으로 표현할 수 있음. 순차구문이 올바름을 입증할 수 있음을 수학적으로 증명. 분기도 마찬가지로 열거법을 사용하여 수학적 증명. 반복은 귀납법을 사용하여 1이 올바르고 N+1도 올바르다고 하고, 시작 조건과 종료 조건도 열거법을 사용하여 증명. 이 증명을 해냄으로써 프로그램에서도 정리에 대한 유클리드 계층구조를 만들 수 있을 거라는 생각이 실제로 이루어질 듯 보였다.

 

goto가 좋다 아니다로 10년간 전쟁 → 결국 데이크스트라의 승리( goto가 사라짐) , 현재의 우리는 모두 구조적 프로그래머

기능적 분해

모듈들을 재귀적으로 분해할 수 있게 되었다. 즉 거대한 문제들을 고수준의 기능들로 분해할 수 있게 되었고, 다시 이 기능들을 저수준의 기능들로, 함수로 분해할 수 있고, 이러한 과정을 끊임없이 반복할 수 있음. 아주 작은 기능들로 세분화할 수 있음

하지만 끝내 증명은 이루어지지 않았음

프로그램 관점에서 정리에 대한 유클리드 계층구조는 끝내 만들어지지 않았다. 오늘날 이처럼 엄밀한 증명이 고품질의 소프트웨어를 생상하기 위한 적절한 방법이라고 믿는 프로그래머는 이제 없다.

과학이 구출하다

과학적 방법은 반증은 가능하지만 증명은 불가능하다. 과학은 사실임을 증명하는 방식이 아니라 서술이 틀렸음을 증명하는 방식으로 동작한다. 각고의 노력으로도 반례를 들 수 없는 서술이 있다면 목표에 부합할 만큼은 참이라고 본다.

테스트

테스트는 버그가 있음을 보여줄 뿐, 버그가 없음을 보여줄 수는 없다. 소프트웨어 개발은 수학적인 시도가 아니라는 사실. 과학과 같음. 최선을 다하더라도 올바르지 않음을 증명하는 데 실패함으로써 올바름을 보여주기 때문.

구조적 프로그래밍은 프로그램을 증명 가능한 세부 기능 집합으로 재귀적으로 분해할 것을 강요한다. 그리고 나서 테스트를 통해 증명 가능한 세부 기능들이 거짓인지를 증명하려고 시도한다.

결론

오늘날까지 가치 있는 이유는 프로그래밍에서 반증 가능한 단위를 만들어 낼 수 있는 바로 이 능력 때문. 기능적 분해를 최고의 실천법 중 하나로 여기는 이유. 소프트웨어 아키텍트는 모듈, 컴포넌트, 서비스가 반증 가능하도록(테스트하기 쉽도록) 만들기 위해 분주히 노력해야 한다. 이를 위해 구조적 프로그래밍과 유사한 제한적인 규칙들을 받아들여 활용해야 한다.