2024년 6월 9일 일요일

신제품보다 업그레이드 제품 번역이 더 어려운 이유 (27)

소프트웨어 국제화가 가장 쉬운 것은 신제품이다.

국제화의 여러 분야도 마찬가지이지만, 번역은 특히 신제품 개발 시 쉽게 접근하지만, 유지보수 때 쓴맛을 본다.

번역 아키텍처와 프로세스는 신제품이던지, 업그레이드 제품이던지 항상 쉽고, 빠르고, 비용을 최소화 해야 한다.

소프트웨어 개발 시 흔히 벌어지는 사례를 보자.

메시지가 1,000개쯤 되는 소프트웨어를 신규로 개발하고 있다. 번역해야 하는 언어는 10개이다.

개발자는 번역이 필요한 메시지를 소스코드에 적으면서, 별도의 번역 파일에 메시지를 적어 줘야 하는 방식으로 개발을 하고 있다. 

개발을 완료하고 1,000개의 메시지를 10개의 언어로 번역을 하여 개발이 완료되었다. 쫑파티도 했다.


이제 소프트웨어를 업그레이드 할 차례다.

메시지를 300개쯤 추가하게 되었다. 이것은 번역 파일에 300개를 추가하면 된다.

이 때 개발자는 새로 추가할 메시지가 기존의 번역 파일에 있는지 검색을 해야 한다. 원래 있던 메시지가 아니라도 오늘 아침에 다른 개발자가 추가했을 수도 있다.

만약에 내가 메시지를 삭제하게 되었다. 그러면 번역 파일에서 그냥 삭제를 하면 되는가? 그 메시지는 나만 쓰는 것이 아니고 다른 개발자가 다른 소스코드에서 쓰고 있다면?

그럼 소스코드 전체를 뒤져서 해당 메시지가 다른 곳에서 쓰이고 있는지 찾아봐야 하는가? 

이것도 완벽하지 않다.

때마침 다른 개발자가 해당 메시지가 번역파일에 있는 것을 알고 그 메시지를 이용해서 개발하고 있고, 아직 소스코드를 등록하지 않았다면?

이처럼 메시지를 새로 추가할 때, 삭제할 때 모두 문제가 된다.


이제 필요 없는 메시지라고 삭제를 하는 것도 문제가 된다.

메시지를 삭제했는데, 다음 버전에서 해당 메시지가 다시 쓰일 수도 있다. 그래서 메시지를 다시 추가하면 옛날에 번역했던 메시지를 다시 번역해야 한다. 비용과 시간의 낭비가 아닐 수 없다.


그래서 이런 문제가 전혀 없는 방식의 번역 아키텍처와 프로세를 사용해야 한다. 전 과정은 자동화 되어야 한다.

구체적인 방법들은 추후에 자세히 다루겠다.

2024년 5월 11일 토요일

소프트웨어 번역 전략 (26)

소프트웨어 국제화에서 가장 중요하며 많은 비용이 드는 것이 번역이다.

번역도 전략이 필요하다. 소프트웨어 번역을 어떻게 해야 하는지 알아보자.


영어 버전을 먼저


우리는 흔히 한국어 버전의 소프트웨어를 먼저 만들어 놓고, 나중에 영어 버전을 만들곤 한다.

이렇게 되면 메시지의 key가 한국어가 된다.

영어와 한국어 2개의 언어만 지원을 할 때는 문제가 안된다.

하지만, 여기에 프랑스어 하나를 추가하면 문제가 된다.

번역가에게 한국어를 프랑스어로 번역하도록 시켜야 하기 때문이다.

물론 번역한 영어를 주고 프랑스어로 번역하게 할 수도 있다.

이렇게 하면 항상 한국어를 영어로 번역한 후에 다른 언어로 번역을 해야 하는 2단계 과정을 거쳐야 한다.

그리고 영어 번역을 수정하면 다른 모든 언어의 번역을 다시 수정해야 한다.

그래서 전세계 거의 모든 번역가 표준의 삼는 영어를 기준으로 해야 한다.

소프트웨어의 첫번째 버전은 영어를 기준으로 만들어야 하며, 한국어버전만 필요한 경우에도 미래에 국제화가 필요하다면 영어, 한국어를 지원하는 소프트웨어를 만들어야 한다.

