Small Releases

글을 쓰는 일은 쉬운 일이 아니다. 자신의 생각을 글로 변환하는 과정이 어렵다는 얘기는 아니다. (물론 그것은 어렵다.) 약간은 성격 탓이기도 할텐데, 자신의 생각이 다른 누군가의 뇌리 속에 또는 영원히 검색 엔진의 캐시를 떠돌며 다른 사람들에게 보여질지도 모른다는 생각은 글을 쓰는 행위 자체를 불편하게 만든다. 글을 한번 쓰게 되면 관련된 모든 정보 – 초기 역사로부터 모든 권위있는 평가 – 를 모아서 써야한다는 강박증도 있다. 이런 강박관념을 떨쳐내야지 하면서도 매번 잊게 된다. 어차피 내가 쓴 글은 일시적인 나의 생각일 뿐이고, 수정 가능하며, 사람들이 심각하게 생각하지도 않는다는 것.

XP의 프랙티스 중에 Small Releases라는 것이 있다. 말그대로 작은 릴리즈, 즉 릴리즈를 작은 단위로 자주 하라는 것이다. 작은 릴리즈의 장점은 여러가지가 있지만 내가 얘기하고 싶은 것은 즐거움이다. 릴리즈를 하면 ‘뭔가를 만들었다는 기쁨’을 느낄 수 있다. 그런 조그만 즐거움은 그 일을 계속 즐겁게 할 수 있도록 해주는 힘이 된다. 하루만에 릴리즈할 수 있는 일은 하루만에 릴리즈하라. 퇴근할 때 즐거운 마음으로 퇴근할 수 있을 것이다.

다른 하나 중요한 것은 필요한 일의 양을 초과하지 않게 해준다는 것이다. 작은 릴리즈를 하기 위해서는 필연적으로 일의 범위를 줄일 수 밖에 없는데, 그 과정에서 핵심적인 일이 무엇인지 가려내는 작업이 들어가게 된다. 다음 릴리즈에서 그 다음으로 핵심적인 일이 무엇인지도 쉽게 파악이 될 뿐만 아니라, 핵심적인 일이 더이상 없다면 일을 하지 않아도 된다!

작은 릴리즈는 소프트웨어 개발에서만 적용되는 것은 아니다. 뭔가가 비효율적인 것 같다는 생각이 들면, 당장은 부족하다 싶을 정도로 시간 제약을 두고 다음으로 미루어라. 정말 중요한 것만 다룰 수 있게 되고 덜 중요한 것은 버려지게 될 것이다. 만약 중요하나 잊어버린 것이 있다면 자연스럽게 생각이 날 것이다.

예를 들어, 회의가 너무 짜증나게 길다고 생각되면, 당장 회의 시간을 반으로 줄여보면 된다. 부족하다고 생각될지도 모르지만, 의외로 알찬 회의가 될 지 모른다. 물론 모자랄 수도 있다. 작은 릴리즈의 정신은 조그만 실험을 반복함으로써 더 좋은 방법을 찾아나가는 방식이다. 실패를 두려워하지 말고 변화에 적응하라는 것은 그런 얘기다.

문득 매일 매일 일터에서 생각하고 다른 사람들에게 특히 후배들에게 얘기한 것들을 돌아보면서 어딘가에 남겨두면 나중에 좋은 기록이 될거라는 생각이 들었다. 이 글도 그런 작은 릴리즈의 시도 중 하나다.

Small Releases 더 읽기"

새 PC를 구입했습니다.

Crysis와 같은 고사양을 필요로 하는 FPS를 많이 하다보니, 1년 전에 구입한 PC의 성능이 그런 게임들을 플레이하기엔 부족했습니다. 구입하기에 좋은 시점을 벼르고 있다가 드디어 구입했습니다.

인텔의 펜린 (45nm 공정 CPU 라인) 계열의 듀얼 코어 CPU(울프데일)와 쿼드 코어 CPU(요크필드)가 나오기 시작했고, Nvidia의 G92 코어 기반의 그래픽카드가 안정적으로 공급되기 시작했으며, 램, 하드디스크 가격도 비교적 저렴한 시점입니다. 상반기 내에 구입하실 생각이 있다면, 지금 시점이 PC를 구입하기에 적절한 시점으로 보입니다. 특히, D램 치킨 레이스에서 삼성이 승리했다는 것이 확실시되면서 D 램값은 현재보다 상승하리라는 관측들이 있습니다. 그리고 하반기로 넘어가게 되면, 인텔의 로드맵 상 연말에 새로운 CPU 라인이 출시될 예정이므로 좀 무의미한 감이 있죠. (아시다시피 CPU라인이 바뀌면 거의 메인보드도 바꿔야하죠. DDR3로 가는 추세도 있구요.)

