336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

저는 현재 회사에서 실무자로 일하고 있습니다. 일을 하며 관리자들에게 종종 아쉬움을 느낄 때가 있습니다. 이런 아쉬움은 여러 가지 사건들을 경험하며 생기는데요, 저는 앞으로 이러한 아쉬움들을 제 시각에서 정리해보자 합니다.

첫 글로써, 최근에 생각해보았던 '관리자의 의견과 대립하는 실무자의 의견'라는 주제에 대해 써보고자 합니다. 때때로 실무자와 관리자 사이에 논쟁이 벌어질 때가 있습니다. 예를 들어 실무자는 A라는 안으로 일을 추진해야 한다고 강력히 주장하는 데, 관리자는 B라는 안으로 일을 추진해야 한다고 주장하는 경우를 생각해볼 수 있습니다. 왜 이런 일이 발생을 할까요?

제가 보기에 관리자의 의사결정은 보통 추상적인 수준에서 이루어집니다. 관리자는 현실적 여건상 세부적인 것들을 모두 상세히 알기가 힘듭니다. 따라서 마치 어떠한 현상을 숫자로 간단히 표현하는 것처럼, 세부적인 것을 좀더 단순한 형태로 변환하여 개념적으로 바라보고 그것을 바탕으로 의사결정을 합니다. 하지만 이로인한 부작용이 생깁니다. 왜냐하면 추상화라는 것은 사고할 때는 유용하지만 어찌됐던 세상은 구체적인 상황 속에서 돌아가고 있기 때문입니다. 관리자는 시간이 지남에 따라 추상적인 사고에 익숙해지고,  결국 구체적인 부분에 대한 감각을 잃어버리게 됩니다. 이 경우 제가 보아왔던 관리자들이 취하는 행동은 크게 두 가지 정도가 있었습니다.

하나는 실무자의 의견을 존중하는 것입니다. 즉, 비록 실무자의 의견에 대해 깊이 이해할 수는 없지만 본인이 관리자로써 가지는 한계를 인정하고 이해를 시도하며 의사결정을 하는 것입니다. 이것은 관리자가 실무자를 현장 전문가로써 인정하고 신뢰한다는 것을 의미합니다.

다른 하나는 이해를 할 수 없기 때문에 실무자의 의견을 받아들이지 않고 추상적인 수준의 사고를 통해 나온 본인의 주장만을 거듭하는 것입니다. 이 경우 실무자는 포기하고 관리자의 의견을 따르거나, 아니면 관리자가 이해할 수 있게하기 위해 근거를 계속적으로 제시합니다. 하지만 저는 이러한 성향을 가지는 관지자가 실무자의 의견을 채택하는 경우를 거의 보지 못했습니다.

첫 번째 실무자를 인정하고 신뢰하는 관리자의 경우는 제가 보아온 가장 좋은 사례로써 저는 더 이상 할 얘기가 없습니다. 물론 실무자의 의견에 근거하여 의사결정을 한후 잘못된 방향으로 갈 수도 있습니다. 어쨌든 관리자는 실무자보다 더 많은 정보를 가지기 때문에 의사결정에 있어 더 나은 통찰력을 가지는 경우가 많기 때문입니다. 하지만 비록 때로 실패가 있다 하더라도 관리자가 실무자를 인정하고 신뢰한다면 실무자는 어떠한 형태로든 그것을 보답한다고 봅니다. 그것이 강한 책임감의 형태로 나타나든 혹은 자신감으로 인한 적극적인 업무자세로 나타나든 말입니다. 결국 실패로 잃어버린 것보다 더 많은 유익을 얻을 수 있을 것입니다.

두 번째 본인의 주장만을 거듭하는 관리자의 경우가 참 어려운 경우입니다. 이 경우 다행히 합리적인 관리자는 본인이 이해할 수 있도록 근거를 요구합니다. 하지만 이 때도 두 가지 정도의 문제점이 있습니다. 첫째는 근거를 제시하는 것에 미숙한 실무자들이 많다는 점입니다. 이것은 실무자의 문제로써 다른 말로 하자면 의사소통 능력이 떨어진다고 볼 수 있습니다. 둘째는 실무자가 근거를 잘 제시함에도 불구하고 관리자가 받아들이지 않는 경우입니다. 이런 경우는 관리자가 실무를 제대로 이해하지 못하기 때문에 발생합니다. 첫째 문제에 대해 제가 생각하는 해결책은 실무자가 노력해야 한다는 것입니다. 의사소통은 실무자가 신경 쓰지 않아도 될 부분이 아니라고 생각합니다. 오히려 실무자들이 의사소통 능력의 중요성을 인식하고, 본인이 갖춰야 할 매우 기본적인 능력 중 하나로 생각하는 것이 필요하다고 봅니다. 둘째 문제는 관리자의 변화가 필요하다고 생각합니다. 가장 이상적인 모습은 관리자가 실무에 대한 이해의 폭이 넓어 실무자와 원활한 의사소통을 하는 것이라고 봅니다. 하지만 현실적 여건으로 인해 실무를 제대로 이해하지 못한다면 본인의 한계, 즉 추상적인 사고의 한계를 겸허히 인정하고 구체적인 것을 항상 다루는 실무자의 의견을 존중하는 것이 해결책이 될 수 있을 것이라 생각합니다.


