[서적] 프로그래머의 길, 멘토에게 묻다

  • 마음이 많이 힘들 때, 이 책을 읽고 큰 용기와 위안을 얻었다.
    팀에서 내가 어떤 기여를 하고 있는지, 당장 어떤 업무를 해야하고, 앞으로 어떤 업무를 할 수 있을지 가늠이 안 되어서 출근이 두려웠던 때가 있었다.
    주체적으로 일을 찾아서 하고 싶은데 그러한 실마리가 보이지 않고, 나의 영역으로 손을 댈 수 있는 부분은 너무나 미약해보이던 시기.
    그 때에 이 책을 읽으면서 내가 나아가면 좋을 방향에 대한 이정표를 선물 받은 기분이었고,
    덕분에 팀장님께도 미팅을 요청하면서 이러한 고민에 대해 이야기를 해서 훨씬 나은 방향으로 전진할 수 있게 되었다고 생각한다.
  • 나만 이렇게 고민하는게 아니었다. 용기를 얻고, 무지에 굴복하지 않고, 계속해서 알아가자.
    주니어여서 아무 것도 모르는 것 같은 부담감에 휩싸일 때도 있지만, 시니어가 되어도 계속해서 배우는 것이 이 직업의 숙명이자 매력.
    즉 배움에 있어서 연차는 아무 의미가 없다. 오직 중요한 것은 새로운 것을 대하고 받아들이는 태도일 뿐.
    가만히 있는 태도를 유지한다면 계속 가만히 있게 될 것이다. 계속해서 도전하고, 실패하고, 도전하자.

서문

  • 우리가 이룬 변혁에서 비롯된 모든 조언은, 그걸 제2의 천성처럼 만들기 전까지는 그다지 도움이 되지 않습니다.
    기술을 습득하고 수련하는 것은 사람에게 천성이 아니며 그것 자체가 수련해야 할 또 하나의 기술.

1. 들어가는 글

  • 부숴도 괜찮은 장난감의 첫 버전을 완성하는 데 가장 적용하기 힘들었던 패턴은 나의 무지를 드러내는 것이었다. 그렇게 창피를 무릅쓸 가치는 충분했다.
    내 프로그램의 짜임새와 유닉스 파일 권한에 대해 몇 가지 간단한 조언을 들을 수 있었기 때문이다. 그 조언 덕에 나는 내 장난감을 신속히 무미래했고, 어브와 스티브는 아주 흡족해 했다.
  • 이 모든 새로운 정보를 단단히 머릿속에 새겨두기 위해서, 누구든 볼 수 있는 내 개인 웹사이트에 배운 것을 기록하여 무지를 드러내기로 마음먹었다.
  • 당신을 영리하고 재능 있게 만드는 것은 노력이며, 실패란 단지 다음번에 다른 방법을 시도해 볼 수 있도록 하는 보상.
  • 당신의 견습과정은 어쨌거나 당신이 통제할 테고, 결국 그 결과는 당신의 책임이 되기 때문이다.
  • 견습생은 계속 배우는 것 말고는 별다른 일이 없는 위치에서 시작해서, 나중에는 책임질 범위도 더 넓고 자기 자신 외의 일도 고려해야 하는 위치로 진급하게 된다.
    하지만 우리에게는 이런 변화란 나중에 돌이켜 볼 때에야 비로소 알게 된다고 믿는 경향이 있다.
    어느 시점에서는, 마스터나 숙련공 한 사람이 견습생에게 가서 이제부터 숙련공의 일과 역할을 맡으라고 얘기하기도 할 것이다.
    이런 경우에 견습생은 그 전부터 조금씩 책임을 더 맡아서 일해 왔을테고, ‘끓는 물속의 개구리’처럼 점진적이면서도 뚜렷한 경계가 없는 그런 변화를 겪어왔던 셈이다.
    어떤 이들에게 이러한 변화는 다른 사람들보다 시간이 더 걸리는 일일 수 있겠고, 또 어떤 경우에는 자신의 직업 경력 내내 변화의 시기를 맞이하지 못할 수도 있다.

