사용자 삽입 이미지

트랙백 주소 :: http://www.epapyrus.com/blog/jeong/trackback/32

댓글을 달아 주세요

일전에 개발 언어 관련해서 KLDP에 글을 포스팅한 적이 있습니다.
http://kldp.org/node/96655

결국 OCaml로 한 번 가보자는 결론을 내렸고 작은 프로젝트 부터 실험적으로 시작해 보고 있습니다.

그나저나 가장 큰 문제는, OCaml에 대해서 별로 경험 없는 사람들끼리 모여서 프로젝트를 하려니 책이나 자료 부족이 가장 큰 문제네요. 한글 책은 없어 보이고요.

혹시 ML 또는 functional language을 배우고 싶은 분들을 위해 책 한권 소개 하겠습니다.

The Little MLer
Matthias Felleisen and Daniel P. Friedman

 
with a foreword by Robin Milner
and drawings by Duane Bibby

사용자 삽입 이미지

이 책은 어려운 개념을 쉽게 잘 설명한다는 점에서 가장 큰 점수를 주고 싶습니다. 왼쪽과 오른쪽으로 나누어져 질문과 답변의 형식에 약간의 유머가 들어 있어 쉽게 읽을 수 있고요.
특히 함수형 언어에 대해 경험이 없는 프로그래머들에게 ML의 타입 시스템, 표현식, 고차 함수, 람다 캘큘러스 등을 잘 설명해 줍니다. 특히 Imperative language에 익숙한 독자들이 재귀적으로 생각하는 틀을 만들어 주는데 많은 도움을 줍니다.
또 한국 독자들에게는 쉬운 영어로 쓰여져 있다는 점도 큰 메리트이겠군요.

책은 SML을 기본으로 사용하고 있지만, 복잡한 문법이 없고 책 앞부분에서 OCaml의 경우에 대한 언급이 있으므로 별다른 문제는 없습니다.

참, Lisp에 관심이 있는 독자라면 The Littler Schemer도 추천합니다.

트랙백 주소 :: http://www.epapyrus.com/blog/jeong/trackback/27

댓글을 달아 주세요

어떤 프로그래밍 언어가 가장 인기 있는지 (널리 사용되는지)에 대한 비교가 여러가지 있는데 TIOBE programming community index 가 그 중 하나 입니다. TIOBE라는 회사에서 내는 인덱스로 검색엔진을 이용해 인기도를 측정하는 것 같습니다.

사용자 삽입 이미지

2008년 7월 기준으로 역시 1위는 Java입니다. 21.345%의 점유율이네요. 2, 3위는 C, C++로 16%, 11%를 차지합니다. Powershell이 15위를 차지했네요.

패러다임별로 보자면 객체 지향 언어가 압도적으로 56.6%를 차지했습니다. Functional language들은 다 합쳐서 1.7%입니다.

출처: http://www.tiobe.com/

트랙백 주소 :: http://www.epapyrus.com/blog/jeong/trackback/21

댓글을 달아 주세요

  1. roylory 2008/08/05 15:00  댓글주소  수정/삭제  댓글쓰기

    한국 내의 인기 순위와는 큰 차이가 있는 것 같네요. 흥미롭군요.

  2. 산호세.칩.개발자 2008/09/05 08:50  댓글주소  수정/삭제  댓글쓰기

    프로그램 언어를 쓰는것은 컴퓨터로 워드나 파워포인트를 자유자재로 사용하는것이나 별반 차이가 없다는 것을 encapsulation이라는 개념을 배운 컴퓨터과학도들은 잘 알것이다.

    이 그래프를 보다가 이런 설문조사표가 떠우르는건 왜일까?
    노가다 연장중 어느 스타일의 곡갱이가 좋은지에 대한 설문조사표.

    우리 한국 컴퓨터과학도들은 외국의 무수한 투어링 어워드를 받는 분들을 닮아야 하지 않을까?

15년 정도 됬나요? 헝가리안 표기법이 인기를 끌기 시작한 것이. 헝가리안 표기법은 헝가리 출신의 프로그래머 찰스 시모니(Charles Simony)가 발명해서 헝가리안이라는 이름이 붙었습니다. 찰스 시모니는 MS에서 Chief Architect로 근무하며 억만장자가 되어 우주 여행도 갔다 왔지요.

사용자 삽입 이미지


윈도 프로그래밍으로 경력을 시작한 프로그래머들은 거의 대부분 헝가리안 표기법을 사용하는 것 같습니다. Win32 API를 비롯해서 MFC 까지도 모두 헝가리안을 사용하고 있으니까요. .NET Framework에서는 별로 쓰이지 않는 것 같네요.

다이나믹 타이핑을 지원하는 언어들에서는 도움이 될 수도 있다고 생각하지만, C/C++에서 헝가리안이 무슨 도움이 되는지 모르겠습니다. 가독성만 떨어질 뿐입니다.

변수 이름만 봐도 타입을 알 수 있다고 합니다만, 안보면 모르냐고 말하고 싶습니다. 변수명 pszName을 보면 zero-terminated string을 담고 있는 포인터라는 뜻이겠지요. 명확하기는 합니다. 그런데 그냥 name이라면 타입이 무엇일까요? 설마 float 또는 integer일 리는 없고 스트링일 것이라는 것이 명약관화합니다. char *, char [512], string, CString, QString 여러가지 타입이 가능하다고 항변할 수 있겠지만, 최소한 C++라면 컴파일러가 체크해 주기도 하고, 타입의 종류도 모르고 변수를 사용하는 경우는 거의 없습니다. 특히 최근의 IDE들은 포인터를 가져다 대기만 해도 타입을 알려주기도 하고요. dwCount, iLength 같은 변수명들은 정말 너무 한다는 생각도 듭니다. ㅎㅎ

