모종닷컴

[클린 아키텍처] 3장 ~ 4장 본문

독서나 해볼까

[클린 아키텍처] 3장 ~ 4장

모종 2022. 12. 17. 21:30
반응형

클린 아키텍처 - 소프트웨어 구조와 설계의 원칙 (로버트 C. 마틴)

3장 : 패러다임 개요

패러다임의 변화

패러다임이란 어떤 프로그래밍 구조를 사용할지, 그리고 언제 이 구조를 사용해야 하는지를 결정하는 프로그래밍을 하는 방법을 말한다. 대체로 언어에는 독립적이다.

구조적 프로그래밍

  • 최초로 적용된 패러다임
  • 1968년 에츠허르 비버 데이크스트라가 발견
  • 무분별한 점프(=goto 문장)는 프로그램 구조에 해롭다는 사실을 제시했다.
  • 데이크스트라는 이러한 점프들을 if/then/else와 do/while/until과 같이 익숙한 구조로 대체했다.
  • 구조적 프로그래밍은 제어 흐름의 직접적인 전환에 대해 규칙을 부과한다.

객체 지향 프로그래밍

  • 구조적 프로그래밍보다 2년 앞선 1966년 올레 요한 달과 크리스텐 니가드에 의해 등장.
  • 알골 언어의 함수 호출 스택 프레임을 힙으로 옮기면 함수 호출이 반환된 이후에도 함수에서 선언된 지역 변수가 오랫동안 유지될 수 있음을 발견했다.
  • 이러한 함수가 클래스의 생성자가 되었고, 지역 변수는 인스턴스 변수, 그리고 중첩 함수는 메서드가 되었다.
  • 객체 지향 프로그래밍은 제어흐름의 간접적인 전환에 대해 규칙을 부과한다.

함수형 프로그래밍

  • 최근에 겨우 도입되기 시작했지만 가장 먼저 만들어진 패러다임.
  • 컴퓨터 프로그래밍 자체보다 먼저 등장.
  • 수학적 문제를 해결하는 과정에서 람다 계산법을 발명했는데, 함수형 프로그래밍을 이러한 연구 결과에 직접적인 영향을 받아 만들어졌다.
  • 함수형 프로그래밍은 할당문에 대해 규칙을 부과한다.

 

4장 : 구조적 프로그래밍

데이크스트라의 증명

프로그래밍은 어렵고, 프로그래머는 프로그래밍을 잘하지 못한다. 아주 작은 세부사항이라도 간과하면 결국엔 예상외의 방식으로 프로그램이 실패한다.

데이크스트라는 “증명”이라는 수학적인 원리를 적용하여 이 문제를 해결하고자 했고, 이는 최종적으로 유클리드 계층구조를 만들어야 했다. 프로그래머가 유클리드 계층구조를 사용한다면 입증된 구조를 이용하고, 입증된 구조를 코드와 결합시켜 코드가 올바르다는 사실을 “증명”할 수 있다.

이러한 연구를 하면서 goto 문장이 모듈을 더 작은 단위로 재귀적으로 분해하는 과정에 방해가 되는 경우가 있다는 사실을 발견했다. 반면 goto문의 올바르게 사용하면 오늘날의 if/then/else 와 do/while 같은 분기와 반복이라는 단순한 제어 구조에 해당한다는 사실을 발견했다. 그리고 이러한 제어 구조만을 사용한다면 증명 가능한 단위로까지 모듈을 재귀적으로 세분화하는 것이 가능해 보였다.

또한 이러한 제어 구조는 순차 실행(모든 프로그램을 순차, 분기, 반복이라는 세 가지 구조만으로 표현할 수 있다는 증명)과 결합했을 때 특별하다는 것을 깨달았다.

모듈을 증명 가능하게 하는 바로 그 제어 구조가 모든 프로그램을 만들 수 있는 제어 구조의 최소 집합과 동일하는 사실이고, 구조적 프로그래밍은 이렇게 탄생하게 되었다.

데이크스트라는 단순한 열거법을 이용해서 순차 구문이 올바름을 입증할 수 있다는 사실을 보여주었다. 분기의 경우 열거법을 재적용하는 방식을 처리하였고, 반복은 귀납법과 열거법을 사용했다.

기능적 분해

구조적 프로그래밍을 통해 모듈을 증명 가능한 더 작은 단위로 재귀적으로 분해할 수 있게 되었고, 이는 모듈을 기능적으로 분해할 수 있음을 뜻했다. 거대한 문제 기술서를 받더라도 문제를 고수준의 기능들로 분해할 수 있고, 이들 각 기능은 다시 저수준의 함수들로 분해할 수 있고, 이러한 분해 과정을 끝없이 반복할 수 있다. 게다가 이렇게 분해한 기능들은 구조적 프로그래밍의 제한된 제어 구조를 이용하여 표현할 수 있다.

엄밀한 증명은 없었다

하지만 끝내 프로그램 관점에서 정리에 대한 유클리드 계층구조는 끝내 만들어지지 않았다. 세세한 기능 하나하나를 엄밀히 증명하는 고된 작업에서 이득을 얻으리라고 보지 않았기 때문이다.

과학적 방법

유클리드 방식이 올바른지를 입증할 때 사용하는 전략이라면 과학적 방법은 서술된 내용이 사실임을 증명하는 방식이 아니라 서술이 틀렸음을 증명하는 방식으로 동작한다.

소프트웨어는 과학이다.

소프트웨어가 수학적인 구조를 다루는 듯 보이지만, 오히려 소프트웨어는 과학과 같다. 최선을 다하더라도 올바르지 않음을 증명하는 데 실패함으로써 올바름을 보여주기 때문이다.

구조적 프로그래밍은 프로그램을 증명 가능한 세부 기능 집합으로 재귀적으로 분해할 것을 강요한다. 그러고 나서 테스트를 통해 증명 가능한 세부 기능들이 거짓인지를 증명하려고 시도한다. 이처럼 거짓임을 증명하려는 테스트가 실패한다면, 이 기능들은 목표에 부합될 만큼은 충분히 참이라고 여기게 된다.

결론

구조적 프로그래밍이 오늘날까지 가치 있는 이유는 프로그래밍에서 반증 가능한 단위를 만들어 낼 수 있는 바로 이 능력 때문이다. 흔히 현대 언어가 아무런 제약 없는 goto 문장은 지원하지 않는 이유이기도 하다.

가장 작은 기능에서부터 가장 큰 컴포너틑에 이르기까지 모든 수준에서 소프트웨어는 과학과 같고, 따라서 반증 가능성에 의해 주도된다. 소프트웨어 아키텍트는 모듈, 컴포넌트, 서비스가 쉽게 반증 가능하도록(테스트하기 쉽도록) 만들기 위해 분주히 노력해야 한다.

유클리드 계층구조
공리 : 증명 없이 참으로 받아들이는 명제
정리 : 증명이라는 과정을 통해 참이라는 것이 밝혀진 명제
보조 정리 : 정리를 증명하는 데 필요한 정리.
따름 정리 : 정리를 통해 자연스럽게 도출되는 정리.
유클리드 기법을 이용하여 증명

 

반응형

'독서나 해볼까' 카테고리의 다른 글

카프카 책 추천  (0) 2023.10.14
[클린 아키텍처] 7장 ~ 11장  (2) 2023.01.08
[클린 아키텍처] 5장 ~ 6장  (0) 2022.12.28
[클린 아키텍처] 챕터 1  (0) 2022.12.11