2010년 4월 19일 월요일

스파르타쿠스 시즌1(망할!) 13화

한 시즌으로 끝맺지 않고 시즌 2로 넘어가디니 너무합니다.

계속 전개가 느리다가 13화에서 갑자기 초고속으로 후르릅챱챱 해치우는걸 보니 뭔가 이상한 느낌이 드네요. 얘들 원래 한 시즌 20화 정도로 계획해놨다가 반응이 괜찮으니까 시즌 늘려보려는 것 같습니다.

그래도 시즌 3까지 가지는 않겠죠? 뭐..몇 개월 내로 다 죽고 끝날테죠. 아무리 디테일하게 들어가도 뭐..

시즌 2 기다리기 힘들 것 같습니다.ㅠ 시즌 1을 다시 보며 기다리자니 두 번 볼 작품은 아닌것 같고..흑

2010년 4월 14일 수요일

정적분석 = 냄새 맡기

작은 개인 프로젝트에 CI를 적용해 보며 자연스레 떠오르게 되는 생각이 있네요. 정적분석이란 코드 냄새맡기를 자동화 해주는게 아닐까 하고요.

CI 도입이 그닥 간단한 일은 아니기에(공부할게 얼마나 많던지;) ant 빌드 스크립트를 작성하는 것 부터 시작해서 조금씩 도입 수준을 높여가고 있습니다. 아직 CI 툴은 도입하지 못하고 빌드 스크립트를 계속 확장하고 삽질하고 다듬고 있습니다. 프로젝트의 한 부분이 완성될 때마다 잠시 멈춰 CI 진도를 나가는 거지요.

코드 정적분석 툴을 도입해 보려고 이것저것 찾아보는데 문득 드는 생각이 정적분석은 리팩토링을 위한 냄새맡기가 아닐까 였습니다. CPD 같은 경우에는 복사/붙여넣기 한(중복된) 코드를 찾아주지요. 마틴 파울러는 그의 책 리팩토링에서 중복된 코드를 악취 퍼레이드의 일등으로 꼽아놓았습니다. 이런 중복된 코드를 치유하기 위한 적당한 리팩토링은 Extract Method, Pull Up Method, Extract Class와 같은 것들이 있지요. 순환 복잡도를 계산해주는 툴도 있습니다. 순환 복잡도가 높으려면 아무래도 긴 메소드가 되기 마련입니다. 역시 리팩토링 대상이 됩니다.

그 외에도 코드 속 나쁜 냄새로 지적되는 긴 파라미터 리스트(CheckStyle로 찾을 수 있겠죠?), 확산적 변경 등도 많은 부분은 정적분석을 통해 찾아낼 수 있는 것 같습니다.

리팩토링 공부하면서 느꼈던게 '나쁜 냄새' 맡는 부분이 가장 어렵다는 것이었습니다. 코드를 읽는다는 것 자체가 쉬운 일이 아니니까요. 그런 걸 도와줄 수 있는게 정적분석 도구들인 것 같습니다.

2010년 4월 13일 화요일

긍정적 피드백

지속 가능한 관계의 핵심은 '긍정적 피드백'이 아닐까요? 오늘 출근길에 오징어가 되어가며 그런 생각을 해봤습니다.

연애도 결혼도 가족도 '긍정적 피드백'이 있어야 건강한 관계가 생기는 것 같아요. 그런것..같아요. 다들 아는 얘기아닌가;;

2010년 4월 8일 목요일

