2010년 1월 15일 금요일

이런 의사 보셨나요? 하우스!


얼마전에 헬스장에서 일이다.

런링머신위에  뛰면서  TV를 보는데   Fox 채널에  하우스 라는 괴짜 의사을 소재로 한
드라마가 하고 있는것이었다  [지금 전편을 구해 보는중이다]

내용을 보면 , 하우스라는 의사가   괴질에 걸린 환자를 , 디버깅?을 통해  환자의 진짜 병이 무엇인지
알아내 치료하는것이었다

마치 프로그래머가  전혀 예측 못하고  , 잡기 힘든  황당한  버그에 맞서 [꼭 멀티쓰레드 디버깅 같은 ]
디버깅 하려는 모습과 같은 모습인것이다

그는 병의 진짜 이유를 위해  병의 증세를 악화시키기도 하지만  병의 원인을  분할 정복시작하는 모습은
분야는 다르지만  대단히 뛰어난 프로그래머를 보고 있는듯한 착각마저 들었다
[ 칠판에 현재 증상으로 생길수 있는 병들을 모두 나열하고 하나씩 체크해 제거하는 방식이 그중 하나다 ]

하우스를 중심으로 의사들끼리 병의 원인에 대해 토론하는 모습도
버그의 원인에 대해 토론하는 프로그래머들과 다를봐 없는것이었다

어떨때는 병의 증상과 원인이 전혀 다르기도 하는데 ,
C언어로 비유 하자면 ,  
메모리를 잘못쓴 코드는 따로 있는데 단지 그 잘못된 메모리를 정상적으로 이용하는 코드에서
뻑이 나버리는 그런 어려운 문제인것이다
 
그런 문제는  디버거로 보더라도  문제의 원인을 제대로 알기 힘들다

대체로 포인터를 잘못 사용한게 원인인데 , 코드를 짠 사람이 포인터를 어떻게 사용하는지에 대해 체크해
원인을 찾는게 차라리 빠르다
[ 일단 무조건 멀티쓰레드로 돌아가는게 있으면 그것부터 끄는게 도움이 되기도 한다 ]
[혹 메모리 값이 변할때 break가 걸리게 하는 방법도 대안이 되려나?]

그것과 비슷하게   미스테리한 괴질에 대해
하우스는 환자의 몸상태나 증세를 보기보단 , 그의 환경 및 습관
어떤것을 숨기고 있는가를 살펴보기 시작한다

또한 환자나 보호자의 거짓말 혹은 실수의 여부도 집중 추궁하기도 한다.
그리고 거기서 단서를 얻는다
[ 거기서 환자나 보호자의  거짓말들은    프로그래머가 버그에 대한 어설픈 변명? 혹은 거짓말을
지어내는것과 같아 보였다 , 나 역시 버그에 당황하면 어설픈 변명을 늘어놓았던 기억이 난다 ]

심지어 불법으로 환자의 집에  부하?의사들을 침입시켜 , 환자의 현재의 증상이 아닌 , 환자의 환경을
체크하기도 한다

프로그래밍으로 따진다면
애초부터  그런 증세가 유발될수밖에 없는  잘못된 환경(설계)로 인한것인가를 따져보는것을 더 중히 여기는것이다

그리고 드라마 내내 자주 반전이 있는데 , 원인을 알아 치료약을 투여해 치료가 된것처럼 보이지만 결국
다른 증상이 생겨버리던가 , 같은 증상이 재발해버리는것이다

프로그래밍에서보자면 ...
우리가 버그의 원인이 되는 코드를 찾았고  그 코드를 수정해 버그를 고쳤다고 생각했지만
결국  버그가 재발하는 모습과 똑같았다 [진짜 버그가 아닌것이다]


뭔가 통하는게 있지 않은가?  


재밌는것은 죽은 사람도 살려 냈다는 소문난 명의 이야기에서도 비슷한것을 찾을수 있다

위나라의 임금이 편작에게 묻는다.
"그대 삼형제 가운데 누가 제일 잘 병을 치료하는가?

