본문으로 건너뛰기

01 실용주의 철학

실용주의 프로그래머는 무엇이 다른가? 우리는 태도와 스타일 그리고 문제와 해법에 접근하는 철학에 차이가 있다고 생각한다. 그들은 직면한 문제 너머를 생각하며, 문제를 항상 더 큰 맥락에 놓으려 노력하고, 항상 더 큰 그림을 보려 한다.

그들의 또 다른 성공의 열쇠는 자신이 하는 모든 일에 책임을 진다는 점이다. 책임감이 있기 때문에, 실용주의 프로그래머들은 프로젝트가 방치된 채로 끝장나는 걸 게으르게 옆에 앉아서 지켜보고만 있지는 않을 것이다.

1 고양이가 내 소스코드를 삼켰어요

가장 큰 약점은 약점을 보일 것에 대한 두려움이다.

실용주의 철학의 초석 중 하나는 경력 향상, 프로젝트, 일상 업무의 면에서 자신과 자신의 행동에 대해 책임을 지는 것이다. 전문가다운 것은 정직하고 솔직해지는 것을 의미한다. 우리는 자신의 능력에 대해 자부심을 가질 수 있지만 실수나 무지 같은 단점에 대해서도 정직해져야 한다.

책임지기

책임은 적극적으로 동의하는 것이다. 실수를 저지르거나 잘못된 판단을 내렸다면, 정직하게 인정하고 다른 방안을 제안하도록 노력하라.

다른 사람이나 다른 무언가를 비난하거나 변명을 만들어 내지 말라. 이들이 모두 한몫씩 했을 수 있겠지만 변명이 아닌 해결안을 제공하는 것은 여러분에게 달려 있다.

Tip 3

어설픈 변명을 만들지 말고 대안을 제시하라.

나쁜 소식을 전하러 가기 전에 뭔가 시도해 볼만한 다른 것은 없을까? 때로는 사람들이 뭐라고 말할지 빤히 보이는 경우가 있는데, 그럴 땐 그들의 수고를 덜어줘라.

변명 대신에 대안을 제시하라. 안 된다고 하지 말고 상황을 개선하기 위해 무엇을 할 수 있는지 설명하라. 자원이 더 필요하다면 부탁하는 것을 어려워하지 말고, 도움이 필요하다는 사실을 인정하라.

어설픈 변명을 늘어놓기 전에 그 변명꺼리를 없대도록 노력해 보라.

2. 소프트웨어 엔트로피

소프트웨어의 무질서도가 증가할 때 프로그래머들은 이를 '소프트웨어의 부패'라고 일컫는다.

소프트웨어가 부패하는 데에는 많은 요소들이 관여한다. 가장 중요한 것은 프로젝트에서 발생하는 심리학적이거나 문화적인 요소다. 무엇이 문제일까?

깨진 창문.

오랜 기간 수리하지 않고 방치된 창문 하나가 거주자들에게 버려진 느낌을 스며들게 한다. 그래서 다른 창문이 하나 더 꺠진다. 사람들은 이제 어지르기 시작한다. 심각한 구조적 손상이 시작된다.

Tip 4

깨진 창문을 내버려두지 말라.

'깨진 창문' (나쁜 설계, 잘못된 결정, 혹은 형편없는 코드)을 고치지 않은 채로 내버려 두지 마라. 발견하자마자 바로 고쳐라. 적절히 고칠 시간이 충분치 않다면 판자로 덮는 것만이라도 하라. 더 이상의 손상을 예방하기 위해 어떤 조치든 취하고 현 상황을 잘 관리하고 있다는 것을 보여 줘라.

깨끗하고 잘 기능하는 시스템들이 일단 창문이 깨지기 시작하면 급속도로 악화되는 것을 많이 보아 왔다. 방치는 다른 어떤 요인보다도 부패를 더 가속시킨다.

도전해 볼 것

'꺠진 창문' 두세 개를 고른 다음, 여러분의 동료들과 함께 무엇이 문제고, 그걸 고치기 위해 뭘 할 수 있는지 토론하라.

3. 돌멩이 수프와 삶은 개구리

Tip 5

변화의 촉매가 되라.

