프로그래밍을 하다 보면 "언어는 도구에 불과하다"는 이야기를 종종 접하게 됩니다. 제 경험상으로 저런 이야기를 하는 개발자가 열 명이 있다면 그중 한 두 명은 이른바 '폴리글랏(polyglot)'이라는 말이 잘 어울리는 상당한 실력자이고, 나머지는 본인들의 생각과는 달리 아직 한 가지 언어도 깊이 있게 공부해보지 않은 수준이었던 것 같습니다.
바꾸어 말하면, 다양한 프로그래밍 언어를 능수능란하게 구사할 만큼 배우는 것은 매우 어렵지만, 그 수준에 다다랐다고 착각하기엔 쉽다고도 할 수 있습니다. 그렇다면 왜 이런 현상이 발생하는 것일까요?
프로그래밍 언어를 배우는 것은 여러 면에서 외국어를 배우는 것과 비교할 수 있습니다. 둘 다 문법이라는 기본적인 규칙이 존재하며, 개발하면서 다양한 API를 사용한다는 것은 외국어를 말할 때 폭넓은 어휘를 구사할 수 있다는 것과 비슷합니다.
문제는 프로그래밍 언어이건 외국어이건, "잘한다"라고 평가받을 만한 수준이 어느 정도인지는 맥락에 따라 달라진다는 것입니다. 딱히 규칙이 있는 것은 아니지만, 저는 프로그래밍 전반에 걸쳐 "언어는 도구에 불과하다" 같은 이야기를 할 수 있으려면 최소한 다양한 언어를 현업에서 능숙하게 다루는 데 문제가 없어야 한다고 봅니다. 그렇다면 이를 외국어에 대입하면 어떤 수준에 해당할까요?
아마도 수준을 낮게 잡으면 해당 언어를 모국어로 하는 나라에서 일상생활이 가능한 정도가 될 테고, 좀 더 높게 잡으면 현지인과 구분이 안 되는 언어 구사가 가능한 수준, 그리고 매우 높게 잡으면 그 나라에서도 기자, 작가, 학자 등 수준 높은 말과 글을 사용하는 것이 직업인 사람들과 대등한 정도가 되는 것을 기준으로 삼을 수 있을 것입니다.
보통 처음 프로그래밍을 배우면 모든 것이 낯설고 문법을 제대로 적용해서 오류가 없도록 하는 것도 힘들게 느껴질 것입니다. 제대로 된 문법을 구사할 수 없다는 건, 자연어로 따지면 예를 들어 '개발자'라는 단어 뒤에 조사 '이'가 붙는지 '가'가 붙는지 헷갈린다거나, "나 배우기 한군말" 수준의 뜻만 겨우 통할 수준의 언어 구사력을 지녔다는 뜻입니다.
그러다가 점점 문법에 익숙해지고 문서나 인터넷 검색으로 필요한 기능을 찾아서 제대로 구동되는 프로그램을 작성할 줄 아는 단계가 되고, 이는 대략 외국에 나가 사전을 들고 다니면서 식당이나 가계 등을 큰 문제 없이 이용할 수 있는 정도와 비슷하다고 볼 수 있습니다.
여기서 조금 더 경험을 쌓다 보면 또 다른 언어를 배우게 되는 경우가 있습니다. 예를 들어 자바로 백엔드를 다루다가 프론트를 다루기 위해 자바스크립트를 배운다든지, 아니면 C언어로 시작해서 게임 개발을 해보려고 C#을 배운다든지 하는 경우입니다.
이때 처음에는 낯설었던 조건문, 분기문, 함수 호출 등 문법 요소들이 새로운 언어에서 모양만 조금 다르게 존재하는 것을 발견하면 신기하기도 하고 앞으로 다른 언어도 쉽게 배울 수 있을 것 같은 자신감도 붙게 됩니다. 그리고 보통 이 단계에서 "언어는 도구에 불과하다"는 성급한 확신에 빠지게 되기도 합니다. 그렇다면 그 단계의 개발자가 놓치고 있는 해당 언어를 능숙하게 다루기 위해 알아야 하는 지식은 무엇이 있을까요?
우선 외국어라면 '관용구(idiom)'나 상황에 맞는 표현을 구사하는 능력, 또는 자연스러운 억양으로 이를 말할 수 있는 능력 정도를 생각해볼 수 있습니다. 프로그래밍에 대입하면 이는 해당 언어의 관례와 관행(convention)을 이해하고 지키는 것이 될 것입니다. 아래 의사(pseudo) 코드를 살펴보겠습니다:
if (user != null && user.company != null) {
return user.company.phone_number
}
이는 정상적으로 실행이 되는 간단한 코드이지만, 아마도 코틀린, C#, 모던 자바스크립트를 능숙하게 다루는 개발자라면 "return user?.company?.phone_number"같이 널 병합(null coalescing) 연산자로 한 줄로 줄일 수 있음을 지적할 것이고, 스칼라나 모던 자바 개발자라면 Option(user).flatMap(_.company).map(_.phone_number) 같이 옵셔널 유형을 통한 코드를 선호할 것이며, F#이나 러스트 개발자는 한술 더 떠서 아예 "널값은 존재할 수 없다"고 이야기할 것입니다.
어쩌면 파이썬 개발자는 'EAPF' 원칙을 들어 이를 try-catch로 바꾸는 것이 "idiomatic Python"코드, 또는 "Pythonic way"라고 주장할지도 모릅니다. 그리고 모든 것을 떠나, 자바나 C# 개발자라면 'phone_number' 같은 스네이크 표기법부터 눈에 거슬릴 것이고, C 개발자라면 중괄호 위치부터 마음에 들지 않을 것입니다.
자연어의 경우도 이를 공유하는 집단의 문화나 사고방식에 영향을 주는 것처럼, 프로그래밍 언어도 비슷한 특성이 있습니다. 예를 들어 파이썬 개발자라면 어떤 값을 불변 상태로 선언할 필요를 느끼지 못할 것이고, C# 개발자는 왜 열거형에 메서드 선언이 필요한지 이해하지 못할 가능성이 큽니다. 또한, 자바 개발자가 자바스크립트를 하면 타입을 중심으로 설계를 할 수 없음에 답답함을 느낄 수 있지만 자바스크립트 개발자가 자바를 하면 항상 타입을 선언해야 하는 점을 불편하게 느끼기 쉽습니다.
능숙한 파이썬 개발자라면 다른 언어에는 프로토콜이 없는 것을 불편해할 것이고, C# 개발자는 왜 다른 언어에선 모든 것을 Enumerable로 다룰 수 없는지 의아해할 것입니다. 코틀린이나 C# 개발자는 확장 메서드 개념을 사용할 때 스칼라 개발자는 암묵 변환을 활용할 것이고, 아마 자바 개발자는 그런 것들이 왜 필요한지 이해할 수 없을 것입니다.
그 밖에도 비동기 코드를 어떻게 작성하는지, 제너레이터 같은 개념을 지원하는지, 제너릭 파라메터를 어떤 식으로 제한할 수 있는지, 고계함수, 부분함수, 커리(curry) 등을 얼마나 잘 지원하는지 등 프로그래밍 언어마다 조금씩 차이가 있고, 이는 각 언어를 사용하는 개발자의 접근 방법에도 영향을 줍니다.
자언어에 비유하면 예컨대 한국어에는 존어법이 존재하지만, 영어에는 없다는 것이 각 언어를 모국어로 쓰는 사람들이 나이 차이가 있는 사람을 대하는 태도에도 영향을 끼치는 것과 비슷합니다. 또한, 만일 어느 외국인이 식당에서 "비빔밥 줘 빨리" 같이 주문을 한다면 아마 예의 상이 아닌 진심으로 "한국말을 능숙하게 한다"고 말하기 어려울 것입니다.
앞서 언급한 이제 막 하나의 언어에 조금 익숙해지고 다른 언어를 배운 개발자들이 과도한 자신감을 느끼는 이유는 아직 주력 언어의 고급 개념도 제대로 접해보지 않았기 때문일 가능성이 높습니다. 즉, 프로그래밍 언어를 아직 변수, 조건문, 함수, 반복문 같은 대부분 언어에 '최대공약수'처럼 공통으로 존재하는 기초 문법 수준에서 이해하고 있기 때문에 다른 언어를 배우는 것도 별거 없다고 착각하는 단계입니다.
하지만 좀 더 주력 언어를 깊게 공부하고 다양한 언어를 접하다 보면 프로그래밍 언어 사이의 공통점과 차이점을 더 넓은 시각에서 이해할 수 있고, 그 단계가 되면 정말로 다른 언어를 배우기가 상당히 쉬워집니다. 사실 현대적인 프로그래밍 언어들은 서로 영향을 주고받으며 몇 가지 큰 축으로 수렴하는 과정에 있습니다. 다만 그 흐름을 볼 수 있을 정도가 되려면 적어도 2-3가지의 언어는 조건문, 반복문, 변수할당을 이해하는 수준보다는 더 깊이 있게 다루어 볼 기회가 있어야 하므로 생각보다 제대로 된 폴리글랏 개발자가 많지 않을 뿐입니다.
그리고 보통 프로그래밍 언어의 본질적인 차이는 단순히 문법 수준이 아닌 패러다임 차원의 특성에 기인하는 경우가 많습니다. 그래서 어느 정도 함수형 패러다임에 익숙하지 않다면 왜 널 병합 연산자가 있는데 굳이 옵션형이 필요한지 이해하기 어려울 수 있고, 객체지향을 일정 수준 이상 사용해보지 않았다면 왜 스칼라의 셀프 타입이 그렇게 강력한 기능인지 깨닫기 힘들 것입니다.
물론 하는 일에 자신감을 느끼는 것은 좋은 일이고, 어느 수준에 다다랐을 때 "언어는 도구에 불과하다" 같은 주장을 할 '자격'이 생기는지 같은 문제는 순전히 주관의 영역입니다. 하지만 프로그래밍 언어를 배워서 실무에 적용하면서 그 과정에 대해 어떤 본질적인 주장을 한다는 것은, 예컨대 단순히 외국에 나가서 '어떻게든 식당에서 주문을 할 수 있다' 같은 수준보다는 적어도 그 나라 사람들 사이에서 큰 이질감 없이 일상생활을 할 수 있는 정도는 전제로 할 수 있는 이야기가 아닌가 싶습니다.
개인적으로 이제 막 주력 언어가 아닌 다른 언어를 배우는 단계의 개발자라면 '외국의 식당에서 주문을 할 수 있는' 수준보다는 그 언어를 사용하는 기자나 작가 수준의 언어 구사력을 목표로 공부를 하는 것을 권해드리고 싶습니다.