테스트의 레벨

 보통 회사에서 테스트를 3가지 정도의 레벨로 구분하여 다루곤 합니다. 첫 번째로 개발자 테스트, 산출물도 작성하게 되는 단위 테스트 그리고 시스템의 최상위 수준(UI)부터 최하위 수준(데이터)까지를 다루는 통합테스트가 있습니다. 그런데 막상 테스트를 하자면 다 그게 그겁니다. 구현된 시스템 자체도 정확히 레벨을 구별할 수 없는데 테스트라고 구분할 수 있을리가 없기 때문입니다.

 예전에 학교 홈페이지 개발실에서 일할 때는 주로 PHP나 ASP로 프로그래밍을 했습니다. 작은 단위의 시스템에 적용할 수 있는 가장 가벼운 개발 방법인 model-1으로 말이죠. 하나의 php 함수에서 파라미터 처리와 데이터 조작, 출력화면 구성까지 모든 걸 다 합니다. php 프로그램의 가장 작은 단위를 함수로 생각해 본다면 기능 단위와 구현 단위가 함수 하나로 동일한 경우이죠. 단위 테스트와 시스템 테스트를 거의 동일하게 화면에서 버튼을 눌러보고 반응을 살펴보는 방식으로 하게 됩니다. 구현의 최상위 수준(UI)부터 최하위 수준(데이터)까지 버무려져 있다고 볼 수 있겠습니다.

 출근길에 지금 만들고 있는 애플리케이션에 어떻게 자동화 테스트를 할까 고민하다가 저런 생각이 들었습니다. CI 책에서의 가르침에 따르자면 단위 테스트는 (자바를 기준으로) 최소한의 의존성을 가진 클래스 단위로, 단위 테스트의 상위 레벨인 컴포넌트 테스트는 아직 어떤건지 감이 오지 않습니다. 시스템 테스트는 최상위~최하위, 외부 의존성까지 포함하여 테스트하는 것이라고 합니다.

 결국 구현하려는 시스템을 어떻게 나누고 구성하는지에 따라서 테스트할 수 있는 방법도 결정된다고 생각해 볼 수 있겠습니다. 구현 단위를 명확히 구분할 수 있고 시스템의 계층화가 잘 되어 있다면 테스트를 구성할 수 있는 방법도 역시 다양하고 보다 쉽게 자동화시킬 수 있을 것입니다.

 어떻게 시스템을 구성해야 할까? 는 별도의 문제인 것 같습니다. 그것에 대한 용어도 많고 조언도 많고 방법도 많습니다. 나중에 직접 체험해 보며 따로 다뤄보겠습니다.

2010년 3월 29일 월요일

TDD의 조언들

제가 개발하는 시스템에 TDD(테스트 주도 개발)와 CI를 꼭 적용해 보고 싶습니다. TDD로 이뤄줄 낼 수 있는 객체지향성과 테스트 자동화가 시스템 개발에 큰 도움이 될 수 있다고 생각하기 때문입니다. 이번에 XUnit Patterns를 구매하여 공부할겸 TDD책을 다시 보며 기억을 상기시키고 있습니다.
TDD라는 것이 하나의 방법론인 만큼 그것에 대한 지식만큼 Practice도 중요한 것 같습니다. TDD를 적용해 보고 싶은데 뭔가 잘 안된다면 이런 조언들이 도움이 될 것 같아서 정리해 봅니다.
  • 격리된 테스트 (TDD 재출간판 페이지 206)
    • 테스트간에는 서로 영향이 없어야 한다. 테스트를 전체 애플리케이션으로 하는 것보다 좀 더 작은 단위의 스케일로 한다.
    • 테스트를 격리하기 위한 노력은 결과적으로 응집도는 높고 결합도는 낮은 디자인으로 이끈다.
  • 테스트 목록(p.208)
    • 시작하기 전에 작성해야 할 테스트 목록을 적어보자. 너무 많아질 수 있으니 몇 시간 내로 해결할 것으로 제한하자.
    • 너무 많은 것을 한번에 통과시키려고 하지 말자.
    • 리팩토링이 필요한 것들도 적어놓자.
  • 단언 우선(p.211)
    • 테스트를 작성할 때 단언(assert)을 제일 먼저 쓰고 시작하자.
    • 단언 우선은 '올바른 결과는 무엇인가?', '어떤 식으로 검사할 것인가?'에 집중하게 해준다.
  • 테스트 데이터(p.213)
    • 읽기 쉽고 따라가기 좋은 데이터를 선택하자.
    • 실제 데이터를 구할 수 있다면 사용하자.
  • 한 단계 테스트(p.217)
    • 다음 발 내닫기. 작성된 테스트 목록에서 다음 대상을 고를 때는 새로운 무언가를 가르쳐 줄 수 있으며, 구현할 수 있다는 확신이 드는 것으로 한다.
  • 시작 테스트(p.219)
    • 당신에게 뭔가 가르쳐줄 수 있으면서도 빠르게 구현할 수 있는 테스트를 선택하라.
  • 싸구려 책상, 좋은 의자(p.228)
    • 에어론 의자(Aeron chair)를 구해라.
여기까지 책에서 제공된 TDD에 관한 일반적인 조언이었습니다. 실제적인 내용들은 직접 해보며 그때그때 올리겠습니다.

5주년 4/3일 + ... 캠핑카 여행