소프트웨어 참사는 대부분 너무 작아 알아채기 힘들 정도에서 시작하고, 프로젝트 폭주는 대부분 어느 날 갑자기 일어난다. 코드에 패치가 하나 둘 적용되다가 원본이 하나도 남지 않을 때까지, 시스템은 명세에서부터 기능 하나하나씩 정처 없이 떠다닌다. 의욕과 팀 자체의 파괴는 종종 작은 것들의 누적에서 온다.

Tip 6

큰 그림을 기억하라.

깨진 창문 이론에서는 다른 누구도 주의를 기울이지 않는다는 걸 알기에 사람들이 엔트로피에 대항해 싸울 의지를 잃는다고 한다. 개구리는 단지 변화를 감지하지 못하느 ㄴ것이다.

그런 개구리처럼 되지 마라. 큰 그림에 늘 주의를 기울여라. 개인적으로 무엇을 하고 있는가에만 정신을 쏟지 말고, 주변에서 무슨 일이 벌어지는지 지속적으로 살펴보라.

도전해 볼 것

군인들은 점진적으로 마을 사람들을 속였지만 그들이 촐진시킨 변화는 마을 사람들에게 좋은 것이었다. 하지만 개구리를 점진적으로 속이는 경우, 그 개구리에게는 나쁜 일이 생긴다. 변화를 촉진시키려고 할 때, 여러분이 돌멩이 수프를 만드는지 아니면 개구리 수프를 만드는지 어떻게 판단할 수 있겠는가? 그 판단은 주관적인가 객관적인가?

4. 적당히 괜찮은 소프트웨어

우리는 종종 뭔가 나아지게 하려다가 괜찮은 것마저 망친다.

리어왕 1.4

완벽하게 품질을 통제할 수 있다면 얼마나 좋을까. 하지만 실세계에서는 진정 완벽한 것을 만들어 내기란 불가능하다. 적당히 괜찮은 소프트웨어를 만들도록 자신을 단련할 수 있다. 자신은 더 생산적이 되고 사용자는 한층 더 행복해 할 것이다.

'적당히 괜찮은' 이라는 문구는 너절하거나 형편없는 코드를 의미하지 않는다. 시스템이 성공하려면 사용자의 요구사항을 충족해야 한다. 단지 우리는 생산해 낸 것이 어느 정도면 적당히 괜찮은지를 결정하는 과정에 사용자가 참가할 기회를 가져야 한다는 걸 말하고 있는 것이다.

타협과정에 사용자를 참여시켜라

보통 다른 사람을 위해 소프트웨어를 작성한다. 하지만 소프트웨어가 얼마나 좋아야 하는지 사용자들에게 얼마나 자주 묻는가? 단순히 프로그램에 새 기능을 추가하거나 코드를 한 번 더 다듬는다던가 하기 위해서 사용자의 요구사항을 무시하는 것은 전문가답지 못한것이다. 불가능한 시간 약속을 하거나 데드라인에 맞추기 위해 기본적인 걸 빼버리거나 하는 것 역시 똑같이 전문가답지 못하다.

여러분이 만다는 시스템의 범위와 품질은 해당 시스템 요구사항의 일부로 명기되어야 한다.

Tip 7

품질을 요구사항으로 만들어라.

오늘의 훌륭한 소프트웨어는 많은 경우, 내일의 완벽한 소프트웨어보다 낫다. 사용자들에게 뭔가 직접 만져볼 수 있는 것을 일찍 준다면, 피드백을 통해 종국에는 더 나은 솔루션에 도달할 수 있을 것이다.

언제 멈춰야 할지 알라

완벽하게 훌륭한 프로그램을 과도하게 장식하거나 지나칠 정도로 다듬느라 망치지 말라. 그냥 넘어가고 코드가 현재 상태에서 한동안은 그대로 있도록 놓아두라. 완벽하지 않을 수도 있다. 걱정하지 마라. 완벽해지기란 불가능하다.

도전해 볼 것

  • 사용자로서 (1) 소프트웨어의 모든 버그를 제거할 때까지 기다리겠는가? (2) 복잡한 소프트웨어를 사용하면서 어느 정도의 버그는 감내하겠는가? (3) 결함이 더 적은 간단한 소프트웨어를 선택하겠는가?

5. 지식 포트폴리오

지식에 대한 투자가 언제나 최고의 이윤을 낸다.

벤자민 프랭클린

여러분의 지식과 경험이야말로 가장 중요한 전문가적인 자산이다.