WRITTEN BY
차민창
르세상스 엔지니어가 사회를 이끌어나가는 상상을 하며!

,
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
오래 전 개발을 무척 좋아하던 시절, 저는 소프트웨어 개발을 뺀 제 인생에 대해 진지하게 생각해보았습니다. 그런데 놀랍게도 제 인생에서 소프트웨어 개발을 빼자 다른 것이 아무것도 생각나지 않았습니다. 물론, 제 인생에는 다른 중요한 요소들이 분명히 있었을 것입니다. 하지만 당시에는 다른 무엇인가를 떠올리지 못했습니다. 제 인생에 있어 소프트웨어 개발은 그만큼 중요했던 것입니다.

하지만 저는 제 인생에 있어 매우 놀라운 경험을 하게 됩니다. 그것은 바로 '사랑'입니다. 예전에는 소프트웨어 개발을 하면서 두근거림을 느꼈습니다. 어떤 어려운 문제가 해결되어가고 있다는 느낌을 들 때 제 가슴은 뛰었고, 얼굴은 붉게 달아올랐습니다. 문제가 해결되면 마음에 평안이 찾아왔고, 전 밖으로 나가 긴 숨을 내쉬며 담배 한대를 태우곤 했습니다. 이렇듯 소프트웨어 개발은 제 심장을 뛰게 했고, 저는 이런 순간마다 제가 살아있으며 제 생명력이 약동하는 것을 느끼곤 했습니다. 하지만 지금에 와서 돌아보건데 소프트웨어 개발로 인한 이런 떨림은 아무것도 아니였던 것 같습니다. 남자가 여자에게 관심을 가지고 그로인해 생기는 떨림, 이 떨림은 소프트웨어로 인해 느겼던 그것을 훨씬 능가했습니다. 아침에 일어나면 심장이 두근거리며 정신이 맑아지는 느낌, 제게는 정말로 새로운 경험이었습니다.

게다가 예전의 제게 있어 '발전'이란 소프트웨어 개발을 잘하기 위한 방향으로의 발전이었습니다. 하지만 사랑을 하고 난 후 저는 소프트웨어 개발이 아닌 '남자'로써의 발전이 필요하다라는 것을 느꼈습니다. 그래서 제가 보고 느낄 수 있는 것들에 대해서는 모두 나아지려고 노력했습니다. 외모, 성격, 마음, 신앙 등 모두에 대해서요. 비록 늦은 감이 있었지만 제가 원하는 사랑을 얻기 위해 후회없이 최선을 다하고 싶었습니다.

이렇게 정신없이 시간이 지났습니다. 그리고 저는 오늘 한결같은 마음으로 그리고 일방적으로 사랑하던 그녀에게 이제는 더 이상 연락하지 않겠다는 얘기를 어렵게 꺼냈습니다. 예, 저는 포기를 한 것입니다. 다른 말로는 저는 첫 번째 도전에서 실패를 경험한 것입니다. 그렇다면 실패로 인해 제 마음의 상처만이 남았을까요? 아닙니다. 저는 이번 실패를 통해 배운 점들이 많습니다.

그 중 하나는 준비의 중요성입니다. 지금 다니는 회사에 오기 전에 일입니다. 저는 사용자가 거의 없는 공공기관 사이트를 개발해야 했습니다. 그렇지만 저는 항상 많은 사용자가 사용하는 사이트를 만든다 생각하고 공부하며 개발을 했습니다. 그리고 이러한 준비는 제가 실제로 많은 사용자들이 이용할 사이트를 만들어야 할 때 큰 도움이 되었습니다. 하지만 저는 사랑에 대해서는 너무나도 무지했고, 따라서 사랑에 대한 준비가 전혀 없었습니다. 그리고 부족한 준비는 실패로 이어졌습니다. 아직도 제 머리 속에는 제가 했던 여러 실수들이 남아있습니다. 만약 제가 준비가 되어있었다라면 피할 수 있었을텐데 라는 아쉬운 마음이 있습니다.

또 하나는 사랑에 대한 이해입니다. 고향에 있던 시절에 이야기입니다. 저와 매우 가까웠던 동생이 사랑으로 인해 자신이 해야 할 일은 제대로 못하는 어려운 상태에서 제게 어려움을 털어놓았던 적이 있습니다. 저는 좋은 말로 동생을 달랬습니다. 하지만 저는 그 동생을 좀처럼 이해하기 어려웠습니다. 고작 사랑 때문에 자신의 일을 제대로 못하는 것이 한심해 보였던 것입니다. 하지만 다시 한번 동생이 제게 비슷한 상담을 한다면 이제는 그 동생을 이해할 수 있을 것 같습니다. 경험을 통해 이해의 폭이 넓어졌기 때문입니다.

저는 사랑을 하며 위에서 이 글에서 얘기했던 그리고 미처 다 얘기하지 못했던 것을 포함한 많은 것을 얻었습니다. 하지만 또 많은 것을 잃어야 했습니다. 하지만 후회하지 않습니다. 사랑이란 신비롭고 놀라운 감정에 대해 이해했다는 사실이 제게는 무척 중요하게 생각되기 때문입니다.

