당원의 제안: 의회와 조직

0. 들어가며

나는 진보신당이 좋아서 가입했다기보다는 유일한 선택으로 남았기 때문에 가입한 사람이다. 가입한 이유가 조금 우습기는 하지만, 그렇다고 해서 진보정치에 대한 혹은 진보적인 삶의 고민에 대한 진정성이 훼손되는 것은 아니리라 본다. 나는 이제 32살이 된 보통의 직장인이며, 현재 진보신당 당원이고, 지금까지 진보정치를 지켜봐왔다.

이 시점에서 이런 글을 써내려가는 이유는 당에 들어와서 지켜본 모습은 당의 바깥에서 지켜본 모습과 생각보다 많이 달랐기 때문이며, 현재의 세계를 인식하는 내 주관과 당이 앞으로 나갈 모습이 많이 다를 수 있다는 판단에 내 의견을 기록으로 남겨야하기 때문이다. 이는 일종의 멈치가 될 것이다. 그리고, 당원으로 갖는 첫 발자국이 될 것이다.

이 글을 써내려가면서 수없이 풍기겠지만, 나는 얼치기 자율주의자이며, 트리보다는 네트워크를, 단일보다는 분산을, 하지만, 산만보다는 집중을 좋아한다.

1. 바깥에서 바라본 모습

애시당초 사회당 지지자였다가, 2003년에 있었던 불미스런 사건으로 인해 지지하는 정당이 없어진 이후에 있었던 분당사태가 지난 이후, 진보신당을 지지하기 시작했다. 분당이 이루어진 이후, 외부에 약속되었던 재창당의 과정을 지켜보고 당원이 되기로 결심했지만, 재창당은 촛불정국에 휘말려 이루어지지 않았고, 당은 불안해보이는 성장을 하기 시작했다.

당의 성장이 불안했던 이유는 당의 사상적 기반이 불분명해보였다는 점이 클 것이다. 외부에서 느끼는 진보/사회주의에 대한 시각은 그토록 비난해마지 않는 종북/패권주의와 다를바 없다. 그들과 다른 점을 명확하게 긋지 못하고 있었다. 게다가, 일반인들이 지지하기에는 투쟁집단의 성격이 너무 강했다. 물론, 진보/사회주의를 지지하는 입장에서 일련의 투쟁에 합류하고 지원하고 만들어내는 것은 너무나도 절실하고 필요한 일이다. 하지만, 정당은 정권을 쥐는 것이 목표인 집단이다. 대의제 민주주의하에서 정권을 잡는데 필요한 대중의 지지를 얻어내기에는 진보신당은 너무나 강성한 투쟁집단처럼 보였다. 그리고, 투쟁 이외에는 아무것도 없어보였다. 진보신당의 이름은 사회적으로 약한 부분에서 많이 보여서 좋았지만, 너무 약한 곳에서만 보였다.

대중적인 지지와 기반을 이끌어낼 아이템이었던 무상급식같은 아이템들은 진보의 탈을 쓰기 시작한 민주당에게 빼앗겼으며, 촛불로 인해 얻은 인지도는 점점 식어가기 시작했다. 그리고, 점점 민주노동당과의 차이점을 부각시킬 만한 타이밍은 점점 멀어져갔다.

2010년의 지방선거는 사실 너무나 아쉬웠던 선거였다. 서울시에서 한명숙이 승리하고, 경기도에서 유시민이 패배하는 결과가 나왔다면, 더할나위 없이 진보진영에 대한 사표론을 무력화하면서 한발 더 앞으로 나갈 수 있는 기회가 되었겠지만, 결과는 그렇지 않았다. 그렇다면, 당의 의사와는 상관없이 후보로서의 지위를 포기해버린 심상정씨에 대한 징계라도 신속하게 정리하는 모습을 보였어야 할진데, 이 역시 더디고 약했다. 바깥에서 보기에는 상황에 기민하게 대응하지 못하고, 이는 당의 대중적 스타를 지켜야한다는 진부한 판단으로 비추어졌으며, 과거 3김시대의 보스정치를 떠올리게 하는 좋지 못한 선택이었다. 또한, 떨어져버린 진보신당에 대한 지지도는 사람들이 당을 “잊어”간다는 증명서였다.

그리고, 2012년 총선. 자유-민족-현실의 결합체인 통합진보당이 탄생하고, 진보신당은 패배했다. 총 선 직전의 통합진보당 탄생과 관련해 외부로 노출된 잡음은 당의 지지도를 더더욱 하락시켰으며, 민주당과 타협이 없어 보이는 총선의 진행은 현실정치 혹은 대중정치에 대한 생각이 없는 아마추어적인 모습으로 보였다.

하지만, 민족주의자들의 종북-패권주의에 대한 걱정이 없는 지지할만한 정당이 남았다.

2. 당원이 되다.

그리고, 당원이 되었다. 그리고, 얼마 지나지 않아 홍세화 대표의 “전태일당”이야기가 나왔다. 그리고, 문득 레닌이 떠올랐다.

