'오픈소스'에 해당하는 글 3건

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
얼마 전 분산 저장소에 대한 팀 내 관심이 뜨거웠다. 때마침 실험적 시도를 할 수 있는 작은 프로젝트를 진행하게 되었는데, 프로젝트 참여자들과 논의하여 Git 도입을 시도했다. Git을 사용해보며 여러 가지 요소를 평가 중인데, 그 중 개인적으로 관심이 있는 부분은 Git이 내가 일하는 환경의 어떤 부분을 향상시켜 줄 수 있느냐이다. 좀 더 나아가 SVN을 사용하고 있는 우리 회사가 Git으로 전환해야 하는지에 대해서도 관심이 있다.

1. Git의 특징

예전에는 중앙 저장소가 있고 모든 개발자가 중앙 저장소에 자신의 작업을 커밋했다. 반면 Git은 분산 저장소를 제공한다. 따라서 중앙 저장소가 있더라도 해당 저장소를 로컬에 복사(clone)하는 순간 로컬에 나만의 저장소가 생긴다. 따라서 예전처럼 원격 저장소에 영향을 미치지 않고 로컬 내에서 브랜치를 만들고, 커밋하고, 롤백하는 일 모두 가능하다. 

만약 중앙 저장소에 내 작업을 넣고 싶으면 어떻게 할까? 예를 들어 어떤 저장소를 로컬에 복사한다. 그리고 파일 하나를 수정한다. 원격 저장소에 변경사항을 반영(push)하려하면 변경사항이 없다고 나온다. 이는 예전과는 달리 사용자와 중앙 저장소의 입장이 아닌 로컬 저장소와 원격 저장소의 입장이 되기 때문에 발생하는 일이다. 즉, 로컬 저장소에 커밋을 하지 않았기 때문에 변경이 없다고 보는 것이다. 로컬 저장소에 커밋을 한다. 그리고 다시 변경 사항을 반영해본다. 이제서야  변경사항이 원격 저장소에 적용된다. 방금 얘기한 것이 Git의 가장 기본적 흐름이다.

2. 오픈소스가 Git으로 전환하는 이유에 대한 견해

오픈소스는 소수의 커밋터(Committer)와 다수의 공헌자(Contributor)로 구성된다. 커밋터를 제외한 공헌자는 익명으로 소스를 체크아웃하고 로컬에서 작업한다. 작업이 어느정도 완료되면 패치를 만들어 커밋터에게 적용을 요청한다. 이 모델은 대부분 오픈소스에서 사용하는 개발모델이다. 그런데 문제점이 있다. 바로 공헌자는 패치를 완료하기 전까지 SCM의 이점을 전혀 못 누린다는 점이다. 저장소가 없으므로 중간에 커밋을 할 수도 없고 롤백도 할 수 없다. 당연히 브랜치도 만들 수 없다. 따라서 어떤 공헌자가 한 프로젝트에 대해 여러 패치를 동시에 작업해야 한다면 이는 기존 SVN 환경에서 쉽지 않은 일이다. 

Git을 이용하면 방금 얘기한 문제가 해결된다. 중앙 저장소에 권한이 없더라도, 로컬에서 얼마든지 SCM의 장점을 누릴 수가 있다. 작업하다 잘못되면 롤백을 할 수도 있고, 몇 개 브랜치를 만들어 여러 패치를 동시에 작업할 수도 있다. 난 이런 이유로 오픈소스진영에서는 Git을 반길 수밖에 없다고 생각한다.

3. 그럼 회사에서도 Git이 필요할까?

Git에 대해 긍정적 의견을 내비치는 사람의 근거 중 하나는 오픈소스진영이 점차 Git으로 전환하고 있다는 점이다. 오픈소스 진영은 기술적 트렌드에 민감한 편이고, 오픈소스에 먼저 적용한 기술이 시간이 흘러 대중화되는 것은 매우 자연스러운 흐름이다. 그렇다면 회사에 Git을 도입하는 것은 어떨까? 난 아래 두 가지 이유로 신중한 접근이 필요하다고 본다.

첫째 회사는 오픈소스진영과 개발상황이 다르기 때문이다. 가장 큰 차이점은 오픈소스에는 흔한 공헌자가 없다는 것이다. 팀원 모두 커밋터고, 팀은 저장소 하나를 공유하며 함께 작업한다. 따라서 수정한 것이 있으면 바로 커밋을 하면 된다. 팀원 모두 커밋터로써 SCM의 장점을 충분히 누릴 수 있다.

