목요일, 6월 14, 2007

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

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

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


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

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

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

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

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

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

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

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

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


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

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

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

라벨:

월요일, 6월 04, 2007

[3부 1번 수필] 재사용: 소프트웨어 부품 - 노스텔지어와 데자뷰

소프트웨어 공장, 소프트웨어 재사용, 컴포넌트 기반 소프트웨어라는 용어를 전산 업계에 몸 담고 있는 사람들은 누구나 한번쯤 들어보았을 테다. 주기적으로 꼭 찾아오는 이런 유행이 어디서 시작되었는지를 알려주는 흥미로운 수필 한 편이 소프트웨어 컨플릭트 2.0에 실려있기에 무척 즐겁게 읽은 기억이 새롭다.

1950년대 IBM 컴퓨터를 다루던 개발자들은 난감한 상황에 직면했다. 요즘과 같은 막강한 프로그래밍 환경(다양한 잡지/책/논문, 소프트웨어 분리판매/끼워팔기)이 없었기에 프로그램 작성에 필요한 자료를 구할 길이 막막했기 때문이다. 이런 어려운 상황을 극복하기 위해 상부상조하는 정신에 입각해서 각 프로그래머들이 자신이 만든 소프트웨어 코드를 기부하고 문서화시켰는데... 바로 SHARE의 시작이었다.

SHARE는 당시 IBM 컴퓨터 사용자(프로그래머)들이 자발적으로 만든 사용자 그룹이다. SHARE에 속한 사람들은 자발적으로 소프트웨어 루틴을 기부해서 이를 라이브러리화시킨 다음에 원하는 사람이면 누구나 라이브러리에 들어있는 코드를 재사용하도록 환경을 조성해주었다. SHARE에서 가장 흥미로운 사실은 SHARE 라이브러리 명세를 보면 항상 만든 개발자 이름과 소속이 나와있다는 점이다. 가상 인터뷰에서 소개하는 대화 일부를 볼까?

로버트 글래스: "소프트웨어 부품이 도움이 되나요?"(코드에 책임을 지지 못한다는 면책 조항이 마음에 걸려서 근처에 있는 프로그래머에게 물어본다.) 프로그래머: "그럼요, 거의 항상. 정말 인정하기 싫지만, 코드를 읽어보면 제 실력보다 훨씬 뛰어납니다. 졸작을 SHARE에 기부하는 사람들은 거의 없습니다. 너무 위험하거든요. 누군지 금방 들통나죠."

잡지도 논문도 책도 없는 상황에서 그 당시 소프트웨어 개발자로 우뚝 솟으려면 SHARE 참여만이 명성과 특권을 누리는 지름길이었다. 한마디로 SHARE에서 명성을 쌓기 위해 개인적인 이기심을 최대로 발휘한 결과 이타적인 결과를 얻은 셈이다.

하지만 왜 SHARE라는 좋은 시스템이 죽어버렸을까? 바로 소프트웨어 제작이 복잡해졌기 때문이다. I/O나 수학 라이브러리 같은 루틴이야 SHARE로 충분히 버틸 수 있었지만, 운영체제와 같이 너무나도 복잡한 시스템은 SHARE와 같이 자발적인 참여만으로 진행하기에는 너무 덩치가 큰 소프트웨어였다. 결국 개발자들은 회사에 소프트웨어를 만들어달라는 압력을 넣었고, 여기에 굴복한 회사가 소프트웨어를 제공하기 시작하면서부터 SHARE는 서서히 와해되기 시작했다. 결국 수학 라이브러리와 같은 몇 가지를 제외하고는 소프트웨어 부품이라는 개념이 자취를 감추게 되었다. 오호통제라!

하지만 현대판 SHARE 프로젝트가 다시 한번 등장하기 시작했다. 바로 오픈소스 운동이다. 앞서 운영체제와 같은 복잡한 소프트웨어를 기업에 의존하기 시작하면서 SHARE라는 공동체가 붕괴되기 시작했다고 말했는데, 역설적으로 오픈소스 운동은 리눅스라는 운영체제가 갖춰지기 시작하면서부터 급속도로 팽창하기 시작했다. 전 세계에 흩어져 있는 개발자들이 자신의 이름이 리눅스 운영체제에 등장하기를 갈망하면서 자발적으로 각종 코드를 기부하기 시작했고, 운영체제를 넘어서 웹 브라우저와 같은 엄청나게 복잡한 응용 프로그램 개발도 이런 흐름에 동참함으로써 제 2의 SHARE 프로젝트 전성 시대가 열린 상황이다. 결국 문명의 발전은 자아 실현이라는 개인의 동기에 의해 움직인다는 사실을 다시 한번 확인해주었다.

로버트 L. 글래스는 이 수필을 다음과 같이 말하며 끝낸다.

1950년대에 일어났던 상황의 데자뷰이다. 과거에도 일어났으니 지금도 가능하다. 단지 그렇게 하기만 하면 된다.

정말 놀라운 통찰력이 아닌가?

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

라벨: ,