당의 외부에서 보았을때 알 수 없던 그 기운은 들어와서 잠시 지켜보건데, 노동자의 강고하고 단일하고 균질한 지지에 기반하는 강성 전위정당을 꿈꾸는 사람들의 기운이었다. 자본이 노동을 파편화하고 불균질하게 만들면서 탄생한 정규직과 비정규직의 갈등에서 발생하는 수많은 약하고 산만하고 불균질한 노동의 현실에서 아직도 2004년의 민주노동당을 꿈꾸고 있구나하는 생각이 들었다.

하지만, 2012년의 현실을 보건데 노동자를 조직화해내는 것이 과연 가당키나 한 일인가? 아니, 현대사회의 구성원이 노동이란 말 하나로 정의되고 조직될 수 있는 단순한 그 무엇인가? 엄밀히 말해, 모든 인간은 다르다. 다르고 또 다르며, 다시 한번 다르다. 어떤 존재를 설명한다는 것은 어떤 관점에서 보건데 그 존재를 설명하기에 가장 가까운 개념을 붙인다는 것이지, 정말로 그 존재가 그렇다는 것이 아니다. 노동자는 임금을 받는 사람이다. 현대사회에서 대부분의 사람은 노동자다. 하지만, 노동자라는 말로 모든 것이 설명가능해지는 것인가? 정말 그런 것인가?

노동을 할 수 없는 사람들도 조직화될 수 있는 것인가? 노동자이지만, 노동보다 다른 문제에 더 관심이 많은 사람들은 어쩔 것인가? 현재의 노동에 만족하는 사람은 어찌해야 하는가? 자신이 속한 노동 혹은 가진 노동이 다른 가치 혹은 노동과 충돌하면 어찌되는 것인가?

노동은 자본이 착취하는 수많은 대상중 하나인, 인간을 착취하는 하나의 분야일 뿐이지 자본-노동간의 착취논리가 자본이 착취하는 다른 분야에도 그대로 적용될 수는 없다. 그리고, 노동의 형태와 그 형태에 따른 착취의 방법 및 논리도 분야별로 상이한 경우가 많다. 맑스가 주장한 착취의 방정식은 각 착취를 설명하는 도구로는 훌륭하지만, 그 설명이 단일한 형태의 주제로 합리화 될 수는 없다. 자본에 대한 맑스의 공격에 대해 자본은 그 방정식을 변주하여 노동이란 주제로 통합될 수 없는 파편화된 복잡한 사회로 응답했다.

자본이 바꾸어놓은 파편화된 이 사회에서 노동을 주제로 단일하고 강고한 조직을 만드는 것은 가치의 충돌을 내포할 수 밖에 없으며, 이 충돌에 의해 균열이 발생하고 조직과 투쟁은 오래가지 못할 것이다. 우리는 비정규직 투쟁과정에서 드러난 정규직 노조의 태도를 통해 이를 예측해볼 수 있다.

그럼에도 노동이 유효하고 주요한 가치중 하나인 것은 분명하다. 하지만, 모든 주제가 노동으로 귀결될 수 있는 것은 아니다. 노동이 아닌 다른 주제를 포괄할 수 있는 무엇인가가 필요하다.

홍세화 대표의 ‘전태일’론은 이런 문제를 가지고 있다. 전위적이고 단일하고 강고한 정당은 비합법 무력혁명을 꿈꾸는 지하서클에서나 가능할 법한 이야기다. 현실적이지 않다는 이야기다. 지금의 상황에서 현실적인 이야기는 파편화된 현실에서 그 파편성을 인정하고 파편성에 맞는 조직과 정당을 만드는 것이다. 노동이란 국한된 주제를 기반으로 당을 세워 제2의 민주노동당을 꿈꾸어서는 안된다. 2000년의 사정과 지금의 사정은 다르다. 12년간 자본은 새로운 환경을 만들어내었으며, 우리는 이 환경에 맞게 적응해야 한다.

3. 꿈꾸어야할 당의 미래, 약자의 의회

정치는 기본적으로 가치들의 충돌과 그 충돌에서 자신이 원하는 바를 이루고자 하는 행위이며, 정당은 이를 이루고자 하는 사람들의 정치결사체다. 그리고, 그 목표를 달성하는 방법은 크게 2가지다. 무력을 통한 혁명이나, 선거를 통한 승리다. 폭력혁명을 꿈꾸는 지하서클이 아닌 이상, 당이 목표로 삼아야 하는 것은 선거를 통한 승리다. 이는 레닌으로 부터 전해저 내려온 전위적 정당의 모습이 아닌, 다른 형태의 대중정당을 만들어야 한다는 것을 의미한다.

그렇다면, 당은, 아니 당을 구성하는 당원들이 쟁취하고자 하는 바는 무엇인가? 아니 무엇이어야 하는가? 당은 어떤 가치를 내세워야하고 어떤 공감대로 사람들을 모아 선거에서 승리해야 하는가? 경쟁상대인 다른 정당들과 어떤 차이점을 만들어내야 하는가?