만약에 영어를 잘 못하는 개발자라면 영어 메시지를 만들어내기 어려울 수 있다.

요즘은 Google번역기와 같은 자동 번역기의 품질이 상당히 좋아서 한국어를 바로 영어로 번역할 수 있다. 검토 후에 문제가 없으면 바로 사용할 수 있다.

영어 검수는 추후 일괄적으로 한번 하면 되기 때문에 개발자들이 메시지 입력 시 자동번역기를 이용하는 것도 좋은 방법이다. 


번역 프로세스


주변에서 흔히 벌어지는 소프트웨어 번역 프로세스는 다음과 같다.

  • 1년에 걸쳐서 소프트웨어 개발을 완료한다.
  • 2개월에 걸쳐서 소프트웨어를 번역한다.
  • 1개월에 걸쳐서 테스트를 한다. 번역이 잘못된 것을 발견한다.
  • 번역을 수정하고, 다시 테스트를 하고 출시한다.

이렇게 하면 계획된 일정에 소프트웨어를 출시하기 어렵다.

번역을 마지막에 한꺼번에 하게 되면 화면 배치가 많이 깨져서 대대적인 수정을 해야 한다. 똑같은 문장이라도 한국어는 대체로 짧다. 한국어를 영어, 특히 독일어로 번역을 하면 2배 또는 3배까지 길어진다. 그래서 번역을 고려하여 UI 배치를 해야 한다.

소프트웨어가 70% 정도 개발이 되었을 때 먼저 1차로 번역을 하고, 90% 정도 개발이 되었을 때 2차 번역을 한다. 마지막으로 구현이 완료 되었을 때 최종 번역을 한다.

이렇게 70%, 90%, 100% 단계별로 번역을 하면, 소프트웨어 구현과 거의 동시에 번역도 완료가 되어 있어서 번역 때문에 소프트웨어 출시가 늦어지는 일은 없다.

소프트웨어 개발 계획을 세울 때 번역 일정도 같이 수립하고 번역 업체도 미리 섭외하여 일정에 지장이 없도록 해야 한다.


번역 방법


번역을 하는 방법은 몇가지가 있다. 각각 장단점이 있으니 비교하여 선택하자.


전문 번역자(회사) 이용

전문 번역회사를 이용하거나 번역자를 채용할 수도 있다. 
소프트웨어 개발 프로세스 상 번역은 항상 벌어지는 일이 아니기 때문에 아주 큰 회사가 아니면 번역가를 보유하기가 어렵다. 그리고 언어별로 모든 번역가를 채용하는 것이 어렵기 때문에 대부분의 회사는 전문 번역 회사를 이용하거나 병행한다.

번역 회사를 고를 때는 해당 언어에 대해서 능숙한 것 외에도 해당 분야에 경험이 많은 회사를 고르는 것이 좋다. 금융, 의료 등 전문 용어를 많이 사용하는 소프트웨어는 아무나 번역을 할 수는 없다. 전문 번역가의 경우 비용이 더 들어가지만 그만큼 번역 품질이 높다.


소셜 번역

전문 번역가는 아니지만 Flitto와 같은 앱을 통해서 전세계 일반인들에게 작은 비용을 주고 번역을 시키는 방법이 있다. 
대규모 번역을 시키는 것은 어렵지만, 작은 소프트웨어에서 작은 번역을 싸게 맡길 수 있는 장점이 있다.

자동 번역기

AI의 발달과 함께 자동 번역기는 엄청나게 발전했다.
구글 번역기, DeepL 등은 번역 품질이 매우 좋다. 
POEDIT의 유료 버전은 자동 번역을 매우 빠르게 한다.
무료이거나 저렴한 것이 장점이지만, 품질을 보장하기 어려운 것이 단점이다.


정확한 번역

동일한 단어라도 상황에 따라서 다른 뜻으로 사용되는 경우는 매우 흔하다.
Ruler라는 단어만 하더라도 '자'가 될 수도 있고, '지배자'가 될 수도 있다.
Ruler를 그냥 번역해달라고 요청을 하면, 원하지 않는 방향으로 번역될 가능성이 높다.
이럴 때는 '번역 가이드'를 같이 전달하는 것이 좋다.
'번역 가이드'는 영어로 전달해야 한다. 그래야 전세계 번역가가 잘 이해할 수 있다.
Ruler의 번역 가이드는 'a stick to measure the length'와 같이 적으면 된다.