2. 잔을 비우다

  • 무지를 드러내라. 그리고 무지에 맞섬으로써 지식을 습득해 나가는 모습을 당신 팀과 고객이 지켜보도록 하라.
    마침내 당신에게는 큰 일을 맡을 기회가 주어질 텐데, 그 기회를 통해서 깊은 쪽으로 뛰어든다면, 수영을 하라 수 있게 되거나 바닥으로 가라앉거나 둘 중 하나가 될 것이다.
    왠지 두려운 생각이 들겠지만, 당신이 경력을 쌓는 동안 이런 종류의 위험을 감수하는 데는 이보다 더 나은 시기가 없다.
    만약 이 모든 것이 너무 압박적으로 다가온다면, 한발 물러서서 당신이 얼마만큼 전진해 왔고 그 동안 어떤 역량을 개발했는지 돌아보는 일이 중요하다.
    그런 다음에 다시 기운을 내어 다음 고지로 올라야 하니까 말이다.

첫번째 언어

  • 소프트웨어 개발에서 치우침 없는 이력을 쌓으려면 다양한 언어를 접하는 편이 좋다. 모든 언어들은 각기 다른 패러다임으로 문제를 해결할 기회를 제공한다.

열정을 드러내라

  • 어리석게 여겨짐을 두려워하여 새로운 일을 시도해 보지 못했던 적이 얼마나 많았던가? 이례적으로 높은 잠재력을 지닌 사람들에게는 어린아이와 같은 면이 있음을 발견했다.
  • 당신의 경력 중에서 이 시기가 위험을 감수하고 속내를 털어내기에 가장 적당한 때다. 당신은 잃을 것이 별로 없다.
    심도 있는 지식이나 엄청난 생산성으로 기여하지는 못하더라도, 팀에 열정을 불어 넣고 모든 것에 대해서 질문하는 것이야말로 당신의 본분이라 할 수 있다.
    당신은 지금 팀의 발전을 위해 유용한 제안을 할 수 있는 신선한 관점을 지닌 톡특한 (그리고 일시적인) 위치에 있는 것이다.

구체적인 기술

  • 이력서를 정기적으로 손보는 습관을 들여라. 그렇게 해가면서 구체적인 기술을 나열한 별도의 목록을 만들어라.
    많은 채용 담당자들이 나열된 그 모든 경력사항보다 이런 목록에 있는 항목만 볼 거라는 사실을 알게 되면 당신은 마음 편할 수 있겠는가?

무지를 드러내라

  • 내일 나는 더 어리석게 보일 필요가 있으며, 거기에 대한 느낌도 더 나아질 것이다. 가만히 있으면서 일이 어떻게 돌아가나 살피는 것은 별로 효과가 없는 것 같다.
  • 무지를 드러내는 가장 확실한 방법은 질문하는 것이다. 이것은 말처럼 쉽지 않은데, 특히 질문 받는 쪽에서 당신이라면 당연히 알 거라고 생각하는 경우에는 더욱 그렇다. 거기에 굴하지 마라!
    물론 당신은 자존심에 상처 입지 않고 어느 정도 우회해서 필요한 지식을 얻을 수도 있다. 하지만 가장 가깝게 질러가는 길을 택함으로써 숙련공으로 가는 여정이 단축될 수 있다.
  • 나는 사실 매일매일 스스로 무지하다는 느낌을 몸에 붙이도록 교육받았고, 그렇게 함으로써 내가 바른 길로 가고 있음을 알 수 있었습니다. 나는 성장하고 있었지요.
  • 업무에 관해서 정말로 이해되지 않는 것 다섯 가지를 적어 보라. 그 목록을 다른 사람들이 볼 수 있는 곳에다 붙여 두어라.
    그리고 당신의 업무가 바뀔 때마다 그 목록을 갱신하는 습관을 들여라.
    이렇게 해서 얻은 새 지식은 그 전까지 알아채지 못했던 빈틈을 드러낼 수도 있다. 그 빈틈을 자신의 목록에 잊지 말고 추가하여라.

