Outsider's Dev Story

Stay Hungry. Stay Foolish. Don't Be Satisfied.
RetroTech 팟캐스트 44BITS 팟캐스트

[Book] 프로그래밍 심리학

프로그래밍 심리학

프로그래밍 심리학 - 10점
제럴드 M. 와인버그 지음
조상민 옮김
인사이트


프로그래밍 심리학의 원서인 The Psychology of Computer Programming은 1971년에 나온 고전으로 1998년 25주년을 맞이해서 Silver Anniversary Edition이 나왔다. 25년이 지나고 개정판을 내면서도 새로 썼다기보다는 각 장 끝에 25년이 지나서 의견이 달라진 부분을 얘기하는 보태는 글을 추가했을 뿐이다. 국내에는 2007년에 번역서가 나왔고 2013년에 개정판이 나왔다. 내가 읽은 책은 2007년에 나온 번역서인데 작년에 나온 개정판에서 얼마나 달라졌는지는 잘 모르겠다.

이 책은 정말 놀라운데 지금을 기준으로 43년이나 전에 쓰인 글인데도 그 내용이 무척이나 좋고 유용하다. 고전으로써 좋다는 게 아니라 현재 기준으로도 책의 내용 자체가 좋다. 코드 작성, 팀 관리, 프로젝트 진행 등 프로그래밍과 관련된 많은 부분을 심리학적으로 접근해서 그런 상황이 벌어지는 이유를 설명하는데 사람이 변하지 않기 때문인지 제럴드 M. 와인버그의 엄청난 통찰력이 느껴진다. 물론 40년 전에 책이니 여기서 얘기하는 프로그래밍이란 것은 천공카드에 찍고 실행결과를 보기 위해서 줄 서서 기다린 후에 결과를 보고 다시 프로그램을 작성하는 원시적인 형태이지만 그 가운데 벌어지는 상황을 꿰뚫은 심리는 지금도 여전히 같다는 생각이 든다. 국내를 생각하면 기술적인 발전 외에는 크게 발전했는지 모를 정도이다.(그래서 25년이 지나서도 보태는 글로 개정판을 진행할 수 있었을지도...)

500페이지가 넘는 꽤 많은 분량에 담고 있는 내용도 프로그래밍부터 회사 내의 조직 구조, 팀의 구성 등 프로그래머가 하는 모든 행위에 대한 분석을 담고 있으므로 요약을 한다는 건 무리이다. 대산 각 부에서 인상 깊었던 문구만 나중에 참고하려고 적어놓는다.

1부 인간 행위로 보는 프로그래밍

대부분의 프로그래머는 좋은 프로그래밍이라는 것이 존재한다고 느낀다. 그다지 틀린 생각은 아닐 것이다. 그러나 그것이 사실이라고 해도, 좋은 프로그램 역시 존재할 것이라는 결론을 끌어낼 수는 없다.

어떤 프로그램이 현재의 모습을 갖게 된 데에는 다 이유가 있다.

프로그래밍 심리학 연구에서 프로그램의 우수성을 평가할 절대적인 척도가 없다는 사실은 큰 골칫거리다.

효율성을 추구하면 보통은 코드가 빡빡해져서 수정하기 어렵게 된다. 고수준(high level) 언어로 작업하다가 프로그램을 좀 더 효율적으로 만들려고 기계어로 내려가는 일도 가끔 있다. 이는 프로그램을 고수준 언어로 작성하는 이 점 중 적어도 하나(다른 기계로의 이식성)를 포기하는 것이다.

컴퓨팅에서 효율성의 문제는 점점 더 애매해지고 있다. 게다가 매년 기계 가격은 내려가는 반면에 프로그래머의 인건비는 올라가고 있기 때문에, 이미 오래 전부터 시스템의 운영비보다 개발비가 더 큰 것이 보통이다. 그리고 디버깅 비용까지 운영비로 계산해서 그렇지, 그것을 개발비에 포함시킨다면 그 불균형은 더 심각해진다 물론 비용 계산을 어떻게 하든 불균형은 있을 것이고, 앞으로도 계속 커질 것이다. 따라서 시간이 지날수록 효율성보다는 효용성이 더 중시될 것이다.

수년에 걸쳐 관찰하면서 최고의 프로그래머는 가장 내성적인 사람이라는 걸 알게 됐다 그들은 자신이 만들어 낸 오류를 발견하면 문제를 야기한 정신적 과정(혹은 물리적 과정)을 검토한다.

2부 사회활동으로 보는 프로그래밍

프로그래머는 보통 고립된 상태에서 일하지 않는다.

파티션이 프로그래머의 생산성에 미치는 악영향은 누군가가 연구해 봐야 할 주제다. 파티션은 방해가 되는 소음이나 움직임은 그대로 놔두고 효율적인 의사소통만 방해한다.