다른 정당들을 살펴보면, 새누리당은 산업화/국가주의에 기반하고 있으며, 민주당은 민주주의/남북평화에 기반하고 있다. 그리고, 통합진보당은 노조/통일/자유주의에 기반하고 있다고 보아야 할 것이다. 이런 시점에서 바라보면, 현재의 상황에서 가장 유력하고, 가장 힘을 얻을 수 있는 의제는 노동자의 정치세력화가 아닌 사회적 약자의 정치세력화다. 다양한 분야와 맥락에서 약자로서 억압/탄압/착취당하는 사람/가치들의 이익을 대변하기 위한 정치결사체가 되어야한다. 당이 내세워야하는 가치는 사회적 약자를 대변하는 것이다.

“약자를 대변한다”라는 가치는 추상적이다. 그리고, 약자라는 존재 역시 추상적이다. 현실에서 약자는 상대적이고, 존재의 위치에 따라 달라진다. 때문에, 어떤 약자를 대변할 수 있는 의제는 문맥적이고 시한적이다. 이는 의제가 생각보다 중요한 것이 아님을 의미한다. 의제가 표면화 될 수 있는 구조와 그 의제를 현실화 할 수 있는 힘이 중요하다.

대의제 민주주의 하에서 힘은 대중의 지지다. 그리고, 지지를 기반으로 목소리를 내는 것이 당의 힘이다. 이런 구조가 낳는 것이 약자다. 약자의 지지는 당의 목소리를 바꾸지 않는다. 때문에, 약자는 자신의 이익을 대변할 수 없으며, 약자로 남게 된다. 그리고, 강자의 목소리를 대변하는 기존의 정당들은 미디어나 지역주의에 기반해서 약자의 지지를 만들어낸다.

당이 이끌어내야 하는 지지는 약자의 지지다. 인간은 어떤 문맥에서든 약자일 수 밖에 없으며, 당은 이 부분을 파고 들어야한다. 약자의 지지를 얻기 위해서는 약자를 대변해야하고, 약자를 대변하기 위해서는 약자인 당사자가 당에서 의견을 표명하여 의제를 만들 수 있어야 한다. 그리고, 이를 기반으로 얻어낸 힘을 이용해 그 의제를 현실화 해야한다. 이는 구조적으로 우리가 대의제 민주주의 하에서 정당으로써 힘을 얻지 못하는 이유와 같다. 국회의원이 없다는 것은 가장 큰 정치기구인 국회에서의 발언권이 없다는 것이고, 그렇기 때문에 당의 힘은 점점 약해진다. 이와 마찬가지로 사회적인 약자는 자신의 목소리를 낼 정치기구가 존재하지 않는다. 당은 그런 사람들이 목소리를 낼 수 있는 기구가 되어야 한다.

즉, 당은 약자의 의회가 되어야 한다.

약자의 의회는 그 약자들의 힘을 기반으로 국회라는 의회에 진출해야 하며, 약자의 의회에서 결정된 내용에 기반해 정치투쟁을 전개하고 약자들의 이익을 쟁취해야 한다. 때문에, 약자의 의회를 구성할 수 있는 구조적 기구가 필요하다. 그리고, 그 기구는 정파등록제에서 출발할 수 있다. 약자를 대변하는 기존의 단체들이 정파로 참여하고, 당이 기존에 추구하던 가치들은 그 가치들 별로 정파를 구성할 수 있다. 또는 새로운 의제가 발생하면, 그에 맞는 정파가 생겨날 수 도 있을 것이며, 필요 없어진다면 없어질 수도 있을 것이다. 당은 이런 형태로 다양한 국면에 존재하는 다양한 약자들을 수용할 수 있는 의회의 형태를 지녀야한다. 기존의 수직적이고 단일하고 강고한 형태의 구조로는 현재의 파편화된 약자들을 수용할 수 없다.

하지만, 이는 기존의 대의제 민주주의가 갖는 소수의견의 묵살이라는 한계점에 부딪힐 수 있다. 따라서, 미국 양원제의 개념과 유사하게 정파별로 지정된 명수가 참여하는 의회와 정파별 가입당원수에 기반해 구성되는 의회로 구성되어야 한다. 그리고, 모든 당원이 직접투표로 참여하는 의회도 존재해야 한다. 굳이 명칭을 붙이자면, 정파의회, 대의회, 평의회로 나누어볼 수 있을 것이다. 또한, 각각의 약자들은 각각 다른 국면에 직면할 수 있기 때문에, 복수정파 가입 역시 허용되어야 한다. 이는, 각각의 구성원들이 가치의 충돌에서 유연하게 대응할 수 있게 도와줄 것이다.

4. 당의 조직: 지역/부문과 중앙

