2015년 5월 27일 수요일

소프트웨어 개발자 성장에 꼭 필요한 리뷰

우리나라 개발자들은 프로그래밍은 잘 하는데 대접을 못 받는다는 얘기가 있다. 또, 머리는 좋은데 환경이 나쁘다는 얘기도 있다. 젊은 개발자들은 외국의 개발자들에 전혀 뒤지지 않는데 나이를 먹을수록 실력이 떨어진다는 얘기도 있다. 이런 얘기를 들어보면 우리나라에서 개발자는 나이를 먹을수록 할만한 직업이 아니라는 생각이 든다.

필자는 이런 현상이 벌어지는 이유 중 하나로 리뷰를 잘 안 하는 문화를 꼽고 싶다. 개발자라면 각자 생각해보자. 지금까지 얼마나 많은 리뷰를 해왔던가? 자신이 작성한 문서, 소스코드를 다른 사람이 얼마나 리뷰를 해줬고, 나는 또 다른 사람이 만든 문서와 소스코드를 얼마나 많이 리뷰를 해줬던가? 잘 생각해보자. 개발자가 10년 정도 일을 했으면 수백 건의 문서와 수만에서 수십만 라인의 코딩을 해왔을 것이다. 그 중에서 리뷰를 받은 경우는 몇 %나 될까?

개발자를 성장하게 해주는 가장 효율적인 수단은 “리뷰”다. 물론 책을 보거나 인터넷을 통해서 지식을 익히는 것도 하나의 수단이다. 하지만 리뷰를 통해서는 훨씬 더 효율적으로 배우고 책을 통해서는 도저히 알 수 없는 수많은 것을 배운다. 물론 본인도 리뷰를 통해서 다른 사람에게 나의 경험과 지식을 전달해줘야 한다.

리뷰는 요구사항을 확인하고 문제점을 찾아내고 바로 잡는 역할도 하지만 자연스럽게 개발자들의 성장을 돕는다. 물론 리뷰를 제대로 해야 한다. 수박 겉핥기 식으로 훑어보는 것은 제대로 된 리뷰가 아니다. 문서든 소스코드든 본인의 전문적인 관점으로 철저하게 수행해야 하면 여기에 많은 시간과 노력을 투자해야 한다. 리뷰를 귀찮은 절차로만 생각하고 바쁘면 생략하거나 흐지부지 사라지는 경우가 많다. 하지만 생략되거나 엉터리 리뷰 때문에 제품이 잘못되기도 하지만 장기적으로는 개발자들이 성장을 하지 못한다.

내가 경험하기로는 중소기업이나 대기업이나 리뷰를 하고 있다고 한 회사치고 진짜 리뷰를 제대로 하고 있는 회사는 매우 드물다. 대부분은 정형화된 프로세스를 따르기 위해서 형식적으로 수행하거나 리뷰를 위한 시간을 주지 않아서 개발자들이 어쩔 수 없이 리뷰를 대충하는 경우가 많다.

그럼 이렇게 꼭 필요한 리뷰가 우리나라에서 리뷰가 잘 안 되는 이유가 무엇일까?

첫 번째 이유는 바쁘다는 이유다. 바빠서 리뷰를 할 시간이 없다는 것이다. 하지만 바빠서 리뷰를 하지 않거나 소홀히 하면 점점 더 바빠질 것이다. 문제가 조금씩 더 쌓이고 개발자들이 실력이 정체되어서 개발 효율이 점점 더 떨어지기 때문이다.

두 번째 이유는 리뷰에 익숙하지 않기 때문이다. 그래서 리뷰를 거북해하는 개발자가 많다. 리뷰를 하면 지휘고하를 막론하고 자식이 작성한 스펙, 설계, 소스코드를 철저히 검토 받는다. 리뷰를 진행하면 지적을 당하기도 하고 다양한 의견 충돌이 있어서 협의, 조율해야 할 때도 있다. 물론 도움을 받는 경우도 많다. 하지만 나이별, 직급별 상하관계가 굳건한 조직이라면 아랫사람은 쉽게 반대 의견을 제시하기 어렵다. 자존심이 상하기도 하고 관계가 틀어지기도 한다. 또, 윗사람의 의견은 지시처럼 들리기 일쑤다. 이런 딱딱한 조직에서 리뷰는 쉽지 않다.

그럼 우리나라 대기업들은 어떨까? 회사마다 다르지만 보통 개발자들은 자기 분야의 보직을 바꾸지 않고 오랫동안 일을 한다. 그러다 보니 그 개발자가 일하는 것을 봐줄 사람도 별로 없고 리뷰를 하지 않아도 별 문제 없이 일이 진행되는 것처럼 보인다. 회사에서 리뷰를 강제화해도 진짜 리뷰가 잘 되는지 파악하기는 쉽지 않다. 이런 문제를 보완하고자 자꾸 프로세스와 절차를 만들어도 개발 효율만 떨어지지 리뷰가 잘 되는 것은 아니다. 이런 문제를 가지고 있는 회사가 리뷰를 잘하고 있는 회사보다 훨씬 많다.

리뷰를 제대로 안 하면 버그도 많아지고 이를 고치기 위해서 비용이 더 많이 든다. 테스트를 강화해서 해결을 하려는 노력도 많이 하지만 리뷰를 잘하는 것보다는 장기적으로 더 비싼 방법이다. 

