본문 바로가기

프로그래밍 고찰/고찰

[책 리뷰] 유연한 소프트웨어를 만드는 설계 원칙 오버뷰

충격과 공포의 제 1 장

SICP 저자에 리치 히키 추천사? 이건 봐야지~

라고 가벼운마음에 도전했는데.. 상상이상으로 어렵다..

충격과 공포의 1장을 제쳐 두더라도, 내용이 좀 어렵다 ㅜ.ㅜ 나는 클로저를 좀 하니까.. 예시가 스킴이더라도 그냥 술술 읽을 수 있을줄 알았는데, 조금 방심하면 무슨내용인지 하나도 모르겠다.

나는 개발서적을 읽을때 빠르게 속독하는데 (의의나 가벼운 내용만 기억해둿다가, 나중에 필요한 부분만 다시 읽는편) 이책은 그러기 쉽지 않다.

이런기분은 대학교때 전공서적 읽을때 이후로 오랜만인듯 단어부터가 너무 고급지고, 예시도 뭔가 와닫지는 않는다. (아니 실제로 SICP 가 하버드 전공서적이었으니까 당연한건가?)

아직 초반부만 읽고있어서 그런가... 그나마 초반부가 내가 이미 알고있는 기술들이라 더 쉬워야되는데..

내용 자체는 저자를 믿고 봐도 될 만큼 뛰어나지만.. 아직 내가 자연스럽게 읽을만한 경지에 도달히지 못한 것 같다. 개인적인 추천으로는, 각 장을 읽을때, 앞에서 부터 읽지말고 뒤에 요약부터 읽는걸 추천...

완독하면 깨달음과 통찰력을 얻을 수 있겠지

- 번역하면서 "이걸 굳이 이렇게?" 라는 의구심이 "와, 이게 되네!" 라는 감탄으로 변하는 순간을 여러번 겪은 것이 기억에 남습니다.
- 유연한 소프트웨어를 만드는 설계 원칙, 옮긴이의 말 중 (옮긴이 류광)-

 

아래는 이책을 overview하고 느낀 내용을 적은것이다.

 

1장 - 자연과 설계의 유연성

이해하지 말고 느끼는걸 추천.. 대충 유연성이 강조된다는 이야기

안타깝지만 시스템이 복잡해질수록 이런 식으로 모든 것을 미리  명시하는 것이 점점 더 어려워 진다. 체스 프로그램을 만든다고 할 때, 적법한 게임을 두는, 그러니까 체스 규칙을 철저히 따르는 프로그램의 명세를 만드는 것은 가능하겠지만, 체스를 잘 두는 프로그램의 명세를 만드는것은 어려운 일이다.

 

2장 - DSL

DSL 을 만들기위한 다양힌 기법들을(적절한 조합자 (컴비네이터), 레핑. 커링등의 기법)  소개해주고, DSL 을 모델링 하기위하여 도메인 영역을 다루는 방법을 소개해준다.

짜맞춤 방식의 교체 가능한 부품들로 시스템을 구축하는 것은 거의 항상 유익하다.

 

3장 - 산술 주제의 변형들

아니 왜 시작부터 예시가 상미분 방정식 적분기냐고..

진짜 진짜 간단하게 말하자면, 오버로딩 관련 이아기 + 알파로 디스패칭

강력하고도 위험하다

4장 - 패턴 부합 (패턴 매칭)

FP 언어 (특히 정적타입) 에서 주로 제공해주는 패턴매칭기술을 이미 알고있다면 좀더 수월하게 읽을수 있을것..
패턴 매칭기 를 뚝딱뚝딱 만든다

FP 언어에서, ADT 를 이용해서 데이터를 모델링해서 DSL 을 구성한다음 AST 를 만들고, 패턴매칭을 통해서 프로그램을 작성하는 패턴이 있는데, 약간 비스무리한 내용이다 (아마..? 아니 솔직히 모르겠다..)

표현식의 일부를 그와 '동등한' 부분으로 연이어 치환하는 프로그램을 손쉽게 작성할 수 있다. 그런 시스템은 기호 조작을 수행하는 더 큰 시스템의 주여한 구성요소 이다. (중략) 이런 종류의 조작을 대량으로 수행하는 것은 바로 컴파일러이다.

 

5장- 평가

FP 언어에서, ADT 를 이용해서 데이터를 모델링해서 DSL 을 구성한다음 AST 를 만들고, 패턴매칭을 통해서 인터프리터 프로그램을 작성하는 패턴이 있는데, 약간 비스무리한 내용이다 (아마..?) 물론 이 책에서는 Lisp 을 사용하므로 Lisp 계열 언어를 만들어서 좀 다르다.