다만 걱정이 되는 것은 사랑이 내게 다시 찾아오지 않을 것에 대한 두려움입니다. 하지만 사랑이 제게 예고없이 불쑥 찾아왔듯이, 저를 기다리고 있는 또 다른 사랑이 있을 것이라 믿습니다.

덧붙임

1. 사실 이 글은 꽤 오래 전에 쓰기 시작한 글입니다. 원래는 사랑에 대한 벅찬 느낌을 개발자의 시각에서 써보고 싶었습니다. 개발자로써 느낀 사랑이란 무엇이고 제게 어떤 영향을 주는지에 대해 진지하게 써보고 싶었던 것입니다. 하지만 잘 써지지 않았습니다. 하지만 오늘은 이 글을 완성할 수 있을 것 같습니다. 어쩌면 오늘 오전에 겪은 일이 이 글을 완성하기 위한 마지막 조각이었던 것 같습니다.

2. 글을 다듬기 위해 꽤 오랜시간을 가지고 있다 발행하게 되었습니다. 그래서 글 중 '오늘'이란 표현은 실제로는 오늘을 의미하는 것이 아닙니다.

WRITTEN BY
차민창
르세상스 엔지니어가 사회를 이끌어나가는 상상을 하며!

,

밝고 강하게

삶 이야기 2009. 6. 1. 22:42
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
제 인생에 있어 가장 극심한 변화를 겪었던 2008년을 보내고, 새로운 2009년을 시작하며 스스로 세운 구호가 있습니다. 바로 '밝고 강하게'입니다.

첫 번째 '밝고'라는 것은 어떠한 상황에 있든지 밝은 모습을 보이고 싶다는 저의 의지입니다. 어느 날인가 방안에 누워 5년 후를 생각해보았습니다. 아마 저는 한 가정의 가장이 되어 있을 겁니다. 어머니, 아내 그리고 자식이 있겠죠. 이들은 모두 제게 전적으로 의지하고 있습니다. 경제적으로, 정신적으로 그리고 신앙적으로 저는 그들을 인도해야 할 책임을 가지고 있습니다. 그런 제게 어려움이 찾아옵니다. 직장에서의 퇴직일수도 있고 혹은 제 마음을 무척 심란하게 만드는 어려운 문제일 수도 있습니다. 이 때 현재 저의 상태라면 어두운 표정으로 집에 돌아갈 것입니다. 모든 가족이 제 얼굴을 보고 걱정을 할 것입니다. 결국 저의 걱정은 가족 모두에게 전염되겠죠. 으악! 여기까지 생각해보니 이건 옳은 방향이 아니라는 생각이 들었습니다. 저는 좀더 밝은 모습을 가져야 할 필요가 있다고 생각했습니다. 제게 어려움이 있을 때 그것을 가족에게 알릴 필요가 없는 것이라면 내색하지 않는 것이 현명한 자세일 것입니다. 그래서 제게는 '밝은' 모습이 필요합니다.

두 번째 '강하게'라는 것은 어떠한 상황에서든 흔들리지 않는 강한 마음으로 내게 주어진 문제를 헤쳐나가고 싶다는 저의 의지입니다. 살다 보면 어려운 문제들을 많이 만나게 됩니다. 이 때 '밝게' 웃는 것은 문제해결에 직접적인 도움이 되지는 않을 것입니다. 그것 보다는 흔들리지 않는 강한 마음으로 상황을 객관적이고 냉철하게 바라보는 것이 문제해결에 직접적인 도움이 될 것이라 생각합니다. 이런 마음을 유지 할수만 있다면 제가 할 수 있는 가장 현명한 선택을 할 수 있을 것이라 봅니다.

추신. 저는 가끔 어머니에게 제 블로그에 쓴 글을 읽어줍니다. 오늘도 발행하기 전에 어머니께 이 글을 읽어드렸더니 요즘 많이 밝고 강해졌다고 인정해주시네요. :0

2009/05/07 ~ 2009/06/01

WRITTEN BY
차민창
르세상스 엔지니어가 사회를 이끌어나가는 상상을 하며!

,
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
저는 '주경야독'이라는 사자성어를 무척 좋아합니다. 짦은 네 자 안에 제가 살면서 마음속에 깊히 두고 추구해야 할 의미가 담겨있다 생각하기 때문입니다. 혹시 '주경야독'이 잘 생각나지 않는 분들을 위해 네이버에서 '주경야독'을 검색한 결과를 옮겨보았습니다.
주경야독 : 낮에는 농사짓고, 밤에는 글을 읽는다는 뜻으로, 어려운 여건 속에서도 꿋꿋이 공부함을 이르는 말
주경야독이란 사자성어를 좋아하다보니 자연스레 그 의미에 대해서 곰곰히 생각해 볼 때가 많았습니다. 그런데 계속 되뇌이며 생각하다보니 선조들이 우리에게 전하고 싶었던 또 다른 교훈이 숨어있는 것이 아닌가 생각하게 되었습니다. 제가 생각하는 숨겨진 교훈이란 학습과 더불어 적절히 육체노동이나 운동을 하는 것의 중요성입니다.