결정적인 문제는 개발자가 성장하기 어렵다는 것이고 한가지 일에 매몰돼서 빠져 나오지 못하는 경우가 많다. 리뷰를 잘 하고 있다는 얘기는 자연스럽게 공유가 잘된다는 의미와도 같다. 말로만 공유한다고 떠들어도 리뷰를 안 하면 문서가 제대로 작성된 것인지 알 수가 없다. 하지만 리뷰를 제대로 하면 문서가 조금만 부실해도 바로 발견이 된다. 리뷰를 제대로 하면 문서가 충실하게 작성될 뿐만 아니라 그 내용이 리뷰를 통해서 동료들에게 전달된다.

리뷰를 제대로 안 하는 현상이 지속되면 특정 지식을 특정 개발자만 알고 있게 되고 이런 개발자가 많아질수록 조직의 유연성은 대단히 떨어진다. 소수의 개발자만 퇴사를 해도 회사가 휘청거리고 개발자들이 정말 바쁠 때 다른 개발자가 도와주기 어렵게 된다. 바쁜 사람은 항상 바쁘고 노는 사람은 노는 회사가 된다.

리뷰는 치열하게 해야 한다. 리뷰에 참여를 했다는 의미는 공동책임을 진다는 의미다. 고참 개발자가 될수록 다른 사람의 문서나 소스코드 리뷰를 더 많이 해줘야 한다. 그런 과정을 통해서 개발자는 계속 성장할 것이고 개발자 본인을 자유롭게 한다. 언제든지 현재 업무를 다른 사람에게 넘기고 새로운 일을 할 수 있도록 해준다.

이글은 ZDNet Korea에 기고한 칼럼입니다.

Image by http://www.lab-initio.com

2015년 5월 26일 화요일

외국에 출시한 소프트웨어가 날짜 때문에 낭패 본 사연 (4)


10년차 개발자인 김과장(가상의 인물)은 최근에 소프트웨어를 영어를 지원하도록 만들었다. 어플리케이션에서 표시되는 모든 메시지(메뉴, 버튼, 다이얼로그 등)를 영어로 번역했다. 그렇게 해서 영어버전을 출시했는데 얼마 안 가서 버그가 보고 되었다.

날짜를 2015/05/15 이렇게 표시를 했는데 미국에서는 05/15/2015로 표기해 달라는 것이다.

김과장은 소스코드를 다음과 같이 수정해서 버그를 해결했다.

if (locale == “en_US”)
     date_format = “mm/dd/yyyy”;
else
     date_format = “yyyy/mm/dd”;

물론 의사코드(pseudocode)이므로 정확한 소스코드는 아니다. 예를 든 것뿐이다. 

그런데 얼마 안 있어서 호주에서는 15/05/2015로 표기를 해달라고 하는 것이다. 기존의 표기는 헷갈린다고 한다. 이렇게 하나씩 고치다 보니 날짜뿐만 아니라 여러 가지 분야에서 끝도 없는 수정이 계속 되었다. 문제는 이렇게 고쳐달라고 요청하는 사용자보다 틀린 것을 참고 쓰거나 아예 포기를 해버리는 사용도 많을 텐데 파악이 안 된다는 것이다.

김과장은 로케일만 알았지 로케일이 시스템에 무엇을 바꾸는지는 잘 몰랐던 것이다. 김과장은 로케일을 제대로 이해하고 있었다면 이렇게 김과장이 직접 로케일의 변화에 따른 프로그래밍을 직접 할 필요가 없었다. 그냥 시스템에서 제공하는 함수를 쓰면 되는 것이었다. 물론 OS나 개발 라이브러리에 따라서 사용법은 조금씩 다르다.


로케일은 시스템의 무엇을 바꿀 수 있을까? 이렇게 로케일이 시스템에 미치는 영향을 6가지로 구분하여서 이를 로케일 카테고리라고 한다.

로케일 카테고리의 약자인 “LC”를 앞에 붙여서 LC_TIME, LC_NUMERIC, LC_MONETARY, LC_COLLATE, LC_CTYPE, LC_MESSAGES 이렇게 6가지가 정의되어 있다. 대부분의 OS와 개발 라이브러리에서 이를 지원하고 있다.

사용법은 setlocale(로케일 카테고리, 로케일) 이다. 즉, setlocale(LC_TIME, “de_DE”) 이렇게 하면 날짜와 시간을 독일 식으로 표현하라는 얘기다. 이렇게 6개를 모두 설정하려면 귀찮기 때문에 LC_ALL이라는 것을 둬서 setlocale(LC_ALL, “de_DE”)이라고 하면 한번에 6개의 카테고리가 모두 독일식으로 설정된다. 

그럼 하나씩 알아보자.

LC_TIME 시간과 날짜의 표현에 대한 설정이다. 김과장이 이 카테고리만 설정하고 이와 관련된 함수만 사용했어도 위에서와 같은 고생은 안 해도 됐다. LC_TIME이 영향을 미치는 함수는 개발 라이브러리에 따라서 다르다. GNU C 라이브러리인 경우에는 strftime(), strptime()이다. PHP나 Python도 strftime()을 지원한다. LC_TIME를 세팅하면 로케일 별로 다른 시간과 날짜가 표시된다.