대한민국은 기본적으로 지방자치를 실현하고 있지만, 지방자치보다는 중앙집권적인 현실을 가지고 있다. 이런 상황에서 지역정치에서 당은 어떤 역할을 해야하는 것인가? 지역정치는 중앙정치에 비해 조금 더 현실적이고, 조금 더 피부에 와닿는 이야기일 수 있다. 그리고, 각 구성원의 생활은 어쩔 수 없이 지역이란 지리적 한계와 연관관계가 클 수 밖에 없기 때문에, 중앙정치와는 다른 관점으로 접근해야 할 것이다.

중앙정치가 가치의 충돌이라면, 지역정치는 현실의 충돌이다. 때문에, 지역정치는 중앙정치에 비해 현실적이다. 그렇기에, 당의 지역조직은 약자의 현실적인 문제에 대해 가능한 도움을 줄 수 있는 기구의 기능을 갖추어야 한다. 이는 각 지역에 소속된 당원들의 참여로 이루어질 수 있다. 그리고, 이런 기능은 당이 약자의 이익을 대변한다는 모습을 당사자들에게 보여주어, 당에 참여하게 하는 계기를 마련할 수 있다. 그리고, 이는 여성이나 환경같은 부문정치에서도 마찬가지일 것이다.

즉, 지역조직과 부문조직은 현실의 충돌에 참여하여 가능한 약자에게 도움을 주는 기구의 역할을 수행해야 한다. 그리고, 각 지역과 부문에서 당에 함께할 수 있는 조직 혹은 개인을 찾아서 약자의 의회를 풍성하게 하는 관문으로의 역할을 같이 수행해야 한다.

그리고, 중앙에는 이런 기능을 수행하는 지역/부문조직을 지원하는 기구가 필요하다. 당의 중앙조직은 가치의 충돌에서 약자의 목소리를 담보해주는 약자의 의회를 운영하고, 지역/부문에서 현실의 충돌에 참여하는 지역조직을 지원하는 역할을 수행해야 한다. 하지만, 이런 역할은 권력을 수반할 수 있으며, 때문에 약자의 의회가 이를 견제하는 역할을 충분히 수행할 수 있도록 권한을 명시적으로 주어야 한다. 즉, 당의 중앙조직은 철저히 행정적인 역할에 머물러야 한다. 그리고, 구조적으로도 지역조직과 부문조직은 중앙조직의 하부조직이 아닌 별도의 조직으로 존재해야 한다. 중앙조직은 지원을 하는 조직이지 명령을 내리는 권력이 아니다.

물론, 당의 현실적인 상황을 보건데, 얼마 없는 당원과 현실에서 이런 구조가 가능한 것인가? 라는 의문이 들 수 있다. 하지만, 이런 지향점을 가지지 않는다면, 당의 중앙조직의 권력에 의해 당이 좌지우지되고, 약자의 목소리를 대변하지 못한 채, 당은 외면받고 잊혀질 것이다.

5. 결론

가치의 충돌을 담당하는 약자의 의회와 현실의 충돌을 담당하는 지역기구, 그리고 이를 운영하고 지원하는 중앙기구로 구성되는 이 제안은 어찌보면, 약자의 목소리를 대변하지 못하는 국회와 현실의 충돌을 해결하지 못하고 중앙정부만 바라보는 지역자치, 자체로 권력이 되어버린 행정부를 가진 대한민국에 비교하면 국가가 가져야 하는 이상적인 모습일 수 있다. 하지만, 이 제안은 당이 직면한 그리고, 약자가 직면한 현 상황에서 당이 가져야 할, 그리고 지향해야 할 지점에 관한 제안이다.

자본과 권력이 파편화시킨 수많은 약자와 의제들을 끌어안고 조금 더 나은 삶을 위해 약자들이 결집할 수 있는, 그리고 더 나은 삶을 위한 정치를 고민할 수 있는 장으로 기능할 수 있는 당을 꿈꾸어본다.

Trace. Trace? Trace!

0. Trace.
원래 개발자란 족속들은 게으르고 게으르고 또 게으른 관계로 족적을 잘 남기지도 않고, 문서는 잘 쓰지도 않으며, 재미있는 개발이 끝나고 나면 한없이 늘어지기 마련이다. 이거야 뭐. 인간이란 원래 그런 족속이니까.

1. Trace?
그럼에도 불구하고, 개발자란 족속들은 언제나 족적을 남기기 마련이다. 코드에 남기기도하고, 주석에 남기기도 하고, 문서를 쓰기도 하고, 무려 코드를 저장할때마다 커밋로그라는 것도 남긴다. 사실 지금 직장에서 Subversion + 커밋로그강제스크립트를 도입한지도 어언 6년반정도 되었다. 처음에 다들 싫다고 징징거리던 것을 억지로 우겨넣어서 지금의 상태인 것인데, 커밋로그를 강제하니 뭔가 족적을 하나씩 -그나마 쓸만하게- 남기긴 한다. 다들 커밋로그가 좋다는 걸 나중에야 알게된 것이겠지.