또 만약에 타입을 바꿀 필요가 생겼을 경우에는 변수 이름을 모조리 바꿔야 하는 문제도 생깁니다.

리누스 토발즈가 한 말로 마무리 짓겠습니다.

"Encoding the type of a function into the name (so-called Hungarian notation) is brain damaged - the compiler knows the types anyway and can check those, and it only confuses the programmer."

ps. btnCancel 같은 의미적인 접두사들은 괜찮다고 생각됩니다. 또 g_ 와 같은 접두사도 글로벌 변수를 눈에 띄게 만들어 준다는 점에서 의미가 있어 보이고요.

트랙백 주소 :: http://www.epapyrus.com/blog/jeong/trackback/20

댓글을 달아 주세요

  1. 사실 그건 다 2008/08/15 03:48  댓글주소  수정/삭제  댓글쓰기

    C++이 후져서.. 진심입니다.

    name이라고 하면 char*인지, char[100]인지, wchar*인지, std::string인지, std::wstring인지, CString인지, boost::string인지 알 수 없잖아요?

    pszString 아니면 szString이라고 하면 뭐 LPSTR이나 LPTSTR, LPWSTR이겠구나 싶은거죠 뭐..

  2. zelon 2010/02/22 12:35  댓글주소  수정/삭제  댓글쓰기

    저도 윈도우로 프로그래밍을 시작한 서버 프로그래머지만, 요즘 남아있는 습관은 std::string 은 strXXXX, char[] 는 szXXXX 정도만 남아있는것 같네요. 이 2개는 혼용해서 쓰면 치명적인 경우(cin, cout, printf 등이 었던걸로 기억합니다)가 생겨서 좀 구분을 해서 썼었습니다. 나머지는 좀 번거롭기도 하고, 실효성이 생각보다는 많지 않더라구요.

늘 부족하다고 생각하고 있습니다만, 우리 회사의 개발 환경을 소개해 보겠습니다.
더 좋은 방법이라던지 새로운 방법을 제안해 주시면 PDF-Pro 한 카피를 정성스럽게 포장해서 보내드리겠습니다. ^_^

1. 소스 콘트롤 서버

이파피루스는 SVN을 사용하고 있습니다. 초창기에는 CVS를 사용했습니다만, 소스들의 무결성(integrity; 무결성이라는 말이 적당한지 잘 모르겠네요 ㅎㅎ)을 위해 Atomic check-in이 가능한 Subversion으로 이주한지 2년 정도 되었습니다. 로깅을 잘하자고 늘 강조하고 있지만 늘 부족한듯이 느껴집니다.

사용자 삽입 이미지


2. 버그 트랙킹 시스템

버그질라를 사용하고 있습니다. 버그질라를 외부에 오픈하는 것이 어떻겠느냐고 프로그래머들을 설득하고 있지만, 아직은 반대가 많네요. (자신이 없냐고 놀리고는 합니다. ㅎㅎ) 버그가 고쳐지면 SVN과 연계해서 어떤 버그를 고치기 위해 어떤 패치가 일어났는지를 알 수 있습니다.
아래 스크린샷을 보면 오늘 날짜로 142개의 버그/이슈가 살아있는 것을 알 수 있습니다. (내부에서 관리하는 버그 개수로 이 정도는 많지는 않다고 우기면 믿어주시려는지 ㅎㅎ)
사용자 삽입 이미지

3. 데일리 빌드 서버

사내의 모든 프로젝트들을 소스 컨트롤에서 받아와, 빌드하는 서버입니다. NT 기반에서 돌아가고 있으며 파이썬으로 작성된 스크립트입니다. 빌드 시간이 만만치 않기 때문에 새벽시간과 점심시간에 한번씩 수행됩니다. 빌드에러는 로그로만 남겨지는데, 빌드 에러 발생시 이메일 등으로 통지하는 기능을 만들려고 마음먹은지 1년쯤 되었습니다. ㅎㅎ

4. 회귀 테스트 (Regression test) 서버

데일리 빌드 서버와 같은 하드웨어입니다. 역시 NT 기반이며 펄로 만들어진 스크립트입니다. PDF 렌더링 엔진에만 적용되고 있으며, 대량의 PDF 문서를 열고, 렌더링 해서 전날 까지의 작업과 달라진 점이 있는지를 (잘 나오던 글자가 사라진다던가와 같은) 체크해서 리포트로 만들어 줍니다. 새벽 3시에 시작하면 5시경에 끝이 납니다.

5. 테스트용 워크스테이션

코어가 4개로 사내에서 제일 짱짱한 시스템입니다. 가상 머신을 동시에 4개 까지 돌릴수 있으며, 모든 테스트는 가상 머신 위에서 진행합니다. 저희 제품이 동작할 수 있는 모든 환경을 가상 이미지로 만들어 놓고, 신제품 출시 또는 패치 출시 전에 테스트를 진행합니다.

6. 위키

여러가지 잡다한 내용들을 위키에 등록해 놓고 사용합니다. 예를 들자면, 복합기 드라이버 설치법이 헛갈릴 때도 사용하고, tar 압축 해제하는 법이 갑자기 생각이 나지 않을 때, 회의록 작성 양식이 필요할 때 등 여러가지로 사용하고 있습니다.

7. 문서 관리 서버

Alfresco를 문서 관리 서버로 사용합니다. 개발부 뿐만 아니라 전 부서가 함께 사용하고 있으며, 여러가지 개발 관련 문서들을 저장합니다. 특히 자동 버전 관리 기능이 좋습니다.

