[The Pragmatic Programmer] 실용주의 프로그래머 - 1장. 실용주의 철학

7 분 소요

실용주의 프로그래머 개발도서 관련 : 1장 정리

0. 개요

실용주의 프로그래밍은 실용주의 사고의 철학에서 뻗어 나온다.
이장은 철학의 기본을 설정한다.

실용주의 프로그래머는 무엇이 다른가?

  • 태도와 스타일
  • 문제와 해법에 접근하는 철학
  • 자신이 하는 모든 일에 책임을 진다.


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

가장 큰 약점은 약점을 보일 것에 대한 두려움이다.
J. B. Bossuet, Politics from Holy Writ, 1709

실용주의 프로그래머는 경력에 대해 책임을 지고, 자신의 무지나 실수를 인정하기를 두려워하지 않는다.

책임지기

: 책임은 적극적으로 동의하는 것이다.

불가능하거나 위험요소가 너무 큰 상황에 대해서는 책임을 지지 않을 권리가 있다.
자신의 윤리의식과 판단에 따라 결정해야 할 것 이다.

실수를 저지르거나 잘못된 판단을 내렸다면 정직하게 인정하고 다른 방안을 제안하도록 노력하라.

변명하지 말고 떠넘기지 말자. 변명이 아닌 해결안을 제공하는 것은 우리에게 달려 있다.

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

혹시 은행원이나 자동차 수리공, 혹은 점원이 어설픈 변명을 늘어놓는다면
그들에 대해 그 회사에 대해 어떻게 생각하겠는가?


2. 소프트웨어 엔트로피

엔트로피

: 시스템 내의 ‘무질서’한 정도를 가리키는 물리학 용어

우주의 엔트로피는 점점 증가한다.

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

깨진 창문

오랜 기간 깨진채 방치된 창문(나쁜 설계, 잘못된 결정, 형편없는 코드 …) 하나가 거주자들에게 버려진 느낌을 스며들게 한다.

깨진 창문 하나로인해 어지르기 시작하고 낙서를 하고 추가로 깨진 창문이 등장하기 시작한다. 꽤 짧은 시간 안에 소유주가 그걸 고치려는 의지를 넘어설 정도로 손상되고, 결국 버려진 느낌은 현실이 되어 버린다.
ㄴ 정말로 와닿는 말이네요…

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

깨진 창문을 발견하면 더 이상의 손상을 예방하기 위해 어떤 조치든 취하고 현 상황을 잘 관리하고 있다는 것을 보여 줘라.

  • 불쾌한 코드 주석처리
  • 아직 구현되지 않았음(Not Implemented) 메시지 표시
  • 가짜 데이터(dummy)로 대치

앤트로피가 우리를 지배하도록 내버려 두지 말자..!

불끄기

하나의 극단적인 예시를 들려주면,

굉장히 부유한 사람이 있었다. 그의 집은 티 하나 없이 깨끗하고 아름다우며, 값을 매길 수 없는 골동품과 예술품으로 가득 차 있었다.
그러나 어느날 거실 벽난로에 의해 집에 불이 붙기 시작했다. 소방서에 요청하여 수습하려 했는데, 소방관들은 불이 한창 번지고 있는 와중에 잠시 멈춰선 것이다.
그 이유는 크고 더러운 소방호스를 집안에 끌어들이기 전에 정문과 불의 진원지 사이에 있던 매트를 굴려 마느라고 그런 것이다.

그들은 카펫을 더럽히고 싶지 않았다…

굉장히 극단적인 경우지만, 이것이 소프트웨어에서 일어나야만 하는 일이다. 깨진 창문 하나는 내리막길로 가는 첫걸음이다.
“나머지 코드가 전부 쓰레기니까 나도 그렇게 하지 뭐” 사태가 발생할 수 있다…

비록 불길이 일어날지라도(데드라인, 출하 날짜, 시사회 데모 등) 엉망징창으로 만드는 첫 번째 사람이 자신이 되는 것만은 피하려 하자…!


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

돌멩이 수프 이야기