불행히도 그것들은 소진하는 자산이다. 새로운 기술, 언어, 환경이 개발됨에 따라 지식은 옛것이 된다. 변화하는 시장 역시 여러분의 경험을 퇴물이나 별 소용없는 것으로 만들 수 있다. 웹-년이 흘러가는 속도를 볼 때, 이런 것들은 꽤 빨리 일어날 수 있다.

지식 포트폴리오

우리는 컴퓨터, 애플리케이션 도메인 등에 대해 프로그래머들이 알고 있는 모든 사실과 경험을 그들의 '지식 포트폴리오'로 생각해보길 좋아한다. 지식 포트폴리오를 관리하는 것은 금융 관련 포트폴리오를 관리하는 것과 매우 유사하다.

  1. 주기적인 투자. 금융 투자에서와 마찬가지로 자신의 지식 포트폴리오에 주기적으로 투자해야 한다. 비록 소량일지라도 그 습관 자체가 금액의 합계만큼이나 중요하다.

  2. 다각화 여러가지를 알면 알수록 자신의 가치는 더욱 높아진다. 기본적으로 현재 작업에 사용하는 특정 기술의 등장과 퇴장을 알아야 한다. 하지만 거기서 멈추지 말라. 오늘날 인기 있는 기술이 내일이면 거의 쓸모없어지기도 한다. 더 많은 기술에 익숙하다면, 변화에 더 잘 적응할 수 있을 것이다.

  3. 리스크 관리 위험하지만 잠재적으로 보상이 높은 것에서 리스크가 낮고 보상도 낮은 것에 이르기까지 기술은 다양한 스펙트럼 위에 존재한다. 여러분의 기술 달걀을 한 바구니에 모두 담지마라.

  4. 싸게 사서 비싸게 팔기 새롭게 떠오르는 기술이 인기를 끌기 전에 미리알고 학습하는 것은 저평가된 주식을 찾아내는 것만큼이나 어려울 수 있지만, 이익 또한 그만큼 클 수 있다.

  5. 검토 및 재조정 이 산업은 매우 동적이다. 지난달부터 탐구하기 시작한 인기 있는 기술이 지금에 와선 완전히 식어버릴지도 모른다. 예전 기술혹은 다른 언어를 시도해 봤다면 새로운 일자리를 얻는 데에 더 유리할 수도 있다.

Tip 8

지식 포트폴리오에 주기적으로 투자하라.

목표

  • 매년 새로운 언어를 최소 하나는 배워라. 다른 언어는 동일한 문제를 다르게 푼다. 몇 개의 서로 다른 접근법을 알면 사고를 확장하고 판에 박힌 사고에 갇히는 걸 예방하는 데에 도움이 된다.

  • 기술 서적을 분기마다 한 권씩 읽어라. 습관이 들면, 한 달에 한 권씩 읽어라. 현재 사용하는 기술을 일단 완전히 익혔다면, 가지치기를 해서 지금 하는 프로젝트와 관련 없는 분야까지 공부 범위를 넓혀라.

  • 비 기술 서적도 읽어라. 컴퓨터를 사용하는 것은 사람 - 우리는 바로 이 사람들을 만족시키려고 노력하고 있다 - 이라는 것을 기억하는 게 중요하다. 방정식에서 인간이라는 변을 잊지 마라.

  • 수업을 들어라. 근처의 대학, 혹은 시사회에서 열리는 흥미로운 강좌를 찾아보라.

  • 지역 사용자 모임에 참여하라. 가서 가만히 듣고만 오지 말고, 적극 참여하라. 고립은 경력에 치명적일 수 있다. 여러분 회사 밖에서는 사람들이 어떤 일을 하는지 알아보라.

  • 다른 환경에서 실험해보라. 윈도우에서만 일을 해 왔다면, 집에서는 유닉스를 갖고 놀아보라.

  • 요즘 흐름을 놓치지 마라. 업계의 잡지와 기타 저널을 구독하라. 여러분의 현재 프로젝트와 다른 기술을 다루는 것도 몇 개 선택하라.

  • 인터넷을 이용하라. 새 언어 혹은 기타 기술에 대해 속속들이 알고 싶은가? 다른 사람이 그에 관해 어떤 경험을 했는지, 그들이 사용하는 특별한 전문용어가 어떤 뜩인지 등을 알아내는 데는 뉴스그룹이 탁월하다.