8. 파일 서버

2테라 NAS를 사용합니다. 특별히 사용 용도는 없습니다만, 늘 용량이 부족한 것으로 봐서 동영상이 가득찬 것이 아닌가 의심을 하고 있습니다. ㅎㅎ

9. 백업

시대에 뒤떨어져 보이기는 하지만, 테이프 백업을 합니다. 테이프 5개를 돌려가며 매일 백업을 하고 있으며, 주 단위 백업과 월 단위 백업 테이프는 회사 바깥의 안전한 곳에서 장기간 보존을 합니다.

트랙백 주소 :: http://www.epapyrus.com/blog/jeong/trackback/19

댓글을 달아 주세요

  1. 김재훈 2008/08/02 17:35  댓글주소  수정/삭제  댓글쓰기

    KLDP에서 글을 보다 여기까지 왔습니다. 좋은 정보 얻고 갑니다. 오픈소스에 관심을 가진지 얼마되지 않지만 수혜자의 역할에서 벗어나 기여자로서 역할을 어떻게 하면 좋을까 고민하고 있습니다. 한번 시간이 되시면 만나뵈면 좋겠습니다. 저는 www.polypix.com을 98년부터 운영하고 있습니다. jaison63@naver.com

  2. Kenny 2008/08/03 19:42  댓글주소  수정/삭제  댓글쓰기

    와.. 꽤 정리가 잘 되어 있네요..
    음.. VCS 관련으로 개인적인 추천을 하자면...

    1. Branch 활용에 대한 언급이 없으시네요... 활발하게 이용하고 계신가요? 저희 회사에서는.. 수정사항이 생길때 Branch를 이용하고는 있습니다면... 아무래도 Subversion의 Branch 기능은 좀 불편한 부분이 있어서.. 개인적으로 Git - Subversion 연동을 통해 로컬 Branch를 활용하고 있습니다. 배워야 한다는 단점만 제외하면... 아직까지는 제일 편한 방법이네요.

    2. http://www.infoq.com/articles/agile-version-control 글을 꼭 한번 봐 주시기 바랍니다. VCS 활용을 극대화 하려면.. 아무래도 VCS "이용"에 대한 전략이 필요하다는 생각을 오랜기간 하고 있었는데... 상당히 정리를 잘 해 놨더라고요.

  3. 모던보이 2008/08/03 19:52  댓글주소  수정/삭제  댓글쓰기

    1. Branch를 쓰고 있습니다만, 사내에 불편해 하는 프로그래머들이 많더군요. 한번도 다른 대안에 대해 생각해 본 적이 없는데, Git + Subversion 검토해봐야 겠네요. 감사합니다.

    2. 정리가 잘 되있네요. 좋은 자료 감사합니다.

    메일로 주소 알려 주시면 PDF-Pro 4 한개 보내드리겠습니다. ㅎㅎ
    jeong@pdfpro.co.kr

  4. LispHacker 2008/08/06 21:31  댓글주소  수정/삭제  댓글쓰기

    vcs 는 어떤 것이든 유사한 문제가 있는 것이 대부분입니다(변경을 관리할 때 공통적으로 생길 수 밖에 없는 근본적인 문제들). cvs 10년 이상 사용하다가 약 3개월 전부터 mercurial 사용하고 있는데, 공통된 문제점도 있고, 더 나은 점도 있더군요. 하나 이상의 vcs를 사용하는 것은 그리 좋은 아이디어는 아닌 것 같습니다. (참고로 저와 동료들은 꼭 필요한 변경은 주저않고 수행하지만, 그렇지 않은 경우 최대한 보수적 관점을 유지합니다. 즉, 뭔가 해결할 수 없는 문제가 없는 한 절대 툴을 바꾸지 않습니다. 반면 개발 프로세스는 쉽게 바꿉니다)

    tracking system을 오픈하는 것도 그리 좋은 생각은 아닌 것 같습니다. 물론, 이메일로 버그보고를 받으면 ts에서 id부여후 답장을 자동으로 보내는 등의 자동화 정도는 괜찮을 듯 합니다. jira 쓰고 있는데, 기본적 기능만 사용하므로 별 어려움 없이 씁니다.

    빌드와 테스트는 거의 동시에 일어나야 하지 않나 생각합니다. 즉, 개별 작업의 change set이 vcs의 메인라인에 커밋되기 전에 머지후 빌드 및 테스트가 돌아간 후 메인라인에 커밋되는 프로세스라면 데일리 빌드는 큰 의미가 없어집니다. 물론 이렇게 되려면 각 개발자가 언제든 돌려볼 수 있는 테스트 케이스가 있어야 합니다(개별 코드라인 전략은 위의 링크에 이미 있는 것과 유사하면 되겠죠. 제 기억이 맞다면, mercurial로 바꾸면서 동료가 알려준 perforce ppt(pdf?) 파일 내용과 유사하네요. tofu scale 만 기억나네요)

    저는 개인용 위키도 사용합니다. http://www.tiddlywiki.com/ USB 메모리 스틱에 truecrypt로 무장한 위키 갖고 다니면서 잡동사니 들을 기록합니다.

    개발툴이 양이면, 프로세스가 음인데, 프로세스에 대한 언급은 없어서 약간 아쉽네요. (적고나서 보니 거의 '프로세스' 이야기가 되버렸네요)

    건승하시길...

  5. youlsa 2008/09/17 14:11  댓글주소  수정/삭제  댓글쓰기

    남의 개발환경을 훔쳐보는 기분이네요. 저 있는 곳과 거의 비슷한 환경이네요. 다만 저희는 문서 관리도 SVN을 쓰고 있습니다. 복잡한 툴 배우게 하기가 쉽지 않아서요... alfresco는 처음 봤는데 한번 검토해봐야겠습니다.

    좋은 글 감사합니다.