제가 구입한 PC 부품들은 다음과 같습니다.

  • CPU: Intel Core 2 Duo Wolfdale E8400 (252,000원)
  • RAM: EKMEMORY DDR2 2G PC2-6400 Black x 2 (92,000원)
  • M/B: GIGABYTE GA-EP35-DS3R (119,000원)
  • GPU: 이엠텍 GeForce 8800GT XENON 황제 512MB VF1000
  • HDD: Seagate SATA2 500GB (7200.11/32MB) ST3500320AS (122,000원)
  • Sound: Creative SoundBlaster X-Fi Xtreme Music JCHyun (117,000원)
  • Power: Seasonic S12II-500 (107,000원)
  • Case: 3Rsystem R910 (91,000원)

CPU는 제조공정 경쟁에서 앞서나가는 인텔이 여전히 대세입니다. 주로 게임을 위주로 하고, 최근의 게임들도 아직 쿼드는 지원하지 못하기 때문에, 그냥 듀얼 코어인 울프데일로 갔습니다. 하지만, 켄츠필드 가격이 저렴해지면 회사 환경에서 쿼드 코어를 사용해보고 싶네요.

램은 비삼성 브랜드도 어느 정도 인정을 받고 있고, 램 가격이 요즘 많이 저렴해지고 가격 상승 예측이 있어서 그냥 4GB를 확보했습니다.

메인보드 같은 건 어차피 가격 차이도 나지 않으니 Gigabyte 같은 인정받은 업체의 것을 사는 것이 좋은 듯 합니다. 일반 소비자들은 P35칩 메인보드를 사용하시면 됩니다.

그래픽카드의 경우에는 G92 코어의 8800GT와 좋은 쿨러의 조합을 구입하려고 애썼습니다. 사실 MSI나 Gigabyte를 선호하는데, 좋은 쿨러를 안달아줘서 그냥 이엠텍으로 골랐습니다. 지금 아무런 문제가 없으니까 또 왜 이엠텍을 샀나 싶긴 하지만, 쿨러가 안좋으면 여름에 고생하죠.

하드디스크는 500GB를 기존의 300GB를 대체하고 이제 총 하드디스크 용량이 1.3TB가 되었네요.

사운드카드는 어차피 한번 사면 두고두고 쓰기 때문에 좀 좋은 것으로 골랐습니다. 도대체 메인보드 내장 오디오는 노이즈 때문에 어떻게 사용하란 건지…

그래픽카드의 크기가 커지면서 기존 케이스가 너무 좁아져서 서버급으로 하나 샀습니다. 전 덕지덕지 붙은 것 보다는 깔끔한 디자인을 선호합니다. 내부 처리도 잘되어있는 것 같습니다. 단지 3.5인치 베이의 수를 왜 늘려주지 않는지는 잘 이해가 가지 않지만 말이에요.

참고하세요.

새 PC를 구입했습니다. 더 읽기"

Fujitsu P7120, iPod Touch and MacBook Air

휴대용 기기 구입 가이드

휴대용 기기를 구입할 때 가장 중요하게 고려해야하는 것은 자신의 사용 문맥입니다. 그 제품을 무슨 목적으로 사용할 것이고, 언제 어디서 사용할 것이고, 얼마나 사용할 것인가 등등을 모두 고려해야합니다.

휴대용 기기의 가장 큰 문제점은 휴대성 – 크기, 무게 – 과 배터리입니다. 크고 무거운 건 금새 들고다니기 지쳐버리게 됩니다. 그렇다고 작게 만들면 디스플레이와 입력 인터페이스가 불편해집니다.