'번역 가이드'는 소스코드에 해당 message를 사용하는 곳에 같이 작성하면 된다.

그럼, 개발자들은 해당 용어를 사용할 때, 이 용어가 잘못 번역될 가능성이 있는 단어인지 잘 생각해야 한다. 여러 뜻을 가진 단어라면 '번역 가이드'를 추가하거나 오해가 없는 확실한 단어로 교체하는 것도 좋다.

물론 소스코드에서 message를 추출하고 '번역 가이드'도 같이 추출하는 것은 완전 자동화 되어야 한다.


번역 검수


프랑스어로 번역을 할 때 외주를 맡기는 것은 우리가 프랑스어를 잘 모르기 때문이다. 그래서 번역을 해와도 프랑스어가 제대로 번역된 것인지 알기가 어렵다.

그래서 번역이 제대로 되었는지 확인을 하려면 번역 검수 절차를 거쳐야 한다.
소프트웨어를 해외 총판을 통해서 판매를 할 경우 해외 총판의 원어민에게 검수를 시키면 좋다. 따는 우리의 해외 우수 고객에게 미리 써보게 하는 필드 테스트를 진행할 수도 있다. 이 때 번역이 잘못되었거나 좀 이상한 것은 꼼꼼히 봐달라고 부탁을 하면 된다.

이렇게 검수 과정을 거쳐야 품질 좋은 소프트웨어를 만들 수 있다.

지금까지의 모든 과정을 소프트웨어 개발 계획을 수립할 때 미리 감안해서 계획을 수립해야 한다. 



   






2024년 4월 14일 일요일

소프트웨어 국제화 전략 (25)

소프트웨어를 이미 개발해 놓고 비즈니스가 잘되면 나중에 국제화를 적용하려고 하면 늦다는 것을 이전 글에서 살펴 보았다.

소프트웨어를 기획할 때부터 향후 1%라도 국제화 가능성이 있다면 계획에 따라서 적절한 국제화 기술을 미리 적용하는 것이 좋다. 

그럼 어떠한 경우 국제화가 필요한가?
  • 국내 외에 해외에 소프트웨어를 판매하거나 서비스할 수 있다.
  • 국내에서만 판매할 계획이지만, 국내의 외국인 고객이 사용할 수 있다.

그럼 소프트웨어 국제화가 필요한 경우 어떠한 국제화 전략을 어떻게 수립해야 하는지 알아보자.

국제화 적용 수준을 결정한다.

당장은 아니고 미래에 해외에 팔 계획이 있는 소프트웨어라면 초기부터 국제화 기능을 모두 적용하면 기간, 비용이 많이 든다. 이러다가 해외 판매 계획을 취소하면 국제화 투자 비용은 매몰 비용이 된다. 

따라서 판매 계획에 따라서 국제화 적용 정도를 달리하는 것이 좋다.

소프트웨어에 국제화 기능을 구현하기 위해서는 크게 2가지 모듈이 필요하다.

  • 국제화 모듈 (i18n module or library)
  • 지역화 모듈 (L10n module or library)
국제화 모듈은 국제화 아키텍처 전체를 다루는 모듈이고, 지역화 모듈은 하나의 국가 또는 언어 기능을 지원하는 모듈이다. (아래 그림 참조)



당장 해외 판매 계획이 있다면 위 그림 처럼 여러 지역화 모듈을 모두 만들어야 하지만, 당장은 국내에서만 판매를 하고 추후에 해외에 판매를 하려면 아래와 같이 필요한 국제화 기능만 개발을 하면 된다.



이렇게 개발을 하면 한국어 전용으로 개발하는 것보다 1~2%의 개발 비용이 더 들지만, 나중에 국제화 기능을 새로 추가하는 것보다는 10배 이상 비용을 절약할 수 있다.

국제화를 적용할 범위 결정

국제화는 매우 광범위하다.
아래는 국제화 시 고려해야할 49가지라는 지난 글이다.