많은 프로그래머들이 컴파일러가 내는 경고(Warning)를 무시하고는 합니다.

가장 큰 이유는 경고가 있더라도 바이너리를 만들 수 있기 때문이겠지요.
또 나중에 고치지 하면서 미루다 보니, 프로젝트가 커지면서 점점 더 경고들이 많아 지기 시작하고, 나중에는 주루룩 쏟아 지는 경고들을 아예 보지도 않게 됩니다.

하지만 컴파일러 경고를 무조건 무시하면 안됩니다.
프로그래머들이 디버깅을 할 때 가장 어려운 케이스가 디버깅 툴이 전혀 힌트를 주지 않는 경우 입니다. 컴파일러 경고는 거저로 컴퓨터가 알려주는 디버깅 힌트입니다.

또한 경고를 잡다 보면, 마음가짐 때문이라도  전체적인 버그 발생 빈도가 줄어듭니다.

컴파일러 경고

우리가 주로 접하는 컴파일러 경고들은 다음과 같습니다.

unreferenced local variable: 변수를 선언하고 한번도 사용하지 않았습니다. 아주 위험하지는 않지만 다른 스코프에서 같은 이름의 변수를 설정하는 경우 등에 혼란이 생길 수 있습니다.

uninitialised variable: 변수를 초기화 하지 않고 사용했습니다. 이는 아주 위험합니다. 심각한 런타임 에러를 낼 가능성이 큽니다. 특히 VC++에서 디버그 모드와 릴리즈 모드의 실행이 다른 경우 이러한 문제에 기인 하는 경우가 많습니다.

conversion from 'XXX" to 'YYY': 묵시적 캐스팅을 하였으나 좌항에 있는 변수의 표현 능력이 우항보다 떨어지는 경우 입니다. 이 경우 역시 심각한 문제를 종종 일으킵니다.

이 외에도 컴파일러에 따라 if (a = 3) {} 과 같은 경우, 경고를 통해 (a == 3)의 오기(誤記)가 아닌지를 확인해 주기도 합니다.



깨진 창문 이론

범죄학자 제임스 윌슨(James Q. Wilson)과 조지 켈링(George Kelling)의 '깨진 창문 이론 (Broken Window Theory)'에 따르면, 깨진 창문을 수리하지 않고 놓아 두면, 그 근처를 지나는 사람들이 '이 집에는 아무도 책임지는 사람이 없구나'라고 결론을 내리게 되고, 이 결과 더 많은 창들이 깨지기 시작하면서 마침내 거리 전체가 무정부 상태가 된다는 것입니다.

이른바 낙서, 무질서, 구걸과 같은 사소한 문제들이 심각한 범죄를 일으킨다는 것이지요.

소프트웨어 개발에서도 이 이론이 적용될 수 있습니다. 컴파일러 경고와 같은 사소한 문제들이 심각한 소프트웨어의 불안정성을 일으킬 수 있다는 것이지요.



실천 방안

가장 쉬운 방법은 경고 에러가 보이면 보이는 즉시 고치는 것입니다. 미루다 보면 경고들이 쌓이게 되고, 나중에는 꽤 큰일이 됩니다.

그리고 이미 작업중인 코드에 경고들이 많이 나온다면 날을 잡아서 모두 해결하는 것이 좋습니다. 이 작업은 모든 팀원이 함께 하는 것이 좋으며, 같은 코드베이스에 대해 다른 개발 작업과 병행하지 않는 것이 좋습니다.

주의해야 할 것은, 경고를 모두 잡은 후에는 꼭 전체 제품에 대한 회귀 테스트(regression test)를 실시하여 새로운 문제가 나타나지 않았다는 것을 확인해야 합니다.

또한 컴파일러 옵션을 이용해, Warning이 있으면 컴파일을 중단하도록 하는 것도 좋습니다.

트랙백 주소 :: http://www.epapyrus.com/blog/jeong/trackback/13

  1. Subject: 리팩토링 - gcc 모든 경고메시지를 제거하라

    Tracked from yundream의 프로그래밍 이야기 2007/07/19 09:19  삭제

    이 문서는 수정될 수 있습니다. 최신글은 Joinc Wiki를 참고해 주세요. 나 같은 경우 일단 돌아가는 코드를 만들고 돌아가는지 눈으로 확인한다음 손을 보는 스타일이라서, 나중에 많은 잔손질 - 거창하게 리팩토링 -을 하게 된다. 이때 모듈화와 함께 가장먼저 손쉽게 진행할 수 있는게 경고메시지를 제거하는 것이다. 이 문서는 gcc 4.0.x 를 기준으로 작성되었다. gcc라면 다음과 같은 옵션을 이용해서 경고메시지를 출력하도록 할 수 있다. #..

댓글을 달아 주세요

  1. 지나가는사람 2009/07/25 10:06  댓글주소  수정/삭제  댓글쓰기

    http://www.pdfpro.co.kr/blog/jeong/entry/Warning-무시하지-맙시다

    이 주소로 오니깐...바이러스가 감지되네요...ㄷㄷㄷ

    • 모던보이 2009/11/21 15:49  댓글주소  수정/삭제

      죄송합니다. 수정했습니다. 도대체 어떻게 저런 코드들이 들어갈 수 있는지 모르겠네요. 해킹이라는 것인지 -_-a