무지에 맞서라

  • 무지에 맞서는 것만을 강조한다면 아무것도 해내지는 못하면서 건방만 떠는 정보탐식가로 엇나갈 위험이 있고,
    무지를 드러내고서도 그 무지를 해결해야할 문제라고 인식하지 못한다면 지나친 자기 비하와 무력감에 빠지게 될 것이다.
  • 다 준비될 때가지 기다리다가는 아무 일도 못할 수가 있다.
    그러므로 당신에게 두드러지는 역할이나 어려운 문제가 주어진다면, 그 기회를 놓치지 말고 두 손으로 꽉 잡아라.
    두렵게 생각되는 일을 맡고, 능력을 넘어서는 듯한 일을 실제로 함으로써만 당신은 성장할 수가 있다. 여기에는 위험이 따른다. 만약 엉터리로 해서 결국 수면 위로 올라가지 못한다면 당신은 물에 빠질 것이다.
    다행히 IT분야에는 실패한다고 해도 경력을 망치지 않고 위험을 감수해볼 수 있는 기회가 많은 편이다. 위험이란 두려움으로 반쯤 감은 눈에 비친 기회의 다른 모습이다.
    실패를 준비하고 그 실패로부터 일어설 때, 소심한 자들은 결코 볼 수 없는 문이 당신에게 열릴 것이다.
  • 당신이 참여했던 프로젝트 중에서 가장 규모가 크고 성공적이었던 프로젝트는 무엇인가? 당신이 단독으로 작업한 것 중 가장 규모가 큰 코드는 무엇인가?
    이 질문들에 대한 답을 적고, 프로젝트의 복잡도를 나타내는 다른 척도가 있을지, 프로젝트를 평가할 수 있는 또 다른 방법이 있을지 한번 찾아보라.
    이제 다음 프로젝트가 시작되면, 당신은 모든 프로젝트를 망라한 차트를 그려 놓고 새 프로젝트가 어디쯤에 위치하는지 점찍어 볼 수 있다.
    얼마 후에는 이 차트에서 당신의 경력이 어떤 방향으로 가고 있는지 알 수 있을 것이고, 여기에 기초해서 선택을 하기 시작할 수도 있을 것이다.

한발 물러서라

  • 무능함에 대한 두려움을 극복하는 것은 무지를 드러냄과 무지에 맞섬 사이를 이어주는 다리와 같다.
  • 무지란, 인지해서 맞선다면 나쁜 것은 아니다. 가장 나쁜 경우는 자기 무지에 대해 신경조차 쓰지 않는 것이다.
    하지만 만약 자신에게 무엇이 부족한지 알고서 그 부족함을 메우고자 노력한다면, 당신은 한 발짝 더 전진한 것이다. 탄탄한 견습과정을 이루는 토대 중 하나는 정확한 자기 평가다.

3. 긴 여정을 걷다

긴 여정

  • 이 여행이 얼마나 길어질지에 대해서는 준비가 되어 있어야 한다. 당신이 앞으로 20년은 더 일할 생각이라면, 그 어떤 일이든 해낼 수 있을 것이다.
    당신이 기예를 연마해 나갈 수십년의 세월을 생각한다면, 당신이 따라잡기 어려울 정도로 앞서 있는 사람은 없을 것이다.
    당신에게는 어떤 비즈니스 영역이나 기술 분야라도 열려 있을 것이다.
    당신의 경력 전부를 바쳐서 기예를 연마한다면, 리누스 토발즈 같은 이들을 능가하는 일이 허황되기보다는 오히려 현실적이라 할 수 있다.
    여행은 길지만, 그렇기에 당신에게열린 가능성의 수는 몇 배가 된다. (물론, 당신이 따라잡을 동안 커누스나 토발즈 같은 사람들이 제자리에 머물러 있을 리는 없다.)
  • 10년, 20년, 30년, 40년 뒤를 생각해보라. 그리고 당신의 경력에 대한 간단한 설명과 인생행로에 가장 큰 영향을 끼쳤던 일에 대해서 글을 써 달라는 요청을 받았다고 상상해 보라.

