초보 개발자들이 힘들어하는 것 중 하나가 이름을 짓는 것이다. 사실 초보들만 그런 게 아니다. 어느 정도 경험이 있는 개발자들도, 자신이 익숙하게 사용해 오던 이름 짓기 방식이 있어서 좀 낫다 뿐, 이름을 짓는 것은 늘 어려운 일이다.

생각해 보면 개발자는 누구보다도 이름을 많이 부여하는 존재일 것이다. 어떤 날은 하루에도 수십 개의 이름을 부여할 지 모른다.

“이름”이란 예로부터 독특한 의미를 지닌 것이었다. 부모가 주신 이름과 아명, 성인이 돼 자기 스스로 지은 호 같은 것까지 말이다. 사람들은 이렇게 이름을 통해 의미를 드러내고 싶어 한다.

우선 우리말로 생각해 보자

초보들 입장에서 생각해 볼 때 가장 어려운 것은 영어로 표현하는 것인 듯하다. 복잡한 과정을 표현하는 것도 어려운데, 이걸 영어로 표현하려니 대체 표현이 떠오르지 않는 것 아닐까 싶다. 이럴 때 어려움을 하나 줄일 수 있는 방법은 함수의 역할을 우리말로 표현해 보는 것이다.

사진을 업로드할 때 사용할 함수를 만들어 본다고 생각해 보자. 사진 원본은 사이즈가 10메가 이상 나간다. 이걸 웹에서 서비스할 수는 없고, 원본을 웹에 공개하는 것도 원치 않는 상황이다. 그래서 웹용으로 리사이즈한 사진은 따로 저장하려고 한다. 원본 사진은 웹에서 접근할 수 없는 폴더에 저장한다. 웹용 사진 파일의 경로는 기본으로 지정돼 있는 상황이고 여기서 원본 사진 파일의 경로를 구해야 한다.

이 때 초보는 이런 식으로 세세하게 과정을 정리하게 될 것이다.

  • 일단 파일명을 제외한 경로만 구합니다.
  • 경로를 제외한 파일명 부분을 구합니다.
  • 확장자를 제외한 파일명을 구합니다.
  • 확장자를 구합니다.
  • 랜덤으로 원본파일명을 생성합니다.
  • 원본 파일 경로를 리턴합니다.

영어로 이름을 지으려고 하면 골치아플 테지만, 우리말로는 비교적 수월하게 지을 수 있을 것이다. 웹용 파일 경로를 이용해 원본 파일 경로를 구한다. 자, 그러면 이제 이걸로 영작을 해 보자. 나의 짧은 영작 실력으로는 이렇게 표현 가능할 것 같다.

Get original file path from web file path.

구글 번역기의 도움을 받을 수도 있다. 구글 번역기를 돌릴 때 문장 끝에 마침표 찍는 것을 잊지 마라. 번역이 달라진다.

Use the file path for the Web to get the original file path.

구글 번역기에서 취할 것은 주로 단어들이다. 문장을 그대로 사용할 수 있는 경우는 거의 없다. 이 경우엔 내 영작이 더 나은 것 같다;;

그러면 함수명을 그냥 이렇게 지을 수 있을 것이다. get_original_file_path_from_web_file_path($web_file_path).

필요없는 부분을 생략하자

자, 이건 출발이다. 이제 생략을 해 보자.

file은 굳이 없어도 될 것이다. 따라서 get_original_path_from_web_path($web_path)라고 줄일 수 있을 것이다.

다음은 팀의 규칙에 따라 생략 가능한 부분이다. 객체 지향 코드를 작성하고 있으며, 간단한 값을 구하는 get 메서드는 속성값처럼 get을 생략할 수 있도록 약속해 둔 팀이라면 이렇게 만들 수 있을 것이다: originalPathFromWebPath($web_path)1

webPath는 인자값으로 대체 가능하다. 따라서 이런 경우 originalPathFrom($webPath)라고 줄일 수도 있을 것이다. IDE에서 자동완성시 인자값 이름까지 표현해 주므로 이렇게 대체하는 게 무리는 아니다. (단, 팀에 따라서 함수명에 webPath까지 표현해야 한다고 약속해 둔 경우도 있을 것이다. 그런 경우엔 이걸 생략하면 안 될 것이다.)

주석을 달자