LC_NUMERIC 숫자 표현을 위한 설정이다. 나라마다 숫자 표현이 크게 다르다는 것을 모르는 개발자도 상당히 많다. 우리는 소수점으로 점(.)을 쓰는 것을 당연하게 생각하지만 그렇지 않은 나라도 매우 많다. 우리가 이렇게 로케일별로 다른 표현을 다 연구할 필요는 없다. LC_NUMERIC이 영향을 미치는 함수를 쓰기만 하면 된다. strtod(), atof()가 그 예이고 sprintf(), printf() 함수도 영향을 받는다. 자세한 것은 나중에 다루겠다.

LC_MONETARY 화폐, 금액을 다루기 위한 설정이다. 영향을 받는 함수는 strfmon()이 있다. 최근에는 유로화를 지원하기 시작하면서 좀 복잡해졌다. 라이브러리 별로 지원하는 것이 조금씩 다르기도 하다.



LC_COLLATE 정렬에 관한 것인데 조금 복잡하다. 정확하게 이해하려면 사전에 어떠한 순서로 정렬이 되는 것이 자연스러운지 생각해보면 된다. 영어에는 대소문자에 대한 정렬 방법이 일반 ASCII 정렬방법과는 약간 다르고 한국어에도 ‘ㄱ’이 어느 위치에 정렬되어야 하는지는 EUC-KR 코드의 순서와는 약간 다르다. ASCII 순서에 따르면A, B, a, b 이렇게 되지만 사전에서는 a, A, b, B이기 때문이다. 물론로케일별로 다르다. Collation이라는 용어는 나중에 Database 설정에도 나오기 때문에 잘 알아두는 것이 좋다. LC_COLLATE가 영향을 미치는 함수는 strcoll(), wcscoll() 등이 있다. 즉, 이런 함수를 이용해서 정렬 함수를 만들어야 각 로케일에 맞는 정렬이 된다.

LC_CTYPE 문자의 종류를 다루기 위한 설정이다. 문자인가 숫자인가, 대소문자 구분을 다룬다. strlen(), stricmp(), strlwr(), strupr() 등의 함수가 영향을 받는다.

LC_MESSAGES 로케일 별로 번역된 메시지를 표현하기 위한 설정이다. catopen(), gettext() 등이 영향을 받는데, 메시징은 국제화에서 별도로 다뤄야 할 만큼 중요하기 때문에 추후 여러 회에 걸쳐서 다뤄질 것이다.

이렇게 거의 모든 OS와 개발라이브러리에서 다루는 6가지 로케일 카테고리 외에도 LC_ADDRESS, LC_NAME, LC_PAPER, LC_TELEPHONE 등을 사용하는 곳도 있다.

우리는 로케일을 지정함으로써 로케일별로 다른 표현 및 기능이 자동으로 바뀌도록 개발을 해야 한다. 소스코드에 if (locale == "de_DE") 등과 같은 표현이 절대로 있어서는 안된다. if (lang == "english")는 더더욱 안된다.

이미지 by Kolmisoft

2015년 5월 19일 화요일

독일어 버전 소프트웨어란 말이 잘못된 이유 (3)


본 시리즈는 차례대로 읽으면 소프트웨어 국제화가 전체적으로 이해가 되어서 소프트웨어 개발자에게 도움이 되는 방향으로 진행하려고 하고 있다. 개발자마다 지식과 경험이 천차만별이라서 초급 개발자를 기준으로 작성하고 있다.

경영자가 개발자에게 독일어 버전을 만들라고 하면 어떨까? 대부분은 콩떡 같이 말하면 찰떡같이 알아듣겠지만 엄밀히 말하면 틀린 얘기다. 정확한 표현이 아니라고 하는 것이 낫겠다.

우리는 우연히 한 국가에서 하나의 언어만 쓰고 있다. 공식 언어가 존재한다. 하지만 미국만 하더라도 공식 언어가 존재하지 않는다. 누구나 미국의 공식 언어는 영어라고 생각하지만 관습 헌법 같은 것일 뿐이다. 그나마 미국은 영어가 대표적인 언어다. 하지만 바로 위의 캐나다로 가면 영어와 프랑스어를 쓰고 있으며 어느 한 언어를 무시할 수 없다.

스위스로 가면 독일어, 프랑스어, 이탈리아어, 로만슈어의 네 가지 언어가 공용 언어다.  이렇게 한 나라에서 여러 가지 언어를 쓰는 경우는 매우 많다. 오히려 한 가지 언어만 쓰는 나라가 더 적다.

반대로 언어의 관점으로 보면 하나의 언어가 매우 많은 나라에서 쓰인다. 독일에서 쓰는 표준 독일어와 스위스에서 쓰는 독일어는 조금 다르다. 독일 사람들은 스위스 사람들이 말하는 독일어를 이해하지 못하곤 한다. 스페인어도 매우 많은 나라에서 쓰인다. 스페인을 비롯해서, 멕시코, 칠레, 미국 등 국가에서 사용된다. 