둘째 지속적 통합에 대한 부정적 영향을 미칠 가능성이 있기 때문이다. 여럿이서 저장소 하나를 대상으로 함께 작업하다 보면 지속적 통합이 무척 중요하다. 다시 말해 동작하는 버전을 자주 커밋하는 게 강력히 권장된다. 이를 잘 지키면 다른 동료에게 빠른 피드백을 줄 수 있고, 통합 시점(보통 QA 혹은 배포 전)에 소스가 충돌이 나 소스를 급하게 수정하는 일도 줄어든다. 그렇다면 Git은 어떨까? 난 Git은 지속적 통합이 추구하는 바에는 잘 안 맞는 것 같다고 생각한다. Git은 로컬 저장소를 제공하기 때문에 로컬에서 커밋하고 롤백하며 작업할 수 있는 좋은 토양을 제공한다. 이로 인해 자주 통합하기보다는 소스를 로컬에 오래 가지고 있는 상황이 생기지 않을까라는 우려가 든다.

4. Git에서도 지속적 통합이 가능하다?

누군가는 이렇게 얘기할 수 있다. '로컬 저장소가 제공되는 Git을 쓰자. 그리고 예전처럼 자주 커밋하자. 예전과 다를 바가 없지 않나?' 그런데 여기 약간의 걸림돌이 있다. Git은 SVN, CVS와 달리 중앙 저장소에 바로 커밋할 수 없기 때문이다. Git은 로컬 그 자체가 저장소이기 때문에 우선 로컬 저장소에 커밋을 수행한 후에 로컬 저장소를 원격 저장소에 머지(push)하는 방식으로 통합한다. SVN, CVS를 사용할 때는 단순한 파일 하나를 수정할 때 커밋을 하면 끝이었다. 하지만 Git은 로컬 저장소에 커밋하고 원격 저장소로 머지해야 한다. 즉, 두 단계가 필요한 것이다. 별것 아닌 것 같지만, 개발자가 가장 많이 수행하는 흐름이 좀 더 길어진 것이다. 물론 두 단계를 한꺼번에 수행해주는 도구를 개발하면 쉽게 해결되는 문제이다. 하지만, 도구를 쓰는 단계까지 간다면 Git을 써야 하는 이유가 많이 퇴색되는 게 아닐까?

5. 커밋터에게 로컬 저장소가 필요한가?

앞서 소개했지만, Git의 가장 큰 장점은 로컬에 나만의 저장소를 둘 수 있다는 점으로 보인다. 그런데 과연 이 특성이 현장에서 얼마나 필요할까? 예전에 가끔 로컬에서 중간 중간 커밋하고 싶다는 생각을 한 적이 있다. 하지만, 당시 내가 그런 생각을 했던 이유는 지속적 통합을 하지 않고 있었기 때문이었다. 나는 소스를 광범위하게 고치고 있었고, 다음 수정에서 무엇인가 잘못되어 예전에 작업한 부분도 없어질까 봐 두려웠다. 하지만, 지속적 통합을 실천하며 다시 이런 생각을 한적은 없었다. 항상 동작하는 버전을 자주 커밋했다. 때로 1시간에 수십회를 커밋하기도 했다. 테스트가 통과하면 바로바로 커밋하기 때문이다. 

6. Git은 머지가 편하다?

가끔 Git과 같은 분산저장소를 사용하면 머지가 편해진다는 얘기를 듣는다. SVN에서 소스충돌은 다른 개발자가 같은 라인을 수정해서 발생하기도 했고, 어떤 때는 SVN의 오판으로 발생하기도 했다. 소스충돌이 일어났을 때 소스를 정리하는 작업은 정말 어렵고 힘들다. 따라서 Git이 머지를 편하게 해준다면 이는 큰 매력이다. 하지만 Git홈페이지(http://git-scm.com/about)를 보면 여러 장점을 소개하지만 머지에 대한 언급은 없다. 어디서 이런 얘기가 나왔는지는 모르겠지만, 확인이 필요한 부분 같다.

7. 결론

Git이 제공하는 가장 주요한 특징은 분산 저장소이다. 많은 오픈소스에서 Git을 잘 쓰고 있는 것처럼, 분명히 분산 저장소라는 특징이 빛나는 상황이 있을 것이라 생각한다. 하지만, 이 점이 Git으로 전환할 만한 충분한 이유가 될까? 난 아직 잘 모르겠다. 지금까지 내가 이해한 수준에서는 전환비용을 감당하면서도 넘어가야 할 이유를 찾기 어렵기 때문이다. 오히려 가뜩이나 잘 되지 않는 지속적 통합을 더 악화시키지 않을까라는 우려가 있다. 하지만 Git이 SVN 보다 머지기능이 탁월하다는 것이 밝혀진다면, 이는 Git으로 전환해야 하는 좋은 근거가 되리라 생각한다.

8. 참고

1) C와 같은 개발 환경에서는 Git이 지속적 통합에 해가 된다기 보다는 오히려 여러 장점이 있다는 의견을 담은 글
http://hyukhur.tumblr.com/post/4126008077/git-for-more-continuous-building 

