일요일, 9월 09, 2007

[5부 8번 수필] 전산학과 교수에게 보내는 공개 편지

로버트 L. 글래스 큰 형님 의견에 따르면 전체 전산학이라는 범주에서 빠진 연결 고리 중 가장 중요한 요소는 바로 '소프트웨어 유지 보수'라고 한다. 실제로 대한민국 소재 4년재 대학교 전산학과나 컴퓨터 공학과에서 유지 보수를 정식 과목으로 택했다는 말은 아직 들어보지 못했다(혹시 누가 사례를 알고 있다면, 이 과목에서 배우는 내용과 과제를 보내주기 바란다).

대학교 때부터 유지 보수를 배워야 하는 이유는 소프트웨어 컨플릭트 2.0을 읽은 독자라면 이미 알고 있듯이

  • 유지 보수 업무는 소프트웨어 비용 중 40~80%를 차지한다.
  • 유지 보수 담당자는 자기 시간 중 75%를 제품 개선에 쏟으며, 15%만 버그 수정에 투입한다.(리처드 K. 불 "남들이 만든 버그를 수정하는 일은 소프트웨어 유지 보수 담당자 역할이 아니다. 우리(유지 보수 담당자)는 예의상 버그를 고쳐줄 뿐이다.
로 요약할 수 있다. 이렇게 중요한 유지 보수를 학교에서 다루지 않고 있다는 사실이 신기하지 않은가?

자, 그렇다면 말이 나온 김에 신기한 사실 하나를 더 짚고 넘어가자. 이 책을 번역한 역자가 생각하는 전산학 분야에서 가장 등한시되는 요소는 무엇일까? 바로 '디버깅과 성능튜닝'이다. 개발자 중 디버깅과 성능 튜닝을 하지 않는 행운아가 있을까? 하지만 '유지 보수' 과목이 개설되지 않았듯이 '디버깅 101'이라는 과목 역시 개설된 경우는 보지 못했다. 유지 보수 업무 중에 자기가 만든 코드 디버깅에 쏟아붓는 비율을 한번 따져보면 끔찍한 기분이 들 것이다. (개인 차원이 아니라) 학교나 회사에서 제대로 된 '디버깅'에 대해 별반 신경쓰지 않는 이유를 알고 있다면 바로 댓글 부탁드리겠다.

"소프트웨어 컨플릭트 2.0: 시대를 뛰어넘는 즐거운 논쟁" 역자 박재호 올림

라벨:

목요일, 6월 14, 2007

[2부 6번 수필 추가] 소프트웨어 유지보수는 해결책이지 골칫거리가 아니다

네, 이미 박재호님께서 짚고 넘어간 글, 또 뒷북입니다. :-)

저자는 유지보수에 인력을 투입하는 방식이 변해야 한다며, 구체적인 해결 방안 네 가지를 제안합니다. 그런데 개인적으로는 그 네 가지도 여전히 조금 추상적이라 여겨집니다. 그래서 오늘은 원론적인 이야기보다 제 경험을 이야기하겠습니다.


제가 처음 일했던 소프트웨어 회사는 거의 천만줄이 되는 소스 코드를 매일 밤마다 빌드할 정도로 소프트웨어 규모가 컸습니다. 몇 백명이나 되는 개발자들이 소프트웨어 하나에 매달려 일했었죠.

첫 서너 달 동안 제가 한 일은 고객이 요청한 버그 수정, 즉 유지보수 작업이었습니다.

먼저 기술 수석이 각자 짠밥에 맞게 버그를 할당합니다. 그럼 할당받은 버그를 들고 가장 먼저 기술 수석을 찾아가죠. 처음에는 문제가 도데체 무슨 말인지부터, 어떻게 재현하는지, 어떻게 디버깅하는지, 어디를 어떻게 고쳐야하는지, 일일이 기술 수석을 찾아가 꼬치꼬치 물어야만 합니다. 하나도 모르니까요. ^^;;

여차저차 코드를 고친 다음에는 기술 수석에게 코드 검토를 받고, 기술 수석이 승인하면, 고친 코드와 관련되는 테스트 케이스를 돌립니다. 여기까지 다 통과하면 소스 코드 관리 시스템에다 넣습니다.

