회사에서는 언리얼4 엔진을 쓰는데, 집에서는 훈련을 유니티로 해볼까 한다. 양쪽 모두 게임 산업에서는 상당히 널리 쓰이고 있다. 유니티는 원래 Unity 3D 라는 상표명을 사용했던 것 같은데, 올해부터 Unity 2017 이라는 이름으로 바뀐 듯 하다. 아마도 2D, 3D 가 모두 지원 가능하다는 이미지를 주고 싶어서가 아닐까? 그 때문인지 프로젝트 생성 시 2D, 3D 를 선택할 수 있게 되어있다.



몇년 전만 해도 양쪽 엔진 모두 개인은 월 몇만원씩 주고 사용해야 했으나 최근 경쟁이 붙기 시작하면서 개인이나 인디 게임 제작하는 회사 수준에서는 모두 무료로 이용할 수 있도록 바뀌었다. 게다가 MS 도 이와 같은 흐름에 동참하면서 비주얼 스튜디오를 개인에게 무료로 개방하였다. 최소한 윈도우 환경에서 취미 생활로 게임을 만들고자 하는 사람에게는 더 없이 좋은 환경이 만들어진 것이다.


다만 언리얼과는 달리, 유니티는 별도의 라이선스(Pro) 없이는 엔진 소스 코드까지 접근할 수는 없는 듯 하다. 언리얼은 디버깅을 할 때 엔진 소스 코드가 보여서 엔진쪽 버그인지 그리고 엔진 코드가 무슨 일을 하는지 쉽게 파악이 가능했는데 - 물론 엔진쪽 버그면 수정이 어려워서 짜증이 나긴 한다 - 유니티는 그런게 어려울 듯 하다. 


언리얼4 엔진은 C++를 보통 사용하지만 유니티는 C#을 사용한다. 개인적으로는 C++을 선호하는 편이지만 C#도 상당히 좋아한다. C#은 무엇보다도 객체 수명 관리가 간편하며 C++와 같이 복잡하고 지저분한 코드가 덜 만들어진다. 언리얼 엔진에서도 대부분의 객체는 스마트 포인터와 같이 따로 해제를 해줄 필요가 없으며 가비지 콜렉션(GC)으로 수명을 관리해주므로 사실상 C++의 문법을 사용하고는 있지만 C#과 비슷한 느낌으로 사용이 가능하게 만들어두었다.


유니티 설치 시 인상깊었던 점은 유니티 설치 시 비주얼 스튜디오 2017 을 같이 설치해준다는 것이다. 언리얼은 별도로 설치했던 것으로 기억한다. 프로그래밍을 처음 하게 될 게임 제작자도 헤멜 거리가 하나 줄어들게 될 것이므로 긍정적으로 볼 수 있겠다.


아래는 두 엔진의 차이점을 표로 정리해본 것이다:

 

Unreal Engine 4

Unity 2017 - Personal 버전

가격

무료

무료

과금 조건 (로열티)

분기 매출 당 $3,000 초과분의 5%

연매출 10만 달러 이상인 경우 Plus 또는 Pro 버전으로 바꿔야 함

엔진 소스 코드 제공

X  (Pro 이상 버전)

주 프로그래밍 언어

C++ 

C# 

프로그래밍 IDE (Windows 기준)

Visual Studio 2017 (또는 2015)

Visual Studio 2017

만약 틀린 정보가 있다면 즉시 업데이트하도록 하겠다.




엔진 이야기는 이 쯤 하고, 이제는 오늘 진행했던 내용이다.


Roll a Ball 이라는 튜토리얼 프로젝트를 하고 있는데 동영상으로 하나씩 따라할 수 있도록 되어 있다. 언리얼로 치자면 블루프린트로만 진행하는 튜토리얼과 같은 수준이지만 유니티에서는 C# 으로 직접 스크립트를 코딩해야 한다. 이 점에서는 언리얼의 진입 장벽이 조금 더 낮다고 볼 수 있겠지만, 블루프린트로 게임을 만드는 경우 (프로그래머 입장에서) 나중에 고생을 많이 하게 되므로 결국엔 별 차이가 없다고도 할 수 있겠다.