저는 예전에 흔히 3D업종이라 불리는 옷공장에서 일당을 받으며 일한 적이 있습니다. 일은 무척이나 고되었고, 일당은 매우 적었습니다. 좋다고 자신있게 얘기하긴 어려운 일터였습니다. 그렇지만 일을 하며 여러 가지로 느끼는 바가 있었습니다.

그 중 하나는 육체노동은 정신을 맑게 해준다는 것이였습니다. 육체노동을 하지 않고 빈둥 빈둥 놀 때는 정신도 흐리멍텅하고 삶에 대한 의욕이 없었습니다. 단지 지금 내게 주어진 시간을 어떻게 즐겁게 보낼까 궁리하며 쾌락을 추구할 뿐이였습니다. 그런데 노동을 하다보니 정신이 맑아졌습니다. 또한 삶에 대한 의욕이 마구 솓아났습니다. 정신이 맑아지고 삶에 대한 의욕이 생기니 자연스레 쾌락에 대한 자제력도 생기기 시작했습니다.

또 다른 것은 진리에 대한 애정이였습니다. 일하기 전에는 흔히 양서라 불리는 좋은 책들은 정말로 읽기 싫은 것이였습니다. 그런데 몸이 힘든 일을 하다보니 만화책이나 소설책보다 그런 책들이 자꾸 생각났습니다. 아마 이러한 책들이야말로 제가 부족하게 느끼고 갈구하는 무엇인가를 채워줄 것이라는 생각을 했던 것 같습니다. 하루종일 몸을 정신없이 움직이며 책 생각이 계속적으로 간절히 났습니다. 이러한 마음 때문에 늦은 밤 피곤한 몸을 이끌고 집에 돌아가면 하루종일 그리워했던 책을 반갑게 꺼내 들고 5분이라도 달게 읽다 잠이들곤 했습니다. 저는 이 때 제 마음에 있던 진리를 향한 애정을 확인할 수 있었습니다.

저는 오래전 한 선비의 삶을 상상을 해봅니다. 넓은 땅 어딘가에 한 선비가 뜨거운 태양빛 아래서 열심히 밭을 갑니다. 이른 저녁이 되고 선선한 바람이 붑니다. 선비는 집으로 돌아와 마루에 앉아 석양빛을 맞으며 바른 자세로 책을 읽습니다. 선비의 몸은 피곤하지만 정신은 매우 맑습니다. 글이 무척이나 매우 달콤하게 느껴집니다. 선비는 밤 늦게까지 집중력을 잃지 않고 책을 봅니다.

예전 신문에서 '주경야독' 하여 우리나라 최고 대학의 수석을 차지했다는 기사를 본적이 있습니다. 이런 사례야 말로 앞서 얘기했던 주경야독의 숨겨진 힘을 보여주는 좋은 예가 아닌가 생각됩니다. 육체를 움직이며 노동을 하는 것 인간이 할 수 있는 가장 고귀한 행동 중 하나가 아닐까 생각해봅니다.

2008/06/12 ~ 2009/05/06

WRITTEN BY
차민창
르세상스 엔지니어가 사회를 이끌어나가는 상상을 하며!

,
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
#1
얼마 전 저는 저의 희망에 따라 팀을 옮겼습니다. 옮길 때 주위의 시선이 그리 좋지만은 않았던 것 같습니다. 좋은 선택이라고 하는 분은 거의 없었고 모두 고개를 갸우뚱 거렸습니다. 하지만 주사위는 던져졌고, 저는 팀을 옮겨야 했지요.

약 3주가 지난 지금 저는 매우 만족하고 있습니다. 제 생각에 지금까지 저를 발전하게 해준 좋은 습관 하나는 일을 할 때 그 배경을 이해하고 깊이 있게 접근하는 자세였습니다. 그렇지만 지난 팀에서는 빠르게 일을 처리해야 한다는 강박 관념 때문에 이런 습관을 잃어버렸었습니다. 지금은 다시 제 자신을 찾고 있습니다. 내게 주어진 문제에 대해 잠시 키보드를 밀어놓고 고민해볼 수 있는 시간, 제겐 정말로 즐거운 시간이고 오랫만에 느껴보는 시간이기도 합니다.

이런 시간이 제게 주어지자 제가 다시 개발자가 된 것 같은 느낌이 듭니다. 제가 있어야 할 자리를 다시 찾은 듯한 느낌이 들고요. 그래서인지 마음이 정말 평화롭습니다. 

#2
최근 많이 생각하는 것 중 하나는 의사소통, 좀 더 구체적으로 얘기하자면 반응(Feedback)입니다. 누군가가 의견을 얘기합니다. 이때 긍정이든 부정이든 그에게 다시 어떤 반응을 보여주는 것, 정말 중요한 것 같아요.

이런 생각에 따라 최근 저는 반응을 하기 위해 성실하게 노력하고 있습니다. 예전에는 마음 속에서 생각하고 지나갈 일들을 지금은 표현하고 있습니다. 팀 내에서 제안이 나왔을 때 '좋은 의견인 것 같습니다', '제 생각은 이렇습니다.' 이렇게 얘기하는 것입니다.