그럼 독일어 버전을 만들라고 하면 표준 독일어를 말하는 것일까? 오스트리아, 스위스, 룩셈부르크 어느 나라의 독일어를 지원하라는 얘기일까? 대충 다 알아보지 않을까?라고 생각하는 것은 안일한 생각이다. 각 나라 별로 같은 언어라고 하더라도 쓰는 방법이 다 다르다.

그래서 소프트웨어 국제화에서는 언어와 국가, 정확하게 말하면 지역을 조합해서 부른다. 이것을 로케일(Locale)이라고 한다. 그래서 앞으로 소프트웨어 국제화를 얘기할 때는 언어나 국가로 얘기하지 않고 로케일을 기준으로 얘기를 해야 한다.

로케일의 컨셉은 거의 모든 OS와 개발 언어에 포함되어 있다. 

로케일의 표기 방법은 다음과 같다. 

[language[_territory][.codeset]]

language는 언어를 나타내며 알파벳 소문자 두 글자로 이루어져 있다. 한국어는 “ko”, 일본어는 “ja”, 영어는 “en”, 독일어는 “de”라고 표기한다. ISO639에 표준이 정의 되어 있다.

territory는 지역을 의미하며 알파벳 대문자 두 글자를 사용하며 생략하기도 한다. 한국은 “KR”, 일본은 “JP”, 미국은 “US”, 독일은 “DE”를 사용한다. ISO3166에 표준이 정의 되어 있다.

codeset은 어떠한 코드셋을 사용했는지 나타내는 것으로 생략할 수 있다. 한국어인 경우 “UTF-8” 또는 “euc-kr”을 사용한다.

그래서 한국어는 ko_KR이라는 로케일을 사용하게 된다.

독일어 하나만 해도 de_DE(독일), de_AT(오스트리아), de_LU(룩셈부르크), de_CH (스위스) 이렇게 여러 가지 로케일로 표한 할 수 있다. 

이렇게 해서 탄생할 수 있는 로케일의 개수는 수백 개가 넘지만 개발 언어의 라이브러리 별로 지원하는 범위가 조금씩 다르다. 하지만 우리가 흔히 지원하려고 하는 로케일은 거의 포함이 되어 있으므로 걱정할 필요는 없다.

이외에 “C” 로케일이라는 것이 있다. 이것은 GNU C에서 사용되는 것으로서 로케일을 지정하지 않으면 지정되는 디폴트 로케일로서 “POSIX”로케일이라고도 한다.

어플리케이션에서 로케일을 지정하는 방법은 setlocale() 이라는 함수를 쓰거나 환경 변수를 바꾸는 함수를 사용하는 것이다. OS나 개발 언어에 따라서 조금씩 다르다. 

로케일이 바뀌면 무엇이 바뀌는지는 다음 연재글에서 알아보자.

2015년 5월 12일 화요일

소프트웨어를 외국에 출시 하면서 흔히 빠지는 함정 (2)



우리나라 소프트웨어 중에서 외국에서 크게 성공했다고 하는 소프트웨어가 있는가? 온라인 게임을 제외하고는 거의 없다. 사실 게임은 국제화, 지역화를 잘 못하더라도 큰 흉이 안 된다. 하지만 그 외의 많은 소프트웨어들은 제품이든 서비스든 국제화, 지역화에 실패하여 해외 시장에서 실패하는 경우가 매우 많다. 그럼 소프트웨어 회사들, 개발자들이 흔히 하는 실수에는 어떤 것이 있는지 알아보자. 실수를 알아보는 것은 같은 실수를 하지 않도록 교훈을 준다.

먼저 소프트웨어 국제화, 지역화를 하는데 있어서 기술적인 목표를 알아보자. 비즈니스적인 목표는 개발자들이 크게 상관할 바는 아니지만 기술적인 목표는 잘 알아야 흔들림 없이 개발을 할 수 있다.

첫 번째 목표는 국제화, 지역화 품질이다. 해당 지역, 국가에서 받아들여 질만해야 한다. 어색한 번역 외에도 날짜, 숫자, 화폐, 단수/복수, 어순, 쓰기 방향, 키보드배치, 폰트, 띄어쓰기 여부, 쉼표, 온도, 문장정렬, 이름, 주소, 색깔의 의미, 섬머타임, 종이 크기 등 지역, 언어별로 신경을 써야 한다. 소프트웨어마다 신경을 써야 하는 범위가 다르고 나라마다 받아들이는 정도도 다르다. 첫술에 이 모든 것을 다 처리하기는 어렵고 앞으로 중요한 순서대로 자세히 알아보려고 한다.

두 번째 목표는 생산성이다. 국제화, 지역화를 위해서 너무 많은 시간과 비용이 들어간다거나 이를 유지하기 위해서 많은 부담이 되면 실패다. 특히, 번역은 소프트웨어가 업그레이드 될 때마다 계속 변하는데 번거로운 수동 프로세스로 진행을 하면 비용도 많이 들뿐더러 실수로 인한 버그가 발생하게 된다. 또한 국제화, 지역화 아키텍처를 잘못 만들면 돌이킬 수 없는 비효율의 구렁텅이로 빠지게 된다. 아키텍처와 프로세스에 대해서도 앞으로 다루겠다.