몇 가지 인상깊었던 차이점을 하나 보자면, 언리얼은 에디터에서 기본 제공되는 기본 도형 중에 유니티에서 Plane 이라고 불리는 객체가 없다. 이게 없어서 상당히 의아했던 기억이 난다. 언리얼은 부피가 존재하는 블록을 사용하여 평평한 땅을 만든다. 유니티의 Plane 은 부피가 존재하지 않는 평면이다. 대신 앞, 뒷면이 존재하며 반대쪽 방향에서는 이 평면이 컬링되어 보이지 않는다.


또 한가지 다른 점은 축, 좌표계이다. 언리얼은 X, Y축이 지면이고 Z축이 위쪽인데, 유니티에서는 X, Z축이 지면이고 Y축이 위쪽이다. 예를 들어, 위 아래로 길쭉한 캡슐의 크기를 설명할 때 언리얼에서는 1x1x2 라고 표현하지만 유니티에서는 1x2x1 이라고 표현한다. 개인적으로는 Z축을 위쪽으로 보는 것을 선호한다. X, Y축은 위에서 땅을 내려다 보았을때 2D 평면의 좌표가 되고 Z축이 높이(Height)값이 되기 때문이다. 당분간은 이것 때문에 헷갈릴 것 같다.


에디터에서 카메라 움직임을 조작하는 법도 다른데, 예를 들어 마우스 휠 버튼을 누른 채로 이동하는 경우 언리얼에서는 카메라의 좌표를 조작한다는 느낌을 준다. 즉 휠을 누르고 마우스를 위쪽으로 움직이면 카메라는 지면에서 멀어지는 쪽(+Z)으로 움직인다. 반대로 유니티는 손으로 화면을 움켜쥐고 이동시키는 느낌이다. 스마트폰에서 화면을 손으로 누르고 밀어서 스크롤하는 느낌과 같다. 휠을 누르고 마우스를 위쪽으로 움직이면 화면의 다른 물체들이 위로 이동하고, 따라서 카메라는 반대로 내려간다. 나는 언리얼 방식을 선호하는 편이다. 아무래도 FPS 게임을 좋아해서 그런지 카메라가 플레이어로 인식되는 느낌이 더 편하다.


유니티 에디터에서 C# 스크립트인 .cs 파일을 여는 경우 내 기대와는 달리 Visual Studio 2017 이 켜지는 대신 처음 보는 에디터가 모습을 드러냈다. 이름은 MonoDevelop-Unity 이다. VS 가 더 편한 나로써는 약간 심기가 불편했지만 이 에디터가 유니티와 더 결합되어 있을 것이라는 기대를 했다. 그러나 한글과 같은 조합형 언어 지원을 제대로 못하는지 주석에 한글을 쓰니 타이핑이 누락되는 처참한 결과를 내고 말았다. 유니티가 한국 지사도 있는 것으로 아는데 이 점은 빨리 개선되어야 할 듯 하다.


"Input" 이라는 스크립트 코드를 입력한 후 Ctrl+' 를 누르면 관련 도움말 사이트로 즉시 넘어가는 기능의 설명을 따라했지만 유니티 사이트에서 404 에러를 뱉어냈다. 아무래도 이 기능이나 레퍼런스 웹 페이지의 유지보수가 필요할 듯 하다. 조금 더 테스트해보니 레퍼런스가 보관된 웹페이지의 주소가 바뀐 듯 하다. 직접 유니티 사이트에서 API 검색을 통해 Input 에 대한 설명을 찾아낼 수 있었다.


이 주소로 직접 이동하여 검색하면 된다: https://docs.unity3d.com/ScriptReference/index.html


