트위터에서 이런 글을 읽었다.
지나치게 표면적인 이야기처럼 들릴지 모르지만, 모두의 경험은 다르다. 서로 다른 제품을 만들었고, 다른 환경, 다른 사람들과 일해왔다. 관찰의 범위가 다르고 각자가 추구해온 목표도 다르다. 그러므로 조언은 … 어디까지나 개인적인 것이고 읽는 사람이 그것을 내 상황에 맞게 이해하는 것이 필요하다.
그렇다면 그 모두를 초월한 지혜는 없을까. 여기에 ‘이름 짓기’가 떠올랐다.
컴퓨터 과학에서 가장 어려운 세가지 문제가 이름짓기와 off by one error라고 하는 농담처럼 이름짓기는 가장 중요하다. 일단 코드에서 그렇다. 어떤 사람은 가장 최근 주문을 갖고 오는 함수를 이렇게 작성한다.
def get_last_item(orders: list)
누군가는 이렇게 작성한다.
def get_last_order(orders: list)
또는 이렇게 작성할 것이다.
def get_last(orders: list)
코드 실행만 생각하면 어떻게 작성해도 큰 문제는 없다. 모두 다 돌아가는 코드가 될 것이다.
그러나 get_last_item 이라고 작성하는 개발자는 코드는 작성뿐만 아니라 읽기 위해 존재하고, 프로그래머는 코드의 조각 조각을 추상화하고 추상화한 요소들로 프로그램 또는 전체 아키텍처를 이야기한다는 점을 스스로 잘 이해하는지 확인해 볼 필요가 있다. 가장 답답한 경우는 … 셋의 차이점이 아예 보이지 않는 경우다. 차이를 보지 못하는 사람들에게 코드란 작성하고, 돌아가면 끝이다. 읽는 사람이라던가, 코드 maintenance 같은데는 생각이 미치지 않는다. (나는 코드를 위에서 아래로 초당 3-5줄씩 읽어갈때 그 내용이 빠르게 이해되야한다고 말한다. 여기에는 읽는 사람의 코드 읽기 기술 또한 중요하다.)
우리는 “가장 최근 주문을 가져와서 관리자 화면에 보여준다” 라고 말하지 “주문 목록의 가장 마지막 항목을 관리자화면의 alert dialgue 에 인자로 주면서..”라고 말하지 않는다. 주니어는 당연히 후자처럼 정확한 스펙에 대한 토의가 필요하다. 하지만 시니어는 전자처럼 이야기하기 마련이다.
코드가 추상화된 개념과 이름을 갖게 될 때 그 이름은 일상의 토의에서 누구나 쉽게 이해하고 사용할 수 있어야한다. 시니어가 되면서 마주치는 상황은 그 어휘들이 마케팅이나 법률적인 맥락에서 사용되는 경우이다. 아주 명확하지 않은 이름은 “아 나 그거 알아”라고 생각하는 마케팅팀 (또는 제품관리자팀)과의 대화에서 좌절감을 느끼게 한다. 비 개발자들은 자기도 그 개념에 대해 알고 있다고 생각하지만 프로그래머의 입장에서 보면 전혀 그렇지 않다! 그들이 똑똑하지 못해서인가? 아니다, 프로그래머가 이름을 잘못 지었기 때문이다.
그런데 코드는 잘 이름 지으면서도 다른 것들의 이름은 잘 짓지 못하는 경우를 본다. 예를들어 나는 원칙 제안서의 문서 제목이 “노트” 였던 적을 본적이 있다. 노트라고 이름지어진 문서는 끄적이는 글의 저장소이므로 누구도 진지하게 읽지 않는다. 누구도 핵심 주제인 원칙에 대한 토의를 시작하지 않게 된다. 당연히 의견은 준다. 그러나 그 의견들은 낮은 수준에 머물게 된다.
정확한 의도를 설명하는 문서 제목인 “제안: ooo 을 위한 원칙”는 무겁고 진지하다. 이제 그 글의 저자는 생각을 끄적이는 사람이 아니라 새로운 규칙을 제안하고 리드하게된다. 읽는 사람들은 진지하게 자신의 의견을 정제하고 답을 주게 된다.
이름은 인간이 언어로 커뮤니케이션하는한 영원히 중요할 것이다. 소프트웨어가 중요해질수록 더 많은 사람들이 소프트웨어의 이름을 일상어로 사용한다. “클라우드” 가 그렇고 “인공 지능”이 그렇다. “클라우드”란 얼마나 멋진 이름인가. 추상적이지만 그림으로 그릴 수 있고, 그림으로 그렸을 때 저 멀리 떨어진 어떤 것이란 이미지를 한번에 준다. 더구나 차갑지 않다. 낭만적이다. “인공 지능”은 자연적이지 않은 것이란 점이 한번에 이해된다. 누가 들어도 사람이 만든 지능이란것을 한번에 알 수 있다.
이 글의 제목은 “시간을 초월한 개발자에 대한 조언: 이름 짓기” 이다. 이렇게 이름을 지을때 글의 제목은 분명하게 “조언”이고 “시간을 초월한”이다. 이것이 핵심 주제이기 때문이다. 그런데 왜 제목에 “:”을 사이에 두었을까. 특별한 계획은 없지만 나는 이 글이 “시간을 초월한 개발자에 대한 조언: 이름 짓기 #2” 처럼 2편이 작성될 상황을 염두에 두었기 때문이다. 또는 “시간을 초월한 개발자에 대한 조언: Foo Bar” 처럼 다른 내용에 대한 글을 작성할 경우도 고려했다. 이 글의 제목이 뛰어나단 자랑이 아니다. 이름을 짓는데 어디까지 생각하고 있는지를 보여주고 싶었다.