2. 실용주의 접근법 - 직교성

김민아·2022년 7월 25일
0
post-thumbnail

TIL

범위

  1. 실용주의 접근법 - 직교성

기억하고 싶은 내용

설계, 빌드, 테스트 그리고 확장하기에 쉬운 시스템을 만드는 데에 있어 직교성Orthogonality은 매우 중요한 개념이다. _76p

‘직교성'은 기하학에서 빌려온 용어다. 그래프의 축과 같이 두 직선이 직각으로 만나는 경우 직교한다고 말한다. … 이 용어는 일종의 독립성independence이나, 결합도 줄이기decoupling를 의미한다. 하나가 바뀌어도 나머지에 어떤 영향도 주지 않으면 서로 직교한다고 할 수 있다. _76p

관련 없는 것들 간에 영향이 없도록 하라. _p78

직교적인 시스템을 작성하면 두 가지의 큰 장점이 있다. 생산성 향상과 리스크 감소. _p78

간단한 컴포넌트들은 설계하고, 코딩하고, 단위 테스트하고, 그러고는 잊어버릴 수 있다. 새로운 코드를 추가할 때마다 기존의 코드를 계속 바꾸어야할 필요가 없다. _p78

컴포넌트 하나가 M가지 서로 다른 일을 한다고 치고, 또 다른 컴포넌트 하나가 N가지 일을 한다고 가정하자. 만약 그것들이 직교적이라면 결합했을 때 결과물은 M*N개만큼 일을 할 것이다. _p79

감염된 코드는 격리된다. … 시스템이 잘 깨어지지 않는다. 어떤 부분을 골라서 약간 바꾸고 수리해도 거기서 생기는 문제점들은 그 부분에만 한정될 것이다. _p79

우리는 애플리케이션에서 인프라infrastructure를 분리하는 방식을 선호한다. … 프로젝트 팀 구조가 얼마나 직교성을 갖는지 간단히 측정해 볼 수 있는 방법이 있다. 요청된 개별 변화에 대한 토론에 참여할 필요가 있는 사람이 몇 명인가를 보라. 숫자가 클 수록 그룹의 직교성은 낮다. _p80

개발자 대다수는 직교적인 시스템을 설계할 필요를 잘 안다. … 시스템은 협력하는 모듈들의 집합으로 구성되어야 하고, 각 모듈은 다른 부분과 독립적인 기능을 구현해야 한다. _p80

모델-뷰-컨트롤러 MVC Model-View-Controller 패러다임을 이용해 코드간의 결합도를 줄이는 방법에 대해 설명한다. _p82

코드를 작성하고 있다면 언제나 애플리케이션의 직교성을 떨어뜨릴 수 있는 위험에 노출되어 있다. … 의도하지는 않았겠지만 다른 모듈에 중복 기능을 추가하거나 동일한 지식을 두 번 표현할 수도 있게 된다. _p84

직교성을 유지하기 위해 사용할 수 있는 몇 가지 기법이 있다.
- 코드의 결합도를 줄여라. → 부끄럼타는 코드 shy code를 작성하라.
- 전역 global 데이터를 피하라. → 코드가 전역 데이터를 참조할 때마다 코드는 해당 데이터를 공유하는 다른 컴포넌트와 묶이게 된다.
- 유사한 함수를 피하라. → 중복 코드는 구조적 문제의 징후다. <디자인 패턴>에서 소개한 스트래티지 패턴 strategy pattern을 사용하여 더 나은 구현을 할 수는 없는지 고려해보기 바란다. _p85

자신이 작성하는 코드를 항상 비판적으로 검토해 보는 습관을 기르기 바란다. 기회가 있을 때마다 코드의 구조와 직교성을 향상시키기 위해 노력하라. 이러한 프로세스를 리팩터링 refactoring이라 부른다. _p85

단위 테스트를 만든다는 것 자체가 직교성을 테스트해 볼 수 있는 흥미로운 작업이다. _p86

직교성은 놀랍게도 문서에도 적용할 수 있다. 내용과 표현이 두 축이 된다. 정말 직교적인 문서라면 내용 변화 없이 표현을 극적으로 바꿀 수 있을 것이다. _p87

만약 사람들이 뭐 하나 변경하기 위해 필사적으로 아등바등해야 하는 프로젝트에 투입되었다면, 혹은 하나를 변경할 때마다 다른 네 개의 무언가가 이상해진다면 헬리콥터의 악몽을 생각하라. _p87

소감

결합도는 줄이고, 응집도를 높이고, 직교성을 향상시킨다. 내용도 다른 챕터보다 길었고 모르는 개념도 많이 나왔다. 직교성 챕터는 책 전반에 걸친 모든 주제와 관련이 있다. 심지어 좋은 변수명을 고르는 것도 직교성에 큰 영향이 있을 것 같았다. 가장 직교성 낮추는 데 공헌하는게 코딩이라는 것만 보아도. 아무튼 직교성은 실용주의 프로그래머의 코어 개념인 것 같다. 추가로 지금 javascript의 객체 지향에 대해 공부하고 있는 만큼 연습문제3이 매우 흥미롭게 느껴졌다.

나중에 이해하고 싶은 부분

::TODO::

디미터 법칙, 단위 테스트, 절차적 언어 대 객체 기술
연습문제 3. 절차적 언어 대 객체 기술은 어떤가? 어떤 것이 직교성이 더 좋은 시스템을 낳을 것인가?

0개의 댓글