자신의 프로그램이 자아의 외연이라고 진심으로 믿는 프로그래머는 프로그램에 있는 모든 오류를 찾아내려 하지는 않을 것이다.

바람직한 환경을 조성하는 문제와 일단 조성된 환경을 유지하는 문제는 별개다. 이미 조성된 환경을 그냥 유지하기는 비교적 쉽다. 그러나 기존의 그룹을 새로운 환경으로 이끌려면 사회적 구조의 정착화 또는 고착화 현상이라는 난관에 부딪힌다. 고착화는 어떤 상황이 자신을 유지하기에 더 적합한 환경을 만들어 내는 것을 말한다.

한 회사에서 프로그래밍 언어를 한 가지만 시용히는 것은 프로그래밍 환경에 관련된 사회적 고착화 현상의 전형적인 예다.

프로그래머들은 프로그래머가 아닌 사람들만 많은 회사에서는 오래 머물고 싶어하지 않는다. 그리고 다른 프로그래머와 직접 대변하거나 모여서 일할 갖가지 이유를 계속 만들어 낸다.

고위 관리자가 비자아적 프로그래밍 철학을 위협 하는 일이 자주 있다. 관리자들은 사회에서 비교적 공격적인 축에 속히는 경우가 많고, 자신과 달리 돈과 명예를 그다지 추구하지 않는 사람들을 이 해하기 어려워하는 경향이 있다 특히, 개인의 소질을 상호 존중하고 공동 목표를 달성하고자 협력하는 프로그래밍 그룹이 원만하게 돌아가는 걸 이해하지 못한다. 대신, 다른 사람들도 자신처럼 돈을 위해서나 또는 위협을 받아 일을 한다고 생각하곤 한다.

관리자는 성과란 탁월한 능력을 지닌 리더가 직접 낳은 산물이라고 생각하는 경향이 있기 때문이다. 심지어 어떤 그룹의 성과를 인정하더라도 마음속으로는 그 생산성을 각 구성원이 제공한 노력의 합이 아닌 그룹 차원의 특성으로 생각한다.

자신의 코드를 다른 사람이 검토하는 것을 원치 않는 이유가 논리적이지 않다면, 그런 태도를 바꾸는 데 논리적인 설득 또한 소용없다는 것이다. 그렇게 비논리적인 행동을 하는 사람의 직업 정신은 제한적일 수 밖에 없다.

현재에서 볼 때 생산성을 최대로 내도록 조직된 팀이 장기적으로도 최대의 생산성을 내리라 보장할 수도 없다. 그러기 위해서는 반드시 훈련이 필요하다. 따라서 당장은 팀에 거의 아무 도움이 못 될지라도 상대적으로 미숙한 프로그래머를 한 명 이상 포함시키는 것이 좋다. 그런 구성원이 있는 팀에는 목표가 하나 이상 즉, 생산과 훈련이라는 두 가지 목표가 생기게 되고 그에 따라 업무 구조도 달라진다.

팀 리더는 다음을 반드시 명심해야한다.
1. 경영자가 약속 이행을 아무리 강하게 요구한다 해도, 진정으로 원하는 것은 결과물 자체다.
2. 팀 전체가 참여하여 설정한 목표를 추구한다면 결과물을 훨씬 더 쉽게 얻을 수 있다.

민주적으로 조직된 팀이 다른 형태의 팀에 비해 새 구성원을 받아들이기 더 힘든 것으로 알려져 있다. 이는 팀 구조 내에 새 팀원이 차지할 만한 분명하게 정의된 지위 같은 것이 없기 때문이다. 다소 역설적으로 들리겠지만, 권위적인 팀의 구성원들은 새로 온 사람에게 아주 친절 하고 호의적인 반면, 민주적으로 조직된 팀은 다소 냉정하고 비우호적인 모습으로 비춰지곤 한다.

모든 프로 그래머가 어려운 업무에 도전하는 걸 즐기지는 않지만(어떤 사람은 너무 급하게 업무를 재촉하면 그만둬 버릴지도 모른다), 대부분은 자신의 지식을 적용해 볼 기회가 없다면 불만족스러워 한다. 따라서 프로젝트를 오랜 기간 동안 안정적으로 수행하려면, 관리자는 프로젝트가 일종의 프로그래머 생산 공장으로 기능하도록 만들어야 한다. 즉, 초보자라는 신선한 재료를 공급받아 숙련된 리더를 생산하는 것이다.