예전 현역으로 활동할 때 소스 코드에 가끔씩 시조를 지어서 (정확히는 패러디 ㅎㅎ) 집어 넣고는 했었습니다. 간만에 기억이 나서 몇개를 올려 봅니다. 현장감을 살리기 위해 /* */ 는 그대로 놓아 둡니다.

사용자 삽입 이미지

/*
하여가(何如歌)

이리쨘덜 엇더하며 져리쨘덜 엇더하리
윈도우 소스코드 얼거진들 긔 엇더하리
우리도 이같이 얼거져 데드라인 지키리라.
*/

/*
 단심가(丹心歌)

코드를 고쳐고쳐 일백 번(一百番) 뜻어 고쳐
밤낫을 작업하야 넉시라도 잇고 업고
완벽한 코드 향한 마음 가실 줄이 이시랴.
*/

/*
딴따라 코더들아

딴따라 코더들아 수이짬을 자랑마라
버그창궐하면 다시 짜기 어려오니
책한권 다시 읽고 배워간들 엇더리.
*/

/*
백만(百萬) 줄 소스코드

백만 줄 소스코드 에디터로 살펴보니
주석은 엄청나되 핵심은 간 듸 업다.
어즈버 대박히트가 꿈이런가 하노라.
*/

/*
열시가 되었느냐

열시가 되었느냐 회의시간 다 되었다
프로그래머 녀석 상기 아니 출근했냐
저 많은 버그 리스트 언제 수정 하나니.
*/



트랙백 주소 :: http://www.epapyrus.com/blog/jeong/trackback/10

댓글을 달아 주세요

  1. 에이르 2007/07/17 00:03  댓글주소  수정/삭제  댓글쓰기

    웃어야 할지 울어야할지 모르겠군요.

  2. 모던보이 2007/07/17 00:15  댓글주소  수정/삭제  댓글쓰기

    웃으면 되죠 뭐 ㅎㅎ

  3. Helllo 2007/07/17 11:22  댓글주소  수정/삭제  댓글쓰기

    재밌네요, ㅋ
    IT 계열 나름대로의 관련 개그가 많이 있죠.
    근데 그런 개그는 그 분야 사람들만 알아듣기 쉽다는..!ㅋ

  4. 가을이 2007/07/21 16:24  댓글주소  수정/삭제  댓글쓰기

    공감 백번하고 침튀겨가며 웃고 갑니다. 크핫핫핫핫..

  5. bups 2007/10/26 17:45  댓글주소  수정/삭제  댓글쓰기

    우연히 링크 따라 여기까지 오게 되었습니다.
    재밌고 느낌이 팍팍 오는 시조들이네요^^

    제 블로그에 담아가도 될런지요?

  6. Jinnovator 2008/07/26 05:56  댓글주소  수정/삭제  댓글쓰기

    우연히 들르게 되었는데, 너무 재미있네요~
    저도 담아가겠습니다 ^^
    번창하세요~

  7. JustAFeelinG 2008/11/13 18:07  댓글주소  수정/삭제  댓글쓰기

    시조 내용은 서글픈 프로그래머들을 노래하지만,
    유쾌해져서 돌아갑니다. ^^

  8. skkong 2008/11/14 08:28  댓글주소  수정/삭제  댓글쓰기

    너무 재미있어서 퍼갑니다. (출처 밝히구요)
    좋은 하루 되세요. ^^;

예전에 어떤 프로그래머와 대화를 하다, 자신이 사장이라면 C 프로그래머를
뽑을 때, 인덴트로 이용할 탭크기가 8이 아니면 무조건 불합격을 시키겠다는
이야기를 들은 적이 있습니다.

이 양반의 논리는, 탭 8 보다 작은 인덴트를 쓰는 사람들은 불필요한 네스팅을
많이 하기 때문에, 머리가 나쁜 사람들이라는 것입니다. 불필요한 if/for 등을
남발한다는 것이지요.

꼭 탭 8을 사용해야 한다는 것에는 동의하지 않지만, 탭크기를 얼마나 주느냐 하는
문제는 단순한 코딩 스타일의 문제만은 아니라고 생각합니다.
탭크기가 코딩 스킬을 대변해 주는 면이 있다는 것이지요.

단, 이 논쟁은 사실 Java 나 C++에는 적용되기가 어렵습니다. 아무래도 객체지향적
특성때문에 C보다 코드가 옆으로 많이 퍼져나갈 수 밖에 없기 때문입니다.

[4칸 탭]

사용자 삽입 이미지


[8칸탭]
사용자 삽입 이미지


제 경험상 탭 8칸 주의자들은 특징은 대체로 다음과 같습니다.

1. 두뇌 회전이 빠르고 기억력이 좋은 편입니다.
2. 결벽증 같은 것이 있어 보기 좋은 코드를 쓰는 데 많은 노력을 들입니다.
3. 경력이 길거나 비 윈도우 계통 OS에서 개발을 시작했습니다. (아마도 VC++ 내장
에디터의 기본 탭이 4이기 때문이라고 추정합니다.)

하지만 아무래도 네스팅을 최소화 해야하다 보면, 코드와 알고리즘이 1:1로 대응하기가
어려워집니다. 또 할당/해제 또는 열기/닫기의 쌍을 맞추기가 어려워지는 경우가 생기고요.
이런 문제들을 머리 속으로 해결해야 하다보니 머리가 좋아야 겠지요.

저도 아무 생각없이 네스팅을 하는 것에 대해서는 반감을 가지고 있지만,

8칸 탭은 구조적 프로그래밍이 불편해진다고 봅니다.
코드 블럭의 블랙박스화가 어려워지고, 변수의 스코프가 넓어질 수 밖에 없지요.
One entry, One exit 규칙을 지키기도 어렵습니다.