전쟁을 마친 군인 세명이 배가고파 저 멀리 보이는 마을로 향하였다. 마을 사람들이 저들에게 식사를 줄 것이라 확신하였지만 기대와 달리 문은 잠긴체 본인들의 음식을 지키기 바빴다.

군인들은 단념하지 않고 큰 냄비에 물을 끓여 돌멩이 세 개를 조심스럽게 넣었다. 놀란 마을 사람들은 이 광경을 보기위해 하나 둘씩 나오기 시작했다.

“이건 돌맹이 수프입니다” 라고 군인들이 말했다. “그것만 집어넣는 것이요?” 마을 사람들이 물어봤다.
“당연하지요. 뭐 어떤 이들은 당근을 몇 개 집어넣으면 더 맛있다고들 하지만요.”라고 말하자, 마을 사람 하나가 자신의 비밀 창고에서 당근 한 바구니를 가지고 나왔다.

몇 분 후 사람들은 다시 물었다. “그럼 된 건가요?”, “흠, 감자를 넣으면 속 알맹이가 생기는 셈이죠.” 라고 군인이 답했고, 이 후 마을 사람들은 계속해서 군인들이 필요로하는 재료들을 내놓기 시작하였다.

그렇게 수프를 맛있게 해줄 재료들이 생기고 군인들은 돌맹이를 꺼내고 온 마을 사람들과 둘러앉아 최근 몇 달동안 아무도 먹지 못한 제대로 된 식사를 할 수 있게 되었다.

이 돌맹이 수프 이야기에는 몇 가지 교훈이 있다.

군인들이 하나의 촉매로 작용하여 마을 사람들 스스로 만들어 낼 수 없던 뭔가를 협동하여 이루어 낸 점. (시너지의 결과)

가끔 우리도 군인들을 모방해야 할 때가 있다. 우리는 준비되어있지만 외부의 영향으로 인해 시작하지 못하는 상황이 온다.
큰 무리 없이 요구할 수 있을 만한 것을 찾아내라. 그리고 그걸 잘 개발해라. 일단 되면, 사람들에게 보여 주고, 그들이 경탄하게 하라. 그게 그다지 중요하지 않은 것처럼 가장하라. 그러면 그들이 알아서 우리가 원했던 기능들을 추가해 달라고 부탁하기 시작할 것이다.

계속되는 성공에 합류하기란 쉽다.

Tip5 : 변화의 촉매가 되라.

삶은 개구리

돌멩이 수프 이야기는 부드럽고 점진적인 속임수에 대한 이야기이다.
한 가지에 너무 집중하여 나머지에 대해 까맣게 잊어버리는 상황.
모르는 사이에 서서히 상황이 악화되는 상황.

소프트웨어의 참사는 대부분 작은것에서 시작하여, 어느 날 갑자기 폭주하기 시작한다.

팀 자체의 파괴는 종종 작은 것들의 누적에서 온다.

Tip6 : 큰 그림을 기억하라.

  • 깨진 창문 : 다른 누구도 주의를 기울이지 않는다는 걸 알기에 엔트로피에 대항해 싸울 의지를 잃는 것
  • 삶은 개구리 : 변화를 감지하지 못하는 것


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

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

일본의 한 제조사는 집적회로 10만 개를 주문받을때, 일부러 결함 비율을 만 개당 한 개로 요청받는다.
10만개의 IC가 들어있는 커다란 상자 하나와, 결함이 있는 10개의 IC 상자. 이 정도로 품질을 통제할 수 있다면 얼마나 좋을까..?

적당히 괜찮은
너절하거나 형편없는 코드를 의미하지 않는다.
시스템이 성공하려면 사용자의 요구사항을 충족해야 한다.
단지 어느 정도면 적당히 괜찮은지를 사용자가 참가하여 결정한다는 걸 말한다.

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

단순히 프로그램에 새 기능을 추가하거나 코드를 한 번 더 다듬는다던가 하기 위해서 사용자의 요구사항을 무시하는 것은 전문가답지 못한 것이다.

불가능한 시간 약속을 하거나 데드라인에 맞추기 위해 기본적인 걸 빼버리거나 하는 것 역시 똑같이 전문가답지 못하다.

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

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