또한 저도 제가 무엇인가를 얘기했을 때 어떤 반응이든 보기를 희망합니다. 긍정적이든, 부정적이든 제게 많은 도움이 될 것이라고 생각하기 때문입니다.

2009/04/15 ~ 2009/05/04

WRITTEN BY
차민창
르세상스 엔지니어가 사회를 이끌어나가는 상상을 하며!

,
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
'나누어 해결하기'는 많은 사람들이 익히 잘 알고 있는 매우 친숙한 문제해결지침입니다. 친숙한 만큼 개념 또한 매우 간단합니다.

In computer science, divide and conquer (D&C) is an important algorithm design paradigm based on multi-branched recursion. A divide and conquer algorithm works by recursively breaking down a problem into two or more sub-problems of the same (or related) type, until these become simple enough to be solved directly. The solutions to the sub-problems are then combined to give a solution to the original problem.

출처 : http://en.wikipedia.org/wiki/Divide_and_conquer_algorithm

(위 위키 페이지에서는 나누어 해결하기가 가진 여러 가지 장점들을 얘기하고 있습니다. 이 글은 그 중 'Solving difficult problems' 에 대한 상세한 내용이라고도 볼 수 있습니다.)


이렇게 단순한 개념이라 그런지 몰라도 제게는 왠지 현실과 거리가 있는 개념으로 보였습니다. 예를 들어 누군가 "소프트웨어 개발을 잘하는 방법이 무엇인가요?"라고 물어보았을 때 "잘 개발해라"라고 대답해주는 느낌이라고 할까요. 그렇지만 얼마 전 저는 '나누어 해결하기'가 가진 아름다움에 대해 엿보는 경험을 하게 되었습니다. 그래서 이번 글에서 나누어 해결하기에 대해 제가 본 부분을 써보고자 합니다.

소프트웨어 개발을 하다보면 필연적으로 어려운 문제를 만나게 됩니다. 설계를 하다 어려운 문제를 만나기도 하고 코딩을 하다 어려운 문제를 만나기도 합니다. 때때로 이러한 문제들은 절망스럽게 느껴집니다. 문제가 복잡하면 머리가 아프고 어디서부터 시작해야 할지 감이 잡히지 않을 때가 있습니다.  예전 개발에 익숙하지 않은 시절에 저는 복잡하고 어려운 문제를 만나면 허둥될 수 밖에 없었습니다. 문제 해결을 시도하면 할수록 문제가 해결되어 간다는 느낌보다는 오히려 문제가 더욱 복잡해지는 듯한 느낌을 받았습니다. 그 늘어가는 복잡함에 기가 질려 결국 프로젝트를 포기한 적도 몇번 있었습니다. 저는 당시 왜 이런 일이 일어나는지 알 수가 없었습니다.

다행히 경험이 쌓이면서 복잡한 문제를 해결하지 못하는 일은 점점 줄어들어 갔습니다. 하지만 여전히 저는 예전에 복잡한 문제를 잘 해결하지 못했던 이유에 대해 명확히 알 수 없었습니다. 그냥 경험을 쌓다보니 문제해결능력이 향상 되었구나라고 생각했습니다. 이렇듯 무의식 속에 지내던 저는 얼마전 실마리를 찾게 되었습니다. 바로 경험이 쌓임에 따라 자연스레 나누어 해결하기를 사용해왔다는 사실이였습니다.

우리는 소프트웨어를 개발할 때 구조를 설계합니다. '이 시스템을 구현하려면 A,B,C 세 부분이 있으면 되겠네.'라고 얘기합니다. 이것이 바로 나누어 해결하기 입니다. 시스템 구현이라는 문제를 해결하기 위해 문제를 A,B,C로 나누었고 A,B,C는 시스템 구현이라는 문제를 해결하기 위해 상호작용합니다. 서두에 소개한 위키피디아의 나누어 해결하기 정의와 같습니다. 또한 하나의 클래스를 만들 때 우리는 해당 클래스가 지향하는 목적을 달성하기 위해 여러 메서드를 만듭니다. 이것 역시 나누어 해결하기의 예라고 볼 수 있습니다.

좀더 큰 관점에서 소프트웨어 개발이라는 것은 추상적인 아이디어로 시작하여 소프트웨어 구조 그리고 소프트웨어의 코드들로 점점 구체화 되가는 과정이라 볼 수 있습니다. 이 과정에서 나누어 해결하기가 계속적으로 사용됩니다. 이 때문에 소프트웨어 개발을 잘한다라는 것은 결국 나누어 해결하기를 잘 한다라고 보아도 무방할 것 같습니다.

더욱 흥미로운 것은 나누어 해결하기는 소프트웨어의 세계를 뛰어넘어 실세계의 많은 부분에서 적용될수 있고 실제로 무의식적으로라도 사용되고 있는 강력한 문제해결지침이라는 것입니다. 예를 들어 우리가 가계부를 적을 때 주별로 혹은 월별로 소계를 내서 총계를 구합니다. 즉 총계를 구하기 위해 그것을 작은 단위로 나누어 각각을 해결한 후에 소계를 더하는 방법으로 원래의 문제를 해결한다는 것입니다. 이것은 소프트웨어에서 사용하는 나누어 해결하기와 동일합니다. 또한 회사 조직도를 보며 나누어 해결하기를 발견할 수 있습니다. 회사의 목적을 위해 여러 부서들로 나누고 해당 부서들은 회사의 목적을 위해 상호작용 합니다. 이러한 조직도를 통해서도 나누어 해결하기의 철학을 엿볼 수 있습니다.

