단어 토폴리지를 활용해 더 나은 작명하기

번역으로서의 프로그래밍


배경

최근 '괘씸한 철학 번역'이라는 책을 읽고 있다. 이 책은 한국의 철학 번역서들이 일본어를 사용하고 있다는 문제점을 지적하고, 일본어 혹은 일본식으로 번역된 난해한 철학 단어들을 우리에게 친근한 한국어로 대체하여 새롭게 번역할 것을 제안하는 책이다.

책에서는 일본어 단어와 이를 대체할 한국어 단어에 대해 '단어 토폴리지'라는 개념을 이용하여 각 단어의 번역 품질을 비교하는데, 이 방식이 매우 합리적이고 유용하다는 생각이 들었다. 특히, 이 방식을 프로그래밍에서 빼놓을 수 없는 변수, 함수, 클래스 등의 작명에도 활용하면 큰 도움이 되리라 생각해 그 내용을 소개하고자 한다.

번역으로서의 프로그래밍

소프트웨어 개발에는 다양한 활동들이 있지만, 그 중 자연어로 기술된 요구사항들을 '프로그래밍 언어'로 명료하게 번역하는 활동이 대표적이다. 특히나, 코드는 자연어보다 명료하게 작성되어야 하므로 프로그래머는 자신이 정의하는 변수, 함수, 클래스 등에 이름을 붙이는 데 큰 공을 들인다.

코드의 번역 품질이 떨어지면 읽는 이로 하여금 오해를 불러일으킬 수 있고 이러한 오해들이 쌓여나가면 코드가 잘못된 정보를 주게 되어 유지보수에 큰 어려움을 겪게 된다. '괘씸한 철학 번역'처럼 '괘씸한 코드'가 되어 버리는 것이다. 따라서, 자연어를 프로그래밍 언어로 번역하는 작업은 일반적인 외국어 번역 활동만큼이나 그 뜻을 오해 없이 잘 전달하는 것이 중요하다.

오해를 일으키는 번역

코드를 작성할 때 명료하게 이름을 붙이는 것은 꽤 어렵다. 그 이유에는 여러 가지가 있겠지만, 대표적으로, 자연어로는 똑같이 표현되지만, 명확히 따져보면 실제로는 다른 개념들이 같은 도메인 내에서 자주 발생하기 때문이라고 생각한다. 이런 경우, 섣불리 번역했다간 나중에 큰 비용을 감당하게 된다. 예시를 통해 살펴보자.

돈, Cash? Money?

은행 시스템을 개발한다고 생각해 보자. 은행에는 여러 전산 시스템이 있겠지만, 고객의 계좌를 관리하는 시스템과 계좌를 이용해 현금을 지급하는 ATM을 개발해야 한다고 가정하자.

계좌 관리 시스템과 ATM은 모두 '돈'을 다루고 각 시스템 요구 사항의 일부는 다음과 같을 것이다.

  • 계좌 관리 시스템의 요구사항

    • 고객은 계좌에 '돈'을 입금할 수 있다.
    • 고객은 계좌에 있는 '돈'을 출금할 수 있다.
  • ATM의 요구사항

    • 고객은 ATM을 이용해 '돈'을 입금할 수 있다.
    • 고객은 ATM을 이용해 '돈'을 출금할 수 있다.

개발자는 이 요구사항들을 코드로 번역해야 한다. 계좌 관리 시스템과 ATM의 요구사항에는 모두 '돈'이 등장한다. '돈'을 코드로 표현할 때 'Cash' 또는 'Money'로 표현할 수 있을 것 같은데, 고민하다 켄트 백의 '테스트 주도 개발' 책에 작성된 예시에서 'Money'를 사용한 것이 떠올라 'Money'로 번역해 아래와 같이 개발하였다.

  • 계좌 관리 시스템
class Account(var money: Long) {
    fun deposit(amount: Long) {
        money += amount
    }

    fun withdraw(amount: Long): Boolean {
        return if (amount <= money) {
            money -= amount
            true
        } else {
            false
        }
    }
}
  • ATM
class Atm(var money: Long) {
    fun deposit(account: Account, amount: Long) {
        money += amount
        account.deposit(amount)
    }

    fun withdraw(account: Account, amount: Long) {
        if (amount <= money && account.withdraw(amount)) {
            money -= amount
        }
    }
}

'돈'을 'Money'로 번역한 선택은 괜찮은 선택이었을까? 이러한 고민이 들 때 단어 토폴리지 분석을 활용할 수 있다.

단어 토폴로지

단어 토폴로지는 '괘씸한 철학 번역'의 저자가 번역어를 검증하기 위해 제안하고 사용한 방법이다. 책에서 저자는 각각의 단어는 의미의 시공간에서 저마다 위상을 갖는다고 말하며 이 위상을 4차원 공간 속의 한 점으로 표현하였고 이렇게 표현된 단어의 위상을 탐구하는 것을 '단어 토폴로지'라고 명명하였다.

4차원을 구성하는 각 항목은 다음과 같고, 각각은 0(좋음)~4(나쁨)까지의 정숫값을 가지며 다음과 같이 수학적으로 2×22 \times 2 행렬로 모델링하여 표현한다.

(의미모호성난이도정합도오해가능성)\begin{pmatrix} 의미모호성 & 난이도 \\ 정합도 & 오해가능성 \end{pmatrix}

단어 토폴로지를 활용한 은행 시스템 작명 개선

다시 은행 시스템으로 돌아오자. 요구사항에 작성되어 있던 '돈'을 'Money'로 번역하는 것이 괜찮은 선택이었는지 단어 토폴리지를 활용해 분석해 보자.