여러분들은 또는 여러분의 팀은 과연 몇칸 탭을 사용하고 계신가요?

참, 여기서 탭은 자기 마음대로 에디터 설정을 바꾸면 되는게 아닌가라는 분이 계실텐데요,
4칸 탭으로 작업하던 코드는 8칸으로 바꾸면, 80칼럼을 훌쩍 넘어가버리는 문제가 생기기
때문에 간단한 문제만은 아닙니다.


트랙백 주소 :: http://www.epapyrus.com/blog/jeong/trackback/9

  1. Subject: 붉은문양의 생각

    Tracked from moon206's me2DAY 2008/08/06 21:17  삭제

    모던보이의 雜說 :: 8칸탭이 아니면, 불합격!

  2. Subject: 박성일의 생각

    Tracked from zihado's me2DAY 2008/09/19 02:57  삭제

    탭8칸 하니깐 시원시원해서 보기 좋네..

댓글을 달아 주세요

  1. 난뭐지 2007/07/16 18:50  댓글주소  수정/삭제  댓글쓰기

    3칸탭을 쓰는 저는 뭘까요 ㅠㅠ

  2. 에이르 2007/07/16 19:28  댓글주소  수정/삭제  댓글쓰기

    갓 학교에서 프로그래밍을 조금씩 배우기 시작한 저로써는 뭔지 모르겠군요 ㅡ,ㅡ

    • 모던보이 2007/07/16 22:58  댓글주소  수정/삭제

      처음 배우시는 것이라면, 8칸 탭으로 시작해 보는 것도 나쁘지 않다고 생각합니다.
      아무래도 불필요한 네스팅 (루프, 조건 블럭 등)을 많이 할 때 이기 때문에 탭을 넉넉하게 쓰면, 금방 문제를 알아차릴 수 있지요.
      또 현업에서 많은 분들이 4칸 탭을 사용하기 때문에, 탭 크기에 대한 고민을 해 볼 수 있는 기회도 생길 터이구요.

  3. 미친데이터 2007/07/16 19:29  댓글주소  수정/삭제  댓글쓰기

    8칸 탭으로 된 소스를 심심치 않게 봤는데....VC만 몇년을 써와서 그런지...적응이 안되더군요-0-;

  4. 도자기 2007/07/16 19:46  댓글주소  수정/삭제  댓글쓰기

    탭에 대한 고민을 저도 많이 했었는데, 꽤 의미가 있군요...탭8칸이 결벽증이 있다는거는 동의합니다...ㅋㅋㅋ

  5. 키엘 2007/07/17 13:26  댓글주소  수정/삭제  댓글쓰기

    4칸탭 주의자 입니다. 8칸탭이 아니면 네스팅을 많이 하게 된다는건 근거가 없는 말 같은데요. 아무리 생각해봐도 논리적 연관성이... -_-; 네스팅을 많이 못하게 되서 배수의진 때문에 그렇게 된거라면 모르겠습니다만..

    • 모던보이 2007/07/17 15:57  댓글주소  수정/삭제

      8칸탭이 아니면 네스팅을 많이 하게 된다기 보다는, 8칸탭은 네스팅을 많이 하기가 힘들어 지니까 (80 칼럼을 쉽게 넘으니까) 4칸탭 보다는 네스팅에 더 예민해 지겠지요.

  6. 두렁청해 2007/07/18 09:16  댓글주소  수정/삭제  댓글쓰기

    저도 3칸 쓰긴 하는데^^;
    예전에 다른 곳에서 위 내용의 글을 봤을 때는 몰랐는데
    위에 4칸과 8칸의 코드를 비교해서 보니 8칸도 먼가 매력이 있어보이네요-_-!

    • 모던보이 2007/07/18 10:58  댓글주소  수정/삭제

      3칸 쓰시는 분들도 많은가 보네요.
      혹시 어떤 계기로 3칸탭을 쓰시게 됬는지 알려주실수 있나요?
      소프트웨어 엔지니어에게 2의 배수가 아닌 수들은 왠지 익숙하지 않은 것 같아서 ㅎㅎㅎ

  7. 두렁청해 2007/07/18 11:07  댓글주소  수정/삭제  댓글쓰기

    아직 학생이라 코딩 스타일이 정해지지는 않았는데
    딱히 이유가 있는 것은 아니고 가로 세로 비율이 맞지 않는다는 느낌을 받아서요~=ㅁ=;
    글자 크기보다 인덴트 간격이 넓은거 같아서 3칸으로 설정했어요^^;
    우리 과 교수님께서는 3칸을 강요하시더군요 그 이상 띄게되면 가독성이 떨어진데나 어쩐데나-_-;
    4칸과 8칸의 차이점은 분명 존재하겠지만 단지 그 이유 하나만으로 인재를 채용하지 않겠다고 발언하는 것은 무슨 심보일까요? 그렇게 독단적이고 융통성이 없어서야-ㅁ-;

    • 모던보이 2007/07/18 11:28  댓글주소  수정/삭제

      가독성이 좋게 느껴져서 3칸을 쓰신다면, 그것만으로도 훌륭한 이유라고 생각합니다.

      인력난에 시달리며 회사를 운영하는 입장에서는, 탭사이즈에 대한 자기 생각을 이야기 할 수 있는 정도의 인재라면 언제라도 환영입니다. ㅎㅎ

      솔직히 경력을 시작하는 프로그래머의 경우 MSVC의 디폴트 탭인 4칸이 아닌 다른 사이즈를 써 본 것만으로도 가점을 주고 싶은 심정이에요. 아무래도 자기 생각이 있거나, 모험심이 있다는 반증일 테니까요.

      저희 회사의 경우는 코딩 스타일 가이드 라인이 없습니다. 너무 스타일을 지키려 딱딱하게 굴다보면 독선적으로 될 수 있기 때문이며, 스타일이 다른 사람의 코드를 읽지 않으려 하게 될 가능성이 크기 때문입니다.

  8. bum 2007/07/18 17:41  댓글주소  수정/삭제  댓글쓰기

    전 프로그래머는 아니지만 가끔 코딩을 할때는 6칸탭을 씁니다. --;
    4칸으로 하면 탭 부분이 한눈에 보이지 않는 경우가 꼭 급할때 생기더군요. 그렇다고 8칸으로 하면 가로스크롤 문제도 있거니와 너무 삭막해서. :)
    요즘은 80컬럼 이상을 쓰는 경우가 많으니까 8칸도 크게 문제될건 없을 것 같기도 하네요. 터미널 환경에서 작업을 해도 80컬럼 이상 표기되니까요.
    여튼 4컬럼은 중요한 순간에 잘 보이지 않는다가 결론. ㅋ

    • 모던보이 2007/07/18 17:49  댓글주소  수정/삭제

      6칸은 많은 K&R을 비롯한 전산 관련 서적들이 사용하는 탭이지요.

      책에서는 예제 코드들이 많기 때문에 실제 사용하는 코드들 보다는 네스팅이나 가로로 퍼져나갈 요소들이 적지만, 책이라는 특성상 가로폭이 넓지 않아서 채택한 탭사이즈가 아닐까라고 감히 추정해 봅니다. ㅎㅎ

      80컬럼은 관습이 무섭다는 말 밖에 ㅎㅎ 저는 코딩 시트를 사용해 본 적도 없고, 80칼럼 터미날을 사용한것도 4-5년 정도 밖에 되지 않습니다만, 아직도 80칼럼을 넘기면 안될것 같은 강박이 있습니다.

  9. 가을이 2007/07/21 16:16  댓글주소  수정/삭제  댓글쓰기

    8칸이라....흐미....전 2칸씁니다. 제가 보기 힘든 케이스가 된건가요? 2칸으로 해서 wrap 사이즈를 132로 세팅해놓고 작업하는데...텔넷도 그렇게 ....전 어떤 성격일까요..ㅎㅎ
    참고로, 전 2칸 강박이 있는 것 같네요. 다른 분의 소스를 분석할때도 2칸으로 만들어놓고 분석한다는;;;;;

    • 모던보이 2007/07/23 09:28  댓글주소  수정/삭제

      Wrap을 132 쓰시면서, 2칸탭을 쓰시면 오른쪽이 많이 남지 않나요?
      2칸탭을 쓰는 분들을 종종 봤지만, 132칼럼에서 2칸탭은 생소하군요. ㅎㅎ

  10. 어라라 2007/08/29 13:39  댓글주소  수정/삭제  댓글쓰기

    전 탭안씁니다. 특히 VC쓰는 사람들 소스 보면 탭썼다 스페이스로 했다하는 사람들이 있는데--자기도 모르게 쓰는지 아니면 남의 코드에 약간 덧붙이다 그리 됐는지 몰라도-- 인덴트가 맞지않아 들쭉날쭉됩니다. Editor를 U-Edit 썼다가 J-Edit 썼다가 다른거 썼다 하면 몽땅 들쭉날쭉됩니다. 그래서 탭 안씁니다.. 그냥 스페이스로 2칸.. 잘 안보인다구요? 쓱 훌터봐서 되는일이면 Edit할 일 없습니다. 자세히 보면 한칸도 잘 보입니다. 전 특히 길게 한줄 쓰는거 싫어합니다. 보기좋은게 결국 생산성도 좋은것 같아요.

  11. chunsinn 2008/08/06 10:24  댓글주소  수정/삭제  댓글쓰기

    재미있는 주제인 듯 하네요. 요즘은 직접 개발하는 일보단 봐주는 입장이지만 ( 실력은 뛰어나진 못합니다 :D )
    4탭, 8탭은 본인의 기호 아닐까요?
    전 눈이 나쁘지만 안경을 잘 안쓰는 편이라 VS에서 폰트를 24정도로 하고 4탭으로 작업 했던 기억이 나네요.
    하지만 모니터등 작업 환경에 따라 조금씩 틀리게 썼던 것 같네요.
    그리고 개인적으로 예전에 {} 를 어떻게 놓을까로 고민을 많이 한 적이 있었는데
    while문은
    while(1)
    {
    }
    if문은
    if ( ){
    }
    이렇게가 보기가 좋더라구요.(지극히 개인적입니다)
    아 결론은 개인의 기본적인 스타일이 있어야 하겠지만 회사내에선 기본 적인 코딩 가이드라인이 있어야 된다고 생각됩니다. 나중에 동료들과의 커뮤니케이션을 조금 더 도와 준다고 생각하고 있으니까요.

  12. 지아 2008/08/07 12:10  댓글주소  수정/삭제  댓글쓰기

    KLDP의 글을 읽다가 여기까지 왔네요.. ^^

    전에는 8칸탭을 썼었는데 가독성 때문에 4칸탭으로 바꿨습니다. (저는 똑똑한 편은 아니라..)

    대신 80칼럼에는 좀 민감한 편입니다.
    신입사원이 들어오면 80칼럼으로 갈구기 놀이도 종종해서 이상한 취급을 받긴 하지만.. ㅎㅎ

  13. ☆~ 2008/08/27 13:41  댓글주소  수정/삭제  댓글쓰기

    저도 KLDP의 글을 읽다가 오게 되었네요 ㅎ;
    전 스페이스로 띄워진 텝이 아니라면 텝 넓이를 개인이 어떻게 쓰든 자유라고봅니다.
    텝 칸수 만큼 또 중요한건 블럭 규칙을 어떻게 쓰느냐 로 생각됩니다. if다음에 공백을 넣건 안넣건 실제 불편함은 없지만 블럭을 어디에 두느냐는 눈에 확 들어 오기 때문이죠 ㅎ;

    여담이지만 씨샵이 기본으로 스페이스로 된 공백이 텝을 누르면 들어가기 때문에 맘에 안들었었는데 그냥 그런대로 쓰니 씨샵에서 만큼은 신경 안쓰게 되네요.

    암튼 2칸 4칸 좋은데 8칸은... 블럭이 3~4개만 되도 저 멀리서 부터 시작 되는 코드 때문에 싫더군요. 그리고 특정한 IDE를 정하고 사용 한다면 아무래도 텝 칸수를 기본 그대로 쓰는게 더 득이 되지 않나 싶습니다.
    씨샵을 예로 들어도 어느 개인이 스페이스로 된 텝을 전부 텝문자로 바꾸게 된다면.. 나중에 메모장으로 보게 되면 종종 썪이는 스페이스 텝 때문에 보기 힘들더군요.

    그런데 가장 중요한건 텝이든 블럭이든 팀 내에서 확실하게 정하고 코딩을 시작 하면 두가지가 개인의 취향이 어떻든 지장이 있나 싶네요 -0-;;

    (그러고 보니 델파이 IDE에선 스페이스 2칸텝이 익숙하네요 =_=;;)