점차 익숙해질수록 할당 받는 버그도 복잡해집니다. 이제는 기술 수석만이 아니라 여기저기 '핵심' 개발자들을 찾아서 회사 안을 헤맵니다. '이 부분은 누구한테 가봐라' 혹은 '지금은 회의있으니까 30분 후에 보자' 이런 소리도 많이 듣죠. 부끄럽다고 대충 넘어가면 문제를 해결 못하니까, 납득할 때까지 캐물어야 합니다. 질문하는 만큼 배우니까요.

그러다보면 점차 다른 개발자를 찾아가는 횟수도, 엉뚱한 개발자를 찾아다니며 헛걸음하는 횟수도, 전혀 상관 없는 질문을 던지는 횟수도, 함께 문제를 의논하는 시간도 줄어듭니다.

반면 혼자서 해결하는 문제 수가 늘어납니다. 전체 아키텍처도 조금씩 머리 속에 들어옵니다. 코드를 열심히 뒤지다 보니 회사에서 사용하는 구현 관례에 익숙해집니다. 생판 처음보는 남의 코드를 빨리 이해하는 눈도 생깁니다. 우리 팀과 관련 있는 '핵심' 개발자들과도 친해집니다. 그렇게 저는 신참 때깔을 조금씩 벗었습니다. 지겨웠다기 보다는 재미나고 신선한 시간이었습니다. :-)

아, 그렇다고 유지보수 업무에서 완전히 손을 떼지는 않습니다. 프로젝트 일정에 따라 수위를 조절할 뿐 유지보수 업무는 개발 업무와 마찬가지로 모든 팀원이 기본적으로 '해야할 일'이었습니다. 신참이었을 때 가장 많은 시간을 투자했죠.

참고로, 회사 내 모든 고참 개발자는 자기 시간에서 10-30%를 멘토링/컨설팅 시간으로 할당했습니다. 전체 아키텍처를 잘 아는 사람일수록 (어쩔 수 없이) 많은 시간을 컨설팅에 쏟았습니다.


신참이 유지보수 업무를 수행할 경우 장점이 많습니다. "신참에게 유지보수 업무를 맡긴다"에서 문제점은 "신참"이 아니라 "맡긴다"에 있다고 생각합니다. 유지보수 업무는 아키텍처를 잘 아는 고참이 "책임"져야 합니다. 신참이 코드를 구현하더라도, 책임자가 전체 아키텍처에 어긋나지 않도록 방향을 잡아주고 코드를 검토해야 합니다. 그러다 보면 고참은 자연히 신참을 이끄는 멘토 역할도 하게 됩니다. 경력 있고 실력 있는 개발자에게 멘토 역할은 참 보람된 일이죠. 경력 있고 실력 있는 개발자로부터 지식과 기술을 전수받는 경험도 참으로 즐겁죠.

유지보수 업무, 어차피 해야할 일이라면 잘 활용해서 여러 마리 토끼를 한꺼번에 잡으면 어떨까요?

"소프트웨어 컨플릭트 2.0: 시대를 뛰어넘는 즐거운 논쟁" 역자 이해영 올림

라벨:

일요일, 5월 06, 2007

[2부 6번 수필] 소프트웨어 유지보수는 해결책이지 골칫거리가 아니다

소프트웨어 컨플릭트 2.0에서 가장 공감이 와닫는 수필을 하나 골라보라고 하면 이번에 소개하는 2부 6번 수필을 결코 빼놓을 수 없다. 대다수 높으신 분들이 매일 역정을 내며 소프트웨어 유지보수에 들어가는 비용을 아까워하는 현실에 비춰볼 때 _해결책_이라는 시각으로 소프트웨어 유지보수를 바라보는 로버트 L 글래스 큰 형님은 보통 사람이 아니다.