끝으로 나누어 해결하기 원칙에 대해 몰랐던 어떤 구독자가 이 글을 통해 나누어 해결하기를  배우고 이해한다 하더라도 갑자기 소프트웨어 개발을 잘 하게 되지는 않을 것 같습니다. 하지만 현재 직면한 복잡한 문제를 해결하기 위한 좋은 접근 방법은 될 수 있다고 생각합니다. 또한 '소프트웨어 개발은 나누어 해결하기의 연속이다.'라는 시각을 갖는 것은, 문제에 대해 체계적으로 접근할 수 있게 도와줄 것이라 생각합니다.

2008/05/13~2009/05/04



WRITTEN BY
차민창
르세상스 엔지니어가 사회를 이끌어나가는 상상을 하며!

,
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
저는 개발에 재미를 느껴 개발자가 된 사람입니다. 그런데 언제부터인가 개발의 재미가 없어지기 시작했습니다. 좀더 정확히 말하자면 어떤 때는 개발이 재미있었지만 어떤 때는 재미가 무척 없었습니다. 이 때부터 저의 고민이 시작되었습니다. 왜 개발이 재미없어지는 것일까? 열정이 사라진것일까? 꽤 오랜 시간 고민을 했습니다. 그리고 저는 한 가지 결론에 이르게 되었습니다. 그것은 바로 제가 즐기고 좋아했던 것은 개발 공정 전체가 아니라 그 중 한 부분인 코드를 '쓰는' 일이였다는 사실입니다.

저는 글을 쓸 때 개발, 좀더 정확히 말하자면 코드를 쓸 때와 비슷한 즐거움을 느낍니다. 아마 그 이유는 글을 쓰는 것이 코드를 생산하는 것과 매우 유사한 일이기 때문일 것입니다. 코드를 다듬듯이 글을 다듬고, 코드의 구조를 생각하듯이 글의 구조를 생각합니다. 이것은 제가 생각하는 활동을 통해 무엇인가를 만들어내는 것을 좋아한다는 사실을 보여주는 증거라 생각합니다.

별거 아닌 깨달음이지만 이 깨달음을 얻는 것이 제게는 쉽지 않은 일이였습니다. 스스로를 돌아보고 내 자신을 알아가는 일은 무척 어려운 일이기 때문입니다. 짧은 인생, 가급적 재미난 일을 하며 시간을 보내면 좋을텐데 회사에서 스스로 원하는 재미를 찾기란 쉬운 일이 아닌 것 같습니다. 특히 주위의 다른 선배 개발자들을 보면 회사에서 인정 받으면 받을수록 코드를 쓰는 일과는 점점 멀어지게 되는 것 같습니다. 코드를 쓰는 것을 좋아하는 개발자의 입장에서는 조금은 받아들이기 어려운 현상입니다. :)

2009/02/07 ~ 2009/05/04

WRITTEN BY
차민창
르세상스 엔지니어가 사회를 이끌어나가는 상상을 하며!

,
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
최근 보고 있는 대수학 책의 내용 중 짝수, 홀수 합에 대한 정리가 있어 흥미롭게 읽어보았습니다. 사실 처음 수학에 대해서 관심을 갖게 된 동기는 개발을 좀 더 잘해보자입니다만, 이것 저것 보다보니 정리에 대해서도 관심이 많이 갑니다. 그러니깐 수학 자체에 대해서 관심이 생기는 것 같습니다.

짝수, 홀수에 대한 정리는 앞서 얘기했던 소수에 대한 정리와는 달리 수식의 전개만으로 증명이 되는 정리입니다.

전제
- 모든 자연수는 짝수 아니면 홀수이다.
- 짝수는 2로 나누었을 때 정확히 나누어 지는 즉 0이 남는 수이다.
- 홀수는 2로 나누었을 때 1이 남는 수이다.
- 자연수 끼리의 덧셈과 곱셉은 항상 자연수이다.(닫힘 성질)

정리1. 짝수와 짝수의 합은 짝수이다.

짝수는 아래와 같이 2에 곱으로 표현되는 모든 자연수이다.

n = 자연수
짝수 = 2 * n

따라서 짝수와 짝수의 합은 아래와 같이 나타낼 수 있다.
= 2 * n + 2 * m
= 2 * (n + m)

(n + m)의 결과는 자연수의 덧셈에 대한 닫힘 성질에 따라 자연수가 된다. 이 식은 결국 '2 * 자연수'의 형식을 갖게되며 이 형식은 짝수의 정의를 만족하기 때문에 짝수와 짝수의 합은 항상 짝수라는 것이 증명된다.

정리2. 홀수와 홀수의 합은 짝수이다.

홀수는 아래와 같이 짝수에 1을 더한 수라 할 수 있다.

n = 자연수
홀수 = (2 * n) + 1

따라서 홀수와 홀수의 합은 아래와 같이 나타낼 수 있다.
= (2 * n) + 1 + (2 * m) + 1
= (2 * n) + (2 * m) + 2
= 2 * (n + m + 1)

