프로그래머를 위한 안전띠

spatialguy의 얼음집: “소년이여 신화가 되어라!“의 ruby on rails에서 test를 쓰지 않으면, 실제로 반도 안 쓰는 것 에서 트랙백.

요즘의 프로그래머들이 다뤄야하는 현실의 문제는 매우 복잡하다. 뭐하나 간단(?)한 것만 짜려고해도,

  • 네트웍 통신: 수많은 예외사항 (예기치않은 연결 종료, 과부하로 디바이스 드라이버 사망, DNS 주소 문제, 인터페이스 선택 문제)이 한 가득
  • 암호화된 통신: 민감한 정보나, “내가 누구다!“라고 주장하는 것에 대한 challenge등등
  • DB: 대부분의 시스템에는 보이던, 그렇지 않던 뒷단에는 거의 DB가 있다
  • 분산된 부하 관리: 한 두대의 머신으로는 보통 감당 안되는 부하들을 처리해야 한다

등등, 산적한 현실의 벽과 싸워야 한다. 그리고 발 한 번 헛디디면, 언젠가 터지는 버그가 안에 곱게(…) 자리잡게 된다.

이런 복잡한 프로그래밍 환경과 맞서는 방법으로 최근…이라기보단 이미 좀 된 과거부터 대세(…이 단어는 싫어하지만)가 된 것 중 하나인 테스트 주도 개발이다. 여기에서 사용되는 개념이,

  • 반복가능하고, 될 때까지(regression) 재실행되는 자동화된 테스트들
  • 자동화된 테스트들을 도와주는 프레임웍 — xUnit 처럼 테스트 준비(setUp), 실행, 종료 처리(tearDown)를 도와주는 것들. ((여기서 setUp/tearDown 되는 부분을 fixture라고 부르기도 한다)
  • DB나 네트웍 등을 테스트하기 쉽게해주는 가짜 디바이스 드라이버나 DB 테스트 유닛들
  • 특정 형태/순서로 값을 되돌려주거나 미리 입력된 상태로 반응하는 가짜 객체(mock-object)들

정도가 있다. Spat. 군이 언급한게 이런거고, 이런 안전띠(?)없이 프로그래밍 하는 일은 장인의 반열에 오르지 않고서야 쉬운 일이 아닐 거다. 비슷한 이유로 이클립스에는 대부분의 개발환경에서 xUnit 류를 실행하는 실행옵션들이 존재 한다 — 예를 들어 python 개발 환경인 pyDev의 실행 옵션은 python, pyUnit, jython 환경들이 있다. MS의 VS도 Team System 이상의 팩키지에는 테스트 용 환경들이 있고, 기업 환경급에서 널리 쓰이는 개발도구들은 이런 자동화된 각 여러 테스트 단계들을 잘 지원하는 것들이 여럿 나와 있다.

즉, RoR은 요즘 나온 환경이라서 저게 _보이기 쉬운 곳_에 있는 것 뿐이고, 현존하는 주요 언어들 — 한참된 C++부터, 몇 년 안된 python이나 ruby, C#에 이르기까지 — 은 TDD용 환경에 해당하는 test, testUnit, test-fixture, mock-object 같은 것들을 잔뜩 껴안고(?)있다. …다만 안 쓰는 사람들이 많은게 문제지 (…)

덤으로 소스 코드를 분석하거나, “이게 좀 이상한거 같다” 하는 식으로 보고하는 도구들 — covertura라거나 vtune이라거나 소스코드 복잡도 분석툴들 — 도 언어마다 잔뜩 있다. 그리고 이런 류의 툴은 사용자 수나 기업환경에서 많이 쓰이는 애들에 더 많이(비싼걸로) 존재하기도 한다…

ps. 덤으로 웹 응용 쪽에서 사용하는 breakpoint에 대한 얘기를 했는데, 이걸 데스크탑 응용이나 서버 응용 쪽에서 놓고 보면 코어 덤프, 로그 등등이 되겠지…