많은 IDE에서 함수의 주석을 표현해 준다. 함수 주석은 함수 바로 위에 /**로 시작하는 문단 주석으로 달아야 한다(예시 참조). 예컨대 PhpStorm은 Ctrl + q를 누르면 함수 위에 달린 주석을 표시해 준다. 위의 경우 이렇게 만들 수 있을 것이다.

/**
 * 웹용 사진 경로를 바탕으로 원본 사진 경로를 만들어서 리턴
 * @param $webPath: 웹용 사진 파일 경로
 * @return string 원본 사진 파일 경로
 */
function originalPathFrom($webPath)
{
	// ...
	return $originalPath;
}

이러면 다른 개발자와의 소통하는 데 크게 무리가 없을 것이다.

실제 상황

사실 위 예제는 내가 2010년에 구현한 함수를 기반으로 한 것이다. 당시엔 이 간단한 함수가 왜 그렇게 복잡하게 느껴졌는지.

아래가 바로 실제 함수다. (이해하기 쉽게 살짝만 손봤다.)

/**
 * 웹용 폴더를 바탕으로 원본용 폴더 경로를 만들어서 리턴합니다.
 * @param $title_folder_full_path: 웹용 사진이 들어가 있는 폴더(파일명까지 포함)
 * @return string 원본폴더 경로 문자열
 */
function make_source_file_and_path_from_issue_folder_full_path($issue_folder_full_path)
{
	// 경로를 분석한 뒤 랜덤으로 원본파일명을 생성합니다.
	// 코드는 생략
	
	return $issue_folder_pull_path;
}

함수명이 어마무시하다. 우리말로 풀어 본다면 “이슈 폴더의 전체 경로를 이용해 원본 파일명과 경로를 만든다”이다. 경험 있는 개발자들이 보기엔 ‘함수명이 뭐 이따위냐’ 싶을 것이다. 나도 그렇다.

하지만 내 생각엔 엉뚱한 함수명보다는 이게 낫다. 초보 시절이었음을 감안하자. 엉뚱한 함수명이나 불충분한 함수명을 지으면 다른 개발자들은 혼란에 빠진다. 소스를 까 봐야만 어떤 함수인지를 안다면 유지보수 비용은 급격히 올라간다. 반면, 그래도 이런 이름은 어느 정도는 함수의 용도를 이해할 수 있게 해 준다. 그래서 초보임을 감안하면 이게 더 낫다는 것이다.

설계 문제로 들어갈 수 있다

한 단계 더 나간다면, 원본 경로를 구할 때 반드시 웹 경로를 인자로 받아야 하는가? 하고 질문해 볼 수 있다. 아마 십중팔구 필요 없을 것이다. 그러면 사실 최종 함수명은 이렇게 할 수 있을 것이다: sourcePath()

최종 함수명은 original 대신 source라고 사용했다. ‘원본’을 영어로 original이라고 표현할 것인지 source라고 표현할 것인지는 팀에서 논의해서 정하면 될 문제인데, 내 생각엔 source로 하는 게 좀더 나은 것 같다. original이라고 하면 뭔가 원래 이름이라는 느낌이 나서 말이다. 그러나 팀에서 정해 일관되게 사용해야 한다는 점이 더 중요하다.

더 알아 볼 것

이 글은 이름 짓기에 관한 본격적인 원리를 알려 주는 글은 아니다. 간단한 팁을 제시한 것이다.

개발시 이름을 지을 때 여러 원리가 있다. 간결한 편이 좋다, 약어는 피해라(컴퓨터의 능력이 엄청나게 높아진 오늘날 약어는 예외적 상황이 아니면 쓸모 없다. 잘 알려진 약어는 예외다.), 누구와 소통할 이름인지 생각해라 등. 이런 원리는 이미 다른 데서 많이 다루고 있으므로 꼭 찾아 보자.

프로그래밍 그 자체의 원리도 있다. 가장 중요한 원리는 단일 책임 원칙일 것이다. 원래는 객체에 적용하는 원리인데, 함수에도 적용할 수 있다. 한 함수가 너무 많은 역할을 떠안고 있다면 올바르게 작성하고 있는 것인지 생각해 보라.

가장 중요한 원리는 이런 고민을 하는 이유가 컴퓨터와 소통하기 위한 것이 아니라 사람과 소통하기 위한 것이라는 점이다. 그 사람은 다른 사람일 수도 있지만, 1년 후의 나일 수도 있다.

  1. 객체 지향 코드로 변경하면서 메서드명을 camelCase로 변경했다. PSR-1: Basic Coding Standard에 따른 것이다.