휴대용 기기에서 디자인은 빼놓을 수 없습니다. 대체 디자인이 뭐가 중요하냐 기능만 있으면 되지라고 말하고 다니는 사람들이 많고, 저도 간혹 그렇게 말하고 다니지만, 항상 그렇듯이 사람들이 얘기하는 것과 마음이 원하는 것은 좀 다릅니다. 디자인은 마음이 원하는 거잖아요.

하나 더, 휴대용 기기를 사고 나서 후회하지 않으려면, 항상 직접 제품을 보고 10분 정도라도 사용을 해보기를 권합니다.

Fujitsu P7120 노트북

지금까지 제가 구입한 휴대용 기기 중에 가장 만족스러운 제품입니다.

제가 이 제품을 구입할 시기는 학교에 다니던 시절이었고, 학교에 매일 들고다니면서 충전기 없이도 오랫동안 사용할 수 있는 제품이 필요했습니다. 디스플레이의 크기나 성능보다는 휴대성과 배터리 성능이 우선이 되었죠.

P7120은 휴대성을 극대화한 노트북 제품입니다. 일단 10.6인치에 1.3kg 밖에 되지 않습니다. 어느 가방에나 쏙쏙 들어가고 공책처럼 한손으로 들고다닐 수 있을 정도입니다. 배터리는 스펙 상 7시간인데, 사용 패턴에 따라 다르겠지만, 적어도 4-5시간 이상은 사용할 수 있었습니다. 굉장히 훌륭한 편이죠.

P7120을 구입할 때 함께 고려한 제품은 Thinkpad 의 서브노트북 계열인 X 시리즈와 Sony의 서브노트북 계열인 TZ 시리즈였던 걸로 기억하는데, 사실 크기, 무게나 성능은 모두 비슷한데, 크기나 무게에서 구입에 영향을 미치지 않을 정도로 아주 약간 P7120이 괜찮았던 걸로 기억하네요.

Thinkpad는 친구의 것을 보고 마음에 들긴 했는데, 좀 더 큰 디스플레이를 채용하고 있기 때문에 선택에서 제외되었습니다. Sony는 역시 키보드 감이 개인적으로 마음에 들지 않았습니다. P7120이다!라고 결정하게 된 계기는 역시 선배의 제품을 눈으로 보고 직접 사용해본 후의 느낌이었습니다. 키보드 감이라든가 소음 문제, 디자인이 마음에 들더군요.

구입하기 전에 별로 생각하지 않았는데 구입한 후에 만족하게 된 것은 디자인이었습니다. 공공 장소에서 들고다니거나 사용하고 있을 때 괜히 뿌듯한 느낌이랄까요. 흔히 된장남이다 된장녀다라고 하는데, 그 뿌듯한 기분을 부인할 수는 없죠. 소음 문제도 의외로 만족스러웠습니다. 쿨링 팬 대신 히트 싱크를 채용하고 있기 때문에 하드 디스크 소리만 납니다. 노트북 하드디스크는 훨씬 조용하죠. 그래서 PC 소음에 익숙한 제겐 엄청나게 조용하게 느껴집니다.

대신 역시 열 문제가 있습니다. 무릎에 놓고 사용하면 상당히 따뜻해지죠. 하지만, 이후에 맥북 프로를 사용해보고는 경악했었습니다.

이번이 두번째 노트북인데 노트북 배터리를 교체해보고서야 배터리는 소모품이라는 것을 깨달았습니다. 1년쯤 지나자 1시간을 못버티더니 배터리를 교체하자마자 구입 당시의 배터리 용량을 보여주더군요. 다행히 폭발 위험이 있는 배터리라서 무상으로 교체했습니다만. :)

iPod Touch

iPod Touch를 사고 싶다는 유혹과 쓸모없다는 판단 사이에서 고민하고 있습니다.

디자인은 마음에 듭니다. iPod Touch와 같이 디스플레이가 휴대용 기기의 대부분을 차지하는 디자인이 궁극적으로 가야하는 방향이라고 봅니다. 터치스크린 방식도 요즘 슬림형 핸드폰의 극악 버튼감 같은 걸 보면 별로 문제가 안될 것 같구요.

크랙, 한글 사용 등의 문제도 PDA로 각종 삽질을 하던 때가 떠올라서, 과연 그게 너드가 아닌 정상적인 인간이 할 짓인가… 그런 생각을 하고 있습니다. 넌 너드잖아 라고 하시면 할 말은 없습니다만.

