2009년 1월 13일 화요일

잔말 말고 시키는 대로 해

소프트웨어를 개발하는 현장에서는 매우 합리적인 척하는 가면을 쓰고 벌어지는 수많은 비 논리적인 판단과 결정을 자주 보게 됩니다.

약장사처럼 "이 약만 먹어봐 끝내줘!"부터 아주 사소한 이슈까지 정말 다양한 문제들이 비효율적으로 의논되고 합리적이지 않은 결정이 이루어 집니다.

물론 PI(Process Innovation)을 하다 보면 "잔말 말고 시키는 대로 해!"라고 하고 싶은 때가 종종 있습니다. 모든 이슈를 모두에게 합리적으로 납득시키고 이끌어가는 것이 오히려 비효율적이고 또는 거의 불가능할 때 이런 생각이 듭니다. 소프트웨어 개발에 관련된 이슈는 상대방과 반대의 생각을 가지고 끝까지 반박을 하면 끝도 없는 논쟁으로 빠뜨리는 것이 그리 어려운 일이 아닙니다. 물론 득도 없죠.

C가 좋나? C++이 좋나? 
CBD방법론이 좋나? OO방법론이 좋나?
Java냐? .NET이냐?
무슨 프레임웍을 써야 하나?
스펙을 자세히 적어야 하나? TDD를 사용해야 하나?
설계는 UML를 써야 한다. Use case를 그려야 하다.

이 중에 쉽게 결정할 수 있는 이슈는 하나도 없습니다. 
회사마다 비즈니스 상황이 다 다르고 고려해야 할 환경이 제각각이기 때문입니다.
암에 걸린 사람에게 내가 침 맞아서 나았다고 다른 암환자에게 침만 맞으면 낳는다고 하는 것처럼 위험합니다.

하지만 자신이 아는 것이 침술 밖에 없다면 또 침술로 먹고 살아야 하는 사람이라면 그렇게 침이 최고라고 주장을 하겠지요.

.NET위주로 개발을 한 개발자가 사내의 모든 개발이슈에서 자신이 아는 것이 .NET이라는 이유로 모든 관련 의사 결정에서 .NET으로 개발하도록 관철하는 것과 비슷합니다. 물론 그 이유로는 "내가 아는 것은 .NET밖에 없다"라고 하지는 않고 온갖 그럴듯한 이유를 대지만, 이미 마음을 정해 놓은 마당에 합리적인 결정은 물 건너 간 것이지요. 그로 인한 손해는 회사와 개발자들이 몇 년 후에 고스란히 감수를 하게 됩니다. 코딩 망쳐서 버그 잔뜩 만들어 낸것과는 비교과 안되는 막대한 비용을 치뤄야 합니다.

또 회사의 역량이나 환경이 다른데 특정 방법론을 무조건적으로 기계적으로 적용하는 것 또한 비슷한 경우입니다. 이 경우 과거처럼 주먹구구식으로 개발하는 것이 오히려 나은 경우도 많습니다.

본인이 뛰어난 개발자라고 생각한다면 또는 뛰어난 엔지니어가 되고 싶다면 고집은 필요하겠지만 아집은 버려야겠습니다. 그리고 합리적인 결정을 하는 훈련이 필요합니다. 이것이 개발자가 성장해나가는 필수 단계입니다.

2009년 1월 8일 목요일

VSS, CVS, SVN 비교

Google Trend에서 세가지 SCM(Software Configuration Management)의 경향을 살펴봤습니다. (아래 그림 참조)

CVS가 여전히 압도적인 우위를 점하고 있고, 상대적으로 SVN은 꾸준히 성장을 하고 있습니다. 물론 Google Trend가 실제 제품의 점유율을 보여주지는 않지만 그만큼 사람들의 관심사는 엿볼 수 있을 것 같습니다.
CVS의 감소는 SVN으로 대체되고 있는 듯 보입니다.
하지만 이렇게 더딘 이유는 CVS도 충분히 좋은 SCM이고 더 좋은 SCM이 나왔다고 함부로 바꿀 수 있는 것이 아니기 때문입니다.
물론 새로 시작하는 회사가 있다면 SVN을 쓰면 좋겠지만, 기존에 수년가 CVS를 쓰던 회사가 치명적인 문제도 없는데 SVN을 그냥 바꿀 필요는 없겠지요.