"해커와 화가" 에서 다른언어를 해도 Lisp 언어를 구현하는 인터프리터를 만든다는 이야기 가 나온다 (그린스펀의 열번째 프로그래밍 법칙) 대충 요런 내용이다 (아마...)

이제 우리는 "이 언어로는 이걸  표현할 수 없어!" 같은 불평을 할 수 없다
'바벨탑' 건축에 참여하지는 말아야 한다.

6장 - 계층화

계층(layer)를 통해서 가산적으로 기능을 추가하는 기법
layered 아키텍쳐같은것 보다는, 메타데이터를 통하여 각 layer별 동작이나, 데이터 확인이 가능하도록 구현할 수 있다.

맞게 이해했는지 모르겠는데 대충 이런내용이다.

;; 계층적 프로시저를 위한 
;; make-layered-procedure 와 layer-datum 등 
;; layer 관련 기능은 이미 구현되어있다고 가정


;; 일반적인 square 가 존재함
(define (square x) (* x x))

;; 가산적으로 계층적 프로시저로 만들 수 있음!
;; layered-squre 는 일반적인경우 그냥 square 와 동일하게 동작함
(define layered-square
 (make-layered-procedure 'square 1 square))
 
 
;; layered-squre 는 일반적인경우 그냥 square 와 동일하게 동작함
(layered-square 4) ; 16, (square 4) 와 동일
(layered-square 'm) ; (* m m), (square 'm) 과 동일
 
;; 들어오는 요소가 계층적인 요소면 (unit처럼 메타데이터 layerd 되어 같이 있음, 단위는 킬로미터)
(pp (layered-square 
 		(layer-datum 'm 
        			  uinit-layer (unit 'kilogram 1))))
                      
;; 아래 처럼 각 계층별 결과를 확인할수있음
;; 기본(base) 레이어는 (* m m)
;; 유닛 레이어는 (unit kilogram 2) -> 킬로미터 제곱이라는 뜻임
;#[layered-datum (* m m)]
;(base-layer (* m m)
;unit-layer (unit kilogram 2))

pp 가 머슨 scheme 함수인지는 해당 링크 참조

데이터와 프로시저를 여러 계층으로 구축해서, 프로그램 텍스트가 지저분해지는 일 없이 가산적으로 주해(어노테이션...) 를 달 수 있게 한다.
프로시저도 계층화 할 수 있는 데이터이다

7장 - 전파

앞서 말한 옮긴이의말이 뭔지 느껴지는 챕터

번역하면서 "이걸 굳이 이렇게?" 라는 의구심이 "와, 이게 되네!" 라는 감탄으로 변하는 순간을 여러번 겪은 것이 기억에 남습니다.

아니 이걸 이렇게? 라는 말이 나올것같은 SW 디자인이다.

이 책에서  축중성이라는 말이 지속적으로 나온다. 약간 이상론에 가까워보이는 이 내용을 실제로 구현하며 이 책이 말하는 가산적, 축중성이라는게 어떤 의미를 가지는지, 지금까지의 논리와 어떤 차이점을 보이는지를 알려준다.

별과의 거리를 측정하는 코드로 예시를 보여주는데, 별과의 거리를 측정할때, 연주시차값과 별의 밝기를 사용한다. 연주 시차/ 별의 밝기는 시간이 지남에 따라 좀더 정확한 값이 나오게 되는데 (실제 이 현실 세계에서) 이게 우리 코드의 변경없이 어떻게 적용되는지, 전파되는지, 그리고 어떻게 결과값이 개선되는지 알려준다.

솔직히 코드 내용은 아직 잘 모르겠는데 이 예시를 가지고 설명하는 내용과 흐름을 읽어보면 저자가 우리에게 어떤 내용을 전달하려하는지 대강 느낄수있다.

좀 다른 이야기 이긴한데, 뉴럴네트워크에서는 각 노드간에 전파와 업데이트를 진행하고, 동시성에서 Actor 모델은 각각 독립적인 actor 간에 메시지로 통신해가면서 업데이트를 진행하는데, 이런 느낌적인 느낌이다. 약간 프롤로그 시스템(논리 프로그래밍)을 구현하는거 같은 느낌이 들기도?

십자말풀이를 풀다 보면 그 어떤 빈칸도 확신 있게 채울 수 없는 지경에 빠질 때가 종종 있다.그렇지만 특정 빈칸에특정 글자가 있다고 가정하고 풀이를 진전시키다 보면 의외로 문제가 풀리기도 한다.

해당 챕터의 주제를 관통하는 문장

728x90