최근 서점에 갔다가 놀라게 된 일이 있었다. 직업이 직업인지라 컴퓨터 관련 서적들을 습관처럼 훑어 보게 되는데, 버전 관리 시스템(이하 SCM)에 대한 책들이 꽤 많이 나와 있는 것이다.


놀란 이유는 두 가지다. 하나는 왜 SCM 사용법이 책으로 나와야 하는 것이고, 다른 하나는 왜 요즘에 저런 책이 나오는가 하는 것이다. 아, 그랬던 것이다. 책을 몇 권 뒤져보니 지금까지도 버전 관리 없이 살아온 개발팀이 많았던 것이다.


여기서, 버전 관리의 중요성을 논하고 싶지는 않다. 그 보다는 널리 사용되는 두 종류의 SCM, 마이크로소프트 SourceSafe와 오픈 소스 프로젝트인 CVS에 대한 담론을 해보려고 한다.


SourceSafe(이하 SS)는 어떤 파일에 대해 작업을 하기 위해 체크아웃이라는 절차가 필요하다. 체크아웃을 통해 내가 이 파일을 수정할 예정이니 다른 사람들은 손대지 말라는 선언을 하는 것이다. 수정이 끝나면 체크인을 해서 중앙 저장소에 기록을 하게 되고, 이제 모든 사람들이 이 수정을 자신의 로컬로 가져올 수 있게 된다.


