Once And Only Once

FrontPage|FindPage|TitleIndex|RecentChanges| UserPreferences P RSS
필요한 것을 하되(Once), 오로지 한번만(Only Once) 하는 것이 효율적이라는 주장. OAOO는 DRY(Don't Repeat Yourself) 법칙을 포함한다.

{{|
Once and only once has two separate parts.
  • "Once and" means that everything that is significant is explicitly stated within the context of the next part.
  • "only once" means that there is no duplication.
--Don Wells
|}}

문서구조조정의 한가지로, 중복되는 텍스트가 있다면 이걸 추출하고, 좋은 페이지이름과 명확한 OpeningStatement 등으로 의도를 명확히 드러내어 OnceAndOnlyOnce가 되도록 바꾸는 것을 일컫기도 한다.

"여자꼬시는법"이라는 페이지와 "남자꼬시는법"이라는 페이지가 있다. 홍춘이가 "남자꼬시는법" 페이지에 어디선가 구한 이성에게 최면 거는 법에 관한 짧은 글을 올렸다. 술퍼맨은 이 글이 "여자꼬시는법" 페이지에도 관련이 있다고 생각하고 거기에 같은 내용을 복사, 붙이기를 한다. (여기서 SeeAlso를 통해, 남자꼬시는법 페이지에 "see also 여자꼬시는법"을 추가하는 방법이 있지만, 이 방법은 해당 페이지 전체를 언급하므로 정보가치가 낮을 뿐더러 이런 방법이 적절하지 않은 경우가 많다)

나중에 만약 홍춘이가 여러번의 최면 시도 끝에 그 방법에 수정이 필요함을 느꼈다면, 홍춘이는 두 군데를 수정해야 한다. 똑같은 내용이 여러 곳에 존재하기 때문이다.

그러므로

OnceAndOnlyOnce를 적용한다. 같은 내용을 여러번 언급해야 한다면, 이미 그 내용은 "저를 페이지로 추출해 주세요"라고 부탁하고 있는 것이다. 그 부탁을 들어줘라. 그 부분을 새 페이지로 추출하고 적당한 이름을 준다. 그리고 그 내용을 언급하길 원하는 페이지에 링크를 달아준다. 훨씬 더 높은 정보전달력을 갖게 된다.

그러나

같은 글일지라도 해당 컨텍스트에서 각자 다르게 발전할 확률이 훨씬 높다면 OnceAndOnlyOnce를 무시할 수 있다.

OnceAndOnlyOnce는 정적인 글에만 적용되는 것은 아니다. 정신적, 물리적 행위에도 적용할 수 있다. 예를 들어 아무개씨가 몇 날 며칠을 걸려 노스모크의 수 천 장의 위키 페이지를 모조리 읽었다고 하자. 그렇게 수고스런 일을 하고 나서 아무 일도 없었던 양, 슥 입을 닦아 버리면 OnceAndOnlyOnce를 어기는 사태가 벌어질지도 모른다. 아무개씨의 노력은 다른 사람에게 아무 영향을 주지 않고, 결국 다른 사람들 역시 아무개씨의 노력을 고스란히 거듭하게 될 것이다. 하지만 아무개씨가 군데 군데에 페이지 요약글을 써주고, 또 관련 페이지들을 엮어주는 지도를 만들었다면 상황은 다르다. 그렇다고 해서 아무개씨가 수 천 장의 위키 페이지를 읽었던 만큼의 노력없이, 그가 얻은 대가를 똑같이 얻기는 힘들 것이다. 하지만 앞서간 사람의 발자국과 그가 만들어둔 표지는 뒷에 오는 사람이 길을 가는 데에 분명 도움이 된다. 그게 문명 아니겠는가.

이렇게 해서 다른 사람들은 아무개씨 덕을 많이 보게 된다. 동시에 아무개씨는 남들에게 도움을 주니 기쁘고, 자신이 이해한 것을 직접 위키 공간에 드러내 보임으로써 자기 생각을 정리하고(얻은 지식을 글로 쓰거나 남에게 가르쳐주면 학습효과가 몇 배나 높아진다는 연구 결과가 있다) 남들과 피드백할 기회를 갖게 되니, 누이 좋고 매부 좋은 격 아니겠는가.

프로그램의 함수와 비슷하군요 :) . 이곳 저곳에서 많이 쓰는 부분은 하나의 함수로 떼어놓으면 좋더군요; -- 최종욱
네. ExtremeProgramming 등에서 Xper:SimpleDesign을 위한 핵심 원칙 중 하나로 내세우고 있습니다. :) --아무개


PragmaticProgrammer에서도 DRY원칙을 여러번 강조합니다. 조금 소개하자면 개발 중에 발생하는 중복의 종류에는 강요된 중복, 잘못된 디자인에 의한 중복, 게으름에 의한 것, 개발자들 사이의 중복 등이 있다고 합니다.
  • 강요된 중복이란 예를 들어 동일한 내용이 설계서, 헤더파일, 데이터베이스의 스키마 등에 반복되는 것을 말합니다. 이러한 중복은 간단히 정리된 하나의 텍스트 문서로부터 헤더파일, sql파일, 설계서에 삽입될 수 있는 형태의 문서 등을 자동으로 생성해주는 스크립트 같은 걸로 일부 해결할 수 있습니다.
  • 잘못된 디자인에 의한 중복이나 게으름에 의해(Copy and paste) 생긴 중복은 refactoring을 사용하면 됩니다.
  • 개발자들간의 중복은 개발자간의 의사소통이 원할하지 못하거나 개발팀이 가지고 있는 프로세스의 문제일 수 있습니다. 적절한 개발 방법론의 도입이 필요하겠죠.
--ZZesu


"; if (isset($options[timer])) print $menu.$banner."
".$options[timer]->Write()."
"; else print $menu.$banner."
".$timer; ?> # # ?>