(3가지를 비교한 그래프입니다. SVN의 성장이 눈이 띕니다. 아래 Comment의 권남님이 제시한 그래프를 보면 SVN의 비율이 훨씬 더 높아지네요. 그리고 미국과 인도에서의 CVS 검색 비중이 아주 높고 나머지 나라에서는 SVN이 더 높은 나라가 많네요.)


(VSS는 점차 감소 추세입니다.)


(CVS는 약간의 감소추세이나 급격하지는 않네요)


(SVN의 성장 추세는 괄목할 만하네요)


제가 가장 오랫동안 사용한 SCM은 VSS입니다. 제가 사용한 VSS는 v6.0이었습니다.
물론 유료지요. 하지만 제가 종종 겪었던 가장 큰 문제는 깨지는 저장소였습니다. CS구조가 아닌 NFS 방식으로 파일을 공유하기 때문에 그런 문제가 있었던 것으로 생각합니다. 물론 VSS 2005에서 안정성(stability)를 향상하고 HTTP를 지원한다고 하지만 그 당시는 제가 SVN을 사용하고 있을 때라서 VSS가 얼마나 좋아졌는지 모릅니다. 혹시 최신 VSS를 쓰고 계신 분은 평가를 올려주시면 좋겠습니다.

하지만, 안정성이 가장 중요한 요소 중 하나인 SCM에서 자주 깨지는 저장소는 신뢰를 잃기에 충분했습니다. 
매일 백업을 받고 있었으므로 몇 시간 분량의 손실만 있을 뿐 복구는 할 수 있었지만, 개발 시간을 낭비하게 만드는 것은 아주 짜증나는 일이었습니다.

그리고 허약한 Branch기능은 부족한 기능 중에 하나였습니다.

그 뒤에 CVS를 거쳐서 SVN을 사용하게 되었는데, 제가 써본 SCM 중에서 최고는 SVN입니다.

VSS < CVS < SVN 이라고 생각합니다.

SVN은 일단 무료이며, 그 오랫동안 사용하면서 저장소는 단 한번도 깨진 적이 없습니다.
그리고 빠릅니다. 아무리 큰 디렉터리를 태깅하거나 브랜치를 해도 시간은 몇 십초 안 걸립니다.
CVS에서 엄청나게 큰 디렉터리 태깅하면서 기다려보신 분은 아실 겁니다.
그렇게 빠른 이유는 SVN은 기존의 SCM의 파일 시스템과 완전히 다른 방식을 사용하고 있기 때문입니다. 기존의 대부분의 SCM들이 RCS(Revision Control System)에서 기초한 파일시스템을 사용하는데 반해서 SVN의 파일시스템은 기존의 단점을 없애고 새로 만들었습니다. 즉 각 Revision의 Diff만 저장하는 방식입니다.
따라서 태그나 브랜치를 만들 때는 Diff가 없으므로 순식간에 이루어집니다.

그리고 SVN의 VSS와 비교한 장점 중의 하나가 협업이 훨씬 쉬워졌다는 겁니다.
SVN도 Lock기능이 있지만, 이걸 사용하지 않고도 협업에 문제가 없습니다. 왜냐하면 하나의 파일을 동시에 수정할 경우에는 Merge를 해주기 때문입니다. 이때 사용하는 3way Merge에 대해서는 제가 올린 글이 있으니 참조하세요.

기존에 VSS를 사용할 때는 물론 Multi-lock 기능이 있기는 하지만, 며칠씩 Lock을 걸어 놓고 풀지 않는 사람 때문에 보통 귀찮은 게 아니었습니다. SVN을 사용하면서 이런 문제는 싹 사라졌습니다.

VSS를 사용하면서는 IDE와 통합되는 기능이 왠지 멋져 보이고 매우 편리하다고 생각했었는데, SVN과 TortoiseSVN을 IDE와 별도로 쓰면서 불편하게 생각되어 본 적이 별로 없었습니다. SVN도 IDE와 통합해주는 Plug-in들이 있지만 이는 취향에 따라서 선택하면 되고 꼭 써야 하는 필수요소는 아닙니다.

결국 SVN의 빠른 속도, 안전한 저장소, 뛰어는 브랜치 기능, 머지기능 등은 저와 저희 팀이 즐겁게, 제대로 일하는데 많은 도움을 주었습니다.

누군가 새로 SCM을 사용하려고 한다면 SVN을 추천합니다.

2009년 1월 7일 수요일

하루에 몇 번 커밋하세요?

한 개발자가 하루에서 수도 없이 커밋(Commit)을 하고 있다면 소스코드관리시스템을 백업서버로 쓰고 있을 가능성이 높습니다.
사실 이러한 경우를 매우 자주 봤습니다.