지속적인 동기 부여

  • 돈을 벌기 위한 소프트웨어와, 만들기에 재미나는 소프트웨어 사이에는 서로 겹치는 부분이 그다지 많지 않다.
  • 당신에게 동기 부여가 되는 일을 최소한 15가지 이상 적어보라. 잠시 기다렸다가 다섯 가지를 추가로 더 적어보라.
    그 중 자발적인 동기가 아니라 다른 사람의 시선을 의식해서 쓴 동기는 몇 가지나 되는가? 그 비율이 처음의 15개와 뒤의 5개 안에서 달라지는가?
    그중에서 빼더라도 괜찮을 만한 것은 몇 가지인가? 이제 당신에게 동기를 부여하는 가장 중요한 다섯 가지를 적어보라. 그 목록을 힘든 시기에 볼 수 있도록 잘 보관해 두라.

열정을 키워라

  • 무언가를 잘 하고 싶으면 그 일을 좋아해야 합니다.
  • 긴 여정을 걷는 사람들은 몇 년 정도 전력 질주한 후에 그냥 소진되어 버리는 영웅이 아니다. 그들은 수십년은 지속할 수 있는 걸음걸이로 움직이는 사람들이다.

자신만의 지도를 그려라

  • 경력을 쌓아 가는 방향은 여러 갈래가 잇겠지만, 어떤 고용주라도 그중에서 한정된 일부의 길만을 제공해줄 수 있다.
    다음 단계에 도달하고, 궁극적으로 당신이 꿈꾸는 목적지에 이르는 진로를 계획하는 일은 당신 책임이다.
  • 멋있어 보이는 단기적인 직함이나 급여를 좇는 것과, 자신의 목표와 더욱 일치하며 장기적으로는 나를 더 높은 곳으로 이끌어 줄 수 있는 직장에서 일하는 것, 그 두 가지의 상대적인 중요성을 비교해 보라.

4. 정확한 자기 평가

가장 뒤떨어진 이가 되라

  • 여우의 머리가 되기보다는 사자의 꼬리가 되어라!

마음 맞는 사람들

  • 연관된 문제를 풀기 위해 힘을 모으고 있는 인재들의 커뮤니티보다 강력한 것은 없다.

팔꿈치를 맞대고

  • 장인의 이상적인 공방이란 “수없이 많이 모여 숙련됨을 이루는 매일매일의 작은 진전”을 “암묵적이고 말로 나타내어지지 않는 지식으로 흡수하는” 장소다.
    이렇게 이상적인 환경은 지금 몹시 드물기 때문에, 우리는 그 현대적인 대체물로 팔꿈치 맞대기 패턴을 써야 한다.
    팔꿈치를 맞대고 일한 경험이 긍정적이었든 부정적이었든 간에, 당신은 배운 것을 기록해 두고 나중에 이런 경험을 돌이켜 볼 수 있어야 한다.

바닥을 쓸어라.

  • 당신은 팀의 업무에 기여하면서 신뢰를 얻고 장인의 키 높이로 성장해나가는 방법을 찾고 싶다면 단순하고 매력도 없지만 반드시 해야 하는 종류의 일에 자원하라.
    이것은 꼭 그럴 필요 없는 일이라도 당신이 훌륭하게 해낸다는 것을 보임으로써 팀의 성공에 일찍 기여하는 좋은 방법이다.
    물론 어떤 프로젝트에서라도, 재미없어 보이는 일을 대충 넘어간다면 나중에 그 부분이 실제로는 아주 중요한 것으로 드러나면서 문제를 일으킬 것이다.
  • 신참의 일은 연관된 업무의 연결 고리 중간이 아닌, 업무 프로세스 가지 끝에 위치하는 경향이 있다.
  • 비록 별 볼일 없는 일이지만 그렇게라도 기여하기 원한다는 메시지를 당신 팀에 보낼 수 있는 기회로 생각하라.
  • 만약 당신이 어떤 맥락을 알지 못한 채 이런 저런 단편적인 일만 하게 된다면, 더 큰 그림을 보는 능력을 계발하지 못할 위험도 또한 존재한다.
    이런 상황에 처해 있다면, 열정을 키우도록 노력하고, 열정을 드러내며, 스스로를 지지해서, 당신이 더 높은 수준의 업무를 맡을 자격이 있음을 증명해 보일 어떤 기회라도 잡도록 하라.
  • 견습과정에서 가능한 많은 것을 얻어내도록 시간을 들이라. 당신이 프로그래밍한지 3개월이 되어든 5년이 되었든 간에, 소프트웨어 장신정신의 관점에서는 여전히 초보자라는 사실을 이해해야 한다.