물론 이 모두를 적용할 필요는 없다. 내용을 읽어보고 현실적으로 우리 소프트웨어에 적용해야 할 범위를 결정한다. 국제화에 대한 지식, 경험이 없다면 무엇이 필요한지 결정이 어려울 수가 있으므로 국제화 전문가나 경험자의 도움을 받는 것이 좋다.

보통 필수적으로는 아래와 같은 것들을 적용한다.
  • 문자열 (번역)
  • 날짜/시간
  • 숫자
  • 쓰기 방향 (좌우, 우좌)
  • 대소문자
  • 문자 정렬
시스템적으로 필수적으로 결정해야 할 기술적인 요소는 다음과 같다.
  • 문자 인코딩 방법 및 변환
    • Database, File, Network communication 시 사용할 문자 Encoding
    • 지금은 UTF-8이 대세지만 아닌 경우도 있어서 주의해야 한다.
  • 국제화에 유리한 UI 배치
  • 타임존 처리
선택적으로는 소프트웨어의 종류나 특성에 따라서 추가 결정을 한다. 
  • 폰트의 종류와 크기
  • 화폐 단위
  • 주소
  • 전화번호
  • 이름 표기
  • 아이콘
처음에는 어려운 일이지만, 국제화 모듈을 한번 잘 만들어 놓으면 회사의 여러 소프트웨어에 재사용이 가능하다. 

국제화 조직 구성

큰 소프트웨어 조직은 국제화 팀이 별도로 있지만, 작은 조직은 별도의 팀을 갖추기가 어렵다. 그렇다면 일반 SW팀에 국제화 담당자를 별도로 지정하여 국제화 아키텍처를 설계하고, 국제화, 지역화 모듈을 개발하게 하면 된다.

모든 개발자가 국제화 기술을 다 알 필요는 없다. 국제화 담당자가 잘 만들어 놓은 기능을 그냥 써서 개발을 하면 된다.

시간을 표시하는 함수 하나도 그냥 쓰지말고 또는 본인이 직접 국제화를 적용하지 말고 국제화 담당자가 잘 만들어 놓은 국제화 시간 함수를 사용하면 되는 것이다.

국제화 담당자도 개발 초기 부터 국제화 모듈을 모두 완성해 놓을 필요는 없다. 그렇게 한다면 국제화 담당자가 국제화 모듈을 완성할 때까지 일반 개발자들은 개발을 시작할 필요가 없다.

국제화 담당자는 국제화 범위를 정하고 Interface만 정해 놓으면 된다. 즉 국제화 모듈의 Interface만 정하고 지역화 모듈은 제대로 개발할 필요가 없다.

시간 함수를 예로 들면 시간 함수의 Interface를 잘 정하고 나면 그 내용은 그냥 시간을 출력하는 함수를 최대한 간단히 구현해 놓으면 되고, 국가별 언어별로 다른 표시법은 적용할 필요가 없다.

이렇게 인터페이스를 만드는 데는 며칠 걸리지 않는다.

나중에 개발을 진행하면서 지역화 모듈의 내용을 하나씩 채워가면 지연 없이 개발이 진행된다.


국제화 마인드

국제화가 잘 된 소프트웨어를 개발하는 것은 매우 어렵다. 경험이 적으면 국제화가 누락된 소프트웨어를 개발하기 쉽다.

예를 들어보자.

사용자가 입력한 문자열을 단어별로 쪼개서 처리하려고 한다. 그래서 띄어쓰기로 token을 구분하여 처리를 했다고 하자. 하지만 띄어쓰기를 사용하지 않는 언어는 의외로 많다. 이런 곳에서는 이 기능은 제대로 동작하지 않을 것이다. 이처럼 예상치 못하게 국가별 언어별로 다른 것들이 꽤 많다.  다음과 같은 것들이 있다.
  • 띄어쓰기
  • 단수, 복수 처리
  • 좌우 쓰기 방향
  • 문장 순서
  • 달력
이외에 매우 많다. 어떤 것은 해당 국가에서 이상하게 보여도 나름 용인이 되는 것도 있고, 용인이 되지 않는 것도 있고, 명백히 버그가 되는 것도 많다.

예를 들어 숫자의 소숫점은 국가별로 다르다. 숫자의 소숫점을 잘못 처리하면 명백한 버그가 되고 큰 사고가 될 수도 있다.