그럼 많은 소프트웨어 회사들이 흔히 빠지는 실수는 어떤 것이 있나 알아보자. 우리는 이런 함정을 피해 다녀야 한다.

첫째, 일단 한국어 버전을 먼저 만들고 나중에 국제화, 지역화를 적용한다.

의도했던 의도하지 않았던 이런 회사는 매우 많다. 혼자서 만드는 아주 작은 소프트웨어라면 어떻게 해도 다 되지만 중간 규모 이상의 소프트웨어를 나중에 국제화하는 것은 다 지어서 아파트에 주민들이 살고 있는 상황에서 리모델링을 하는 격이다. 제대로 국제화가 되지도 않고 비용도 10배 이상 많이 들어간다.


둘째, 번역이 전부인줄 알고 번역만 한다.

경영자들은 아주 쉽게 개발자에게 “영어 버전 만들어”, “독일어 버전 만들어” 이렇게 얘기를 한다. 물론 이 말은 정확한 표현도 아니다. 이 시리즈를 계속 읽다 보면 왜 이렇게 말하면 안 되는지 알게 된다. 번역은 소프트웨어 국제화 시 고려해야 할 200가지 중에서 한가지일 뿐이다. 200가지 전부를 완벽하게 지원하는 것은 어떠한 소프트웨어라도 불가능하지만 그중 몇 가지는 꼭 신경을 써야 한다.

셋째, 해외 버전을 별도로 만드는 것이다.

현재 한국어버전 소프트웨어 밖에 없는 경영자가 어느 날 갑자기 “한달 안에 일본어 버전을 만들어”라고 강요를 하면 개발자들이 흔히 하는 선택은 소스코드를 그대로 복사해서 소스코드의 한국어 부분을 전부 일본어로 바꾸는 것이다. 이 방법은 가장 빠른 방법이지만 가장 느리다. 첫 버전은 가장 빠르지만 점점 느려진다. 소스코드를 수정할 때마다 두 소스코드를 모두 고쳐야 한다. 이 와중에 “독일어 버전도 만들어”라고 하면 개발자는 앞이 캄캄해진다. 첫번째 소스코드가 복사된 순간 “지옥문”을 연 것이다. 무식한 경영진을 탓해야 하지만 그렇다고 소스코드를 복사한 개발자도 똑 같은 책임이 있다.

이런 실수는 거대기업을 무너뜨리는 결과를 낳기도 한다.

넷째, 국제화, 지역화 기능을 모두 직접 구현하는 것이다.

이는 자동차를 만들라고 했더니 타이어도 직접 제작하고 유리를 녹여서 유리창도 만들고 에어백도 직접 생산하는 꼴이다. 자동차를 제대로 만드는 방법은 설계를 잘하고 핵심 부품만 우리가 만들고 수많은 부품은 사다가 조립하고 것이다. 그런데 많은 개발자들은 그런 부품이 시장에 있는지도 모르고 직접 만들곤 한다. 물론 엉터리다. 수십 년간 진화해온 전문 부품을 개발자가 며칠 동안 흉내 낼 수 있겠는가? 특히 메시지 번역관련 라이브러리는 많이들 직접 만들어 쓰는데 필자가 수십 가지 사례를 봐왔지만 제대로 만들어서 쓰고 있는 사례는 0 건이었다. 그 외에도 날짜함수, 숫자함수를 직접 만들어서 낑낑대며 고생하는 개발자들도 많이 봐왔다. 국제화, 지역화 기능은 표준이 있으며 직접 구현해야 하는 것도 있지만 상당수는 라이브러리를 이용하거나 OS에 이미 포함된 기능을 써야 한다.

다섯째, 한국어 코드체계를 기반으로 개발을 한다.

한국어 버전을 먼저 만든 경우 흔히 저지르는 실수인데 한국어 인코딩인 “EUC-KR”로 DB나 파일을 저장할 경우 중국어, 일본어나 다른 언어를 저장하려고 할 경우 글자들이 깨지게 된다. 영어까지는 저장하는데 문제가 없어서 무신경하게 지나가곤 한다. “EUC-KR”은 전세계 모든 글자를 담을 수가 없다. 제품이든 서비스든 일단 “EUC-KR”기반으로 소프트웨어를 개발하면 나중에 유니코드 기반으로 소프트웨어를 변경하기는 매우 어렵다. 데이터를 변환해야 하며 모든 기능을 다시 다 테스트 해야 한다. 엄두가 나지 않는 일인 경우가 많다.

여섯째, 우리의 기준으로 외국을 이해하는 것이다.

우리나라가 이러하니 다른 나라도 이럴 것이다라고 착각을 하는 경우다. 우리가 “.”을 소수점으로 사용하니 다른 나라도 그럴 것이다. 단어 사이에는 띄어쓰기를 할 것이다. 종이는 다 A4용지를 사용할 것이다. 하지만 전세계에는 수많은 다른 문화가 있다. 물론 완벽하게 이 모든 문화를 지원할 수는 없지만 일단 다르다는 의심을 가지고 시작해야 한다. 그 중에서 중요한 것들은 지원을 해야 한다.



그럼 어떻게 해야 할까? 반대로 하면 된다. 처음부터 국제화, 지역화 전략을 가지고 아키텍처를 구성해야 하며 하나의 소스코드를 유지해야 하고 잘 개발된 표준과 라이브러리를 이용해서 유니코드를 기반으로 만들어야 한다. 

