#review Simple Made Easy, Rich Hickey - 쉬움(easy)이 단순함(simple)을 만들지 않는다

2 minute read

nil

simple과 easy. 이 두 용어의 차이는 무엇이며 목표는 어디로 잡아야 하는가? 쉬움(easy)은 단순하게(simple) 만들지 않는다. 오히려 쉬움은 복잡(complex)하게 만드는 경향이 있다. 예를 들면 value와 time을 함께 엮은 state는 쉽다. 하지만 단순하지는 않다. 오히려 모든 복잡성의 씨발점이 된다. 우리는 익숙함을 단순하다고 착각하기도 하지만 실은 쉬울 뿐이다. 결국, 우리는 단순함을 추구해야 한다. 쉬움은 알아서 잘 따라올 것이다.

이 발표는 simple, complex, easy, hard 섞어 쓰기도 하고 잘못 쓰기도 하는 이 용어들을 명료하게 정의한다. 단순함은 객관적이지만 쉬움은 상대적이란 설명에 놀라고 깊이 공감했다. 왜 이제까지 단순함을 상대적이라 생각했을까?

하지만 OO(Object Oriented)에서 사용하는 도구 세트(toolkit)를 보니 복잡한 것밖에 없다. 리치 히키가 말하는 단순함을 추구하기 위해선 패러다임을 바꿔야만 하나? 그냥 clojure 만세로 끝나는 것일까? 아니다. 명료한 개념 정의와 단순하게 만들 수 있는 여러 도구를 배우는 것만으로도 현업에서 OO를 버리지 못하는 내게도 이 발표는 도움이 됐다.

nil

추상(抽象)을 한자로 보면 ’뽑아낼 추’와 ’코끼리 상’으로 이루어져 있다. 상(象)은 모양이란 의미가 있으므로, 한자를 풀이해 보면 ’모양을 뽑아내는 것’ 정도로 이해할 수 있겠다. 즉, 추상이란 실재하는 사물에서 어떠한 특징만을 뽑아내는 과정을 말한다. 이때 뽑힌 특징을 우리는 추상적이라고 부르게 된다.

추상이란 무엇인가? - 大山

추상(abstraction)에 관한 얘기도 무척 흥미로웠다. 프로그래밍에서 추상화를 왜 하는가? 생각을 해보니 나는 복잡성을 감추기 위한 용도로 주로 사용해왔다. 그런데 여기선 단순함을 위한 추상화와 복잡성을 감추려는 추상화를 구분해서 설명한다. 육하원칙에 각 요소에 대한 추상화를 설명하는데, 이렇게는 한 번도 생각을 안 해봤던지라 놀라웠다. 말은 멋지지만 실로 어려운 코드 재사용성에 대한 힌트를 여기에서 얻을 수 있지 않을까란 생각을 했다.

DOD(Data Oriented Design)와 목적은 다르지만, 방법은 유사하다. 리치 히키는 단순함을 위해 값(value)을 분리했고 DOD는 성능을 위해 데이터를 분리했다.

Now, ask yourself what TDD means to you. Is TDD a discipline you use to make things easy? Or is it a discipline you use in order to be thoughtful, careful, and to keep things simple?

Simple Hickey by Uncle Bob

꽤 어려운 발표라 시간을 많이 썼다. 고수들은 이 발표를 어떻게 생각할까? 찾아보니 엉클밥이 남긴 글이 있다. 덕분에 이 발표를 이해하는데, 많은 도움이 됐다. 의미심장한 질문을 던지는데, 아직 TDDer가 아녀서 이것에 관한 생각정리가 안 됐다. 나중엔 답을 할 수 있겠지.

리치 히키 발표는 다 재미있네. 생각할 거리를 많이 던져준다.

주요 슬라이드와 간단한 코멘트

nil

끼워 넣는(interleaving) 게 없는 걸 의미한다. 개수에 관한 얘기가 아니다.

nil

익숙한 것이다. 상대적이다.

nil

초반에 엄청나게 빠른 속도를 제공하는 easy를 경계해야 한다. 복잡함을 수반하는 경우 속도는 뒤로 갈수록 급격히 떨어진다.

nil

lisp는 어렵다. 익숙하지 않기 때문이다. CommonLisp, Scheme에 있는 복잡함을 그루핑을 위한 자료구조를 추가해서 단순하게 만들었다.

nil

OO는 복잡함이 넘친다.

nil

값과 시간을 함께 엮어서 복잡하다. 하지만 익숙해서 쉽다. 이건 모듈과 캡슐화로 완화할 수 없다.

nil

state 자체를 단순하게 못 만든다. 줄이는 방향으로 가야 함.

nil

어떤 걸 함께 엮어서 복잡해졌는가?

nil

어떤 걸로 단순하게 만들 수 있는가?

nil

How와 함께 엮지 마라.

nil

서브컴포넌트로부터 만든다.

nil

로직을 구현. 다른 것과 함께 엮지 마라.

nil

객체끼리 바로 연결하면 스며들 수 있다. 이럴 때 큐를 사용해라.

nil

정책과 룰. 모든 곳에 흩뿌려지곤 한다.

nil

데이터 좀 그냥 내버려둬라. 괴롭히지 마.

참고