" 큰 형님의 의술이 가장 훌륭하고 다음은 둘째 형님이며 저의 의술이 가장 비천합니다.

임금이 그 이유를 묻자 편작이 대답한 내용은 이러했다.


"큰 형님은 상대방이 아픔을 느끼지 전에 얼굴빛을 보고 그에게 장차 병이 있을 것임을 알아서 그가 병이 생기기도 전에 원인을 제거하여 줍니다. 그러므로 상대는 아파보지도 않은 상태에서 치료를 받게 되고 따라서 그간 자기의 고통을 제거해 주었다는 사실을 알지 못합니다. 큰 형이 명의로 소문나지 않은 이유는 여기에 있습니다.

둘째는 상대방이 병세가 미미한 상태에서 그의 병을 알고 치료를 해줍니다. 그러므로 이 경우의 환자도 둘째형이 자신의 큰 병을 낫게 해주었다고 생각하지 않습니다.

그러나 나는 병이 커지고 환자가 고통속에 신음할 때가 되어서야 비로소 병을 알아 보았습니다. 환자의 병이 심하므로 그의 맥을 짚어야 했으며 진기한 약을 먹이고 살을 도려내는 수술도 했습니다. 그런데 사람들은 나의 그러한 행위를 보고서야 비로소 내가 자신의 병을 고쳐주었다고 믿게 되었죠. 내가 명의로 소문이 나게 된 이유는 여기에 있습니다."


여기서 큰형님의 치료를 보면 애초부터 버그를 유발하지 않겠끔 설계를 한다고 볼수 있겠다

코드 컴플리트(Code Complete)의 저자 스티브 맥코넬도 초보 프로그래머 시절에는  머리에 생각나는데로 짜다가
버그때문에 고생하였고, 중급 프로그래머로 올라오고 나서야  디버깅에 고수가 되었다고 한다
하지만 , 디버깅을 잘하는건 프로젝트을 성공하는데 큰 도움이 되지 않았다고 한다
디버깅을 아무리 잘해도 , 버그가 계속 나오는 구조라면 무슨 의미가 있겠는가?
아예 디버깅을 할 필요가 없는  즉  아예 버그를 유발할 가능성이 적은 설계를 하는게 최고였다는것이다.  

그래서 인지 설계에 통달하지 않으면 쓸수 없는  Code Complete라는 책을  내지 않았겠는가?

여담이지만 ,예전 해커 한분을 본적이 있는데 그는 코드를 짜면  코드를 짜는 그 순간 모든것이 컴파일 타임때
모든 논리가 완벽하게 정리되어야 한다고 생각하신분이었다 , 한마디로 디버거가 필요 없다는 것...
수학처럼 완벽함을 추구하는 분이었다 .   컴파일타임에 모든 물리적(?), 논리적 에러까지 이미 처리가능한 (믿기는 힘들었지만)

구루들은  대체로(?) 디버깅 자체가 필요없는 설계자인것이다

여기서 우리는 의학에서의  진단과  프로그래밍의 디버깅에서 통하는점을 찾을수 있었다
마치 건축과 프로그래밍의 설계와의 공통점을 찾는것과 비슷한 느낌인것이다 [디자인 패턴]

왠지 의학을 공부하고 싶은 생각마저 드는 이 드라마를 통해 무엇인가  배울수 있는 무언가를
찾을수 있을것만 같은 느낌이다 , 물론 재미와 감동 역시 빠질순 없다

아직 이 드라마를 보지 못햇다면 , 꼭 볼것을 추천한다
당신이 프로그래머라면   무엇인가 통하는 느낌을
받으리라......

여담으로

난 아직 버그를 유발하지 않을 최선의 설계는 알지 못하지만 assert로  인자 와 리턴 값 그리고
포인터 접근에 관한것 꼼꼼히 걸어둔다 , 최선의 설계를 알지못하면 이러한 방어적 프로그래밍이라도
잘해두는게 차선은 아닐까라는 생각도 해본다  


댓글 없음:

댓글 쓰기