혹시 경영자가 당장 외국 버전을 턱도 없이 짧은 시간 내에 만들어 내라고 한다면 “그 시간 안에는 안됩니다. 아키텍처를 제대로 구성해서 제대로 만들려면 시간이 더 필요합니다.”라고 주장할 용기가 있어야한다. 이런 것이 씨도 안 먹히는 조직문화를 가진 회사도 많지만 이는 경영자가 시켰다고 6개월 후면 무너질 것을 알면서도 다리를 만드는 것도 같다. 누구의 책임이 더 클까? 생각해볼 문제다. 모든 것을 경영자 등 외부의 탓으로 돌리는 것은 경계해야 할 자세다.

필자는 수십개의 회사를 직접적으로 또 간접적으로는 더 많은 회사의 상황을 직접 봐왔고 이런 어설픈 국제화 적용으로 망해가는 회사를 봐왔기 때문에 이 시리즈를 시작하게 된 것이다. 나는 지식과 정보, 경험, 노하우을 전하겠지만 이것이 얼마나 도움이 될지는 독자의 몫이다.

이 글은 네이버포스트에 게재한 글입니다.

2015년 5월 5일 화요일

외국에서 팔리는 소프트웨어 만들기 위한 소프트웨어 국제화 (1)


가장 먼저 소프트웨어 국제화에 대한 이야기로 글을 시작하려고 한다.

오래 전부터 소프트웨어 세계에는 국경이 없었다. 거의 모든 사람들은 수십 나라에서 개발된 다국적 소프트웨어를 사용하고 있다. 앱을 하나 개발해서 앱스토어에 올리면 바로 다음날부터 전세계 수십, 수백 나라에서 즉시 사용된다.

이제 소프트웨어 국제화는 소프트웨어 개발자라면 필수적으로 알아야 할 지식이다. 소프트웨어 국제화 전문가가 되기 위해서는 십 수년의 공부와 경험이 필요하지만 최소한의 기본 지식은 갖추도록 하자.

기본적으로 영어권 개발자들이 만든 소프트웨어는 국제화에 대해서 별로 신경을 안 써도 큰 문제 없이 전세계에서 사용되는 경우가 많다. 우리도 영어만 지원하는 소프트웨어를 얼마나 많이 써왔던가? 비단 메시지만 영어로 나오는 것뿐만 아니라 날짜 표기, 이름 표기 등도 우리 문화와는 다르지만 소프트웨어를 사용하는 데는 큰 문제가 없다. 물론 한국어 폰트가 깨지는 등 문제가 있는 경우도 많지만 개발자들은 이런 것은 신경도 안 쓰는 경우가 많다. 우리는 소수 사용자이기 때문이다.

하지만 비 영어권 개발자들이 만든 소프트웨어는 상황이 전혀 다르다. 기본적으로 우리 문화에 맞춰서 개발한 소프트웨어는 영어권뿐만 아니라 우리나라를 제외한 대부분의 나라에서 거부감을 갖게 된다. 그만큼 우리나라 개발자들이 만든 소프트웨어가 전세계로 확산되기는 쉽지 않다. 그러다 보면 전세계 1% 시장이라는 우리나라 소프트웨어 시장만을 대상으로 소프트웨어를 만들게 된다.

100배 큰 시장으로 나가기 위해서는 소프트웨어 국제화를 잘 알아야 한다.

일단 용어부터 알아보자.

첫 번째 용어는 국제화, 영어로는 Internationalization이다. 이 용어는 1985년에 Apple에서 사용하기 시작하였다. 오랫동안 이렇게 긴 영어 단어로 사용되다가 유니코드 컨소시엄에서 i18n이라는 줄임말을 사용하기 시작했다. 사실 정확하게 누가 먼저 사용했는지는 알기 어렵다. "인터네셔널라이제이션"이라는 긴 단어를 발음하다보면 혀가 꼬이기 일쑤다. 그래서 i와 n 사이에 18글자의 알파벳이 있다는 의미로 i18n을 사용하기 시작했다.

i18n은 소프트웨어를 여러 나라 언어와 문화를 지원하기 쉬운 구조로 만드는 것이다. 국제화가 잘된 소프트웨어는 쉽게 여러 나라 언어를 지원할 수 있다. i를 소문자로 쓰는 이유는 대문자로 쓸 경우 L의 소문자와 헷갈리기 때문이다.

두 번째 용어는 지역화, 영어로는 Localization이다. 이 또한 줄여서 L10n이라고 한다. L를 흔히 대문자로 쓰는 이유도 역시 헷갈리지 않게 하기 위함이다. 

L10n은 소프트웨어를 특정 지역의 언어와 문화를 지원하도록 만드는 것이다. 예를 들면 중국어나 일본어를 지원하는 것이다.


전세계 개발자와 회사들은 1980년대부터 본격적으로 소프트웨어 국제화와 지역화에 대해서 연구를 해왔고 그 결과 1991년 유니코드가 탄생을 하였고 수많은 표준이 제정되었다. 그 지식과 정보는 너무나 방대해서 어느 개발자도 모두 알기는 어렵다. 따라서 앞으로 이 중에서 소프트웨어 개발자가 알아야 할 필수적인 내용을 연재하겠다.