계좌 관리 시스템

계좌 관리 시스템에서 'Money'의 단어 토폴리지는 다음과 같다.

  • 의미모호성: 의미가 분명하다. (0)
  • 난이도: 쉬운 영어 단어다. (0)
  • 정합도: 계좌 관리 시스템의 요구사항에서의 '돈'이라는 개념과 의미가 일치한다. (0)
  • 오해가능성: 소통에 문제가 없다. (0)
(0000)\begin{pmatrix} 0 & 0 \\ 0 & 0 \end{pmatrix}

계좌 관리 시스템에서 'Cash'의 단어 토폴리지는 다음과 같다.

  • 의미모호성: 의미가 분명하다. (0)
  • 난이도: 쉬운 영어 단어다. (0)
  • 정합도: 'Cash'는 현금을 의미하지만, 계좌 시스템에서의 '돈'은 현금이 아니기에 의미가 조금 다르다. (2)
  • 오해가능성: 'Cash'는 현금을 의미하기에 계좌 시스템에서 이를 사용한다면 계좌 잔액만큼 은행에 현금이 있어야 한다는 오해를 불러일으킬 수 있다. 은행은 계좌의 잔액 중 지급준비율만큼만 현금으로 보유하고 나머지는 다른 사람에게 대출해 주기 때문에 잘못된 정보를 제공하게 된다. (3)
(0023)\begin{pmatrix} 0 & 0 \\ 2 & 3 \end{pmatrix}

따라서, 계좌 관리 시스템에서는 'Money'가 'Cash'보다 위상값이 좋으므로 '돈'을 'Money'로 표현하는 것이 더 나은 선택일 것이다.

ATM

ATM에서 'Money'의 단어 토폴리지는 다음과 같다.

  • 의미모호성: 의미가 분명하다. (0)
  • 난이도: 쉬운 영어 단어다. (0)
  • 정합도: ATM 요구사항의 '돈'이라는 것은 사용자에게 지급할 수 있는 '현금'을 의미한다. 따라서 의미가 다르다. (3)
  • 오해가능성: ATM이 현금을 보유하고 있어야 한다는 의미를 충분히 전달해 주지 못한다. 따라서 소통을 위해 별도의 설명이 필요하다. (2)
(0032)\begin{pmatrix} 0 & 0 \\ 3 & 2 \end{pmatrix}

ATM에서 'Cash'의 단어 토폴리지는 다음과 같다.

  • 의미모호성: 의미가 분명하다. (0)
  • 난이도: 쉬운 영어 단어다. (0)
  • 정합도: ATM 요구사항에서의 '돈'과 'Cash'는 현금으로 그 의미가 일치한다. (0)
  • 오해가능성: ATM은 현금을 보유하고 있어야 하고 'Cash'는 그 뜻을 잘 전달하므로 소통에 문제가 없다. (0)
(0000)\begin{pmatrix} 0 & 0 \\ 0 & 0 \end{pmatrix}

따라서, ATM에서는 'Cash'가 'Money'보다 위상값이 좋으므로 '돈'을 'Cash'로 표현하는 것이 더 나은 선택일 것이다.

개선된 코드

단어 토폴리지 분석을 통해 개선한 코드는 다음과 같다.

  • 계좌 관리 시스템
class Account(var money: Long) {
    fun deposit(amount: Long) {
        money += amount
    }

    fun withdraw(amount: Long): Boolean {
        return if (amount <= money) {
            money -= amount
            true
        } else {
            false
        }
    }
}
  • ATM
class Atm(var cash: Long) {
    fun deposit(account: Account, amount: Long) {
        cash += amount
        account.deposit(amount)
    }

    fun withdraw(account: Account, amount: Long) {
        if (amount <= cash && account.withdraw(amount)) {
            cash -= amount
        }
    }
}

단어 토폴리지 분석을 통해 자연어로 똑같이 표현된 '돈'이라는 개념을 각 시스템에 어울리는 이름으로 적절히 번역할 수 있었다. 특히나, 계좌 관리 시스템에서 'Cash'를 사용함으로써 불러일으킬 수 있는 오해나 ATM에서 'Money'를 사용함으로써 불러일으킬 수 있는 오해에 대해 생각해 보는 계기가 되기도 하였다. 코드를 읽는 사람은 단어의 표면적인 의미뿐만 아니라 단어가 갖고 있는 숨겨진 의미도 함께 떠올려 읽는다는 점을 감안할 때 이러한 오해를 사전에 방지하는 것은 작명 시 중요한 점일 것이다.

번역가로서 프로그래머

코드를 작성할 때 작명에 고민이 된다면 '단어 토폴로지'를 활용해 후보 단어들을 평가해 본다면 도움이 될 것이다. 더 나아가 코드를 작성하는 작업을 정확하고 이해하기 쉬운 번역서를 집필하는 작업이라 생각하여, 내 코드를 읽을 누군가에게 '괘씸한 번역'이 되지 않도록 노력하는 자세는 프로그래머가 가져야 할 중요한 덕목 중 하나라고 생각한다.

이 글에서는 아주 간단한 예시로 그 개념을 간략히 소개한 것에 불과하기에 '단어 토폴리지' 분석에 관심이 생긴다면 '괘씸한 철학 번역' 책을 읽어보기를 추천한다. 이 책은 단어와 소통에 대해 생각해 보며 철학에 한 걸음 더 가까워지는 데 도움을 주는 정말 좋은 책이다.

참고문헌

  • 코디정. 괘씸한 철학 번역. 이소노미아, 2023.