그래서 우리가 이러니 전세계 모든 국가에서도 이럴 것이라면 생각을 버려야 한다. 어려운 일이다. 그래서 국제화 전문가가 회사에 적어도 한명은 있으면 좋다. 그렇지 않으면 국제화 전문가의 컨설팅을 받으면 적은 비용으로 큰 문제를 해결할 수 있다.


국제화 프로세스

국제화 조직 또는 담당자는 국제화 모듈만 개발하는 것이 아니고 국제화 프로세스를 잘 정해야 한다. 국제화 초보자에게는 매우 어려운 일이지만 필요한 것이 프로세스다.

예를 들어 문자열을 번역하기 위해서는 여러 단계가 필요하다.

  • 소스코드에 국제화 문자열 함수를 작성한다.
  • 문자열을 추출한다.
  • 추출한 문자열을 각 언어로 번역한다.
  • 소프트웨어에 번역된 문자열을 적용한다.
  • 검수를 한다.

국제화 프로세스는 최대한 자동화가 되어야 한다.
국제화가 누락되는 부분을 찾기 위해서는 코드 리뷰 절차에 국제화 관련 부분이 추가 되어야 한다.
그리고 테스트 프로세스에서도 국제화 부분이 추가되어야 한다.


결론

우리나라에는 수많은 회사가 소프트웨어 국제화에 실패한 역사가 있다. 초기에 소프트웨어 인코딩 결정의 실수로 대규모 서비스가 글로벌 서비스에 실패하기도 한다. 

소프트웨어 국제화의 실패로 좌초된 경우조차 그 원인을 국제화에서 찾지 못하는 경우가 대부분이다. 그래서 매우 중요하지만 아주 소홀히 하는 분야이기도 하다.

국제화는 결코 소홀히 하면 안되고, 소프트웨어 개발 초기부터 심각하게 고민하지 않으면 안된다.

2024년 3월 24일 일요일

소프트웨어 국제화는 나중에 적용하면 늦는다 (24)

 잠시 중단했던 소프트웨어 국제화 칼럼을 재개한다.


당장의 소프트웨어 출시가 급하다고 국제화를 고려하지 않고 일단 개발하고 출시를 했다가 나중에 필요 시에 국제화를 적용하려고 하면 안된다. 비용이 너무 많이 들거나 너무 복잡해져서 제품 자체가 망가지기도 한다.

실제로 많은 회사들이 소프트웨어 국제화에 실패해서 비지니스에서도 실패하는 경우가 많다.




처음에는 국내에서만 팔다가 나중에 해외 진출을 하면서 뒤늦게 국제화를 적용하다가 낭패를 본다.
국제화를 적용하려고 했더니 데이터 베이스의 인코딩 등 설정을 바꿀 수 없기도 하고, 기능이나 UI를 대거 바꾸지 않으면 안되기도 한다. 초기부터 국제화를 적용했을 때의 국제화 비용보다 수십배 또는 수백배가 들기도 한다. 또한 수많은 버그를 만들어내곤 한다.

국제화를 적용하기에는 너무 늦어져 국제화 버전을 따로 개발해서 똑같은 소프트웨어가 여러벌이 되기도 하는데, 이는 더 큰 문제가 된다. 돌아올 수 없는 강을 건넌 것과 같다.

우리가 개발할 소프트웨어가 영원히 한국에서만 팔릴 소프트웨어라면 국제화를 적용할 필요가 없다.
한국에서만 팔리는 소프트웨어라도 한국내의 외국인을 위해서 여러 언어를 지원해야 한다면 국제화가 필요하다.
당장은 한국에서만 판매를 하지만 추후 해외에서도 판매할 계획을 1%라도 가지고 있다면 초기부터 국제화를 적용해야 한다.

당장 국제화 기능이 필요한 것은 아니고 추후 필요한 경우라면 국제화 아키텍처만 적용하여 나중에 국제화가 필요할 때 언제든지 적은 비용으로 빠르게 국제화를 적용할 수 있도록 할 수 있다.

간단한 예를 들어보자.

소프트웨어 내에는 날짜, 시간을 처리하는 수많은 모듈들이 있다. 이것을 국제화를 고려하지 않고 개발자들이 알아서 한국어에만 알맞게 개발을 한다면 어떻게 될까?

