프로그램을 개발하는 중에 지식을 중복해 넣는 경우가 많다 그렇게 된다면 애플리케이션이 완성되기 전부터 유지보수의 악몽이 시작될 것이다.
소프트웨어를 신뢰성 높게 개발하고 개발을 이해하고 유지보수하기 쉽게 만드는 유일한 길은 DRY원칙을 따르는 것이다
DRY - 반복하지 마라 Don't Repeat Yourself
모든 지식은 시스템 내에서 단일하고 애매하지 않고 정말로 믿을만한 표현양식을 가져야한다.
DRY원칙을 따르지 않는다면 똑같은 것을 2군데 이상 표현했을 경우 하나를 바꾼다면 나머지 하나도 바꿔야함을 기억해야한다.
강요된 중복 : 개발자들은 다른 선택이 없다고 느낀다. 환경이 중복을 요구하는 것처럼 보인다.
해결법
언어의 관한 문제
부주의한 중복 : 개발자들은 자신이 정보를 중복하고 있다는 것을 깨닫지 못한다.
예를들어 Line이라는 클래스의 시작점
, 끝점
, 길이
라는 속성값이 있다,
이 클래스는 그럴싸해보이지만 길이
는 시작점
과 끝점
으로 정의가 된다, 그중 하나라도 바뀌면 길이
도 바뀌게 된다, 그러니까 길이
는 계산되는 필드로 만드는 것이 낫다
참을성 없는 중복 : 중복이 쉬워 보이기 때문에 개발자들이 게을러져서 중복을 하게 된다.
개발자간의 중복 : 한 팀에 있는(혹은 다른 팀에 있는) 여러 사람들이 동일한 정보를 중복한다.
재사용하기 쉽게 만들어라
하나를 변경할 때마다 다른 네개의 무언가가 이상해진다면? 끔직하다
설계, 빌드, 테스트 그리고 확장하기에 쉬운 시스템을 만드는 데에 있어 직교성은 매우 중요한 개셤이다.
직교성의 원칙을 적용하는 걸 직접 배우면 여러분이 만드는 시스템의 질을 즉각 개선할 수 있을 것이다.
직교성이란?
컴퓨팅에서 직교성이란 모듈간의 독립성(independence)이나, 결합도 줄이기(decoupling)을 의미한다.
직교성과 반대되는 개념은 상호의존적인 것이다, 특정 부분을 변화시키면 그것만 변화되는 것이 아닌 상호의존적인 어떤 것도 같이 변하기 때문에 어떠한 에러를 발생시킬지 모른다.
그러니까 어느 하나를 바꿀 때 나머지 것들을 걱정하지 않아도 되도록 설계를 해야한다.
관련 없는 것들 간에 서로 영향이 없도록 하라.
팀 내 업무가 겹치는 영역이 많다면 구성원들은 책임영역에 대해 혼동하게 된다, 뭘 하나 바꾸려고 해도 그들 중 누구라도 영향을 받을 수 있기 때문에 전체 팀원이 모여야한다.
팀 구조를 직교적으로 구성해야 한다 얼마나 직교성을 갖는지 측정해볼 수 있는 것은 요청된 개별 변화에 대한 토론에 참여할 필요가 있는 사람이 몇명인가를 보는 것이다.
숫자가 클수록 그룹의 직교성은 낮다.
직교적인 팀이 더 효율적임이 명백하다.
각 모듈은 다른 부분과 독립적인 기능을 구현해야 한다.
계층식 접근은 직교적 시스템을 설계하는 강력한 방법이다.
각 계층은 자기 밑에 있는 계층들이 제공하는 추상화만을 사용하기 때문에 코드에 영향을 끼치지 않으면서 아래에 있는 다른 구현들을 바꾸는 높은 유연성을 얻을 수 있따.
계층을 두는 것은 또한 모듈 간의 종속성이 발리 늘어나는 위험을 감소시킨다.
컴포넌트를 나누었을 때 스스로에게 물어보라
'특정 기능에 대한 요구사항을 극적으로 변경했을 경우, 몇 개의 모듈이 영향을 받는가?'
써드파티 툴킷이나 라이브러리를 도입할 때, 시스템의 직교성을 보존할 수 있는지 주의깊게 살펴보고 기술을 현명하게 선택하라.
자신이 작성하는 코드를 항상 비판적으로 검토해보는 습관을 기르길 바란다.
기회가 있을 때마다 코드의 구조와 직교성을 향상시키도록 노력해라.
이러한 프로세스를 리팩토링(refactoring)
이라고 부르며 매우 중요하다.
코드의 결합도를 줄여라
불필요한 어떤 것도 다른 모듈에 보여주지 않으며 다른 모듈의 구현에 의존하지 않는 코드를 작성하라
객체의, 상태를 바꿀 필요가 있따면, 객체 스스로가 그러한 일을 수행하게 만들어라.
전역 데이터를 피하라
코드가 전역 데이터를 참조할 때마다, 코드는 해당 데이터를 공유하는 다른 컴포넌트와 묶이게 된다.
읽기 전용 목적으로 전역 데이터를 사용한다 하더라도 문제가 발생할 수 있다.
유사한 함수를 피하라
종종 유사해 보이는 함수의 집합을 구현해야 할 때가 있다.
직교적으로 설계, 구현한 시스템은 테스트하기 더 쉽다.
시스템 컴포넌트 간의 상호작용이 형식화되고 제한되었기 때문에 시스템 테스트의 더 많은 부분을 각각의 모듈 수준에서 수행할 수 있기 때문이다.
이는 모듈(단위) 수준의 테스트가 통합 테스트보다 테스트케이스를 만들고 수행하기 훨씬 쉽다는 점에서 좋은 소식이다.
우리는 모든 모듈이 자신만의 단위 테스트를 위한 테스트케이스를 갖고 테스트가 정규 빌드 과정의 일부로 수행되어야 한다고 생각한다.
단위 테스트를 만든다는 것 자체가 직교성을 테스트해볼 수 있는 흥미로운 작업이다.
정말로 직교적인 문서라면 내용 변화 없이 표현을 극적으로 바꿀 수 있다.
현대의 워드 프로세서는 이를 도와주는 스타일스트와 매크로를 제공한다.
DRY원칙과 매우 밀접한 관계가 있다 시스템 내부의 중복을 최소화시키고 직교성은 시스템 컴포넌트 간의 상호의존도를 줄인다.
당연한 말이겠지만 DRY원칙으로 무장하고 직교성 원리를 충실히 사용한다면 개발하고 있는 시스템이 더 유연하고, 이해하기 쉽고 또한 디버그,테스트 유지도 쉬워질 것이다.
가역성이란 ?
물질이 어떤 상태로 변하였다가 본래 상태로 되돌아갈 수 있는 성질.
결정이 돌에 새겨지는 것이라고 생각하고 발생할지도 모를 우연할 사건들에 대해 준비하지 않는 데에서 실수가 나온다.
결정이 돌에 새겨진 것이 아니라 해변가의 모래 위에 쓰인 글씨라고 생각해보라, 언제든지 큰 파도가 글씨를 지워버릴 수 있다.
최종 결정이란 없다.
항상 객관적으로 판단하여 문제가 있을 것인지 판단해서 다가올 안좋을 미래를 대처하기 위한 방안을 세워야 한다.
어둠 속에서 예광탄을 넣고 총을 쏘면 그안에 든 인 성분이 발화하여 총알의 궤적을 보여준다.
어둠 속에서 총을 쏘는 방법은 2가지이다.
예광탄을 사용하면 즉각적인 반응을 통해서 조준을 다시 한다던가 빠르게 조치할 수 있기 때문이다.
새로운 프로젝트에서도 마찬가지로 예광탄처럼 해야한다.
익숙하지 않은 알고리즘, 막막한 요구사항등 수많은 미지의 것들과 조우를 하게 된다 그럴 때 모두 다 정확히 계산해서 일을 처리한다는 것은 매우 어려운 일이다.
그래서 실용주의 프로그래머는 예광탄을 선호한다.
목표물을 찾기 위해 예광탄을 써라.
예광탄은 요구사항부터 최종시스템까지 눈에 보이고, 빠르게 도달해줄 수 있다.
프로토타이핑은 누군가에게 보여주려고 대충 만들고 버리는 코드이다.
예광탄은 나중에 버리려고 만드는 것이 아니라 계속해서 사용할 코드이다.
꼭 코드가 아니라도 화이트보드와 포스트잇으로 프로토타입을 만들 수 있다.
프로토타입을 통해 학습하라
언어의 한계가 곧 자기 세계의 한계이다. -루트비히 비트겐슈타인-
도메인이란 전문분야에서 어떠한 것에 대한 지식의 범위를 말한다.
상대는 배추 김치를 생각하고 김치를 말해도 나는 파김치라고 생각할 수 있다.
이런식으로 상대와 나의 도메인을 맞춰가는 작업은 매우 중요하다.
어떤 시스템을 제안하는 사용자의 말을 듣다보면 그들이 정확히 시스템이 어떻게 동작해야하는지 우리에게 말해주는 경우가 있다.
그런 경우에 그들이 원하는 내용대로 코드를 작성을 하는 것이다.
문제 도메인에 가깝게 프로그래밍하라.
추정을 통해 놀람을 피하라.
어떤 의미에서 모든 답은 추정치이다,
질문자가 매우 높은 정확도의 답을 요구하는가? 아니면 단순히 큰 그림만을 요구하는가?
언제쯤 도착하냐고 물어보시는 할머니, 아마도 점심을 준비하실지, 저녁을 준비하실지에 대한 것이다,
당신이 사고를 당한 다이버라면 구조대에게 정확히 언제 도착할 것인지에 대해 초 단위까지 관심이
있을 것이다.
전달하려는 정확도를 고려하여 답변의 단위를 선택하는 것이 중요하다.
좋은 추정 기술은 이미 그 일을 해본 사람에게 물어보라는 것이다.
추정치가 잘못되었더라도 움츠리거나 도망가지 마라.
여러분의 추측과 실제 값이 달라졌는지 원인을 찾아야 한다.
저자는 "나중에 전화드릴께요"라고 말한다고 한다.
자판기 앞에서 말한 추정치는 여러분에게 해를 끼칠 것이라고 말한다.