혹시 코딩을 하다가 점심 먹으러 간다고 한번 커밋하고 중간 중간에 수시로 커밋을 하고 있으면 이건 좋은 방법은 아닙니다.
혹시 이런 방법으로 소스코드관리시스템(SVN, CVS, VSS, ClearCase 등)을 사용하고 계신지 확인해보십시오. 본인이 아니라도 이렇게 백업용도로 사용하고 있는 동료나 후배가 없는지 확인해보십시오.

커밋을 하면 소스코드의 Revision이 바뀌게 되는데, 각각의 Revision은 의미를 가지게 됩니다. 
그 의미가 "점심 먹으러 나가면서 임시로 저장" 이렇게 되면 곤란합니다.

각 Revision의 정보는 우리회사 개발의 역사로서 영원히 남게 되는데 그런 쓰레기 정보를 남기면 안되죠.
누군가는 각 Revision에서 바뀐 내용을 알기 위해서 Diff를 해볼 것이고, 이를 이용해서 Merge도 할 수 있고, 원 소스코드 작성자에게 내용을 물으러 올 수도 있습니다.

그래서 커밋(Commit)은 아무 때나 아무렇게나 하면 안됩니다. 각 회사마다 소스코드관리시스템을 사용하는 규칙이 필요하고, 이를 지켜야 합니다.
소스코드를 수정하기 위해서는 항상 버그ID(Issue ID)가 필요하며 그에 따른 수정 내용은 한번에 커밋을 하는 것이 바람직합니다. 그리고 커밋을 할 때는 회사의 규칙에 맞는 형식으로 Message를 남겨주어야 합니다. 이때 버그ID와 수정 내용 및 Peer Review(Desk check 정책을 사용할 경우)를 한 사람은 꼭 기록하는 것이 좋습니다.

이렇게 쌓인 소스코드관리시스템의 History와 마구잡이로 규칙없이 사용한 History는 나중에 그 가치와 활용도가 확연히 차이가 나며 개발 생산성에 많은 영향을 주게 됩니다. 

사소해 보이지만 쌓이면 정말 큰 차이가 나는 중요한 개발 규칙 중 하나입니다.

2009년 1월 6일 화요일

공사판 프로젝트?

가끔 소프트웨어 프로젝트가 공사판 같다는 얘기를 하는데, "공사판"이 들으면 기분 나쁠 수도 있겠습니다. ^^

요즘 빌딩 공사현장을 가만히 보면 깜짝 놀랄 때가 많습니다.
엄청난 규모의 빌딩을 만드는데, 사람을 그렇게 많이 보이지 않고 척척 빌딩이 올라가는 것을 보면 놀라움을 금할 수 없습니다.
모듈화된 건축방식, 자동화된 기계들, 전문화된 각각의 전문가들, 상세한 설계, 체계적이 프로젝트관리.
소프트웨어 개발과 사뭇 비슷하면서도 소프트웨어 개발 프로젝트가 공사판 같았으면 좋겠다라는 생각을 해보게 됩니다.

PS) 사실 소프트웨어 개발의 용어 중 상당부분은 공사 용어에서 왔습니다. 
프로젝트관리의 뿌리도 건축, 건설이죠. 


2009년 1월 2일 금요일

2009년 새해가 밝았습니다. - 개발자에게도 희망의 한해가 됐으면...

소프트웨어 개발자 여러분 무자년동안 수고 많으셨습니다.
기축년에는 하시는 일 모두 잘 되시기 바랍니다.

제가 처음 소프트웨어 개발일에 뛰어 들었을 때는 개발이란 사람들이 잘 모르는 "신기한" 직업 중에 하나였습니다.
재능이 있는 일부 특수한 사람들이 하는 일이 었지요.

그리고 한참 있으니, 20세기 말쯤 되나요? 최고의 선망의 직업이 되었습니다. 꾀죄죄하고 맨날 밤새면서 미래가 불확실해서 결혼을 하려고 해도 여자집에서 반대가 심했는데, 하루 아침에 최고의 신랑감이 되었었지요.

이것도 잠깐, 이제는 3D 직업 중 하나로 인식이 되어서 대학의 학과 중에서도 점점 인기 없는 학과가 되어가고 있는 것이 우리 S/W 업계의 현실입니다.

