Clean Architecture에 대해서…
소프트웨어 설계에 대해 많은 사람들이 고민하고 경험, 직관, 도메인과 요구사항, 현실적인 환경에 따라 적절한 아키텍처를 디자인하게 되는데 이 책은 그런 점들에 대한 이론적인 바탕을 심어주는 책이다. 각 장이 굉장히 유익하고 설계를 하는 단계에서 놓치지 말아야 하는 핵심들이 구체적으로 어떻게 중요한지 너무나도 잘 설명해주고 있다.
이 책에 의하면 좋은 아키텍처는 소프트웨어의 생명주기를 더 길게 가져갈 수 있게 해주고 유지 보수 비용을 효율적으로 줄여준다. 그리고 개발자들의 생산성이 떨어지지 않게 해주고 심지어 소프트웨어 자체의 작동 효율에도 영향을 준다. 우리는 외부세계에서 오는 오만가지 요구사항의 형태에 의존하지 않도록 하고, 요구사항의 범위에 비례하게 작업 시간과 난이도가 늘어나도록 설계를 해야 한다. 그러한 아키텍처까지 도달하기 위해 프로그래밍 언어의 패러다임부터 서비스 아키텍처까지 상향식으로 접근하는 것이 이 책의 전체적인 구성이다.
원래는 책 한권을 통째로 리뷰 글로 작성하려 했지만 분량이 너무 늘어지고 책 내용에 버릴 구석이 없어서 중요한 키워드에 살을 붙여서 내용을 정리해보려고 한다.
구조적 프로그래밍
가장 처음 나오는 패러다임이 바로 구조적 프로그래밍이다. 이 개념은 컴퓨터 프로그래밍이라는 용어가 본격적으로 자리잡던 시기였다는 1950년대 말 ~ 1960년대 초에 Edsger W. Dijkstra, 한국에서는 미국식 발음을 따라 애드거 다익스트라 라고 하는 컴퓨터 과학자가 프로그램 코드의 무결성을 수학적 증명과 유사한 형태의 엄밀한 증명을 하기위해 그간 작성되었던 프로그램 코드를 분석하면서 정리하기 시작했던 것이 처음이었다고 한다. 이 책에서는 특히 다익스트라가 다양한 구문을 순차 실행, 분기, 반복 이라는 세가지 구조로 표현할 수 있음을 증명했고, 이 구조를 공리계로 삼아 유클리드 공리계와 같은 증명 체계를 세우기 위해 프로그램을 잘게 쪼개고, 프로그램 구문을 최소 기능단위까지 분해한 후 최소단위 구문의 무결함부터 프로그램 전체로 증명 체계를 확장하려는 시도를 했다. 그 과정에서 초기 기계어, 원시 프로그래밍 언어에 있던 goto 구문이 앞의 세가지 구조가 성립하는데 가장 큰 방해요인이라는 것을 인지하고 goto를 사용하지 말자는 주장을 최초로 했었다고 나와있다.
(책에 있는 표현으로)안타깝게도 다익스트라는 공리체계를 만들려는 도전에 실패하고 구조적 프로그래밍은 엄밀한 증명에서 반증 가능하지만 보다 현실적인 귀납적 방법으로 유효함을 증명할 수 있고, 소프트웨어 테스트는 문제가 있음을 보일 수는 있지만 소프트웨어의 무결성을 증명할 수는 없다는 말도 남겼다.
특성
구조적 프로그래밍은 두가지 중요한 특성을 갖고있는데, 하나는 코드의 모듈화, 그리고 또 하나는 코드의 재사용성이다. 코드 단위를 최소 단위에서 환원적으로 개발하기 때문에 작은 단위에서부터 무결함을 검증하는 것으로 전체 논리구조를 간접적으로 검증할 수 있다. 또한 모듈화된 코드를 재사용하면서 같은 기능을 하는 코드를 중복해서 작성하지 않아도 되기 때문에 코드의 명세가 변경되더라도 손쉽게 수정이 가능하고 미처 수정하지 못해 잠재적으로 위험요소가 될 수 있는 지점들을 효율적으을 제거할 수 있다. 이 특성들은 프로그래머들이 혹시나 발생할 지 모르는 오류 제어할 수 있게 해주고 결과적으로 프로그램 코드의 무결성을 검증하기위한 시간을 획기적으로 줄여주어 전체적인 생산성이 극적으로 향상되었다. 그런 이유로 현대의 대부분의 프로그래밍 언어는 이 구조적 프로그래밍을 기반으로 하는 다양한 패러다임을 배경으로 하게 되었다.
현대의 프로그래밍에서
현대의 수학 이론 증명 중에서도 컴퓨터를 이용해 가능한 모든 수를 대입해서 이론의 증명하려는 시도들이 종종 있는 것을 보면 귀납적인 방법 또한 오늘날에는 제법 유효한 것으로 받아들여지고 있다고 생각된다. 다만 프로그래밍에서는 코드의 무결함 못지않게 중요한 것이 개발 생산성이기 때문에 실제로는 정의역의 일부를 선별해서 테스트를 수행하게 된다. 여기에 프로그래머의 편견이 반영되는 문제로 테스트 자체가 굉장히 불안정한 현실적인 문제가 존재하게 되었다. 그런 이유로 Python3을 포함한 일부 언어에는 Hypothesis 등의 도구들을 통해서 이러한 테스트 기법들을 보조할 수 있다.
또한 현대의 모든 프로그래밍 언어들은 형식언어로써 구조적 프로그래밍 패러다임을 갖고있고 환원적으로 소프트웨어를 개발하게 되어있다. 대다수의 개발자들이 프로그래밍 언어에 이미 정의되어있는 많은 연산자들을 이용해 만들어진 함수들을 적절히 차용하고 있다. 다만 이런 이유로 여러 함수들이 보장하지 못하는 조건들이 서로 중첩되면서 프로그램의 불안정성을 높이고 있다. 그래서 많은 프로그램들이 논리적인 오류를 대다수 내포하고있고 보안 구멍으로 작용하고 있다. 해커들은 이런 취약점들을 노려 다양한 방향에서 프로그램을 공격하고있기 때문에 개발자들은 이러한 불안정성으로 인해 발생하는 오류까지 컨트롤 할 수 있는 영역 안에 두도록 다양한 장치를 만드는데, 이러한 예측가능한 오류를 예외라는 이름으로 부르고 있다.
결론
다익스트라가 처음에 기대했던 엄밀한 증명은 실패했지만 현대의 프로그래밍 언어가 갖고있는 모든 요소들의 기반을 다졌고 그 결과 대규모 프로그램 코드를 훨씬 효율적으로 작성할 수 있게 되었다. 프로그래머들은 특정 도메인 안에서 경험적으로 오류가 적은 프로그램을 작성하는 방법을 학습해왔다. 하지만 다익스트라의 가장 큰 업적을 꼽자면 개인적으로는 프로그래밍이 어떻게 수학과 연결될 수 있는지 이론적 배경을 제시해주었고, 프로그래머들이 자신의 코드를 굉장히 추상화해서 이해할 수 있도록 하는 방법론을 보여줬다는 것에 있다고 생각한다.