4. 프로그램을 쉽게 수정할 수 있다는 생각을 버려라
프로그램은 흔히 소프트웨어(software)라고도 불린다.
소프트웨어라는 말에는 '부드럽다', '고치기 쉽다',
'손에 잡히는 물건이 아니다'와 같은 다양한 생각이 녹아 있다.
다른 의미는 접어 두고 소프트웨어가 진정으로 고치기 쉬운 것일까?
집을 짓는 경우와 소프트웨어를 개발하는 경우의 절차는 무척 비슷하다.
설계도를 그리고, 자재를 매입하고, 기술을 동원하여 건축하는 행위는
소프트웨어 개발의 그것과 동일하다.
집을 지을 때에는 한 번 설계한 후에 짓기 시작하면 어지간하면 설계를
변경하지 않는다. 그런데, 소프트웨어를 개발할 때에는 설계도도 수시로
변경하고, 심지어 다 완성된 상태에서도 변경을 요구한다.
만약 집이라고 생각해보라. 벽체를 뜯어 내고 새 벽체를 세우는 것이
쉬운 일인가? 그런데, 왜 소프트웨어는 집의 벽체를 뜯어내는 것과 같은
작업을 쉽게 할 수 있다고 생각하는가?
소프트웨어라는 말 속에 숨어 있는 '고치기 쉽다'는 생각이 우리로 하여금
프로그램을 쉽게 고칠 수 있다는 편견을 가지게 하는 면이 있다.
그러나 결코 소프트웨어는 고치기 쉽지 않다.
프로그래머의 경험을 가진 사람이라면 누구나 인정할 것이다.
수백 줄이나 되는 프로그램의 논리를 바꾸라고 할 때,
화면 인터페이스를 바꾸라고 할 때, 네트워크 신호 처리 방식을 바꾸라고 할 때에 차라리 기존 프로그램을 버리고 새로 작성하고 싶은 마음이 간절하다는 것
을 그리고 실제로도 기존 프로그램을 수정하는 것보다 아예 새로 작성하는 편이 더 빠른 경우도 있다.
[그림3] 소프트웨어를 고치는 것은 집을 수리하는 것만큼 어렵다
여러 프로그램이 엮인 시스템 단위에서는 이런 문제가 더 심각하다.
작은 설계 변경이 시스템 전체에 영향을 미치기 일쑤이기 때문에,
한 번의 설계 변경으로 수일에서 수십일 때로는 몇 달의 공기가
늦추어질 수도 있다.
그동안 투입될 인력과 비용은 고사하고라도 제 때 마무리 되지 못한 프로젝트
는 대부분 실패로 끝난다는 점에서 보면, 설계 변경은 곧 프로젝트 실패로
이어진다.
그럼에도 불구하고, 프로젝트 매니저부터 일선 프로그래머까지 고객들이
설계 변경 요구를 할 때 쉽게 들어주고는 한다.
누구보다 프로그램 수정이 힘들다는 것을 아는 그들이 왜 건축가처럼
설계 변경을 단호하게 거절하지 못하는 것일까?
5. 새로운 기법을 도입할 때에는 신중히 하라
도끼를 아주 잘 다루어 나무를 잘 베던 사람이 한 번도 다뤄보지 못한
전동 톱으로 나무를 베야 한다면 어떤 문제가 생길까?
우선 전동 톱이 고장나기 일쑤일 것이다. 톱날이 부러지거나, 기어가 망가질
가능성이 높다.
그리고 나무는 제대로 베이지 않을 것이고, 전동 톱을 다루던 사람이 다칠
가능성도 있다.
생산성은 떨어지고, 문제는 더욱 커져만 갈 것이다.
물론, 시간이 지나면서 전동 톱을 다루는 법을 익혀 간다면 언젠가는
전동 톱을 다루는 편이 더 높은 생산성을 가져다 줄 것이다.
하지만, 지금 당장 나무를 베어야만 한다면 어떤 방법을 택할 것인가?
도끼인가, 아니면 전동 톱인가?
[그림4] 전동 톱을 서투르게 다루면 다치기 쉽다
열 중 아홉은 도끼를 선택할 것이다.
우리는 익숙한 것과 결별하는 것을 두려워해야 한다.
그렇다고 수구적인 태도를 가지라는 말은 아니다.
그러나 새로운 기술을 도입하는 데에는 학습하는 시간이 필요하다는 것을
잊지 말아야 한다.
만약 프로젝트가 새 기술을 제대로 학습하기 전에 끝나야 한다면 차라리
기존 기술을 그대로 사용하는 편이 났다.
4세대 언어들이 본격적으로 소개되던 시절에 많은 프로그래머들은
혼란에 빠졌었다.
어떤 프로그래머는 코볼이나 C 언어를 그대로 사용하였지만,
어떤 프로그래머들은 비주얼 베이직이나 4th Dimension과 같은
소위 4세대 언어들을 쉽게 도입하였다. 그 중에 일부는 성공하였고,
그 중에 일부는 실패하였다.
자바가 도입되던 시절에, 자바를 도입해 임베디드 프로그램을 작성하려고
했던 사람들 중 많은 사람들이 실패했지만,
웹 프로그램을 작성하려고 시도한 사람들은 대부분 성공하였다.
이런 현상은 오래 전에도 있었다. 구조화 프로그래밍 기법을 도입하던 시절에 그 도입을 서둘러 적용하려고 한 프로젝트는 실패했지만, 기존 프로젝트는 기존 방식 그대로 프로그래밍하면서 구조화 기법을 천천히 학습하게 하며 도입한 회사들은 대부분의 프로젝트에 성공하였다.
지금도 CBD나 CMM을 비롯하여 프로그램 작성과 관련된 다양한 기법이
소개되고, 다양한 도구(tool)나 언어들이 소개되고 있다.
새로운 기법들은 마치 우리에게 구세주인 것처럼 행세한다.
모든 프로젝트의 공정을 효율적으로 만들어주고, 납기 일정을 제대로 맞출 수 있으며, 프로젝트 비용을 대폭적으로 줄여준다는 장밋빛 환상을 보여준다.
그러나 새 기법이나 새 도구가 외우기만 하면 문제를 풀게 만들어 주는
주문이 아니다. 전동 톱처럼 위험한 물건이다. 배우는 데에 시간이 필요하고,
제대로 다루지 않으면 손해를 입힐 수 있는 것들이다.
새 기법이나 도구를 도입하기보다는 기존 도구를 개량하여 사용하는 것이
어떤 면에서는 더 생산적이다.
새 기법이 안착되기까지는 널리 알려지고 안정되었으며 도입하는 데에
시간이 걸리지 않는 기술을 사용하는 편이 더 바람직하다.
이런 면에서 보면, 코딩 스타일은 혁신주의자도 보수주의자도 아닌 개량주의자
라고 할 수 있다. 코딩 스타일은 우리에게 익숙한 언어를 그대로 사용하면서,
조금만 더 개량하라고 한다. 코딩 스타일을 익히고 적용하는 데에 오랜 시간이
걸리지 않는다. 어렵지도 않다. 안정된 기술이다. 그리고 입증된 기술이다.
그러므로 필자는 새로운 프로그래밍 기법이나 언어 또는 CASE와 같은 도구를
도입하기 전에, 먼저 코딩 스타일을 도입하고 교육시키며 지키게 하기를
권한다.
6. 'Run and Fix' 전략을 피하라
25년 전에 IBM은 프로젝트를 빨리 마치는 데에 중점을 두고 프로젝트를
진행한 결과로, 오히려 비용과 일정이 초과되기만 했다고
발표했다. 반대로 소프트웨어의 결함을 제거고 품질을 높이는 데에
힘쓴 프로젝트의 경우에는 오히려 일정을 맞출 수 있었고,
생산성도 높았다고 발표하였다.
서두르면 일을 망친다는 것은 누구나 아는 사실이다.
그럼에도 불구하고 여전히 많은 프로그래머들은 일정 단축의 미신에 사로잡혀
있다. 프로그래머들의 세계에서는 오히려 더 서둘러야 일을 성사시킬 수 있다는 미신이 존재하고 있다. 많은 프로그래머들은 프로그램을 작성하기 전에
충분히 생각하는 것을 귀찮아한다.
일단 프로그램부터 작성하여 결과부터 보려고 한다.
[그림5] 성급한 프로그래머
프로그램은 보이지 않는 추상적인 논리로만 만들어져 있기 때문에,
이 논리 만으로 결과를 예측하는 것이 힘들다는 것은 사실이다.
그래서 충분히 훈련되어 논리만으로 최종 결과를 머리 속에 그려 볼 수 있는
프로그래머가 아니라면, 일단 어떤 형태의 결과든 출력물의 형태로 그것을
확인해보고자 하는 것이 프로그래머들의 본능이다.
그렇게 해서 결과를 확인하면 문제가 확실하므로 고치면 된다고
[그림6] 눈으로 확인하고 나서야 오류를 발견하는 프로그래머
이것을 필자는 "코드를 작성하고 일단 실행하여 결과를 확인하고 고친다."
라는 행동 양식으로 규정한다.
영어로 'Run and Fix'전략(이하 RAF 전략)이라고 부를 수 있을 것이다.
이 전략은 소규모 프로그램이든, 대규모 프로젝트이든지 상관없이
아주 광범위하게 퍼져 있다.
그러나 이 전략은 전투에서부터 전쟁까지를 모두 실패로 이끈다.
[그림7] Run and Fix 전략
우선 소규모 전투부터 살펴보자. 1,000줄 이내의 작은 단위 프로그램을
RAF 전략에 따라서 작성한다고 가정해 보자.
처음 대충 코딩한 다음에 일단 결과부터 확인하려고 보면 온갖 컴파일 에러를 만나게 될 것이다.
보통 이런 경우 컴파일 에러는 수백 개에서 수천 개에 이른다.
이 컴파일 에러를 하나하나 수정하게 된다.
결국 컴파일 에러는 수백 개에서 수십 개 그리고 마침내는 수 개 이내로
줄어들게 된다.
그동안 프로그래머는 계속해서 코드를 수정하고 컴파일하고 에러를 확인해야 한다.
그런데 이런 'RAF 전략'을 쓰는 경우에 최종적으로 남은 몇 개 안 되는
컴파일 에러가 큰 문제가 되는 경우가 많다.
이런 에러들은 코드에서 쉽게 발견하기 어렵다. 결국 프로그래머는 코드를
작성하는 시간만큼 이 컴파일 에러를 잡아내는 데에 시간을 투자해야 한다.
[그림8] RAF 전략은 어리석은 짓이다
우여곡절 끝에 컴파일 에러를 다 잡아내어 'Compile Error :0, Warning Error:0'이라는 기쁜 메시지를 보게 되었다고 하자.
일단 이 상태에서 소스 코드는 실행 코드로 완전하게 바뀐다.
즉, 소스 코드가 실행 가능한 프로그램이 되는 것이다.
그러나 이제부터가 문제이다.
첫 실행 결과가 의도했던 대로 나타나는 경우는 극히 드물다.
화면에 출력된 데이터의 줄 간격이 안 맞을 수도 있고, 입력 데이터 검증을
제대로 처리하지 못하는 경우도 있을 수 있고,
아예 화면에 아무런 결과도 나타나지 않을 수도 있다. 심지어 'Run Time Error'라는 기분 나쁜 메시지만 보여 주고 프로그램이 종료되는 경우도 있다.
이렇게 실행시에 문제가 있으면 프로그래머는 다시 그 문제를 해결해야만
한다. 결국 코드를 수정해야 하고, 다시 컴파일해야 하고, 수정하는 도중에
실수하면 컴파일 에러를 다시 잡아야 하고, 또 런타임 에러를 잡아내야 한다.
그렇다고 한 번에 문제가 해결되면 다행이라고 할 수 있다.
'RAF 전략'을 사용하는 프로그래머들을 살펴본 결과,
이런 경우에 대부분 수회에서 수십회까지 이런 과정을 반복하는 것을 볼 수
있다. 결국 'RAF 전략'은 소규모 단위 프로그램에서조차 생산성을 헤치는
결과를 낳는다. 소규모 전투에서 패하게 된 것이다.
이제 대규모 전투 현장으로 가보자.
'RAF 전략'을 70% 정도의 팀이 사용한다는 믿을 만한 통계에 따르면,
거대한 시스템을 구성하는 단위 프로그램의 70% 정도는
'RAF' 전략에 따라서 만들어졌다고 추정해 볼 수 있다.
그런데, 단위 프로그램의 실행시에는 전혀 발생하지 않던 문제들이,
단위 프로그램들을 시스템적으로 엮어서 실행하게 되면 나타나게 된다.
어떤 단위 프로그램에서는 결과 값을 잘못 계산하기도 하고,
또 어떤 단위 프로그램에서는 부동 소수점 상의 계산 착오가 발생하기도 한다.
이런 '잠재된 문제'들은 통합 테스트 단계에서 많이 발견된다.
특히 'RAF 전략'을 사용하는 프로그램들이 이런 문제들을 발생시킨다.
결국, 통합 테스트에서 심각한 문제가 발견될 것이고, 시스템 단위로
대폭적인 수정 작업에 들어가야 할 것이다.
그러나 소규모 전투 부대들 즉, 'RAF 전략'을 사용하는 팀들이 여전히
존재하기 때문에 결국 대규모 전투 부대인 SI 업체나 프로젝트 담당 부서도
실패할 수 밖에 없게 된다. 모든 소속 소대의 70%가 전투에서 패배하는데,
사단이 전투에서 승리할 리 없는 것이다.
필자는 어떤 경우에라도 'RAF 전략'을 피하도록 권고한다.
만약 'RAF 전략'을 사용하는 프로그래머나 팀이 있다면,
아예 프로젝트 조직에서 제외하는 것이 좋다.
만약 제외할 수 없다면 'RAF 전략'을 사용하지 못하도록 하는 것이 좋다.
그렇다면 어떻게 해야 할까? 프로그램의 구상 단계에 투자하는 시간을 늘려라.
플로차트나 의사코드 등을 도입하여 프로그램의 논리를 충분히 구상해 보라.
종이에서 작업하는 시간을 컴퓨터에서 작업하는 시간보다 더 많게 하라.
사전에 프로그램의 결함을 예측하고, 그것들을 제거할 수 있는 방법을
찾아보라. 충분히 심사숙고한 뒤에 코드를 작성하라. 이것이 해결 방법이다.
필자는 이것을 'Fix and Run 전략(FAR 전략)'이라고 부른다.
발췌: 좋은 코딩, 나쁜 코딩: 읽기 쉬운 코드가 좋은 코드다
(한빛미디어, 8월 출간예정)
원문 : http://network.hanbitbook.co.kr/view.php?bi_id=981&pg=1
| |
'IT_etc > 유용한 전산 지식들..' 카테고리의 다른 글
무료 플래시 강좌~ (0) | 2007.02.13 |
---|---|
내 pc가 해킹 당하고 있는지 알아보는 방법과 예방법 (0) | 2007.02.13 |
컴퓨터 비프음 만으로 알수있는 컴퓨터의 오류 / 컴퓨터 에러 (0) | 2006.12.04 |
IT 서비스 관리의 4P (0) | 2006.08.22 |
전산 관련 사이트 링크 (0) | 2006.06.10 |