따라서 정리1에서 언급했던 것처럼 짝수의 정의를 만족시키기 때문에 홀수와 홀수의 합은 항상 짝수임이 증명된다.

정리3. 짝수와 홀수의 합은 홀수이다.

짝수와 홀수의 합은 아래와 같이 나타낼 수 있다.
= (2 * n) + (2 * m + 1)
= 2 * (n + m) + 1

위에서 (n + m)은 정리1에서 언급한 자연수의 덧셈에 대한 닫힘 성질에 따라 자연수가 된다. 따라서 정리2에서 업급한 홀수의 정의를 만족시키기 때문에 짝수와 홀수의 합은 홀수이다.

WRITTEN BY
차민창
르세상스 엔지니어가 사회를 이끌어나가는 상상을 하며!

,
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

예전 어린 시절 소프트웨어 개발자라는 것은 제게 동경의 대상이였습니다. 그때는 소프트웨어 개발에 대해서 잘 몰랐습니다. 때때로 막연하게 제가 소프트웨어 개발을 하는 모습을 상상해보았습니다. 낭만적인 상상들이 제 머리를 지나가고 상상만으로도 너무 즐거웠습니다. 가끔 게임 잡지나 PC전문잡지에서 유명 개발자들의 인터뷰 내용을 보았습니다. 이런 사람들을 닮고 싶다라고 생각했고 마음속에 열정이 타올랐습니다. 제게 있어 소프트웨어 개발자가 되는 것은 꼭 이루고 싶은 꿈 중 하나였던 것이였습니다.

놀랍게도 꿈이 이루어졌습니다. 저는 지금 소프트웨어 개발자로 일하고 있습니다. 소프트웨어 개발자가 되어 일해보니 제가 예전에 상상했던 것처럼 모든 것이 낭만적이지 않긴 합니다. 그렇지만 여전히 소프트웨어 개발은 멋진 일이라 생각됩니다. 또한 저는 소프트웨어 개발을 통해 많은 즐거움을 느끼고 있습니다.

그리고 최근 새로운 동경에 대상이 생겼습니다. 새로운 대상은 바로 수학입니다. 이 느낌은 어린 시절 소프트웨어 개발자가 되고 싶어했던 마음과도 유사합니다. 저는 학창시절 게으른 시간을 보낸탓에 기초적인 수학 능력이 매우 부족합니다. 어쩌면 아는 것이 거의 없을지도 모릅니다. 그렇지만 수학을 배우는 것이 제게 큰 기쁨을 줄 것 같고 수학을 이용해서 무엇인가 가치있는 일을 할 수 있을 것 같은 느낌이 듭니다.

얼마 전 저는 하디라는 수학자가 쓴 수필 집을 읽고 있었습니다. 그리고 그 책에 통해 2,000년전 유클리드가 증명한 '소수는 무한히 존재한다'라는 증명에 대해 이해할 수 있었습니다. 사실 책에서 밝히기로는 일반인도 이해할 수 있는 매우 쉬운 정리라고 합니다. 하지만 제게는 이 증명에 대한 이해가 매우 의미있는 한 걸음으로 느껴졌습니다. 마치 예전에 아무것도 모르면서 무작정 GW베이직을 띄우고 짦은 코드를 만들어 무엇인가를 출력한 후에 느꼈던 기쁨과도 유사한 것 같습니다. 별거 아닌걸 알면서도 무척이나 자랑스럽다고 해야할까요?

솔직히 제가 수학에 뭔가 재능이 있다는 생각은 들지 않습니다. 그렇지만 흥미가 있고 관심이 간다는 것이 자꾸 수학을 곁눈질하는 유일한 이유인 것 같습니다. 인터넷을 돌아다니다보면 매우 기초적인 내용을 꾸준히 블로그에 올리는 블로거들이 있습니다. 저 역시 이와 같이 앞으로 별거 아니겠고 매우 초보적인 내용이겠지만 수학에 대해서 느끼고 배우는 것을 블로그를 통해 자주 정리해보고자 합니다. 새롭게 생긴 동경이 좋은 열매를 맺었으면 좋겠습니다.

추신. 이 글은 2008년 9월 경에 썼던 글인데, 지금 마무리 하게 되네요. 지금도 제 마음은 변하지 않았으며 최근에도 대수학을 열심히 공부 중입니다. 다만 글을 많이 올리지는 못했네요. :)

2008/09/04 ~ 2009/03/16


WRITTEN BY
차민창
르세상스 엔지니어가 사회를 이끌어나가는 상상을 하며!

,
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

최근 주위를 보면 개발자들 사이에서 코드 가독성에 대한 관심이 높아지고 있는 것 같습니다. 아마 켄트벡이나 마틴 파울러 같은 대가들이 자신의 블로그를 통해 코드 가독성의 중요성을 강조하고 있기 때문일 것입니다. 켄트벡이 최근에 쓴 Implmentation Pattern을 관통하는 핵심 아이디어 중 하나는 다른 개발자들과의 의사소통입니다. 즉, 내가 만든 코드에 담겨있는 의도를 다른 개발자에게 잘 전달할 수 있어야 한다는 것입니다. 또한 이에 관한 마틴 파울러의 명언이 있습니다. 바로 '좋은 프로그래머는 사람이 이해할 수 있는 코드를 만든다.'입니다.