모든 것에 밝은 곳이 있으면 어두운 곳이 있지만, 20년도 안되는 시간에 참 많은 굴곡이 있었던 업계인 것 같습니다.

내려갈 만큼 내려갔으니 이제 올라가는 일만 남지 않았을 까요? 
한번에 좋아질 수는 없고, 또 옛날 같이 버블을 다시 기대할 수는 없습니다. 
맨날 밤새서 생활을 망가뜨리기보다는 정상적으로 일하는 방법을 익히고, 개발자로서 꾸준히 성장하는 방법을 배워야 겠습니다. 여러명이 모여서 효율적으로 프로젝트하는 법을 익히고, 훌륭한 개발문화를 다져가는 것이 길입니다.


제 블로그를 꾸준히 보고 계신 개발자 여러분, 감사합니다.
올해는 더욱 내실 있는 글로 여러분과 꾸준히 만날 수 있도록 하겠습니다.

2008년 12월 30일 화요일

소프트웨어는 소프트하지 않다.

소프트웨어는 손쉽게 수정할 수 있다고 생각하기 쉽습니다.
특히 고객이나 개발을 잘 이해하지 못하는 Sales part에서는 소프트웨어가 대단히 Soft해서 쉽게 주물떡 주물떡 해서 변경이 가능할 것으로 생각합니다.

하지만 무엇이 언제 수정되냐에 따라서 소프트웨어는 절대로 소프트하지 않습니다.
프로젝트 막바지에 요구사항이 변경되면 요구사항 분석 시 반영된 것에 비하여 수십배의 비용을 지불해야 합니다.

소프트웨어가 소프트하다고 생각하는 것은 비단 고객이나 Sales만이 아닙니다.
개발자들도 그런 생각을 하는 것을 종종 볼 수 있습니다.

개발자들은 자신이 뚝딱뚝딱 만들어 보고는 수정이 쉽다고 생각할 수 있습니다.
하지만 이는 간단한 프로토타입에 불과하고 실제 프로젝트나 제품을 만들 때는 사정이 달라집니다.
요구사항이 바뀌면 아키텍처가 바뀌어서 전체를 다 뜯어 고쳐야 할 수도 있습니다.

빌딩을 지을 때는 뼈대를 다 올리고 나서 이거 저거 뜯어 고쳐달라고 하지를 않습니다. 하지만 소프트웨어를 개발할 때는 다 개발해 놓고도, 부담없이 고쳐달라고 하는 경우가 비일비재합니다.

SW분리발주법이 이러한 부작용을 줄여 줄 수 있는 좋은 제도이나 아직 형식적인 가이드에만 그치고 있고 기업들은 얼마든지 이를 피해갈 준비가 되어 있습니다. 이렇게 후진적인 마인드가 결국 소프트웨어 업계를 공멸하게 만들어가고 있는데, 이 기형적인 소프트웨어 산업 구조는 쉽게 바뀌기가 어려운 상황입니다.

소프트웨어가 소프트하지 않다는 것을 우리 모두 인식할 때 조금씩 희망이 보이지 않을까요?

2008년 12월 26일 금요일

공든 탑을 쌓는 것은 수년, 무너지는 것은 한 순간



소프트웨어 개발 문화가 한 회사에서 제대로 정착하려면 수년이 걸립니다.
3년이 걸리기도 하고 5년이 걸리기도 합니다.

하지만 이것이 무너지는 데는 불과 몇 개월이 걸리지 않습니다.
손바닥에 올려 놓은 모래가 손가락 사이로 줄줄 빠져나가는 것처럼 허물어지는 것은 순식간입니다.

대부분의 이러한 개발 문화 와해는 경영층에서부터 시작됩니다.
 CTO를 잃거나, 회사의 경영방침이 완전히 단기적인 매출지향으로 바뀌면서 이러한 일들이 일어나곤 합니다.

수년간 키워온 남녀간의 사랑이 한 순간의 실수로 깨져버릴 수 있고, 이를 다시 회복하는 데는 오랜 시간이 걸리듯이 이렇게 와해된 개발 문화는 다시 일으키기가 쉽지 않습니다.

그만큼 소프트웨어 회사에서 경영층의 마인드가 미치는 영향은 큽니다. 
개발을 이해하지 못하거나, 이해하지 않으려고 하는 경영자는 단기적인 성과는 가능할지 몰라도 장기적 또는 Global한 성과는 기대하기 어려울 것입니다.

개발 문화는 쌓는 것만큼 지키는 것도 중요합니다.

이미지출처 : Microsoft Office Online