2. Trace!
그래서 든 생각이 이런거다. ‘왜 개발자만 족적을 남기는가?’, ‘요즘같이 빠른 세상에 정중하게 하나하나 맞추어 문서를 쓰기란 뭐같이 힘든 일이니, 빠르게 족적이라도 남기면 좋지 않겠는가?’

하지만, 연구소에서나 가능한 일을 전사에 강제하기란 그리 쉬운일은 아니다. 하아.

디버깅: 누가 나의 this를 옮겼을까? #1. 아이디어.

C++ 컴파일러들은 아주아주 훌륭합니다. 최적화를 켜면 이리저리 쿵짝쿵짝 뭔가 대단해보이는걸 해치워서 코드를 빠르게 만들죠. 요런류의 최적화중 중요한 한가지 기법이 특정 변수를 register를 사용하게 만드는 겁니다. 넵. 대단합니다. 멋지죠. DRAM보다는 Cache가 빠르고 Cache보다는 Register가 빠르니까요. 빠른게 최고인겁니다.

하지만, 디버깅 과정에서는 재앙입니다. 저런 최적화를 수행하게 되면.. 변수가 날아갑니다. 특히 this포인터는 무용지물이 됩니다. MSVC의 경우, this포인터는 CX레지스터를 이용하는데.. 최적화를 수행할 경우 CX레지스터를 범용 연산 레지스터로 씁니다. 즉.. CX레지스터를 다른 용도로 쓰게 되고.. this포인터는 이상한 값을 남발하죠. (보통 0인 경우가 많습니다.) 재현이 가능한 버그라면, 최적화를 끄고 재현해서 문제를 해결할 수 있겠지만, Post-mortem디버깅(크래쉬덤프를 이용한 디버깅)이나 타이밍 문제로 버그가 발생하는 동시성 문제라면 최적화를 끌수도 없습니다. 전자는 끄는게 불가능하고, 후자는 경험상 단언컨데 최적화 끄면 문제가 안생길 확률이 은근히 높습니다. OTL

가장 근본적인 방법은 disassemble된 코드를 읽어서 this포인터를 찾는 것이지만.. 사실상 힘들죠. 그 값이 유지되고 있다는 보장도 없구요. 결국은 포기하기 마련입니다. 아니면, 소설을 쓰거나요. 음… 일단 상황을 정리해보면 아래 3가지로 정리가 될겁니다.

  1. 최적화를 끄고 재현이 가능한 상황.
  2. 최적화를 끄면 재현이 안되는 상황.
  3. 재현이 불가능한 상황(Post-mortem)

1번의 경우에는 앞에서 언급한대로 그냥 최적화를 끄고 디버깅을 하면 됩니다. 문제는 2번과 3번인데, 2번은 코드를 살짝 수정해서 문제가 되는 부분의 this pointer를 전역변수로 저장해두면 됩니다. 의외로 간단하지만 쓸만하죠. 마지막, 3번이 골아픕니다.

Post-mortem 디버깅이란 프로세스가 비정상종료될때 남기는 정보를 이용해 버그를 잡아내는 방법을 의미합니다. 보통 Win32플랫폼에서는 이를 위해 MS에서 제공하는 DBGHelp라이브러리를 이용해 미니덤프파일을 남기게 됩니다. 물론, Dr.Watson을 이용해도 되지요.

미니덤프를 이용해 프로세스가 비정상종료될때의 위치를 파악한다고 해도, 앞에서 이야기한 것처럼 최적화된 바이너리라면, 문제를 찾아내기 어려울 경우가 발생합니다. 이때 사용가능한 기법이 메모리검색입니다.

네? 메모리 검색이라구요??

네. 메모리 검색입니다. 우리에게 필요한 것은 잃어버린 this 포인터이고, 결국은 메모리안에 존재합니다. 그러므로, 어떻게든 찾아내면 되는 것이죠! 이제 어떻게 찾아내는지가 관건일텐데.. 바람직한 C++프로그래머라면, 아마도 소멸자를 가상함수로 선언해두었을 가능성이 높습니다. 사실 이거 하나면 충분하죠. 무슨 이야기냐구요?

C++은 다형성을 구현하기 위해서, 가상함수테이블을 사용합니다. 그리고, 각 인스턴스들은 가상함수테이블에 대한 포인터를 들고 있습니다. 즉, 인스턴스의 메모리 레이아웃에 포인터변수가 선언되어 있는 것이지요. (_vftable!) 잃어버린 this 포인터가 가리키는 메모리, 즉 해당 클래스의 인스턴스가 차지하고 있는 공간에는 분명히 가상함수테이블에 대한 주소가 적혀있을겁니다. 슬슬 느낌이 옵니다. ㅎㅎㅎ

자. 이제 _vftable의 주소와 이 주소를 갖고있는 메모리를 찾으면 됩니다. 🙂

To be continued.

구인-구직: 최근의 면접(관)후기.