이 글인 네이버포스트에 게재한 글입니다.

2015년 5월 3일 일요일

나쁜 프로그래머가 되는 18가지 방법

소프트웨어 개발자는 끊임없이 변화하면서 성장한다. 스스로 길을 잘 찾아서 성장하는 경우도 있고, 좋은 환경에서 개발을 하다 보니 자연스럽게 실력이 향상되기도 한다. 하지만 열악한 환경에서 열심히 일만하다가 개발자로서의 실력은 점점 잃어가는 경우도 있다. 아무리 사회가 어떻고, 회사가 열악하다고 불평을 해봤자 남는 것은 자신의 개발자로서의 실력밖에 없다. 

이번 글에서 나쁜 프로그래머가되는 18가지 방법을 소개한다. 물론 본의 아니게 주변의 환경이 나를 이렇게내모는 경우도 있지만 이를 반대로 해보는 노력을 해보자. 내가 대단한 사람이라서 이런 얘기를 하는 것은 결코 아니다. 나도 독자들과 똑같은 개발자로서 18가지 중에서 잘 안되는 항목도 있다. 단지 20년 넘게 개발을 하면서 느끼는 바를 공유하고자 함이다. 

1. 익숙한 기술만 고집한다
대부분의 사람들은 변화를 싫어한다. 익숙한 것을 사용할 때 업무의 효율도 높다. 하지만 지식노동자인 개발자는 익숙한 기술만 고집한다면 한계에 다다른다. 물론 환경이 그렇게 만들기도 하고, 다른 분야의 기술을 익힐 만한 시간과 여유가 없는 경우도 많다. 그러다 보면 새로운 기술이 필요한 상황에서도 익숙한 기술을 고집하는 고집쟁이가 되기도한다. 

2. 공유를위해 노력하지 않는다
현재 내가 하고 있는 일은 나만 안다. 내가 퇴사하면 당장 이 일은 마비된다. 지금은 내가 하는 일에 다들 관심들이 별로 없지만 내가 없는 빈자리는 매우 클 것이다. 내 업무에 관련된 지식의 90%는 내 머리속에 있다. 주변의 다른 개발자들도 비슷한 상황인데 굳이 내가 깃발들고 공유를 위해 나설 필요가 있을까?  

3. 후배에게 시키지 않고 직접 처리하는 것이 속편하다
후배들이 많이 있지만 실력도 부족하고 일을 시키면 답답하다. 내가 하면 한시간이면 할 수 있는 일을 신입사원을 시키면 하루종일해도 못끝낼 뿐만 아니라 신입사원이 해놓은 것을 검토하고 고치고 가르치는데 몇시간이 소모된다. 그러니 차라리 내가 빨리 끝내버리는 것이 낫다. 그래서 우리 회사는 신입 개발자보다 고참 개발자가 훨씬 바쁘다. 

4. 후배나 동료들이 작성한 소스코드를 봐주지 않는다
회사에서 코드리뷰를 하라고는 하는데, 내 할 일이 바빠서 다른 사람 코드를 봐줄 시간이 없다. 나 뿐만 아니라 다들 이런 상황이다 보니 코드리뷰는 유야무야되었다. 과거에도 코드리뷰를 몇번해 봤지만 바쁜 와중에 잠깐시간내서 봐주기는 했는데 제대로 봐주지도 못했다. 그냥 코딩 스타일을 가지고 트집을 잡는 정도다. 그러다보니 이제 코드리뷰는 모두들 꺼려 한다. 

5. 남이 내 코드를 보는 것을 꺼려 한다 리뷰가 활성화된 조직에서는 지위고하를 막론하고 소스코드를 리뷰한다. 고참의 소스코드를 신입사원이 리뷰하고 지적할 수도 있다. 이런 거북함이 싫고, 귀찮고, 바쁘다. 내가 작성한 코드는 충분히 정상동작하는데굳이 다른 사람이 내 코드를 보고 지적을할 필요가 있을까? 개발할 시간도 부족하다. 

6. 문서화를 꺼려한다
문서작성은 무조건 싫다. 귀찮기도하고 잘 작성하지도 못한다. 하지만 회사에서 꼭 문서를 만들고 개발을 하라고는 한다. 그러면서 개발시간은 턱없이 부족하게 준다. 그래서 문서는 개발 다 끝나고 형식적으로 문서를 만든다. 한달동안 개발하고 나면 문서는 하룻밤 세워서 대충 문서를 만든다. 물론 이렇게 만든 문서를 나중에는 보지도 않는다. 

7. 커뮤니케이션 스킬 향상에 관심이 없다 
개발자는 프로그래밍을 잘하면 되지 커뮤니케이션 스킬은 별로 중요하지 않다고 생각한다. 개발자가 아닌 다른 사람들은 기술에 대해 잘 이해하지 못해서 기술에 대한 대화를 하기가 어렵다. 설명을 해도 잘 이해 하지 못한다. 난 컴퓨터와의 커뮤니케이션은 잘 되는 것 같다.