C# 스크립트가 C++ 코드보다 더 나은 점이 있다면 엄청난 시간이 걸리는 컴파일 작업을 하지 않아도 된다는 것이다. 언리얼에서는 한 줄의 코드만 바꾸더라도 컴파일을 다시 해야 했는데 프로젝트가 커지면 커질수록 C++ 의 특성상 몇분에서 수십분 정도는 기다려야 했지만 C# 은 컴파일 속도가 엄청나게 빠르므로 그냥 스크립트를 저장하고 에디터로 오면 짠! 하고 게임을 플레이할 수 있다.

반응형

때는 2007년 봄. 나는 대학교 외에서의 첫 실무 프로젝트를 시작하게 되었다. 20명 남짓 규모의 작은 SI 회사에 취직하게 되었고, 나에게 주어진 임무는 이 회사에서 기존에 만들었던 것과 비슷한, 하지만 다른 고객 회사를 위한 어플리케이션을 작성하는 것이었다.

작은 회사가 원래 다 그런건지 아니면 SI 회사가 다 그런건지는 모르겠지만, 목표만 던져줬을 뿐, 코딩 스타일 가이드나 기본적인 설계와 철학, 이 회사에서 사용하는 라이브러리나 기본적인 프로젝트 시작 방법에 관하여 별 다른 업무 지도를 받지 못하였다. 뭘 어떻게 만들라는건지 갈피를 못 잡다가 마감일이 점점 다가오기 시작하자 나는 조급해졌다. 아무래도 이대로는 힘들다 싶어 선배님의 코드를 열어 살피기 시작했다.

참고로 당시 비주얼 C++ 6.0 을 사용하고 있었다. 비주얼 스튜디오 프로젝트 파일을 더블클릭하는 순간, 나는 어디선가에서 나는 강한 악취를 느꼈다. 그 악취는 바로 눈앞의 소스 코드에서 풍겨져 나오고 있었던 것이다.

당시 내가 보았던 코드는 내 기억에 따르면 아래와 비슷했다:

---------------
char g_szMstNum[3];
...
memset(g_szMstNum, 0, 3);
memcpy(g_szMstNum, "Bar", 3);
---------------

위 코드를 보고 혹시 문제점을 몇 가지 찾아낸 사람 있는가? 아니면 이해가 잘 되고 어디가 문제라는건지 모르겠는가?

내가 생각하는 이 코드의 문제점은 다음과 같다.

1. sz라고 써있지만 null로 끝나는 문자열이 아니다.

일반적으로 C/C++ 에서는 스트링의 마지막을 표시하기 위해 0 또는 null 을 사용한다. 그런데 여기서는 3바이트 캐릭터 배열에 3글자를 집어넣었기 때문에 sprintf(file, "%s", g_szMstNum); 따위의 코드를 넣었다가는 수백 수천 바이트가 파일에 기록될 수도 있고 잘못된 메모리 주소에 접근하여 크래시가 날 수도 있다. 그러나 변수 이름에서 이 사실을 알아낼 수 없으며 오직 정의 부분과 "Bar"를 대입하는 코드를 둘 다 찾아보고 메모리 크기와 스트링 크기가 정확히 일치한다는 것을 눈치채야만 알 수 있다. 요약하자면 완전히 잘못된 정보를 주고 있다.


2. 변수 이름만 봐서는 이 변수가 무엇을 의미하는지, 어디서 사용되는지 쉽게 알 수 없다.

g_szMstNum 변수에서 헝가리안 표기법에 해당하는 g_sz 를 떼어내고 나면 "MstNum"이 남는다. 이게 무슨 의미인지 알 수가 없다. Master 인지 Most 인지 Minimum Spanning Tree 인지 보는 사람마다 다르게 해석할 수 있을 것이다.


3. 변수 이름과 변수 내용에 접점이 없다.

Num으로 미루어 보아 숫자일 것이지만 sz 접두어를 보면 문자열이다.


위는 약간 각색하긴 했지만 실제로 있었던 일이다. 특히 sz 접두어를 붙였지만 문자열이 null 로 끝나지 않도록 만들어 둔 바람에 여기다가 스트링 처리를 했던 모든 코드들에서 문제가 생겼었다. 몇 시간 동안 디버거를 통해 변수가 어떻게 초기화되는지 찾아보고 나서 위와 같은 코드를 찾은 나는 헝가리안 표기법에 대한 깊은 의구심이 들기 시작했고 이에 대한 외국 포럼의 토론 글을 찾아보기 시작했다. 그리고 내린 결론이다:




나는 헝가리안 표기법(Hungrian notation)은 이제 사용하지 않아야 한다고 강력히 주장하는 바이다.

첫 번째 이유는 사람들이 헝가리안 표기법을 잘 못 이해하고 사용할 가능성이 높으며, 이 경우 큰 혼란을 초래할 수 있다는 것이다. 가령 sz가 String terminated by Zero 의 약자인데도 사람들이 잘 모르고 스트링을 대표하는 접두어로 그냥 쓴다는 것이다. 만약 해당 변수가 null로 끝나지 않는다면 나와 같은 상황이 생길 수도 있다. 이 외에도 int 형 변수의 접두어를 누구는 n을 쓰고 누구는 i를 쓰고, bool 변수는 b를 쓰기도 하고 is를 쓰기도 하며 float 변수는 f를 쓰기도 하고 fl을 쓰기도 하며 static 변수 앞에 s를 붙이기도 하지만 스트링 앞에 s를 붙이기도 하는 등 일관성이 없는 문제가 있다. 일관성이 없어지기 쉽다는 것이야말로 이 방법이 잘못되기 쉽다는 반증이기도 하다.

두 번째 이유는 변수의 '타입'을 변수 이름에 기재해야 하는 이유가 없다는 것이다. 요즘은 IDE가 발달해서 변수의 타입 정도는 아주 빨리 알아낼 수 있다. 그리고 C와 달리 C++은 클래스가 도입되어 사용자가 원하는 타입을 거의 무한대로 만들 수 있는데 접두어를 일일히 고안해낼 수도 없는 일이다. PlayerState 클래스 변수의 접두어는 무엇을 할 것인가? ps? iAge를 생각해보자. 나이는 당연히 숫자인데 int 형이라는 정보를 굳이 줄 필요가 있는가?

세 번째 이유는 변수의 가독성이 떨어지고 변수명이 쓸데없이 길어진다는 것이다. 우리는 대부분의 시간에 코드를 쓰기보다는 "읽는다". 변수의 이름은 변수가 어떤 역할을 하는지에 충실해야지 타입을 나타내는데 낭비되어서는 안된다고 생각한다. m_iAge 와 Age 중 어떤게 보기 편할까? 별 차이가 없다고 생각할 지 모르겠지만, 사람은 문자를 읽을 때 마음속으로 모든 글자를 소리내어 발음하려는 경향이 있다. m_iAge 는 "엠, 아이 에이지"로 읽지만 Age 는 그냥 "에이지"로 읽게 된다. 불필요한 문자들의 추가는 가독성을 현저히 떨어뜨리며 코드를 이해하는데 방해가 된다.


네 번째 이유는 변수의 타입이 변경될 경우 변수명을 모두 교체해야 한다는 것이다. 간혹 겪는 일인데, 정수로 계산하던 값이 부동소수점이 되어야 할 일이 생겨서 타입을 바꾸는 경우가 있다. 예를 들어, 캐릭터의 체력은 화면에 정수로 표시되므로 int 타입을 줘서 iHealth 로 만들었다가 나중에 초당 0.5씩의 피해량, 또는 50% 감쇠된 피해량 등을 계산해야되서 float 로 바꾸는 경우가 그것이다.

다섯번째 이유는 타입을 알아야 하는 것 자체가 문제라는 것이다. 예를 들어, 총알을 쐈을 때 적에게 주는 피해량을 50% 증가시키는 버프를 만든다고 생각해보자. 아마 여기서 enemyHealth -= damage * damageBuffRate; 정도의 코드면 이해하는 데 문제가 없다. 그러나 이게 m_iEnemyHealth -= iDamage * fDamageBuffRate; 이면 눈이 피로해지고 잘 읽어지지 않는다. 물론 타입을 알아야 할 순간이 오기는 한다. 그런데 왜 그걸 선언부가 아니고 변수명에 주렁주렁 달고 다니는가?