2) 덧글 중 benelog님의 반대 의견도 참고

3) benelog님의 Git 유랑기 



WRITTEN BY
차민창
르세상스 엔지니어가 사회를 이끌어나가는 상상을 하며!

,
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
최근 대중들이 읽는 신문에도 오픈소스라는 말이 심심찮게 등장하고 있습니다. 따라서 IT업계에 종사하지 않더라도 교양 차원에서 오픈소스를 알고 있는 사람이 많아졌습니다. 그만큼 오픈소스가 사회적으로 가치를 인정받고 있다는 뜻일겁니다.

프로그래밍 전문 잡지에서는 오픈소스를 매우 상세하게 다루며, 많은 회사들은 오픈소스 도입을 적극적으로 추진하는 것으로 보입니다. 인터넷 개발자 커뮤니티에서도 오픈소스는 더이상 낯선 용어가 아닙니다. 누구나 오픈소스를 이야기하고 각자의 환경에서 활용하고 있습니다. 그렇지만 너무 오픈소스에 밝은 면만이 너무 강조되어 마땅히 경계해야 할 내용들이 무시되고 있지는 않은가 생각하게 됩니다.

저는 최근의 활발한 오픈소스 도입에 대해 가지고 있는 두려움이 있습니다. 그것은 '통제력 상실에 대한 두려움'입니다. 개발자는 코드집합에 대하여 깊고 넒은 범위에서 가능한 최대의 통제력을 가져야 할 의무가 있다고 생각합니다. 그런데 오픈소스를 도입하는 대개의 경우 통제력이 오히려 약화되는 것으로 보입니다. 이것이 바로 제 마음속에 있는 두려움의 원인입니다.

'코드에 대해 통제력을 갖는다'라는 말은 말 그대로 개발자는 코드를 통제할 수 있는 능력이 있어야 한다는 것입니다. 예를 들자면 코드를 수정할 때 수정되는 코드가 다른 부분에 미칠 영향을 파악할 수 있다면 코드에 대한 통제력이 있다고 얘기할 수 있을 것입니다. 다른 부분에 미칠 영향을 파악할 수 있다는 것은 해당 코드 집합의 전반적인 구조와 각 부분간에 관계를 알고 있다는 것을 뜻합니다.

그런데 위에서 오픈소스를 도입할 때 통제력이 오히려 약화되는 경우가 많다고 했습니다. 그 이유는 무엇입니까? 그것은 오픈소스를 도입하는 저를 비롯한 많은 사람들이 도입 후 오픈소스를 블랙박스 형태로 사용하기 때문입니다. 즉 내부의 전반적인 구조나 각 부분간의 관계를 모르고 그냥 필요한 기능을 호출하여 사용한다는 것입니다. 이것은 평상시에는 생산성이나 재활용 측면에서 매우 합리적인 방안일 수 있겠지만, 예외 상황시에는 얘기가 달라집니다. 예외가 발생하고 그 예외로 인한 문제가 생기면 빠르게 원인을 파악할 가능성이 줄어들기 때문입니다. 여기서 중요한 점은 문제의 원인을 빠르게 못찾음으로써 인해 발생하는 손실은 예상보다 훨씬 클 수 있다는 것입니다.

누군가는 문제가 생긴다 할지라도 오픈소스의 강점이기도 한 빠른 피드백과 누구나 참여 가능한 패치로 해결이 될 수 있다고 주장할지 모르겠습니다. 하지만 이것이 보증수표가 될 수는 없습니다. 내가 겪고 있는 문제가 다른 사람에게도 항상 함께 나타난다고는 볼 수 없기 때문입니다. 어쩌면 전세계에서 이 문제를 겪고 있는 곳은 여기 한 곳일지도 모르는 것입니다.

싸움에 나가는 병사가 나는 더 강한 검으로 싸우겠다며 평소에 쓰던 소검 대신 무거운 대검을 가져나갔습니다. 그런데 결정적인 순간에 대검을 빠르게 휘두르지 못해 적에게 목숨을 잃었습니다.  생명이 달린 그 중요한 순간 평소에 쓰던 소검을 사용했으면 오히려 적을 살상했을텐데 대검이 무거웠고 아직 완벽하게 통제하지 못했기 때문에 목숨을 잃는 안타까운 결과가 발생했습니다.