5. 끊임없는 학습

  • 큰 성취를 이루는 사람들이란 지식을 너무나 갈망하여 좋지 않은 여건에서도 그것을 탐구하는 이들이다. 여건이 좋을 때란 결코 오지 않는다.

연습, 연습, 또 연습

  • 당신의 일상적인 프로그래밍 환경에는 실수해 가면서 배울 만한 여지가 없으며, 늘 무대 위에 서 있는 것 같다면 실수해도 마음 편한 환경에서, 방해 받지 않고 기예를 연마할 시간을 확보해라.
  • 초심자는 강의가 아니라 실제로 해보면서 배운다.
  • 사실 연습은 영구적인 그 무엇을 만든다. 그러므로 스스로 무엇을 연습하는지 주의를 기울이고, 진부함으로 빠지지 않도록 끊임없이 연습에 대한 평가를 해 나가야 한다.

부서도 괜찮은 장난감

  • 당신의 한계를 넘은 곳에 발을 디디고 혼자 힘으로 완전한 소프트웨어 프로젝트를 하나 구축해 볼 기회를 의도적으로 만드는 데 더 중점을 두었다고 할 수 있다.
  • 초기 버전은 간단한 UI만 있으면 된다. 시간이 지나면서 당신은 기능도 더 추가하고 기존의 수많은 위키들과 차별화할 흥미로운 방법도 찾을 수 있을 것이다.
    기존 구현 방식에 얽매이지 말고, 당신의 직업적인 관심이 당신을 이끌도록 하라. 당신이 실험하고 학습하는 한 무엇을 하기로 결정하든 전혀 문제가 되지 않는다.

소스를 활용하라.

  • 다른 사람들의 코드를 찾아서 읽어라. 코드에서 신속히 지식을 흡수할 수 있는 사람들은 머지 않아 더 우수한 프로그래머가 된다.
  • 패턴, 관용 어법, 우수한 사례들에 대해 배우는 가장 좋은 방법은 오픈소스 코드를 읽는 것입니다. 다른 사람들이 어떻게 하는지 보십시오. 이것은 시류를 따라잡을 수 있는 훌륭한 방법인데다 무료입니다.

일하면서 성찰하라.

  • 자기 성찰은 쉽지 않은 일이지만, 우리는 자신의 성공보다 실패를 연구함으로써 더 많이 배울 수 있다고 나는 믿는다.
  • 업무 습관에 대한 ‘나의 습관 도표’를 그려 보라. 일정 기간 바뀌지 않은 습관들 사이의 연관성에 집중하라.

배운 것을 기록하라.

  • 배운 것을 기록만 하고 그냥 잊어버리는 덫에 빠지지 않게 노력하라. 당신의 공책, 블로그, 위키 같은 것은 보육원이 되어야지 묘지가 되어버리면 곤란하다.
    교훈들이 죽을 자리를 찾아오는 것이 아니라 이 기록으로부터 생겨나도록 해야 한다. 그렇게 만들려면 당신이 썼던 글을 정기적으로 다시 읽어보라.
    글을 리뷰할 때마다 새로운 연관관계를 만들어보라. 이렇게 창조적인 리뷰를 함으로써, 전에 내렸던 결정이 새 데이터에 기초해서 재평가될 수도 있고, 모호했던 신념이 확고해질 수도 있다.
    당신이 침체되지만 않는다면 둘 중 어느 쪽이라도 괜찮다. 자신의 일지를 리뷰함으로써 당신은 미래를 만들어 내기 위해 과거와 현재를 재배치할 수 있다.

