신념, 이념, 종교, 그리고 스타일

@codemaru · March 19, 2010 · 8 min read

인지부조화 이론이라는 것이 있다. 사람은 태도와 행동간의 불일치를 줄이는 방향으로 행동한다는 것이다. 즉, 대부분의 사람들은 언행일치 내지는 신념과 행동간의 불일치를 줄이는 방향으로 자신을 조절해 나간다는 이야기다. 이걸 활용한 것 중에 하나가 다짐을 받는 방법이 있다. 즉, 사소한 일이라도 부탁을 해서 다짐을 받아두면 그 사람은 다짐을 했기 때문에 그 일을 하기 싫어도 할 확률이 높아진다는 것이다. 그럴 것 같기도 하고, 아닐것 같기도 한 이 이론에 대한 심오한 경험을 오늘 하게 되었다.

문제의 발단은 리팩토링 작업을 하면서 만난 다음과 같은 코드였다.

class XSCPacket1 : public ISCPacket
{
private: char Key[PACKET_KEY_SIZE];
public: virtual LPCSTR Key() const;
}

코드가 이렇게 된 배경에는 다음과 같은 이유가 있었다.

  1. 개인적으로 Get/Set 계열 함수에 해당 동사를 붙이는 것을 좋아하지 않는다.
  2. 타입이나 범위(scope)에 기반한 헝가리언 표기법을 사용하지 않는다.

하지만 결국 저 코드는 쓸 수 없는 코드다. 왜냐하면 동일한 네임스페이스에 Key라는 동일한 이름을 가진 존재가 두 개가 있기 때문이다. 결국 한 놈은 다른 이름으로 바뀌어야 하는 상황이다. 정말 아무것도 아닌 상황일 수 있다. 아무 곳에나 아무 글자나 덧붙이면 되기 때문이다. 그런데 나는 이 사소한 문제를 가지고 2시간을 고민했다.

처음으로 이러한 문제를 겪은 다른 사람들의 글을 찾아보려는 시도를 했다. 보통 파라미터와의 이름 충돌 문제는 this->를 사용해서 해결을 하지만 이러한 함수 이름 충돌을 겪는 것에 관한 이야기는 잘 없었다. 비슷한 문제를 해결하기 위해서 멤버 변수 뒤에 _ 스코어를 붙이는 걸 좋아한다는 사람의 글을 하나 찾았을 뿐이었다.

결국 그렇다면 둘 중에 하나를 고쳐야 한다면 무엇을 고칠지에 대해서 생각해 보았다. 함수 이름을 고치면 코드 전체에 고칠 부분이 너무 많았다. 또한 다른 코드의 Get/Set 함수와의 일관성도 잃게 되는 부작용도 있었다. 결국 멤버 변수 이름을 바꾸기로 결정했다.

변수 이름을 어떻게 바꿀지 고민을 시작했다. 앞에 m이나 m_를 붙이는 게 좋을지, 뒤에 _를 붙이는 것이 좋을지를 두고 고민한다. mKey, m_Key, Key_ 흠. 사실 셋 다 마음에 들지 않는다. 결국 mKey를 하겠다고 결정을 했다.

변수 이름 세 개 중에 충돌이 나는 두 개를 mKey, mData로 변경했다. 이러니 나머지 한 변수가 좀 이상해 보인다. 둘만 붙이고 하나를 안 붙이는 것이 찜찜한 것이었다. 결국 나머지 하나는 충돌도 없지만 붙였다. 이러고 나자 헝가리언 표기법을 사용하지 않으려는 나의 신념에 위배되는 코드를 만든 것 같아 찜찜한 기분이 든다. 한참을 코드를 본다. 그리고는 결국 m을 다 지우고, Data와 Key 뒤에 Buffer라는 엄청난 단어를 붙였다. DataBuffer, KeyBuffer가 된 것이다. 결국은 그 놈들은 버퍼인 셈이기도 하니 머 잘못된 결정은 아니라는 안도의 한숨을 쉰다. 머 변수 중에 버퍼가 아닌 변수가 뭐가 있겠냐마는 말이다.

종종 사람들은 자신의 신념, 이념, 믿음, 종교 등을 증명하기 위해서 정말 어처구니 없는 일들을 하곤 한다. 왠지 그런 사람들을 이해할 수 있을 것 같은 오늘이었다. 그리고 또 한번 느꼈다. 신념, 이념, 사상, 종교 등이 얼마나 대단한 것인지를 말이다. 그런 것들을 점령 했을 때 얼마나 엄청난 일을 할 수 있을지에 대해서 말이다.

덧0) 글을 쓰고 다시 읽어 보니 제가 원하는 스타일이 굉장히 충돌이 잘 발생할 수 밖에 없을 것 같다는 생각이 드네요. 저도 원래는 대부분의 윈도우 프로그래머들이 그러하듯 타입 기반 헝가리언 표기법을, 그러다 범위 기반 표기법을, 그러다 이제는 의미론을 제외한 일에는 헝가리언 표기법을 사용하지 않습니다. 변수명에 대한 표기법도 첫글자를 소문자로 하는 방식을 쓰다가, 멤버 변수는 뒤에 언더스코어를 쓰는 방식을 쓰다가 결국은 그런 제한이 다 없는 상태로 쓰기로 했습니다. Get/Set 함수는 이 페이지에 소개된 것과 같은 생각으로 붙이지 않습니다. 제가 버린 순서가 Get/Set, 헝가리언, 소문자 표기가 되다 보니 이런 일이 벌어진 것 같습니다. 비극이군요. ㅎㅎ~^^;;

덧1) 저희 큰 누나는 28살에 결혼한다고 이야기 하고는 28살에 시집을 갔습니다. 작은 누나는 32에 한다고 하고는 그 나이에 가더군요. 인지부조화 이론은 참 그럴듯하죠. 그런데 재미난 사실은 팀원들이 하는 일정 관련 이야기는 인지부조화 이론이 통하지 않는다는 사실입니다. 물론 저도 그렇지요. 매번 일정을 너무 살인적으로 잡아서 그런것 같다는 생각도 드는군요.

 0  0

 

@codemaru
돌아보니 좋은 날도 있었고, 나쁜 날도 있었다. 그런 나의 모든 소소한 일상과 배움을 기록한다. 여기에 기록된 모든 내용은 한 개인의 관점이고 의견이다. 내가 속한 조직과는 1도 상관이 없다.
(C) 2001 YoungJin Shin, 0일째 운영 중