여섯번째 이유는 기본 타입(Primitive type) 강박증이 생기기 딱 좋은 습관이라는 것이다. 위 g_szMstNum 을 보면 알겠지만 C++ 에 기본적으로 딸려오는 STL 클래스인 std::string 으로 대체해도 충분하며 오히려 char 배열 변수를 사용하는 이유가 무엇인지 물어보고 싶어질 정도이다. 헝가리안 표기법에서는 항상 변수를 만들 때 타입 이름을 무엇을 넣을까 생각하는 과정에서 이미 잘 알려진 타입(i, b, sz, f 등)을 쓰려는 경향이 있다. 따라서 적절한 클래스를 만들어 넣어야겠다는 생각을 하기 어렵고 C native 타입들을 사용하게 되기 마련이다. 기본 타입 강박증은 코드 라인 수가 상당히 길어지고 헤더가 비대해지며 응집도가 낮은 코드를 만드는 경향이 있다. 또 제네릭한 코드와 객체 지향 코드와는 상당히 맞지 않는다.


일곱번째 이유는 변수 이름을 대충 짓는 습관이 생기기 좋다는 것이다. 단지 타입을 변수 이름에 집어넣는 것으로 iPlayer, szPlayer 같은 변수 이름이 얼마나 많이 보이는지 생각해보자. playerIndex, playerName 으로 바꾸면 얼마나 보고 이해하기 좋은가?


여덟전째 이유는 헝가리안 표기법을 썼던 MS 조차도 이제는 쓰지 않는다는 것이다. 헝가리안 표기법을 쓰는 사람 중 일부는 예전 Windows API 스타일을 보고 이 똑똑한 사람들이 만든 법칙에는 분명 무언가 중요한 이유가 있을 것이라는 것을 느끼고 따라한다. 그러나 MS가 만든 현대적인 언어인 C#을 다뤄본 사람은 알겠지만, 헝가리안 표기법은 MS 내에서 더 이상 사용되지 않으며 실제로는 사용이 금지되었다. 

https://docs.microsoft.com/en-us/dotnet/standard/design-guidelines/general-naming-conventions

위 링크는 MS의 프레임워크 디자인 가이드 중 명명법(Naming) 항목이다. 여기에 가면 다음과 같은 문장이 있다:

DO NOT use Hungarian notation. (헝가리안 표기법을 사용하지 말 것)

이 정도면 말 다 했다고 생각한다.




정리하면,

  • 좋은 코드의 핵심은 코드를 알아보기 쉽게 하고 가독성을 높이는 것에 있다. 그러나, 헝가리안 표기법은 가독성에 큰 도움을 주지 못하며 오히려 해친다. 
  • 읽는 사람에게 잘못된 정보를 전달하여 버그를 만들 수 있다. 
  • 코드를 작성하는 사람에게는 비 객체 지향적인 코드를 작성하게 만든다. 또 변수 이름에 타입을 넣음으로써 어느 정도 정보를 전달했다고 믿게 만들고 변수명을 대충 짓게 만든다.
  • 타입 검사는 컴파일러에게 맡길 것. Visual Studio 2010부터는 컴파일 없이도 타입 체크가 되어 빨간 색으로 밑줄을 그어주니까 훨씬 편하다.
  • 만약 타입을 반드시 알아야 한다면 클래스 등으로 캡슐화한다거나 해서 추상화 수준을 올려보는 것이 좋다고 생각한다. 


---

2010년에 원고를 썼는데 7년이 지난 이제서야 퇴고하고 올린다.

반응형

요즘 자정 넘어 퇴근하는 일이 많아지고 있다. 담당한 프로젝트가 곧 출시를 앞두고 있는 것과 무관하지는 않을 것이다.


