작년 11월부터 손에 가지고 다닌 책입니다.
다 읽기는 했지만 글자만 다 읽었습니다. ^^; 사실 솔직히 얘기하면 마지막 10% 부분은 많이 설렁설렁 읽었습니다.

읽고난 후 소감은 음... "해 냈다."입니다. core j2ee patterns 이어서 두 번 째 완독한 원서라고 할까요.

사용자 삽입 이미지


책은 누더기가 되었습니다. ^^;
이제 몸으로 읽을 때가 된 듯 합니다. 체득해야죠.
어려운 단어 등장했습니다. 직교성. Orthogonality. 공업수학시간에 잠깐 배운 기억이 스쳐지나갑니다. 갑자기 이 단어가 요즘 제 뇌를 후벼팝니다. Working Effectively With Legacy Code 책의 후반부에 나오는 단어인데, 코드 리팩토링의 결정판은 궁극의 직교성이라고 얘기합니다.

말을 좀 쉽게 풀죠.
3차원 그래프라고 생각하시면 됩니다. x축, y축, z축이 있습니다. 왼쪽 그래프에서 보면 성별, 생일, 출생지가 있습니다. 세 기준이 각자의 영역에서 사람의 특성을 설명해주고 있죠. 각 기준은 독립적입니다. 다른 기준에 종속적이지 않습니다.
사용자 삽입 이미지
image from: http://www.itcon.org/1997/2/paper.htm

이것을 소스코드에 빗대어 설명하면 이렇습니다.
웹 페이지에는 HTML, CSS, Javascript가 있습니다. 각기 역할이 있죠. HTML은 컨텐츠 데이터, CSS는 렌더링 스타일, Javascript는 Behavior 즉 동작입니다. 각기 독특한 영역이 있는데, 이 코드를 분리해서 관리하는 것이 직교성이 있다고 얘기할 수 있습니다. 세 가지가 만나는 접점은 id 입니다.

이해가 좀 가시나요?

이럴 필요가 있는 것은 직교성이 무너졌을 때, 세 가지 코드는 뒤죽박죽 됩니다. 스타일 고치는데 Javascript 고쳐야하고, 동작을 고치는데, HTML과 CSS코드가 헤집어진다면 코드가 뒤섞여 있다는 뜻입니다.

휴~

어렵죠.

프로그래밍 코드의 영역에서도 마찬가지입니다. 비단 세 가지 축(3차원)만 있는 것이 아니라 다차원(Multi-demension)의 코드를 짤 때도 이런 컨셉으로 분리해서 짠다면 코드의 관리포인트를 분리해서 생각할 수 있습니다. 리팩토링이 바라보는 관점과 일견 같다고 할 수 있습니다.

관련 : Open/Closed Principle

참고: Working Effectively With Legacy Code, 285~286p
Working Effectively With Legacy Code 책을 다시 보기 시작했습니다.
이제 1/3 정도 읽었는데, 아주 벅찬 책입니다.

124페이지를 보면 다음과 같은 표현이 있습니다.

If we want to avoid talking to the database, we can subclass PermitRepository like this:
public class TestingPermitRepository extends PermitRepository {
...

심각하게 고민해봐야겠습니다.
내용의 일부는 Working Effectively with Legacy Code 에서 발췌했습니다.

시스템 소스 코드의 변경은 자주 일어나는 일입니다. 개발자에 따라서 두 가지 형태로 일이 진행된다고 하는군요.
  1. Edit & Pray
  2. Cover & Modify

첫번째 항목을 보면서 많이 웃었습니다. 심하게 공감을 했기 때문이죠. 수정하고 기도하는 자세로 소스코드의 변경 작업을 하는 부류가 대부분이라고 생각이 됩니다. 적어도 80% 이상의 개발자들이 해당되지 않나 개인적으로 추산해봅니다.

설명에서 이어지는 것은 열심히 포크로 이리저리 찔러본다고 합니다. 열심히 찔러 보고 그 다음에 기도를 드리는 것이죠. 아니, 기도 드리는 마음으로 이리저리 찔러보는 것일 수도 있겠죠. 盡人事待顧客(사람이 할 일을 다 한 후 사용자를 기다린다)이라고 할까요.

두번째 방법의 스타일은 이상적인 방법입니다. 그리고 마땅히 해야될 방법이기도 합니다. 커버라는 말은 공중곡예의 안전망을 친다라는 뜻과도 같습니다. 엄호사격을 영어로하면 Cover fire 입니다. 이때의 커버도 마찬가지이죠. 암벽등반을 하는 사람들 얘기를 들어보면 두 손 두 발 중에서 세 지점이 안정하다는 것을 확인하면 나머지 하나를 움직여서 나아간다고 합니다. 변경에 따른 사이드 이펙트를 줄이자는 것이지요.

마치 무협 판타지에서 나오는 결계(結界)를 치고 싸우는 것과 같다고 할까요.

사용자 삽입 이미지

image from: http://fireblood.egloos.com/1252976 

회귀테스트(regression test)가 가능한 테스트코드들이 필요하겠지요.
레거시 코드, 또는 레거시 시스템이라고 합니다.
요즘 보기시작한 책이 WORKING EFFECTIVELY WITH LEGACY CODE 입니다.
http://kangcom.com/common/bookinfo/bookinfo.asp?sku=200410110002
 
자바지기 박재성님의 블로그를 보고 부쩍 읽고 싶은 마음이 생겨서 구입을 했습니다. 원서라 조금씩 책장을 넘기고 있는데, 표현이 예술입니다. ^^; 구구절절이 제 마음을 후벼파는군요.

  • 누군가 나에게 맡겨놓은 코드
  • 자기가 직접 짜지 않은 누군가가 만들어 놓은 코드
  • 많은 의문의 그림자와 중압감을 내포한 코드
  • 얽히고 설킨, 아둔하게 짜놓은, 갈아엎고 싶지만 그럴 자신이 안 생기는 코드
  • 기능이라도 하나 추가할라치면 몇일 밤을 새게 만드는 코드
  • 도저히 손댈 수 없어서 팀에서 누구라도 나서지 않는 코드
  • 손대면 손댈수록 나락으로 빠져버리는 코드
  • 차라리 날 죽여줘 라고 절규하게 만드는 코드
  • 개선한다는 생각 자체에 몸서리 치게 만드는 코드

레거시 코드를 잘 묘사하지 않았나요.
책을 읽어가면서 요약해서 글을 올려보고 싶군요.
사용자 삽입 이미지

늪 괴물과 레거시 코드의 공통점


image from: http://wow.allakhazam.com/db/mob.html?wmob=766

+ Recent posts