오픈소스 도입 역시 마찬가지라고 생각합니다. 통제할 수 있느냐와 없느냐는 결정적인 순간에 많은 차이를 낼 수 있습니다. 따라서 오픈소스 도입은 통제력을 갖추며 점진적으로 이루어지는게 좋다고 생각합니다.

WRITTEN BY
차민창
르세상스 엔지니어가 사회를 이끌어나가는 상상을 하며!

,
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
소프트웨어 업계는 정말로 빠르게 변화하고 있습니다. 잠시 눈을 들어 주위를 둘러보면 많은 곳에서 생각치도 못했던 것들이 발견되고 오픈소스라는 이름으로 공개되고 있습니다. 소프트웨어의 시류에 민감해 보이는 몇몇 분들이 그런것들을 재빠르게 살펴보고 전도사가 되어 목청을 높이기도 합니다.

대게 전도사들은 열정적으로 확신에 가득찬 얼굴로 외칩니다. "이것이 여러분의 개발을 획기적으로 바꿀 것입니다." "이것이 제대로 정착된다면 개발자들에게 행복한 삶이 펼쳐질 것입니다." 라고요.

이런 전도사들은 그들이 의도했든 아니든간에 다른 개발자들에게 위협을 줄 때도 있습니다. 마치 우리의 배에 당신이 지금 당장 타지 않는다면 이후 크게 후회할 것이라고 분위기를 몰아가는 것이죠. 그럼 개발자들은 내키지 않아도 그곳에 우물쭈물 탑승하게 됩니다. 나중에 후회하고 싶지 않아서입니다.

저는 그런 전도사들에게 아래와 같이 묻고 싶습니다.

"당신이 우리를 설득하기 위해 작성한 문서를 다시 한번 봐주세요. 그리고 당신에 가슴에 손을 얹고 솔직히 말씀해주세요. 정말 당신이 문서에 쓴 그대로 생각하십니까?"

현재 전도사들이 외치는 것들에 대한 평가는 미루더라도 예전 전도사들이 외쳤던 것들에 대해서는 평가가 가능합니다.

대표적으로 마이크로소프트의 .NET을 생각해볼 수 있습니다. MS가 .NET을 홍보하던 당시 정말로 분위기는 열광적이였습니다. .NET이 나타나면 소프트웨어 세계가 변화할 것 같았기에 나도 변화해야 할 것 같았습니다. .NET 전도사들이 인터넷에서 종횡무진 활약했고, .NET에 대한 문서가 넘쳐흘렀습니다.

결과는 어떻습니까? .NET은 그다지 성공하지 못했고 현재 특별한 위치에 있지도 않습니다. 왜 이러한 일이 발생을 했나요? 제 생각에 .NET은 그들이 외쳤던만큼 매력적인 기술이 아니였기 때문입니다. 그것을 보다 매력적으로 보이게 하기 위한 전도사들의 피나는 노력이 있었음에도 불구하고, 소프트웨어 개발시장의 소비자들은 .NET을 선택하지 않았습니다.
결과적으로 그들은 거품을 만들었고 그것은 소프트웨어 산업에 있어 매우 부정적인 사건이였습니다. 왜냐하면 저를 포함한 많은 개발자들이 .NET에 필요 이상으로 신경을 씀으로 인해 좀더 중요한 것에 집중할 시간을 빼앗겼기 때문입니다.

최근 여기 저기에서 새로운 얼굴의 전도사들이 보입니다. 저는 그들을 보며 염려를 지울수가 없습니다. 그들은 무엇인가를 열정적으로 홍보하고 주장합니다. 그렇지만 정말로 자신이 반해서 소리치는 것인지 아니면 다른 목적을 위해서 소리치는지 알수가 없습니다. 진심으로 반하고 그것이 어떤 믿음으로 이어져 참지 못해 소리치는 것이라면 저는 그 전도사를 존경할 것입니다. 그것은 순수한 열정에 발현이며, 소프트웨어 산업에 대한 긍정적 기여가 될 가능성이 크다고 생각하기 때문입니다.

하지만 스스로 확신하지 못하는 것을 다른 사람에게 전하는 사람은 '거짓 전도사'일 뿐입니다. 그들이 말하는 것은 시끄러운 잡음이며, 다른 사람에게 혼란을 가중시킬 가능성이 큽니다. 그렇기에 그들의 외침은 소프트웨어 산업의 발전을 방해하는 외침이 될 수 밖에 없습니다. 거짓 전도사들이 자신들이 행위를 돌아보고 그것을 즉시 멈춰주었으면 좋겠습니다. 이것은 더 나은 소프트웨어 산업으로 가는 걸음중 하나일 것입니다.


WRITTEN BY
차민창
르세상스 엔지니어가 사회를 이끌어나가는 상상을 하며!

,