왜 자정 넘어 퇴근을 하는가? 정규 업무 시간이 끝나고 나면 또 무슨 일을 하길래 나는 회사에 이렇게 오래토록 있는가? 야근 없이는 이 프로젝트가 성공할 수는 없는가? 오늘은 이 주제에 대해 약간 다뤄볼까 한다. 하지만 아래에 나올 이야기는 하나의 주제를 가지고 이야기를 풀어 쓴 것이 아니라, 내 생각의 흐름에 맞춰 순서대로 기록되었기 때문에 일관적인 내용을 가지지는 않는다는 것을 알아두었으면 좋겠다.




나는 사람이 하루에 쓸 수 있는 집중의 시간은 정해져 있다고 생각한다. 마라톤 선수라고 해도 하루에 마라톤을 두 번 이상 할 수는 없는 법이다. 난 사실 마라톤을 어떻게 교육하는지는 모르겠지만, 아마도 마라토너 코치가 선수에게 하루에 100km 를 달리라고 한다면 - 참고로 마라톤은 약 42km 달린다 - 코치의 자질을 의심하고도 남을 것이다. 몸의 피로는 너무나도 자명하기 때문에 쉽게 이해할 수 있다. 정신 - 즉 '뇌' - 의 피로는 쉽게 '정신력'이라는 말로 간과당하고는 한다. 정신력은 상황에 따라 거의 무제한에 가까운 능력을 발휘할 수 있다고 믿는 사람들이 있지만 그 또한 뇌 세포의 활동, 즉 신체 활동의 연장에 불과하다. 따라서 적절한 휴식이 따라오지 않으면 정신력은 휴식 없는 마라톤 선수의 근육 상태와 같이 며칠 지나지 않아 더 이상 적절한 생각과 노동을 할 수 없게 될 것이다.


나는 프로그래머인 관계로 마라톤과는 일 하는 방식이 다르지만, 이렇게 일정 시간 동안 집중하여 생산할 수 있는 능력을 나는 '코딩력'이라고 표현한다. 하루에 내가 코딩할 수 있는 노동의 총 량을 의미하는 것이다. 오래달리기 선수라고 한다면 하루에 달릴 수 있는 총 거리와 비슷한 느낌일 것이다. 그리고 '코딩력'을 전부 소진하고 나서도 만약 일을 더 해야 한다면, '생명력'을 사용한다고 표현한다. 생명력을 소진하는 것은 말하자면 이자율이 비싼 대출과 비슷하다. 내일의 코딩력을 오늘 땡겨 쓴다고 생각할 수도 있고, 아니면 내 체력을 팔아서 코딩력을 산다고 생각할 수도 있다. 그렇지만 어제나 비싼 이자를 지불해야 하기 때문에 단기간의 능력은 향상되나 장기간의 능력은 감소한다.


요즘 더 알려진 용어로는, 이렇게 생명력을 소진하는 행위를 '크런치 모드'(crunch mode 또는 crunch time)라고 한다. 재미있게도, 구글에 crunch mode 를 검색하면 상위권에 다음 링크가 나온다:

https://cs.stanford.edu/people/eroberts/cs181/projects/crunchmode/index.html


<위는 구글 검색 내용을 캡처한 것이다>


일단 두 번째 링크의 주소를 살펴보면, 미국의 명문 대학교인 스탠포드 대학교(stanford.edu)라는 것을 알 수 있다. 그리고 내 경험으로 미루어 보아, 앞의 "cs" 는 보통 Computer Science 를 의미한다. 즉, 스탠포드 대학교 컴퓨터 학과라는 것이다. 이게 어느 정도 레벨인지 모르는 사람을 위해서 설명하자면, 만약 내가 여길 수석으로 졸업할 정도의 실력이라면 아마 10년마다 대출 없이 집을 한 채 살 수 있을 정도의 급여는 받고 살 수 있을 정도라고 말할 수 있겠다. 전 마이크로소프트 CEO, 페이팔 설립자, 구글, 야후, HP, Nvidia, 썬 마크로시스템즈, 스냅챗 창업자가 여기서 나왔으니 대충 어느 정도 수준인지 느낌이 올 것이다.