투자를 계속하는 것은 중요하다. 새로운 언어나 어떤 기술에 대해 익숙할 정도가 되면 다음으로 나아가라. 또 다른 걸 배워라.

학습 과정을 통해 사고를 확장하고 새로운 가능성과 새로운 방법들로 자신을 활짝 개방하게 될 것이다. 사고간의 교접은 중요하다. 자신이 배운 교훈들을 현재 프로젝트에 적용하도록 노력하라. 프로젝트에서 그 기술을 사용하지 않을지라도 어쩌면 몇 가지 아이디어를 도입할 수 있을 것이다.

학습의 기회

여러분이 엄청난 다독가이고, 해당 분야의 최신 발전에 대해 낱낱이 알고 있는데, 누군가 질문을 한다. 여러분은 답이 뭔지 전혀 알지 못하고, 허물없이 그걸 인정한다.

거기에서 멈추지 마라. 답을 찾기 위한 개인적인 도전으로 생각하라. 구루에게 물어보라.

스스로 답을 찾지 못하겠거든, 누가 답을 찾아줄 수 있을지 그 사람을 찾아라. 중단하지 마라. 다른 사람들과 이야기함으로써 개인 네트워크를 구축하는데 도움이 되기도 하고, 답을 찾는 도중에 별로 관련이 없어 보이는 문제들에 대한 해답을 찾아서 놀라는 일도 생길 것이다. 포트폴리오는 그 사이 계속 커져 간다.

이 모든 독서와 연구는 시간이 걸리고, 시간은 늘 부족한 자원이다. 그래서 미리 계획해야 할 필요가 있다. 할 일 없는 시간을 위해 늘 읽을거리를 준비하라. 병원에서 진료를 기다리느라 허비되는 시간은 밀린 독서를 할 훌륭한 기회다.

비판적 사고

마지막으로 중요한 점은 여러분이 읽거나 듣는 것에 대해 '비판적으로' 생각하는 것이다. 자신의 포트폴리오에 있는 지식이 정확하고, 벤더나 매체의 과대광고에 흔들림이 없도록 확실히 해야 할 필요가 있다.

Tip 9

읽고 듣는 것을 비판적으로 분석하라.

6. 소통하라!

나는 무시당하느니 차라리 샅샅이 훑어보는 시선이 낫다고 봐요.

메이 웨스트

뭘 가졌느냐 만이 아니라 그걸 어떻게 포장하느냐도 중요하다. 최고의 아이디어, 최상의 코드 혹은 가장 실용주의적인 사고 등이 있다고 해도 다른 사람들과 소통할 수 없다면 그것들은 궁극적으로 아무 효용이 없다. 효과적인 소통 없이는 어떤 훌륭한 아이디어도 고아에 지나지 않는다.

개발자로서 우리는 여러 층과 소통해야 한다. 회의를 하고, 듣고 말하며 여러 시간을 보낸다. 하루 중 많은 시간을 소통하며 보내기 때문에, 이를 잘해야 할 필요가 있다.

말하고 싶은 게 무언지 알아라

비즈니스에서 사용하는 조금 더 형식적인 스타일의 의사소통에서 가장 어려운 부분은 아마도 여러분이 말하고자 하는 것이 정확히 무엇인지 생각해 내는 것이다.

무엇을 말할지 미리 계획하라. 개요를 작성하라. 그리고 자문하라. "이게 내가 말하고자 하는 것을 잘 전달하는가?" 그렇게 될 떄까지 다듬어라.

청중을 알아라

정보를 전달하고 있는 경우에만 소통하고 있다록 말할 수 있다. 그렇게 하기 위해서는 청중의 요구와 관심, 능력을 이해할 필요가 있다. 각 그룹에 맞는 접근을 통해, 그들이 모두 여러분의 프로젝트에 대해 열광하도록 만들 수 있다.

때를 골라라

청중이 무엇을 듣기 원하는지 이해하기 위해서는, 그들의 우선순위를 알아야 한다. 말하는 내용만이 아니라 말하는 시간도 적절하게 하라. 가끔 '...에 대해 이야기할 좋은 때일까?' 라는 간단한 질문을 해보는 것만으로도 충분하다.

Tip 10

무엇을 말하는가와 어떻게 말하는가 모두 중요하다.