저는 올해 들어 개인적으로 프로젝트를 시작했습니다. 프로젝트를 시작하게 된 여러 동기 중 하나는 이렇습니다. 저는 최근에 출시된 스포츠카를 사고 싶었습니다. 그런데 가격을 알아보니 제가 버는 돈으로는 구매는 하더라도 유지가 힘들다는 판단이 들었습니다. 힘이 빠졌습니다. 어떻게 하면 스포츠카를 살 수 있을까 생각해보았습니다. 제가 내린 결론은 스스로 더 많은 가치를 산출 해야한다는 것이였습니다. 결국 저는 재미 있으면서도 이후 저의 작은 꿈을 이루는 데 도움이 될 만한 것으로 Robust-Task개발을 생각해냈습니다. 좀 세속적이긴 하지만 재밌는 동기죠? ㅋ

동기야 어찌됐든 창의적인 코딩에 굶주려 있던 저는 저는 너무도 즐겁게 개발을 진행했고, 개발을 하며 여러 지인들에게 의견을 구했습니다. 여러 지인들의 보편적 의견은 아이디어는 괜찮다(하지만 난 참여 안 하겠다 ㅋ)는 것이였습니다. 그래도 괜찮아 보인다는 말에 힘을 얻어 진행하다보니 어제 'Robust-Task 0.1 concept' 버전을 릴리즈하게 되었네요.

Robust-Task의 주요 의도는 복잡하고 긴 업무흐름(Business Flow)을 가독성 좋은 코드로 표현하자는 것입니다. 예를 들어 어떤 작업을 실행하는데 3번 이상 실패하면 뭔가 특별한 처리를 해주어야 한다고 가정해봅시다. 머리 속에 어떤 유형의 코드가 떠오르시나요? Robust-Task를 이용하면 이런 작업을 구현할 때 아래와 같이 두 가지 유형의 표현이 가능합니다.

new ToBeFailedTask()
  .wrapByRetryFailover()
    .failover(new LoggingFailoverTask())
    .retryCount(3)
  .execute();
    
retryFailOver(
    task(new ToBeFailedTask()),
    failover(new LoggingFailoverTask()),
    retryCount(3)
).execute();


어떤가요? 간단한가요?

또한 순차적인 작업의 흐름에 대해 아래와 같은 표현도 제공합니다.

new TaskChain()
  .add(new GenesisCoupeTask())
  .add(new TuscanyCoupeTask())
  .add(new TiburonCoupeTask())
.execute();


위 코드는 추가된 순서대로 정확히 실행이 됩니다.

더욱 재밌는 것은 이 두 가지 형태를 결합할 수 있다는 점입니다. 예를 들어 아래와 같은 표현이 가능합니다.

new TaskChain()
  .add(new GenesisCoupeTask())
  .add(new TuscanyCoupeTask())
  .add(new TiburonCoupeTask())
.wrapByRetryFailover()
  .failover(new LoggingFailoverTask())
  .retryCount(3)
.execute();

retryFailOver(
    task(new TaskChain()
              .add(new GenesisCoupeTask())
              .add(new TuscanyCoupeTask())
              .add(new TiburonCoupeTask())),
    failover(new LoggingFailoverTask()),
    retryCount(3)
).execute();


위 예제는 RetryFailover라는 Robust-Task에서 제공하는 Task Decoration을 이용하여 순차적인 흐름을 가지는 Task Chain에 대해 RetryFailover 기능을 부여해주는 것입니다. Task Decoration은 0.1 concept 버전에서 4개 정도가 제공되고 있는데요. 아래와 같이 전처리 후처리를 처리해주는 Task Decoration도 있습니다.

new GenesisCoupeTask()
  .wrapByAspect()
    .before(new TiburonCoupeTask())
    .after(new TuscanyCoupeTask())
  .execute();

aspect(
    beforeTask(new TiburonCoupeTask()),
    mainTask(new GenesisCoupeTask()),
    afterTask(new TuscanyCoupeTask())
).execute();


결론적으로 Robust-Task는 Task와 Task Chain 그리고 Task Decoration을 이용하여 업무흐름을 쉽고 이해하기 쉽게 표현하기 위한 프레임웍이라 할 수 있겠습니다.

이렇게 간단하지만 예제 위주로 소개를 드렸습니다. 전달이 잘 되었는지는 모르겠네요. 현재 Robust-Task는 오픈소스로 개발되고 있으며 구글코드에서 호스팅을 받고 있습니다. 오픈소스이기 때문에 소스에 패치를 해주시거나 혹은 메일링에서 의견을 제시함으로써도 프로젝트 참여가 가능합니다. 관심이 가는 분들의 많은 참여와 의견 부탁드립니다.

[프로젝트 홈 바로가기]
[프로젝트 한국 메일링 리스트 바로가기]
[Robust-Task 0.1 concept 소개 문서 바로가기]


WRITTEN BY
차민창
르세상스 엔지니어가 사회를 이끌어나가는 상상을 하며!

,