일하면서 동료들과 농담삼아 하던 이야기가 있다.

버텨야해! 몸값은 오를꺼야!

IT를 밥줄로 먹고산지도 햇수로 12년째다. 정규직 붙밖이로 일을 시작한 것이 2004년이니 흔히 말하는 경력으로 치자면 벌써 8년차 개발자인가. 이렇게 일하면서 느끼는 사실이지만, 갈수록 같이 일할 사람을 구하는 것이 힘들다. 흔히 말하는 ‘스펙’은 신규 인력의 가능성을 간접적으로 보는데는 유용하지만, 이 스펙을 쌓느라 기본적인 지식들이나 경험이 부족한 인력들을 양산하는 주된 원인이 된다. 특히 프로그래밍은 재미를 붙이는 사람들이 필요한데, 학점을 올리고 영어점수를 신경써야하는 스펙공장에서 과연 재미를 붙일 수 있을까. 한줄의 코드가 자신의 재미가 아니라 학점의 도구가 되어버렸는데.

최근 면접을 보면서 느끼는 점이 바로 스펙의 폐해다. 이미 스펙향상의 도구가 되어버린 대학교육에서 면접자들이 배워오는 것은 점수와 이력서에 적힌 몇줄의 경력사항들. 전공에서 배웠을 가장 기초적인 것들을 물어보았을때 우물쭈물하고 가능성을 보기위해 가벼운 문제들을 내었을때 당황해하는 모습들을 보면서 참 씁쓸할 따름이었다. 그나마 순발력을 보여주는 면접자들은 다행스럽지만, 그도 보여주지 못하는 면접은 솔직히 시간낭비라는 생각이 들 정도다. 사실 여유가 많다면 왕창 뽑아서 인턴을 돌리며 테스트를 하는 것도 좋겠지만, 중소기업에서 이게 쉬운 일인가. 인턴을 몇번 받아서 일을 해보았지만, 인턴을 관리하고 일을 시키는 것도 상당한 부하를 발생시킨다. 여유가 있으면 모르겠지만, 이럴 여유가 되는 회사가 과연 얼마나 될까?

뭐. 몸값이 오르겠지. 몸은 피곤해지겠지만. 후아.

클래스는 영원하다: 범용 컴퓨팅 장치의 크기.

“클래스는 영원하다.”

빌 샹클리라는 축구감독의 발언에서 유래한 최근의 이 유행어는 스마트폰, 7인치 탭, 10인치 패드의 ‘클래스’에도 정확하게 적용된다. 이 ‘클래스’는 성능같은 geek한 속성에 의해 좌지우지 되는 것이 아니라, 단 한가지의 속성에서 결정된다. 그건 바로.

크기

크기! 크기! 크기! 무게나 성능, 두께같은 다른 속성은 부차적일 뿐이고, 가장 중요한 것은 크기. 화면 크기다. 화면 크기는 상당히 많은 것을 내포하고 있는데, 크기는 무게나 두께를 동반하고, 이렇게 도출된 물리적 스펙은 이동성을 결정짓는다. 이 이동성은 배터리의 성능과 연결되어, 탑재가능한 CPU를 결정짓고 성능을 도출한다.

크기가 가장 중요한 요인인 또다른 이유는 인간의 시력에 있다. 인간이 볼 수 있는 글자의 최소 크기는 정해져 있다. 개인별로 차이는 있겠지만, 최소 10pt이상은 되어야 편안하게 읽는 것을 보통이라고 가정할때, 장치별 화면의 크기는 해당 장치에서 한번에 볼 수 있는 정보의 양이고, 그 정보의 양은 장치의 사용성을 결정짓기 마련이다.

물론, 역으로 생각해보면, 사용성에 맞추어 그 크기를 결정지었다고 할 수 있다. 현재 눈앞에 놓여진 클래스는 ‘화면 크기’다. 정보를 ‘읽는’다는 측면에서 접근해보면 좀 간단할 것 같다. 흥미롭게도 책장의 책을 유심히 살펴보면 비슷한 분류의 책들은 그 크기도 비슷하다는 걸 알 수 있다. 컴퓨터 관련 서적들의 크기는 다 비슷하고, 소설책들의 크기 역시 다 비슷하다. 소설책을 A4로 내지는 않으며, 레퍼런스를 문고판으로 내지는 않는다. 컨텐츠가 요구하는 사용성에 맞게 크기가 결정된 것이다. 논리의 앞뒤가 바뀐다고 해도 결국 크기가 중요하다는 사실은 변하지 않는다. 실제로 아이패드가 처음 나왔을때 덩치큰 아이팟 터치라고 비웃음을 샀지만 (필자도 그 비웃음에 동참했었다.) 실제로 써보니 전혀 다른 경험이었다.

현재 가장 대중적인 클래스인 4인치급의 스마트폰, 7인치급의 탭, 10인치급의 패드, 12인치급의 노트북은 각각의 클래스에서 경쟁하는 제품이지 서로 경쟁하는 제품이 아니다. 즉, 삼성이 내놓은 갤럭시탭은 아이패드의 경쟁자가 아니라, 7인치탭의 시작점에 불과하다.

