- Published on
누구를 위한 코드인가?
- Authors
- Name
- Hyesung Lee
- GitHub
- @silentsoft
코드란 무엇일까. 사전에서는 소스 코드를 아래와 같이 정의하고 있다.
소스 코드(source code) 또는 원시 코드란 컴퓨터 프로그램을 (사람이 읽을 수 있는) 프로그래밍 언어로 기술한 글을 말한다. 한 개, 또는 여러 개의 텍스트 파일로 구성되어 있다. 현대 소프트웨어 개발에서 기계어는 극히 일부 영역에서만 쓰이며, 대부분 고급 언어로 된 소스 코드를 컴파일하여 개발한다. 소프트웨어와 이에 동반하는 소스 코드는 일반적으로 크게 자유 소프트웨어와 사유 소프트웨어 가운데 하나의 라이선스를 지닌다.
출처 - 위키백과
사전 본문에는 '사람이 읽을 수 있는', '프로그래밍 언어로 기술한 글'이라고 나와있다. 코드가 컴파일러를 위한 것이 아닌, 사람을 위한 글이라는 것을 우리는 너무나 쉽게 생각하고 있다. 혹은 '간과하고 있다.'고 표현하는 것이 더 옳은 표현일지도 모르겠다.
예를 들어 count 변수를 cnt로 축약하여 명명하거나 문자열 변수는 str이라던가 오브젝트는 obj로 명명한다면, 과연 이게 누구를 위한 코드일까? 이 변수가 무슨 역할을 하는지 주석이나 별도의 설명 없이 그저 이름만으로 유추할 수 있게 하고, 하나의 비즈니스에서 논리적인 흐름 단위로 적절한 곳에 줄바꿈 2번 정도의, 마치 한 권의 소설책을 읽는다는 느낌을 받게 하는 것이야말로 사람을 위한 코드가 아닐까?
필자는 변수나 메서드 명을 지을 때 30자를 넘는 경우가 종종 있다. 누군가에게는 너무 길다고 느껴질 수 있겠지만, 변수명을 간결하게 짓고 주석을 작성하는 것보다 흐름을 덜 끊기게 하고, 의도와 목적을 명확하게 전달하는데 효과적이다. 가령 예를 들어 사용자가 프로그램에서 언어 설정을 변경하는 경우에 사용자가 설정한 언어 코드를 가져오는 변수를 아래와 같이 선언했다고 치자.
// Case 1.
String lang = SharedMemory.getDataMap().get(...);
// Case 2.
String languageCodeTrrigeredByUser = SharedMemory.getDataMap().get(...);
변수 선언만으로는 아직 와 닿지 않는가? 그렇다면 조건문 하나만 더 걸어보자.
// Case 1.
if (lang != null && lang.length() > 0) {
...
}
// Case 2.
if (isNotEmpty(languageCodeTriggeredByUser)) {
...
}
첫 번째 if 조건문에서 추측해보자. lang이 과연 어디서 온 lang일까. 시스템의 언어? 사용자 변경에 의한 언어? 서버에서 가져온 언어? 추측이 난무해진다. 두 번째 if 조건문에서는 추측할 필요도 없다. 그냥 읽기만 하면 된다. 첫 번째 케이스의 lang 변수가 어디에서 온 lang이냐는 태클은 있을지 몰라도, 두 번째 languageCodeTrrigeredByUser 변수명이 불필요할 정도로 너무 길다고 태클 거는 사람은 없을 것이다.
비단, 이런 류의 문제는 단순히 명명시에 발생하는 문제만은 아니다. 사실 첫 번째 if 조건문은 변수 명명을 포함한 총 두 가지 실수를 범하고 있다. != null과 length > 0이 의미하는 바는 누구나 알고 있지만, ‘누구를 위한 코드인가?’. 이제, 두 번째 if 조건문을 다시 보자. 사람을 위해, 보다 읽기 편하게 isNotEmpty 메서드로 분리한 것이 전부이다.
한 번만 스스로를 돌아보자.
오늘 나는 누구를 위한 코드를 작성하였는가?