가장 큰 문제는 ‘쓸데가 없다’는 것입니다. 회사 근처로 이사온 후로 출퇴근 시간이 걸어서 10분이고 제가 어딜 많이 다니는 것도 아니라서 이런 제품을 쓸 시간과 필요가 없습니다. 제가 이사오기 전이었다면 벌써 샀겠지만 말이에요.

음악이나 비디오 용으로 사용할 수 있겠지만, 이미 iPod을 가지고 있어서 디자인 외에는 굳이 살 이유를 모르겠네요. 참고 좀 더 기다려봐야겠습니다.

MacBook Air

세간에 악평들이 많았는데, 대부분은 성능과 가격 위주라서 서브노트북을 사용해보지 못한 사람들인 것 같습니다. 사실 서브노트북으로서 MacBook Air의 스펙은 일반적으로 만족스러운 것 같습니다. 물론 이러한 평도 저의 사용 패턴을 기준으로 하는 것입니다.

제 입장에서 MacBook Air의 문제점은 포트 문제와 배터리 문제겠네요. 회사에서 무선랜만 사용할 수 있는 환경이 못됩니다. 무선랜의 액세스를 제한해놨거든요. 그렇다고 USB 랜카드를 사용하기도 힘든게 USB 포트가 하나밖에 없습니다. 배터리 교환을 위해 A/S 센터에 맡겨야하는 것도 굉장한 부담입니다. 배터리를 구입하는 것과 A/S 센터에 맡기는 것은 천지 차이죠.

사실 이 모든 것을 극복할 수 있게 만드는 것이 바로 애플의 간지 디자인이긴 합니다. 얇기와 무게에 집중하고 디스플레이의 크기를 유지한 것도 맘에 듭니다.

요즘은 노트북을 회사에 놓고 다니는데, 그래서 휴대성이 크게 장점으로 작용하지 않고, P7120의 디스플레이 크기가 불만으로 작용하고 있습니다. 여러 사람들의 맥북을 관리해주느라 사용해보고 나서 맥 애플리케이션에 대한 동경도 새겼고, 너드-개발자로서 맥 애플리케이션에 대한 오지랖을 넓히고 싶다는 소망도 그동안 있었습니다.

아직 구입은 미루고 있습니다. 아직 실제로 사용해볼 기회도 없었구요. 애플의 신제품은 항상 결함이 있다라는 친구의 조언도 있네요.

한가지 더 이유를 들자면 이렇습니다. 노트북에는 데스크탑 하드디스크보다 성능이 떨어지는 하드디스크가 장착되는데요. SSD가 장착된 MacBook Air는 비용효율 면에서 일반적인 기준으로는 도저히 사기가 어렵습니다. SSD가 노트북에서 보편화될 것은 시간 문제인데, 기왕 사는 김에 SSD 버전을 사고 싶긴 합니다. 그래서 다음 MacBook Air의 사이클을 기다려보는 것도 괜찮을 것 같구요. 미리 이번 버전을 구입하고 다음에 파는 것도 괜찮을 것 같구요. 여전히 고민 중입니다.

Fujitsu P7120, iPod Touch and MacBook Air 더 읽기"

Sun Accuires VirtualBox

리눅스 데스크탑에서는 VMware Workstation을 구입해서 윈도우즈를 사용하고 있고, 윈도우즈 데스크탑에서는 VMware player를 이용해 리눅스를 사용하고 있습니다. VirtualBox는 국내 리눅스 사용자들의 IRC 대화와 블로그를 통해 알게 되었는데, VirtualBox는 VMWare, Microsoft의 Virtual PC와 함께 국내에서도 어느 정도 지명도가 있는 VM 소프트웨어 입니다. VirtualBox에 대한 재미있는 소식이 있더군요.

Sun이 VirtualBox를 만든 Innotek인수한다고 합니다. (via Tim Bray)

VM 기술은 사용자에게 매력이 있는 기술이나 중요한 기술의 수준을 넘어서서, 기술 자산으로 보유할 매력이 있을만큼, 점점 보편화된 – 다르게 말하면 싼 – 기술이 되어가고 있는 것 같습니다. ‘싼 기술’이란 것은 중요하지 않다는 것이 아니라 ‘시장’이 그 기술이 중요하다는 것을 인정했다는 것을 의미하는 것이죠.