대부분 일 년을 기다리느니 차라리 오늘 당장 좀 불편한 소프트웨어를 사용하고 싶어 한다.

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

언제 멈춰야 할지 알라

완벽하게 훌륭한 프로그램을 과도하게 장식하거나 지나칠 정도로 다듬느라 망치지 마라.

그냥 넘어가고 코드가 현재 상태에서 한동안은 그대로 있도록 놓아두라.

완벽하지 않아도 걱정하지 마라, 완벽해지리란 불가능하다.


5. 지식 포트폴리오

지식에 대한 투자가 언제나 최고의 이윤을 낸다.
벤자민 프랭클린
지식과 경험이야말로 가장 중요한 전문가적인 자산이다.
불행히도 이것들은 사라지는 자산이다…

새로운 기술, 언어, 환경이 개발됨에 따라 지식은 옛것이 된다.

지식이 점차 떨어짐에 따라 자신의 가치 또한 같이 떨어진다. 우리는 이를 예방하고 싶다…

지식 포트폴리오

지식포트폴리오 관리 = 금융 관련 포트폴리오 관리

  1. 진지한 투자자들은 주기적으로 투자하는 습관이 있다.
  2. 장기간 성공의 열쇠는 다각화다.
  3. 똑똑한 투자자들은 자신의 포트폴리오를 보수적인 투자, 위험성이 큰 투자, 보상이 높은 투자 사이에서 균형을 잘 맞춘다.
  4. 최대 수익을 위해 투자자들은 싸게 사서 비싸게 팔려고 한다.
  5. 포트폴리오는 주기적으로 재검토하고 재조정해야 한다.

경력을 성공적으로 쌓기 위해 이와 동일한 지침을 사용하여 지식 포트폴리오를 관리해야 한다.

포트폴리오 만들기

  1. 주기적인 투자
    • 비록 소량일지라도 그 습관 자체가 금액의 합계만큼이나 중요하다.
  2. 다각화
    • 여러 가지를 알면 알수록 자신의 가치는 더욱 높아진다.
    • 더 많은 기술에 익숙하다면, 변화에 더 잘 적응할 수 있다.
  3. 리스크 관리
    • 위험하거나 보수적인 기술에 올인하지 말고, 분산하여 투자하자.
  4. 싸게 사서 비싸게 팔기
    • 새롭게 떠오르는 기술 = 저평가된 주식, 나중에 큰 이익을 얻을 수 있다.
  5. 검토 및 재조정
    • 이 산업은 매우 동적이기 때문에, 인기있던 기술이 한순간 식기도한다.
    • 반대로 사용하지 않던 기술이 떠오르기도 한다.
    • 현 상황을 검토하고, 재조정해보자.

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

목표

지식 포트폴리오에 자금(= 지식 자산)을 얻는 최선의 길은 무엇일까?

  1. 매년 새로운 언어를 최소 하나는 배워라.
    • 다른 언어는 동일한 문제를 다르게 푼다. 다양한 접근법을 알면 사고가 확장된다.
  2. 기술 서적을 분기마다 한 권씩 읽어라.
    • 습관이 들면 한달에 한권씩
    • 현재 사용중인 기술을 일단 완전히 익힌다.
    • 그 이후 가지치기로 프로젝트와 관련 없는 분야까지 공부 범위를 넓혀라.
  3. 비 기술 서적도 읽어라.
    • 컴퓨터를 사용하는 것은 사람 = 우리가 만족시켜야 하는 대상
  4. 수업을 들어라.
    • 흥미로운 강좌, 세미나 등 참여하라
  5. 지역 사용자 모임에 참여하라.
    • 가서 듣지만 말고, 적극 참여하라.
    • 고립은 경력에 치명적일 수 있다.
    • 회사 밖의 사람들은 어떤 일을 하는지 알아보라.
  6. 다른 환경에서 실험해보라.
    • 다양한 OS 환경을 경험하라.
    • 다양한 IDE도 경험하라.
  7. 요즘 흐름을 놓치지 마라.
    • 업계 잡지와 기타 저널을 구독하라.
    • 현재 프로젝트와 다른 기술을 다루는 것도 몇 개 선택하라.
  8. 인터넷을 이용하라.
    • 새 언어, 기타 기술 등 알기 위해 인터넷 웹서핑을 즐겨하라.

