PracticeEveryday

Clean Architecture 본문

Clean Architecture

kimddakki 2022. 9. 4. 21:26
구조적 프로그래밍

1. 증명

 - 데이크스트라가 초기 인식한 문제는 프로그래밍은 어렵고, 프로그래머는 프로그래밍을 잘하지 못한다는 것이었다.

 - 모든 프로그램은 단순해도 인간의 두뇌로 따라가긴 힘들었고 작은 세부 사항이라도 간과하면 프로그램이 잘 동작하는

   것처럼 보여도 결국엔 예상 외의 방식으로 실패했다.

 

 - 데이크스트라는 증명 ( Proof )이라는 수학적 원리를 적용하여 이 문제를 해결하려 했다.

 - 이는 공리, 정리, 따름 정리, 보조정리로 구성되는 유클리드 계층 구조를 만드는 것이었다.

공리: 증명 없이 참으로 받아들이는 명제
Ex 두점이 주어졌을 때 두 점을 지나는 직선은 단 하나 존재한다.
 => 증명할 수 없기에 공리라 부른다.

정리: 증명이라는 과정을 통해 참이라는 것이 밝혀진 명제

보저정리: 이러한 정리를 증명하는 데 필요한 정리

따름정리: 정리를 통해 자연스럽게 도출되는 정리

 - 데이크스트라는 수학자가 유클리드 계층구조를 사용하는 방식을 프로그래머도 사용할 수 있으리라 믿었다.

   => 다시 말해 프로그래머는 입증된 구조를 이용하고, 이들 구조를 코드와 결합시키며 코드가 올바르다는 사실을 스스로

        증명하게 되는 방식이다.

 - 이렇게 진행하기 위해선 단순한 알고리즘에 대해 기본적인 증명을 작성할 수 있는 기법을 보여주어야 했다.

 - 하지만 goto 문법이 모듈을 더 작은 단위로 재귀적으로 분해하는 과정에 방해가 되는 경우가 있다는 사실을 발견했다.

   만약 모듈을 분해할 수 없다면, 합리적으로 증명할 때 필수적인 기법인 분할 정복 접근법을 사용할 수 없게 된다.

분할 정복 알고리즘(Divide and conquer algorithm)은 그대로 해결할 수 없는 문제를 
작은 문제로 분할하여 문제를 해결하는 방법이나 알고리즘이다.

빠른 정렬이나 합병 정렬로 대표되는 정렬 알고리즘 문제와 고속 푸리에 변환(FFT) 문제가 대표적이다.

 - 하지만 어떨 때는 goto만으로 모듈을 분해하는 데 문제가 되지 않을 때가 있었다.

 - 데이크스트라는 이런 goto문의 좋은 사용 방식은 if/then/else 와 do/while과 같은 분기와 반복문이라는 단순한 제어 

   구조에 해당된다는 것을 발견했다.

 

 - 뵙, 야코피니가 데이크스트라보다 2년 앞서 발견했는데 이들은 순차, 분기, 반복이라는 세 가지 구조만으로 모든

   프로그램을 표현할 수 있다는 사실을 증명했다.

 => 이 발견으로써 모듈을 증명을 가능하게 하는 바로 이 3가지 제어 구조가 모든 프로그램을 만들 수 있는 제어 구조의

      최소 집합과 동일하다는 사실이었다. 구조적 프로그래밍은 이렇게 탄생하게 되었다.

 

기능적 분해

 - 구조적 프로그래밍을 통해 모듈을 증명 가능한 더 작은 단위로 재귀적으로 분해할 수 있게 되었고, 이는 결국 모듈을 

   기능적으로 분해할 수 있음을 뜻했다.

 => 즉, 거대한 문제 기술서를 고수준의 기능들로 분해할 수 있고 다시 각 기능을 저수준의 함수로 분해할 수 있다.

      무수히 많은 분해를 통해 분해한 기능들을 구조적 프로그래밍의 제한된 제어 구조를 이용해 표현할 수 있게 되었다.

 

과학적 증명

 - 하지만 프로그래밍의 관점에서 정리된 유클리드 계층구조는 끝내 만들어 지지 않았다.

 - 과학은 수학과 근본적으로 다르다. 과학 이론과 법칙은 그 올바름을 절대 증명할 수가 없기 떄문이다.

 - 뉴턴의 제 2법칙 F=ma, 만유인력의 법칙은 증명할 수 없다. 하지만 시연을 할 수 있고 소수점 이해 많은 자리의 정확도도

   표현할 수 있다. 하지만 수학적으로 증명할 순 없다.

 - 실험을 아무리 수행하고 경험적 증거를 아무리 수집하더라도 언젠가는 운동 법칙과 만유 인력 법칙이 잘못되었음을 

   밝혀질 가능성은 항상 열려있다.

   => 이 점이 과학이 지닌 본성이다. 과학적 방법은 반증은 가능하지만 증명은 불가능하다.

 

 - 과학은 서술된 내용이 사실임을 증명하는 방식이 아니라 서술이 틀렸음을 증명하는 방식으로 동작한다.

 - 각고의 노력으로도 반례를 들 수 없는 서술이 있다면 목표에 부합할 만큼은 참이라고 본다.

 

 - 수학은 증명 가능한 서술이 참임을 입증하는 원리다.

 - 과학은 증명 가능한 서술이 거짓임을 입증하는 원리다.

 

테스트

 - 구조적 프로그래밍은 프로그램을 증명 가능한 세부 기능 집합으로 재귀적으로 분해할 것을 강요한다.

 - 이 후 테스트를 통해 증명 가능한 세부 기능들이 거짓인지를 증명하려고 시도한다.

 - 이처럼 거짓임을 증명하려는 테스트가 실패한다면, 이 기능들은 목표에 부합할 만큼은 충분히 참이라고 여기게 된다.

 

결론

 - 구조적 프로그래밍이 오늘날까지 가치 있는 이유는 프로그래밍에서 반증 가능한 단위를 만들어 낼 수 있는 바로 이 능력 

   때문이다.

 - 가장 작은 기능에서부터 가장 큰 컴포넌트에 이르기까지 모든 수준에서 소프트웨어는 과학과 같고, 따라서 반증 

   가능성에 의해 주도된다.

어느 가설이 반증 가능성을 가진다는 것은 그 가설이 어떠한 실험이나 관측에 의해서 반증될 가능성이 있다는 것을 의미한다.
예를 들면, “아침에 태양이 동쪽에서 떠오른다”라는 가설은 “아침에 태양이 동쪽에서 떠오르지 않는다”라는 
관측에 의해서 반증될 수 있다. 이것에 대해서, 어떠한 실험이나 관측에 의해서도 반증되지 않는 구조를 가지는 
가설을 반증 불가능한 가설이라고 부른다.

 


 

 

클린 아키텍처 - YES24

살아있는 전설이 들려주는 실용적인 소프트웨어 아키텍처 원칙『클린 코드』와 『클린 코더』의 저자이자 전설적인 소프트웨어 장인인 로버트 C. 마틴은 이 책 『클린 아키텍처』에서 이러한

www.yes24.com

 

'' 카테고리의 다른 글

Clean Architecture  (0) 2022.09.04
HTTP 완벽가이드  (0) 2022.08.09
HTTP 완벽 가이드  (0) 2022.08.06
HTTP 완벽 가이드  (0) 2022.08.01
HTTP 완벽 가이드  (0) 2022.07.25
Comments