2010년은 5번째 4/3일 입니다. 렁사와 저의 기념일이죠. 실제로 5번째는 아니고 날짜를 지정하고 기념한 걸로 계산하면 두 번째구요.
다음 주 주말(4월 3일)에 렁사 + 정여사 + 나 는 동해 망상해수욕장에 있는 오토캠핑장으로 캠핑 아닌 캠핑을 가기로 했습니다. 몇몇 안 좋았던 일도 정리하고 맛난 것도 먹고, 캐러밴 체험도 할겸 해서요. 사실 기념일에 놀러갈 계획은 아니었는데 어떻게 일정이 저렇게 나왔네요. 기념일도 함께 챙겨야 할지 고민입니다.
  • 캠핑카에 대해서는 이전부터 관심이 있었고, 여행 사전조사를 하며 더 알게되고 놀란 사실은 캠핑 관련 사업이 굉장히 번창하고 있다는 것입니다. 한국일보의 기사에도 요즘의 캠핑 열기에 대해서 다룬 걸 봤었지만 막상 예약하려고 했더니 다음 달 예약이 종료되어 있던 것입니다. 원래 자라섬오토캠핑장에서 캐러밴을 예약하려고 했었는데 말이죠. 이렇게 사업이 잘 되는 걸로 봐서는 캠핑 앱을 개발한다던가 돈벌이 대상 목록에 추가하는 것도 괜찮을 것 같습니다.
  • TBS 애청자로서 기억하는 공익광고 중에 '자연을 찾아 나서는 우리는 방사능이나 .. 보다 자연에게 무서운 존재일 수 있습니다.'라는게 있었습니다. 캠핑, 좋지만 깔끔하게 해야겠다고 마음먹었습니다.
  • 일정을 간략히 짜봤는데 역시나 먹고 노는게 다였습니다.
직딩들이라 일하자고 바쁜 가운데 재미있는 여행이 되었으면 좋겠습니다. 다녀와서 후기 남길께요.

2010년 3월 22일 월요일

최근 구매한 도서 목록..

아 그나저나 광화문 교보가 4월부터 5개월간 휴업한다니 참 아쉽습니다. 괜찮은 놀이터였는데 말이죠. 지난 주 금요일 교보문고 바로드림 서비스로 구매한 책까지 해서 최근에 구매한 책들의 목록입니다.
  • 섹스의 진화 : 제러드 다이아몬드(Jared Diamond)가 쓴 책입니다. 그가 쓴 다른 책인 총, 균, 쇠를 읽고 반하여 구매했습니다. 제목부터 노골적으로 저런 단어를 쓴다는건 야한 책이 아니라는 증거입니다. ㅎㅎ
  • 리팩토링 데이터베이스 : 리팩토링 이라면 외부(인터페이스)를 그대로 유지한 체 내부를 재구성하는 방법인데요. 제가 참여한 몇몇 프로젝트에서는 데이터베이스가 변경되면 구현된 코드와 기능들이 송두리째 깨져버리는 일일 종종 발생했습니다. 이런 풍지박산 없이 데이터베이스를 바꾸려면 어떻게 해야할지 배워보려고 구매했습니다. 역시 최근에 구매한 Continuous Integration에서 언급된 책이기도 합니다. 이것도 Martin Fowler Series 인데 정말 이 시리즈의 모든 표지에는 다리(bridge)가 있네요..
  • xUnit 테스트 패턴 : TDD를 좀 더 적극적으로 도입하고 싶은 마음에 어떻게 하면 jUnit을 더 잘 쓸수 있을까 하는 고민에서 구입하였습니다. 폭력적인 두께에 겁이 좀 나기도 합니다. 하지만 그만큼 더 상세히 설명했겠죠?
  • 로마 황제 : 로마인 이야기 이후 역사에 문외한국(國) 무관심시(市)에 살던 제가 역사에 빠지기 시작했습니다. 구성방식이 독특한게 장점이자 단점인 것 같습니다. 지하철 도서할인판매하는 곳에서 샀어요.
  • 앨리스의 이상한 나라(?) : 영화 이상한 나라의 앨리스를 보고 나서 궁금해서 구입했습니다. 정말 이상하더군요! 근데 루이스 캐럴이 소아성애자였는데 진짜인가요?
  • 지속적인 통합 : 프로젝트의 삽질과 개노가다에서 벗어날 수 있는 길이 될 수 있을까요?
대략 여기까지가 올해동안 구매한 책의 목록입니다. 이상한 나라의 앨리스만 다 읽어봤네요 ㅋㅋ. 기록할 가치가 있는 것들은 읽고나서 꼭꼭 포스팅 남겨야지!