로버트 L 글래스 큰 형님께서 바라본 유지보수 특성은 다음과 같다.

  • 지적으로 복잡하다. 유지보수 담당자에게 극심한 제약이 가해지는 가운데에서도 창조력 발휘가 필요한 작업이다.
  • 기술적으로 어렵다. 유지보수 담당자는 개념, 설계, 코드를 동시에 다룰 줄 알아야 한다.
  • 불공평하다. 유지보수 담당자는 항상 무언가 부족하다. 예를 들어 우수한 유지보수 문서가 없다.
  • 성공이 없다. 유지보수 담당자는 항상 문제가 있는 사람을 만난다.
  • 지저분하다. 유지보수 담당자는 세세한 구현까지 지저분한 수준에서 일해야 한다.
  • 과거에 산다. 분명 코드는 누군가 구현에 능숙해지기 전에 작성했다.
  • 보수적이다. "긁어 부스럼 만들지 말자"라는 좌우명을 따른다.

그리고 페이지 존스 큰 형님에 따르면 소프트웨어 유지보수는 전체 소프트웨어 개발 생명주기 비용에서 2/3을 차지하는 어마어마한 작업이라고 한다.

상황이 이러하니, 유지보수를 대부분 어리버리한 신참이나 개발에 능숙하지 않은 사람에게 맡긴다. 대다수 사람들이 창의력을 발휘하기 어려운 유지보수보다 개발을 선호하기 때문이다. 결국 가장 능력이 떨어지고 가장 수요가 낮은 인력이 유지보수를 담당하니 소프트웨어 유지보수가 아직도 이 모양 이 꼴을 못벗어난다. 하지만 유지보수가 오류 수정(17%)보다는 개선(60%) 작업 비중이 훨씬 높기 때문에 제대로 된 유지보수 없이는 제대로 된 소프트웨어 개발도 없으며, 유지보수가 소프트웨어 부문에서 가장 어려운 작업이므로 상식에 반하게 최고 인력을 투입해야 한다.

결국 유지보수, 아니 소프트웨어 개발을 제대로 하기 위해서는 유지보수를 바라보는 시각을 바꿔야 한다. 누군가 유지보수에 대해 색안경을 끼고 있다면 벗긴 다음에 인정사정 보지말고 망가뜨려 버려라.

"소프트웨어 컨플릭트 2.0: 시대를 뛰어넘는 즐거운 논쟁" 역자 박재호 올림

라벨: ,

일요일, 4월 15, 2007

[2부 5번 수필] 소프트웨어 품질과 소프트웨어 유지보수 사이의 관계

로버트 L. 글래스 큰 형님에 따르면 소프트웨어 품질이 우수하기 위한 속성이 일곱 가지있다고 한다.

  • 신뢰성(reliability)
  • 효율성(efficiency)
  • 인간공학(human engineering)
  • 이해 용이성(understandability)
  • 수정 용이성(modifiability)
  • 테스트 용이성(testability)
  • 이식성(portability)

여기서 제시한 일곱 가지 속성 중에 소프트웨어 유지 보수와 관련이 있는 항목이 대부분이다. 이해 용이성, 수정 용이성은 당연히 유지 보수와 직접적인 관련이 있는 항목이며, 소프트웨어가 실패하지 않고 제 기능을 수행해야 한다는 신뢰성과 소프트웨어가 시간/공간 자원을 최소로 사용해서 동작해야 한다는 효율성, 소프트웨어 테스트가 쉬워야 한다는 테스트 용이성, 소프트웨어를 쉽게 사용하도록 만들어주는 능력인 인간 공학, 다른 컴퓨터나 환경에서 소프트웨어를 사용하게끔 만드는 이식성 모두 유지 보수 담당자가 머리를 싸매는 항목이다.

자, 그렇다면 소프트웨어 품질을 높이려면 가장 좋은 방법은 무엇일까? 상기 일곱 가지 항목을 생각해보면 대답이 바로 나오지 않는가? 바로 '유지 보수'를 제대로하는 방법이다. 유지 보수가 3D 중의 3D로 계속 남아있으며, 애물단지로 취급되는 현 상황에서는 절대로 소프트웨어 품질을 높이지 못한다. 따라서, 소프트웨어 품질 운운하면서 유지 보수에 형편없는 인력을 투입하는 관리자를 항상 경계하기 바란다. 실제로는 소프트웨어 품질을 높이고 싶은 생각이 전혀 없음을 에둘러서 표현했을 뿐일테니까.

"소프트웨어 컨플릭트 2.0: 시대를 뛰어넘는 즐거운 논쟁" 역자 박재호 올림

라벨: ,