8. 책임지고 자신의 일을 마무리하지 않는다. 벌려만 놓는다
나는 개발을 엄청나게 빠르게 한다. 남들이 일주일 걸려서 하는 일도 나는 하루, 이틀이면 해치운다. 대신 완성도는 좀 떨어진다. 동작하도록 만드는 것은 나의 일이지만 귀찮은 버그를 잡는 일은 후배들을 시킨다.나는 새로운 일을 좋아하지 버그 잡는 것은 싫다. 

9. 소스코드가 주석 하나 없이 깨끗하다
항상 주석 같이 읽기 쉬운 소스코드를 주장하면 주석 하나 없이 깨끗하게 코딩을 한다. 하지만 후배들은 주석이 없으면 이해하기 어렵다고 불평이다. 하지만 프로젝트 일정이 항상 너무 촉박해서 소스코드에 주석을적을 시간이 없다. 

10. 소스코드가 읽기 난해하다
내 소스코드는 정상동작하지만 읽기는 어렵다. 워낙 바빠서 소스코드를 읽기 쉽게 정리할 수가 없다. 한 파일이 너무 크기도 하고 함수 이름도 난해하다. 내 소스코드는 최적화가 많이 되어서 짧은 코드로 어려운 로직을 기가 막히게 처리한다. 내 소스코드를 분석해 본 사람은 감탄을 할 것이다. 

11. 낮에는 집중해서 일하지 않고 주로 밤에만 일한다
회사가 낮에는 집중해서 개발할 수 없는 환경이다. 회의도 많고 시끄럽다. 그래서 밤에만 일을 하다 보니, 낮에는 여건이 되도 개발이 잘 안 된다. 밤에만 일하는 것이 완전히 습관이 되었다. 밤에 개발하는 것이 썩나쁘지는 않지만 나이를 먹어 갈수록 내 생활이 없어지는 것 같아서 걱정이다. 

12. 소프트웨어 공학에는 관심이 없다 
오로지 코딩, 코딩, 코딩만 잘하면 된다. 알고리즘, 알고리즘, 알고리즘은 관심이 많다. 소프트웨어공학이란말은 많이 들어 봤지만 이게 뭔지 설명하라고 하면 애매하다. 

13. 영어는 잘못하지만 공부할 시간은 없다 
원래 영어는 잘못했고 당장 영어공부를 따로 하지 않아도 개발을 하는데 큰 문제는 없다. 가끔 인터넷에서개발 관련 검색을 할 때는 주로 한글사이트만 검색한다. 스택오버플로우(Stack overflow)도 영어로 되어 있어서 잘 안 본다. 외국 소프트웨어 회사에 취업을 하고 싶어도 영어 때문에 포기했다. 

14. 기초, 원리는 잘 모르고 응용만 하려고 한다
시스템의 원리나 깊은 지식은 잘 모른다. 필요한 알고리즘이 있어도 원리는 잘 모르지만 인터넷에서 다운받아 그냥 사용하는 데는 큰 지장이 없다. 바빠서 따로 공부할 시간은 없다. 학교 다닐 때 전공수업 공부 열심히 할 걸 그랬다. 

15. 카피&패이스트(Copy & Paste)는 나의 무기 
소스코드 복사하는 것이 일상이다. 다른 프로젝트에 비슷한 기능이 있으면 복사해서 사용한다. 공통모듈을만들려면 여러 사람하고 얘기하고 조율을 해야 하는데 시간도 없고 내가 깃발들고 나서기는 싫다. 복사가 훨씬 빠르다. 소스코드를 복사해서 써도 지적하는 사람이 없다. 

16. 수학을 못한다. 관심도 별로 없다 
학교다닐 때부터 수학은 관심이 없었다. 잘 하지도 못한다. 소프트웨어를 개발하는데 수학이 왜 필요한가? 코딩만 잘하면 되지. 어려운 알고리즘은 인터넷을 조금만 뒤지면 라이브러리가 다 있다. 

17. 변변한 취미가 하나도 없다 
지난번 건강검진에서 의사가 술을 줄이고 운동을 하라고 했지만 매일 야근에 운동은 꿈도 못꾼다. 그나마 가끔 시간이 날 때 친구, 동료들과 술을 마시는 것이 유일한 낙이다. 숙취 때문에 다음날 일은 망친다. 

18. 개발밖에 모른다
회사가 어떻게 돌아가는지 잘모른다. 회사의 전략이나 경영 상황은 잘 모른다. 그런데 관심을 가질 시간이 별로 없다. 나는 회사일 신경 안 쓰고 내가 좋아하는 개발이나 평생하면 좋겠다. 

나는 소프트웨어 개발자는 참 좋은 직업이라고 생각한다. 물론 본인이 일 자체를 즐긴다면 정말 좋다. 말들도 많지만 대우도 그리 나쁘지 않고 성취도도 높다. 하지만 열악한 환경에서 일하는 수많은 개발자들은 그렇게 느끼지 못하고 있다. 물론 좋은 환경에서 일한다면 만족도도 높아지겠지만 개발자가 오랫동안 즐겁게일하는데 제일 중요한 것은 본인 스스로의 실력이다. 나쁜 개발자가 되는 방법을 한가지씩 지워가면서 좋은 개발자가 되는 노력을 해보자.

이 글은 ZDNet Korea에 기고한 입니다.