Sun Accuires VirtualBox 더 읽기"

Prefactoring

PrefactoringPrefactoring by Ken Pugh

오랜 경험을 통해서 소프트웨어 개발에 관한 통찰을 얻은 소프트웨어 개발자라면, 자신이 얻은 교훈을 세심하게 준비된 실제 사례를 곁들여 다른 사람에게 보여주고 싶은 욕구를 한번쯤은 느꼈을 것이다. 이 책은 바로 그러한 책이다.

이 책의 제목인 Prefactoring은 자신과 다른 사람들의 경험으로부터 얻은 통찰을 소프트웨어를 개발하는 데에 사용하는 것이라고 저자는 설명한다. 그렇다면, Prefactoring이란 경험을 가진 여러 소프트웨어 개발자들이 이미 하고 있는 일이다. 단지 반짝하는 제목 이상의 뭔가가 있을까? 다음은 저자가 내세우는 3가지의 가이드라인이다.

  • Extreme Abstraction
  • Extreme Separation
  • Extreme Readability

더이상 언급이 필요없을 정도로 소프트웨어 개발에 있어서 핵심적인 가치들이라고 할 수 있다. Abstraction과 Separation은 나도 ‘프로그래머에게 필요한 능력‘이라는 글에서 언급한 적이 있다.

이 책에서 가장 읽을만한 부분은 Preface다. 이 책을 사지 않더라도 서점에 들르게 되면 서문 부분을 한번 뒤적거려볼만한 가치는 있다.

서문에서 얘기하고 있는 것 중 하나는 바로 어떤 원리나 프랙티스에 얽매이지 말고 항상 상황-문맥에 따라 트레이드 오프(trade-off)를 고려해서 판단해야한다는 것이다. 이름 있는 훌륭한 엔지니어들에게서는 항상 이러한 모습을 볼 수 있다.

One rule exists: nothing works everywhere, and hence, you must be the judge if a particular practice is appropriate for your application. You need to apply principles in context. The decison whether to use a particular principle or practice depends on the situation in which it is employed.

다른 하나는 바로 회고의 중요성이다. 회고에 대해서는 다른 글에서 좀 더 얘기하기로 하고 여기서는 말을 아껴야겠다. Norman L. Kerth의 Project Retrospectives라는 책을 추천하고 있는데, 한번 읽어봐야겠다.

이 책의 본 내용은 처음에 얘기했듯이 CD 대여점을 위한 가상의 프로젝트를 진행해 나가면서 정련된 가이드라인과 원리들을 보여주는 식으로 이루어진다. 이 가이드라인과 원리들은 하나하나 한번 읽고 넘기기 아까울 정도로 소중한 교훈들이지만, CD 대여점 프로젝트는 좀 지루한 편이다. 참고로 난 100 페이지 정도 읽고 나서는 그냥 나머지는 가이드라인만 읽고 말았다.

가이드라인 중에는 자주 들을 수 있는 것들도 있고 아닌 것들도 있는데, 그렇지 않은 것 중에 하나를 소개하자면 다음과 같은 것이 있다.

Splitters can be lumped more easily than lumpers can be split: It is easier to combine two concepts than it is to separate them.

다시 말하면, 뭉쳐있는 것을 나누는 것보다 나뉘어있는 것을 합치기가 쉽기 때문에, (고민이 된다면) 나누어놓는 쪽을 택하는 것이 좋다는 것이다.

이는 여러가지 상황에서 적용될 수 있는데, 예를 들어 어떤 인터페이스에서 발생할 수 있는 예외 (또는 에러 코드)들을 정한다고 해보자. 당연히 너무 세부적으로 나누면 복잡할 것 같다는 생각이 들기 마련이다. 어느 정도 수준으로 나누어야 할지도 애매한 경우가 있다. 어차피 미래의 필요는 예측하기 힘들다. 하지만 우리가 지금 알 수 있는 것은 미리 나누어두는 것이 좋다는 것이다. 나중에 쌓인 에러 로그를 보면서 비슷한 종류의 에러끼리 모아서 분석할 수는 있지만, 애초에 나누어놓지 않은 에러는 분석이 아예 불가능하다.