새로운 개념의 제품이 등장하고 각 클래스에서 패러다임이 바뀌는 현상은 4인치급에서 적나라하게 확인할 수 있다. 언젠가부터 PDA라는 용어가 사라졌으며, 스마트폰이 대세다. Palm과 WinCE로 대표되던 PDA들이 아이폰을 앞세우고 안드로이드가 뒷받침하는 스마트폰에게 처참하게 패배한 것이다. 이런 전례로 비추어 보건데 예상되는 경쟁관계는 7인치급의 네비게이션/PMP와 탭의 경쟁, 그리고 10인치급의 넷북과 패드의 경쟁이 될 것이다. 4인치급의 전쟁을 돌이켜보건데, 획기적이고 파급력있는 제품이 뚫고, 유사한 다종의 제품들이 기반을 다지는 형태의 상황이 될 가능성이 높다. 10인치급은 애플의 iPad라는 에이스가 존재하지만, 7인치급의 갤럭시탭이 그 에이스의 역할을 담당할 수 있을지는 의문이다. 10인치급의 넷북은 iPad가 열어제낀 패드들에게 밀려나갈 가능성이 높으며, 7인치급의 탭은 네비게이션/PMP들이 탭의 기능을 흡수하면서 통합될 가능성이 높다고 본다.

4인치, 7인치, 10인치 등의 화면크기는 손에 “들고” 사용해야하는 상황의 모바일 범용 컴퓨팅 장치에서는 결정적인 factor이며, 당분간 이 클래스는 변동치 않으리라고 본다. 축구에서처럼 클래스는 영원하다.

ps. 적어놓고 보니 당연한 이야기를 어지럽게 풀어버렸다. 이런 산만함이라니. orz

디버깅: 마음가짐.

전 사실, 대학에서 공학을 전공했습니다. 그것도, 산업공학이란 시스템을 다루는 공학을 전공했지요. 대학시절이 제게 남긴 가장 큰 가르침은 시스템에 대한 정의와 공학적 문제 해결 방법입니다. 시스템에 대한 정의는 언젠가 설계와 관련한 글을 쓸때 써먹게 될 것이고, 오늘 이야기할 디버깅은 공학적 문제 해결 방법을 써먹게 되겠네요.

일을 하면서 느끼는 것은 디버깅을 어렵게 느끼는 사람들이 많다는 점입니다. 어렵게 느끼는 사람들 혹은 어렵게 느끼는 상황을 곰곰히 생각해보면, 어려운 이유는 단 하나입니다. 막막하다는 것이지요. 보통, 막막함에 당황하고, 당황하니 더 막막한 악순환의 고리로 빠져드는 경우가 많습니다. 일단은 침착해야 합니다.

차분하게 공학적 문제 해결 방법을 따라서 생각해보는게 좋습니다.

  1. 문제를 탐색한다.
  2. 문제를 정의한다.
  3. 자료를 수집한다.
  4. 자료를 분석한다.
  5. 대안을 생성한다.
  6. 대안을 평가한다.
  7. 대안을 선정한다.
  8. 대안을 적용한다.
  9. 1번으로 돌아간다.

네. 사실 ‘당연한거 아냐?!’ 라고 생각하기 쉬운 당연하고 자명한 이야기입니다만, 당황하게 되면 의외로 잊기 쉬운 기본적인 것들입니다. 타석에 들어선 야구선수가 공을 끝까지 보고 스윙을 해야하듯이 디버깅도 항상 차분하게 공학적인 자세로 접근해야 하는거죠. 아무리 시스템이 복잡하다해도, 아무리 답이 안보이는 것 같은 문제라 할지라도, 차분하게 접근하면 대부분의 버그들은 찾아낼 수 있습니다. 차분한 마음가짐이 있다면, 비로소 여러 테크닉들을 적용할 수 있게 되니까요. 어려운 버그는 없습니다. 다만 복잡해서 막막한 버그일 뿐이지요. 모든 버그는 그냥 버그일 뿐입니다. 🙂

왜 개발자로 살고 있는가?

정확한 질문은 “왜 삶의 여러 지층 중 하나가 개발자인가?” 겠지요.

문득, 미사를 드리러 가려고 샤워를 하는 도중에 이런 생각이 들었습니다. 음악을 하고 그림을 그리고 글을 쓰면서 프로그래밍으로 밥을 벌어먹고 있는데, 왜 하필이면 개발자로 먹고 살고 있는가? 그냥 잘하기 때문에? 가진 능력중 가장 경제적으로 뛰어난 것은 사실이고, 실제로 경제적인 부분은 전적으로 이쪽에 의지하고 있는 것도 사실입니다. 이쯤 되니 갑자기 이건 아니다라는 생각이 들더군요. 그러면서, 아 나도 서른이구나. 7년차구나. 라는 생각도.. (퍽)