배운 것을 공유하라

  • 혼자 힘으로 배우는 것과 그렇게 익힌 새 지식을 겸손하게 공유하는 것, 둘 다를 가치 있게 여기는 개인들이 모인 커뮤니티의 일원이 된다는 것은, 견습 과정이 가진 가장 강력한 측면이다.

피드백 루프를 만들어라

  • 우리 소프트웨어 업계 종사자들은 어느 정도는 눈에 보이지 않는 제품을 가지고 일하지만, 눈에 보이지 않는다는 점 때문에 피드백에 대한 필요성은 오히려 커진다.

실패하는 법을 배워라.

  • 사실 무언가를 한 번도 실패해 본 적이 없는 사람이라면, 그는 자기 능력의 한계치까지 밀어붙이기를 피해 왔거나 자기 실수를 대수롭지 않게 여기도록 배운 사람이다.
  • 끊임없는 학습은 축복으로도 저주로도 생각할 수 있다. 새로운 것을 배우는 일은 고통스러울 수 있으며, 특히 의무적으로 배워야 하거나 지도해줄 이가 없을 때 더욱 그렇다.
    하지만 격렬한 연습 후에 오는 근육통을 참고 견뎌야 하는 운동 선수처럼,
    소프트웨어 개발자는 새로운 것을 배울 때 따라오는 정신적인 부조화를 견뎌내야만 한다. 그런 부조화는 일이 잘 진행되고 있다는 표시일 수 있다.
  • 소프트웨어는 제품이 아니며, 지식을 저장하기 위한 매개물이다. 그러므로 소프트웨어 개발은 제품 생산 활동이 아니라 지식을 습득하는 활동이다.
    지식은 무지라는 동전의 다른 면일 뿐이다. 따라서 소프트웨어 개발이란 무지를 줄이는 행위라 할 수 있다.

6. 학습 과정의 구성

독서 목록

  • 배우는 사람은 자기만의 학습 계획을 스스로 세운다.
  • 지금 현재 읽고 있는 모든 책의 목록을 타이핑해 넣어라. 이것이 당신의 독서 목록이며, 이 패턴의 가장 단순한 구현 형태다. 이제 당신은 이 텍스트 파일을 최신 상태로 유지하기만 하면 된다.

더 깊이 파고들어라

  • 표면적인 지식만 가졌을 때 초래될 수 있는 또 다른 결과는, 풀려고 하는 문제에 대해 잘 알려진 해법이 있는지 혹은 실질적으로 해결이 불가능한 문제인지 전혀 모를 수가 있다는 것이다.
    수박 겉핥기식으로만 해서는 지금 모르는 것을 앞으로도 모를 것이며, 자기 지식의 한계가 어디까지인지 이해하지 않고 새로운 것을 깨달을 수는 없다.
  • 이 패턴을 정기적으로 실천한다면, 당신은 자기 도구가 어떻게 동작하는지 진정으로 이해하는 사람들 중 하나가 될 것이다.
    당신은 더 이상 코드 조각을 짜깁기 해놓고서 일이 되게 하려고 다른 사람들이 마법을 부려 주기를 바라지는 않을 것이다.
    하지만 주의할 점이 있다. 당신은 같이 일하는 프로그래머들 대부분과 구별될 것이고, 그 논리적인 귀결로 가장 어려운 과제를 맡게 될 것이라는 점이다.
    그 결과 당신은 완전히 실패하거나 눈부시게 성공하거나 둘 중 하나가 될 가능성이 크다. 덧붙이자면, 이런 지식을 얻었다고 거만을 부려서는 안 된다.
    그러는 대신에 가장 뒤떨어진 사람이 될 기회를 계속 찾아라. 사물을 분석적으로 보는 능력에 안주하지 말고, 그런 기초적인 구성요소를 가지고 유용한 도구를 만드는 일에 한번 도전해 보라.

출처

  • 데이브 후버/ 애디웨일 오시나이, 프로그래머의 길, 멘토에게 묻다(인사이트, 2021)

Written by
Sunmin
어제보다 나은 오늘을 만들기 위해 배우고, 기록하고, 회고합니다. Maker. Reader. Realistic optimist.