이러한 원리는 이러한 결정이 돌이키기 힘들 수록 더욱 강하게 작용한다. 분류하는 정보의 크기가 너무 커서 다시 분류하기가 힘들수록, 이미 여러 고객들과 미리 정한 인터페이스를 변경하기가 힘들수록 이러한 가이드라인이 머리 속에 떠오를 것이다.

이 책은 그리 두꺼운 책도 아니니 부록에 있는 가이드라인 모음만 쓱 훑어보는 식으로 읽어보는 것도 괜찮을 듯 하다. 하지만, Jolt Award 수상작에게 기대한만큼 만족스럽지 못한 것도 사실이다.

Prefactoring 더 읽기"

C++ Local Class as Template Argument

이 글은 최철호 군의 local function object를 stl algorithm function들에 사용하지 못하는 이유에 대한 답변입니다.

한마디로 말하면, 로컬 클래스(local class)는 템플릿 인자로 사용될 수 없기 때문입니다.

local function object는 로컬 클래스이고, for_each는 functor (function object)의 타입을 템플릿 인자로 받는 템플릿 함수입니다. 함수 인자로부터 템플릿 인자가 deduce되기 때문에 템플릿 인자가 생략되어 일반 함수처럼 보이는 것 뿐이죠.

템플릿 인자는 linkage를 필요로 합니다. 특정 템플릿 인자에 대한 템플릿의 인스턴스는 서로 다른 컴파일 유닛에서 사용되므로 특정 컴파일 유닛에 속한다고 할 수가 없을거라는 걸 생각하면 당연히 그럴테죠. (컴파일 과정에서 생성된 템플릿 인스턴스는 다른 소스 파일에 존재한다고 생각하시면 편합니다.)

한편, 로컬 클래스는 linkage가 없습니다. (C++ Standard의 [basic.link] 부분을 참조하세요.) 정확한 이유는 모르겠으나, linkage를 가지게 되는 순간부터 문법과 구현 모두 복잡해지기 시작할 것임을 쉽게 상상할 수 있습니다.

gcc 4.1를 사용한 컴파일에서는 ‘no matching function for call to …’와 같은 오류를 발생합니다. 이러한 오류가 발생한 이유는 이해할 수 있으나, 약간이라도 가능성이 있는 경우들을 잘 보여주지 않는 불친절한 gcc 컴파일 오류의 사례를 보여주고 있네요.

로컬 클래스의 인스턴스를 로컬 스코프에서 사용한 이런 자연스러운 경우를 표현하지 못하는 것은 좀 아쉽습니다. C++의 algorithm과 functional은 C++에서 빼놓을 수 없는 요소일 뿐만 아니라 그 사용이 상당히 권장되고 있습니다. 이 때 사용되는 functor들을 일일이 namespace 스코프에 정의해서 namespace에 난립하게 하는 것도 그다지 바람직하지 않은 것 같구요. 로컬 클래스는 오히려 functor와 같은 크기도 작고 용도도 한정적인 경우에 가장 유용하겠죠. 그래서인지 Anthony Williams에 의해 로컬 클래스에 linkage를 부여하자는 제안 (Making Local Classes more Useful)도 나와있네요.

C++ Local Class as Template Argument 더 읽기"

Unicode Support in Programming Languages, Part 1

유니코드 지원

프로그래밍 언어에서 유니코드 (Unicode) 지원은 크게 두가지로 나누어볼 수 있다. 바로 소스 코드(source code)에서의 유니코드 지원과 문자열(string)에서의 유니코드 지원이다. 소스 코드에서의 유니코드 지원은 문자열 리터럴과 클래스, 변수 이름과 같은 심볼들의 이름에서 유니코드 문자를 표현할 수 있음을 의미한다. 문자열에서의 유니코드 지원은 소스 코드에서의 유니코드 지원을 포함한다. 문자열에서의 유니코드 지원은 문자열 변수, 리터럴이 유니코드 문자를 표현할 수 있는가 뿐만 아니라, 문자열과 문자를 다루는 방법, 문자열과 바이너리의 구분, 여러가지 다른 인코딩으로의 변환 등을 포함한다.

이 글에서는 ‘문자열에서의 유니코드 지원’을 중심으로 얘기를 해보자.

C 문자열