가장 감명깊었던 책제목은 (내용말구요. 제목!) Just for fun입니다. 라이너스 토발즈씨의 자서전 제목이죠. 요즘 잃고 있었던 초심이 Just for fun이었던 것 같습니다. 대부분의 개발자들이 재미로 시작하지만, 어느새 그 재미를 잃고 있는게 아닌가 싶습니다. 이런 의구심이 드는 시점임에도, 일은 재밌습니다. 문제는 일이 재밌는 것이지 일을 재밌게 만들고 있지는 않다는 점이죠. 제 초심은 일을 재밌게 만드는 것이었으니까요. 잃었던 것을 찾은 이 기쁨은 뭐… 이루 말할 수 없습니다.

재미있는 일을 더 재밌게 만드는 것. 개발자로 오래 살아남는 가장 즐거운 방법이 아닐까 생각해봅니다.

그리고, 이 곳에 오신 당신은. 왜 지금의 직업을 갖고 계십니까?

집착하고 있는 것: 흐름

몇몇 지인들은 알고있는 사실이지만, 최근 3년간 집착하고 있는 것은 ‘흐름’이다. 다분히, 들뢰즈적인데, 2004년에 처음 만나서, 가장 많은 영향을 준 사람이니 당연하다면, 당연한 사실이다. 이렇게 쓰면서도 이것이 들뢰즈적이라고 부를 수 있는 것인지 의문스럽다. 공부는 안하면서, 단초만 잡아서 공상만하고 있는 것도 사실이므로.

이런 생각을 하게 된 데에는, 회사에서 밥벌이로 작성하고 있는 소프트웨어가 처절할 정도로 흐름에 기반을 두고 있고, 데이터의 흐름을 어떻게 하면 잘 처리해낼 수 있을 것인가가 관건이기 때문이다. 일반적으로 바라보는 객체지향 프로그래밍의 모델링 사상과는 어느 정도 동 떨어져 있는 것도 사실인데다, 복잡하기 그지없는 인터페이스의 난립에 지쳐있기 때문이기도 하다.

그런가하면, 이 ‘흐름’은 2001년에서 2003년까지 연구하던 주제이기도 하다. 당시에는 Business Process를 연구하고 있었고, BPMS와 Simulation Engine이 주요 과제였다. 이런 면에서 보면, 산업공학이란 전공을 선택한 것이 다행이라면 엄청난 다행이다. ‘흐름’은 절단 가능하고, 연결 가능한 그 무엇이다. BPMS와 Simulation Engine이 그랬던 것처럼. 그리고, 그 흐름에 연결되는 다양한 지반들을 어떻게 모델링 해낼 것인가가 현 시점에서 객체지향주의자로서 갖는 유의미한 과제다.

회사의 일정과 시장에서의 위치덕분에 지금 당장은 구현이 어려운 상황이다. 그런 이유로, 무언가 다른 일이 하나 필요할 듯 싶다. 가능하면, 올해 맞는 내 생일 전에 말이지. 씨익-

언어-사고: 프로그래밍은 왜 어려울까?

프로그래밍을 한다고 하면, 사람들은 종종 안드로메다에 거주하는 외계인으로 간주하는 경우가 있다. 특히, 작업하는 것을 옆에서 보게되면 더더욱 심하다. 영어의 탈을 쓴 알아볼 수 없는 괴악한 텍스트 문서를 만들고, 이상한 프로그램을 돌려서 그들이 사용하는 소프트웨어를 만들어내니 그렇게 생각하는 것도 무리는 아닐 것이다. 그런데, 사실 사람이 쓰는 언어보다 프로그래밍 언어 자체는 쉽다. 애매모호함도 덜하거니와, 기계적으로 맞아 떨어져야하는 언어이기 때문에 쉬운건 사실이다. 그렇다면, 왜 사람들은 프로그래밍을 어려워할까? 답은 사고에 있다.

인간이 사용하는 자연어는 일반적인 사고의 틀내에서 존재하지만, 프로그래밍 언어는 특정한 목적에 의해 특정한 사고의 틀내에 존재한다. 이 사고방식이 절차지향 프로그래밍이라든가 객체지향 프로그래밍이라든가 함수형 프로그래밍같은 거다. 이 사고방식은 컴퓨터라는 기계의 작동방식에 그 근원을 두고 있기 때문에 자연어의 사고방식과 유사하지만 다르다. 그리고, 이 차이가 어려움을 가져온다. 한가지 재밌는 것은, 자연어의 사고방식과 유사한 사고방식의 언어를 접하게 되면, 프로그래머도 난감해한다는 점이다. 기존의 방식과는 다르므로.

쉬운 프로그래밍은 근본적으로 불가능할지도 모른다. 하지만, 프로그래밍을 쉽게 배우려면, 언어나 문법에 집중하는게 아니라 그 사고의 작동방식에 초점을 맞추어야하지 않을까?