한 세대가 지났지만 고위급 관리자들은 여전히 소프트웨어의 모든 측 면을 알지 못한다. 적어도 현대 소프트웨어 산업은 개발자들이 관리자가 되면 어떨 지를 충분히 볼 수 있을 만큼 번성했다. 일부는 꽤 잘하고 있지만, 다른 일부는 관리자의 문제가 소프트웨어에 대한 경험 부족 때문만은 아님을 증명하고 있다. 동시에, 최근에는 소프트웨어에 대한 경험이 없는 사람도 대규모 소프트웨어 프로젝트를 성공적으로 관리할 수 있음이 분명해졌다. 즉, 문제는 소프트웨어 기술의 부족이 아니라 관리 기술의 부족인 셈이다. 소프트혜어 기술이 부족해서란 말은 자부심이 부족한 관리자 들이 갖다 붙이는 편리한 변명에 지나지 않는다.

3부 개인 행위로 보는 프로그래밍

이상적인 프로젝트에서는 모든 인력을 동시에 프로그래밍의 특정 단계로 몰아넣지 않아야 한다. 그러나 관리 매뉴얼을 문자 그대로 믿는 관리지는 이와 정확히 반대로 행동한다.

좋은 프로그래머를 만드는 요소가 훌륭한 우정을 만드는 요소와 비슷하다는 사실을 발견하게 될 것이다. 바로, 상호 관심과 개성 존중이다.

프로그래밍에는 지능보다 성격이 더 중요하다고 단언할 수 있다.

능률을 실질적으로 향상시키는 요인은 성격의 변화나 지능의 향상이 아니라 훈련과 경험에 있다.

알만한 가치가 있는 것 중에서 아직 모르는 것이 존재한다는 사실 을 인정해야 한다. 그런데 전문 프로그래머들은 그 사실을 인정하면 자신 의 지위가 낮아진다고 여긴다. 진정한 프로라면 약점을 인정해도 잃을 것이 없음을 알고 있겠지만 말이다.

뭔가를 학습하는 방법을 배우는 첫 단계는 자신이 무엇을 알고 있고 무엇을 모르는 지를 배우는 것이다.

학습은 능동적인 추구다. 프로그래밍을 학습할 때 능동적으로 배움을 추구해야하는 경우가 두 가지 있다. 프로그램이 정확하게 동작할 때와 그렇지 않을 때다.

문제는 어떤 사람을 프로그래머로 뽑느냐가 아니라 어떻게 프로그래머를 양성할 것인가로 바뀐다. 즉, 좋은 프로그래머는 태어나는 것이 아니라 만들어진다. 따라서 우리는 프로그래머의 생산 즉, 훈련과정에 관심을 가져야 한다.

4부 프로그래밍 도구

인본주의자들은 기계의 영향으로 비인간화 다시 말해, 사람의 성품이 피폐해진다고 말하지만 사실은 정반대다. 기계가 경직된 만큼 그 기계를 성공적으로 사용하려는 사람은 더 유연해져야 한다. 이 현상을 두고 인본 주의자들은 비인간화라 생각하는지도 모르겠다.

우리는 어떤 프로그래밍 언어에 익숙해져 갈수록 그 언어에 점점 얽매이게 된다.

대부분의 사람은 현재 상황이 주는 고통이 아무리 크더라도 상황을 바꾼 후의 결과가 확실하지 않다면 그냥 참고 안주한다. 프로그래머가 프로그래밍 언어를 배울 때도 마찬가지다.

프로그래밍이 근본적으로 해결해야 하는 문제란 프로그램을 올바르게 작동하도록 만들고 증명하는 것임을 생각하면, 프로그래밍은 오직 테스트 관점에서만 다루어도 충분히 말이 되는 분야다.

문서화는 잘할 때에만 가치가 있다. 그렇지 않다면 안하느니만 못하다.

5부 에필로그

컴퓨터는 정말 멋진 존재이고 프로그래밍도 정말 신나고 재미있는 일이다. 그렇기에 우리 프로그래머들은 이 재미있는 장난감을 그다지 재미있지 않은 목적에 사용하려는 사람들의 꼭두각시가 될 위험에 노출되어 있다.

얼마 전에 샌프란시스코에 갔다 와서 더 그런지 모르겠지만, 이 책을 읽으면서 우리나라 IT 환경이 투영되는 느낌을 많이 받았다. 읽으면서 공감이 많이 돼서 현재 우리의 문제를 얘기하고 있는 듯했다. 미국서 최고 인기 직업, 한국에선 3D라는 글에서 실리콘밸리는 개발자와 협업하는 문화를 만들어 낸 것이 가장 강력하다는 부분에 공감하는데 실리콘밸리는 이미 수십 년 전에 이런 문제를 겪고 지금은 해결책을 찾아서 지금의 혁신을 이뤄내고 있다는 생각이 들었다. 그런 문화면에서 우리는 20년 정도(대충 어림짐작) 뒤처져 있다고 볼 수 있고...

2014/12/30 23:58 2014/12/30 23:58