이 방식의 가장 큰 특징은 하나의 파일을 동시에 한 사람만 수정할 수 있다는 것이다. 즉 main.c 파일을 김군이 수정하고 있으면, 이양은 김군이 수정을 마칠 때까지 수정할 수 없다는 것이다. 여러 사람이 작업할 때, 생길 수 있는 충돌을 원천 봉쇄하는 것이다.


CVS는 훨씬 자유롭다. 아무 파일이나 마음 내키는 대로 수정하면 된다. 그리고 수정이 끝나면 커밋(SS의 체크인과 비슷한 개념)을 하면 된다. 그러면 동시에 여러 사람이 같은 파일을 수정하고 커밋하면 어떻게 되냐고? 이런 상황을 충돌이라고 하는데 그런 경우는 동시에 일어난 수정들을 손으로 해결 하거나, 자동에 맡기면 된다.


위의 두 방식은 예전부터 격렬한 논쟁 거리가 되어 왔었지만, 이 이야기를 또 들고 나온 것은 저 물건들의 정치적, 사회적 특성에 대해 재미있는 것을 발견 했기 때문이다.


SourceSafe의 방식은 안전하다. 절대 혼란이 발생할 수가 없다. 어떠한 작업을 하기 위해서는 SCM이라는 중앙 기관의 허락을 받아야 하고, 이 허락 없이는 작업이 불가능 하기 때문이다. 그야 말로 계몽주의의 전형이다. 누가 어떤 파일을 사용하는지 중앙에서 통제한다. 사회의 혼란을 막기 위해서 모든 것을 통제 하는 시스템. 형식의 아름다움이 느껴지지 않는가?


하지만, CVS는 이 형식을 깨버린다. 작업을 하기 전에 중앙의 승인을 받아야 하는 절차를 무시한다. 그저 아무 때나 작업을 하면 된다. 작업을 하기 위한 중앙 저장소의 허락이 필요 없다. 작업이 끝나면 커밋 만 하면 되는 것이다. 더 이상 관리의 주체는 SCM이 아니라, 개인이 된 것이다. 오바를 해 보자면, 개인과 사회의 해방을 이룩한 것이다.

종종 충돌 과 혼란도 일어난다. 하지만, 구조나 형식을 통해서 이 문제를 해결하지는 않는다. 자유와 해방을 위해서 이러한 혼란을 감수한다.


사회, 문화, 예술에 이어 엔지니어링 세계에서도 포스트모더니티가 나타나고 있다.

트랙백 주소 :: http://www.epapyrus.com/blog/jeong/trackback/6

댓글을 달아 주세요