다시 본론으로 돌아와서, 크런치 모드의 검색 결과가 의미하는 것은 무엇일까? 세계 최강의 명문대 조차도 야근은 피할 수 없다, 또는 우리야 말로 야근에 대해 가장 권위있게 설명할 수 있는 곳이다 라는 의미가 아닐까 한다. 구글 검색 결과의 상위를 차지하고 있다는 것이야말로 권위를 나타내는 지표일 것이다.


미국의 대학교는 한국과는 달리 들어가는 것은 그렇게 어렵지 않지만 졸업하는 것이 정말로 어려운 것으로 알려져 있다. 비교하자면 한국의 고3 수능 시험을 준비하는 공부의 강도가 미국에서는 대학교 4년 내내 이어지는 것이다. 잘 떠올려보면, 미국의 영화 중 치어리더 나오고 운동남 나오고 파티를 하는 코믹 학원물은 우리 눈에는 마치 대학생들 이야기처럼 느껴지지만, 실제로 영화 내에서는 고등학교 시절 이야기다. 말하자면 우리와는 고3과 대학 생활이 반대라고도 할 수 있겠다. 조금 슬픈 이야기지만, 우리나라에서는 고3 학생들이 시험 공부를 하다가 자살을 하고는 하지만 미국에서는 대학생들이 자살을 한다. 나도 돌이켜 생각하보면 가장 끔찍했던 시절이 바로 고3이었다. 누군가는 젊은 시절로 돌아가고 싶다지만 나는 다시는 그 시절로 돌아가지 않으리라.


그렇다. 야근이야말로, 지구상에서 가장 위대한 IT 업계의 업적인 구글 창업자 또한 피할 수 없는 일이었을 것이리라.

나 또한 회사에서 이루었던 가장 큰 업적들은 야근 속에서 만들어진 것이 많다고 생각한다.


그렇다면 야근은 결국 프로그래머에게 필요불가결한 존재인 것인가? 그렇지는 않다고 생각한다.


위에서 이야기했던 '업적'을 이루었던 야근의 형태는 어느 정도의 패턴을 가지고 있다. 그 중 가장 중요한 것은 "강한 동기"이다. 뭔가를 이루고자 하는 마음이 일정의 마감과 겹쳐 시너지를 낸 것이다. 만약 내가 내 일에 대해서 책임감과 관심, 그리고 사적인 흥미를 느끼지 않았다면 그런 업적은 이루지 못했을 것이다. 반대로 말하면, 사적인 동기가 없는 야근은 아무런 의미가 없다. 내가 아닌 다른 사람이 아무리 급해봤자 내가 그것에 대해 공감하고 동의하지 않으면 아무 소용이 없는 것이다. 대중교통을 이용할 때 내 뒷 사람이 나를 아무리 밀어봤자 내가 여기서 내릴 역이 아니면 나는 꿈쩍하고 싶은 마음이 들지 않는 것이다.


그래서, 요즈음의 야근은 과연 나에게 사적인 동기가 있었고 자발적인 것이었는가? 나는 분명 책임감을 느끼고는 있지만 그게 사적인 동기로까지 이어지려면 그 보상 또한 나에게 연결되어 있을 것이라는 믿음을 가지고 있기 때문일 것이다. 그러니까 생명력을 불태우면서까지 납기일을 맞추는 행위가, 내년 내 급여와 인센티브에 직접적인 영향을 줄 것이라는 강한 믿음을 가지고 있기 때문이다. 그리고 또한 내가 담당한 업무가 제대로 돌아가는 것을 보고 싶은 것 또한 있다. 만약 이러한 업무와 보상과의 연결고리가 부정된다면 나는 야근을 할 필요가 없다. 야근을 하면 내 개인 시간이 없어지고, 안하면 평가는 나빠질 수도 있지만 솔직히 회사에서 잘려도 내가 갈 곳은 많으니까. 굳이 시간을 돈으로 바꾸는 업무에서 내 시급을 일부러 희석시킬 필요가 뭐 있겠는가? - 참고로 우리 회사는 포괄임금제라서 야근을 해도 돈을 더 주지 않는다.



반응형

+ Recent posts