한국에서는 잘 동작할 것이다. 하지만 영어, 프랑스어 등 외국어를 지원해야 하는 국제화가 필요할 때는 큰 문제가 된다. 날짜를 처리하는 수많은 코드를 찾아다니면서 모두다 고쳐야 한다.

개발자들이 적절히 날짜 함수에 국제화 코드를 적용했다고 하더라도 문제가 된다. 각각 따로 적용한 국제화 코드는 일관성이 떨어져서 날짜를 표시하는 위치마다 다른 형태의 날짜가 표시될 수 있다.

그럼 당장 국제화가 필요하지 않지만 미래를 위해서 국제화 코드를 미리 적용해 놓으려면 어떻게 해야 할까?

날짜, 시간를 처리(입력, 출력)하는 모든 기능을 별도의 국제화 함수(클래스)로 분리를 하는 것이다. 그리고 모든 개발자는 날짜, 시간을 다룰 때는 꼭 이 국제화 함수를 사용하도록 하는 것이다. 이 국제화 날짜, 시간 함수는 현재는 한국어만 지원하지만 추후 필요할 때 언제든지 다양한 언어를 쉽게 지원할 수 있다.

날짜, 시간 처리 함수는 필요한만큼 다양하게 준비해야 한다. 소프트웨어 UI상 필요한 모든 조합을 함수로 만들어 놓아야 한다.

년월일시분초
년월일
시분초

날짜, 시간 함수 관련 추가 내용은 아래 글을 참조한다.

제공된 국제화 함수 외에 다른 형식의 날짜 출력 함수가 필요하면 개별 개발자는 스스로 함수를 만들어서 사용하면 안된다. 국제화 담당 개발자에게 필요한 날짜 출력 함수를 만들어 달라고 요청한 한 후에 그 함수를 써야 한다. 1인 개발이라면 한명의 개발자가 양쪽 역할을 다하면 된다.

국제화 외부 라이브러리가 모든 것을 해결해주지는 않는다. 외부 라이브러리를 이용하더라도, 현재 프로젝트에 맞게 다 커스트마이징해서 일관된 국제화 함수들을 만들어 줘야 한다. 개발자들에게 각자 알아서 국제화 함수를 사용하라고 하면 일관성이 없고 중구난방이 된다.

국제화 함수 인터페이스는 나중에 바뀌지 않도록 잘 정해야 하므로 경험이 많은 고참 개발자가 정하는 것이 좋다.

날짜 외에도 고려해야 할 것은 많다. 아래 그 예를 보자.

번역이 필요한 메시지, 문자 인코딩(Database, File, 통신), 키보드 글자 배치, 폰트 종류, 글자 크기, 숫자 표기, 띄어쓰기, 쉼표, 마침표, 날짜/시간 표기, 썸머타임, 대소문자, 정렬 방법, 화폐, 무게, 부피, 길이, 종이크기, 온도, 주소, 이름, 제도 관련, 문화 관련 색깔/아이콘 등, 소리, 텍스트를 포함한 아이콘, O/X 기호, 문자 입력 방향

국제화 이슈가 있는 것은 개별 개발자가 마음대로 개발하면 안되고, 국제화 라이브러리에 추가한 후에 사용해야 한다. 모든 소프트웨어가 이 모든 항목을 고려해야 하는 것이 아니므로 국제화 이슈가 있을 것 같은 항목을 만나면, 또는 이미 구현을 했어도 나중에 발견하면 국제화 라이브러리로 옮겨야 한다.

소프트웨어의 어떤 부분이 국제화의 영향을 받을지 찾아내는 것도 중요하다. 그래서 국제화 경험이 많은 개발자가 필요하다. 

개발 초기에 소프트웨어 국제화 전문가에게 컨설팅을 받는 것도 좋다. 대충 개발하고 나중에 국제화가 문제 되어서 큰 비용을 지불하는 것보다 훨씬 경제적이다.

국제화 아키텍처를 어떻게 구성해야 하는지는 아래 글을 참조한다. 실제는 이보다 훨씬 복잡하지만 간단한 참조는 될 것이다.

소프트웨어 국제화는 쉽게 생각했다가는 큰코다칠 수 있지만, 초기부터 제대로 적용하면 큰 무기가 될 것이다.