C/C++, PHP, Python (< 2.0), Ruby와 같은 언어들에서는 다음과 같은 문자열을 가지고 있다.

  • 문자열은 외부에서 주어진 인코딩으로 인코딩된 바이너리 형태며, 문자열 자체만으로 어떤 인코딩인지는 구분할 수 없는 방식.
  • 문자열과 문자를 다루는 함수는 시스템 로케일 또는 컴파일러에게 주어진 설정에 따른 인코딩을 가정함.
  • 이를 다른 인코딩의 문자열로 변환하는 방법을 문자열에 대한 언어적인 지원이나 라이브러리로 제공.

이러한 문자열 방식의 문제점은 그동안 수많은 프로그래머들을 괴롭혀온 것이라고 볼 수 있다.

  • 유니코드 문자를 사용할 수 없다. 동시에 여러 문자집합을 사용하기 어렵다.
  • 특정 문자집합 인코딩(charset encoding)을 가정하고 프로그래밍하는 경우가 잦아서, I18N이 매우 어렵다.

C와 함께하는 프로그래밍 역사에는 ‘a byte is a character’라는 생각이 깃들여있다. 하나의 문자가 실제로 ‘문자’에 해당하는 문자집합 인코딩을 가진 영어 또는 서유럽 언어에서는 크게 문제가 안되지만, 이른바 멀티바이트(multibyte) 문자열을 사용하는 한국, 중국, 일본과 같은 국가에서는 인코딩 지옥(encoding hell)이라고 부를만큼 사용자나 프로그래머들이 어려움을 겪어왔다고 볼 수 있다.

Java 문자열

Java는 유니코드 지원과 함께 탄생했다. 국제 표준에 해당하는 유니코드에 대한 개념이 그리 보편화되지 않았던 1996년에 Unicode 1.1을 반영하는 Java 1.0이 발표되었다.

  • 타입을 사용한 문자열과 바이너리의 구분: 문자는 char형, 바이트는 byte형을 이용하고, 문자열과 바이너리는 각각의 배열로 표현한다. 문자와 이를 인코딩한 형태를 타입을 이용해 구분했다는 것은 당시로서는 획기적인 것이었다.
  • 유니코드 문자집합 (UCS-2)의 지원: 내부적으로 2byte로 표현되는 char형은 유니코드에서 정의한 UCS-2 문자집합의 코드포인트(codepoint)에 해당했다. Java 5에서 Unicode 4.0을 반영하면서 char형은 UTF-16의 코드유닛(codeunit)을 나타내게 되었다.
  • 문자열과 문자를 다루는 함수는 UTF-16 이외에 더이상 인코딩을 신경쓸 필요가 없게 되었음. (UCS-2에 속하는 문자만 사용한다면 아예 신경 쓸 필요가 없음.)
  • 문자열을 특정 인코딩으로 인코딩하는 방법을 언어적인 지원과 라이브러리로 제공.

Java 초기에는 유니코드 지원으로 인한 성능 문제에 대한 논란이 많았던 걸로 기억한다. 지금 돌이켜보면, 유니코드 문자열의 도입으로 인한 성능 하락은 그리 큰 문제가 아닌 듯하다.

Java의 유니코드 지원 방식은 다른 언어들의 모범이 될만큼 깔끔하고 성공적으로 적용되었다고 생각한다. 개인적으로 가장 맘에 드는 Java의 특징 중 하나가 바로 유니코드 지원이다.

To Be Continued…

다음에는 C/C++의 wchar_t, Perl의 유니코드 지원, Python 2.0의 유니코드 문자열, Python 3000과 PHP 6의 유니코드 문자열, Ruby의 유니코드 지원에 대해서 다루어보겠다.

Unicode Support in Programming Languages, Part 1 더 읽기"

Ease-of-use in Databases

Jim Starkey, a Senior Software Architect for MySQL, said,

what a bother mapping back and forth between fixed-length declaration and variable-length storage! If the Standard would let us, the user could just say, "It’s a number—Just deal with it." Modern languages and frameworks have strings without size. Why not databases?

So that’s how I prefer to deal with ease-of-use versus performance: Make it easy for the user to let the software do the smart thing.

(…)

We’ll change the data model, the data types, the application topology, and the network interface, but they’ll still be relational databases.

Ease-of-use in Databases 더 읽기"