비판적 사고

읽거나 듣는 것에 대해 ‘비판적으로’ 생각하는 것은 중요하다.

시중에 있는 도서 혹은 웹에 있는 글들을 맹신하지 마라. 돈주고 만든 결과일 수 있다.

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

6. 소통하라!

나는 무시당하느니 차라리 샅샅이 훑어보는 시선이 낫다고 봐요.
메이 웨스트, Belle of the Nineties, 1934

뭘 가졌냐 만이 아니라 그걸 어떻게 포장하느냐도 중요하다.

다른 사람들과 소통할 수 없다면 최고의 것들을 가지고 있다한들 궁극적으로 아무 효용이 없다.

소통을 잘하는 아이디어~!

  1. 말하고 싶은 게 무언지 알아라
    • 의사소통에 가장 어려운 부분은 말하고자 하는 것이 정확히 무엇인지 생각해 내는것이다.
    • 무엇을 말할지 미리 계획하라. 개요를 작성하고, 자문하라. (“이게 내가 말하고자 하는 것을 잘 전달하는가?”)
    • 의사소통하고 싶은 아이디어들을 적은 다음, 제대로 전달하기 위해 필요한 전략을 몇 개 세워라.
  2. 청중을 알아라
    • 정보를 전달하는 경우에만 소통이라고 할 수 있다.
    • 청중의 요구와 관심, 능력을 이해할 필요가 있다.
    • 청중에 대한 뚜렷한 그림을 가져야 한다.
    • WISDOM - 청중 이해하기
           
      W : 무엇(What)을 배우길 원하는가?
      I : 말하려는 것에서 그들이 관심(interest) 있어 하는 건 무엇인가?
      S : 얼마나 소양(sophisticated)이 있는가?
      D : 어느 정도의 구체적인(detail) 내용을 원하는가?
      O : 누가 정보를 소유(owe)하길 원하는가?
      M : 그들이 경청하도록 동기(motive)를 주려면 어떻게 해야 할까?
      
  3. 때를 골라라
    • 청중이 무엇을 듣기 원하는지 이해하기 위해 그들의 우선순위를 알아야 한다.
    • 말하는 내용만 아니라 말하는 시간도 적절하게 하라. (“~에 대해 이야기할 좋은 때일까?” 스스로 생각하기.)
  4. 스타일을 골라라
    • 전달하는 스타일이 청중에 어울리도록 조정하라. (누군가는 ‘그저 사실만 전달하는’ 브리핑을 원한다.)
    • 뭐가 좋을지 모르겠거든 물어보라.
    • 원하는 스타일에 맞출 수 없는 경우 솔직하게 사실을 말하라. 이러한 피드백 역시 의사소통의 한 가지 형태이다.
  5. 멋져 보이게 하라
    • 모양새에 신경을 써야한다. (내용만 존재하는 아이디어는 청중들에게 전달되지 못한다.)
  6. 청중을 참여시켜라
    • 가능하면 문서 초고에 독자가 참여하도록 하라.
    • 피드백을 받고 그들의 머릿속을 도용하라.
    • 더 좋은 관계를 형성하게 되며 더 나은 문서를 만들게 될 것이다.
  7. 청자(Listener)가 되어라
    • 다른 사람들이 본인의 말을 경청해주길 바란다면, 반대로 본인도 경청할 줄 알아야 한다.
    • 본인이 귀기울여 듣지 않는다면 그들도 그러할 것이다.
    • 질문을 해서 사람들이 이야기를 하도록 복돋우거나, 전달한 말을 그들이 요약하도록 하라.
  8. 응답하라
    • 사람들이 정보를 요청하거나 어떤 행동을 부탁하는 이메일 혹은 메모를 보냈을 때, 어떻게든 답을 하도록 하자.
    • 늘 사람들에게 응답해주면 때때로 일어나는 실수에 대해 훨씬 관대해질 것이다.

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

⬅️ 실용주의 프로그래머 목차보기

댓글남기기