💡 Intro

  • 개발바닥의 김영한님 편을 보다가 꼭 추천하실 책이 김창준님의 함께 자라기라고 하셔서 바로 주문했다.
  • 이 책을 읽으면서 얻고 싶은 것은 3가지였다.
    • 내가 지금 성장하고 있는 방법이 잘 하고 있는 방법인가
    • 요즘 그렇게도 강조하는 ‘함께’라는 것이 개발자에게는 어떤 의미인가
    • 최근 진행한 7명 팀 프로젝트를 더 잘 할 수 있는 부분은 무엇이 있었을까
  • 이 글은 첫번째 파트인 자라기 파트이다.

🌱 자라기

시간에 비례하여 실력이 상승하지 않는다. 중요한 것은 얼마나 오랜 기간 학습했느냐보다 얼마나 많은 의도적 수련을 했는지다. 업무를 하면서 의도적 수련을 할 수 있는 방법은 애자일 철학을 활용하는 것이다.

애자일에서 학습은 소프트웨어 개발에 큰 병목 중 하나이다. 그 이유는 일반 프로젝트에서 피드백의 주기가 느려서 결정을 내리고 학습을 한 후 다시 피드백을 받응ㄹ 시기에 이전에 내린 결정에 대한 이유를 기억하기 어렵다.

하지만 애자일 프로젝트에서는 당장 한 행동에 대한 피드백을 10분, 한시간, 하루 주기로 빠르고 지속적으로 받아 다음 주기에 교정할 수 있다.

1) 피드백을 짧은 주기로 얻는 것 2) 실수를 교정할 기회가 있는 것이 학습에 중요한 요소이다.

실력이 좋은 사람은 당시에 어떤 결정을 어떠한 이유로 내렸는지 자세히 기록하고 나중에 다시 확인하여 피드백을 반드시 얻는다.


자기계발은 복리로 돌아온다

꾸준히 자기계발에 시간을 쏟으면 그것이 1년, 2년 뒤에 성장해서 돌아온다. 지식이나 능력은 복리로 이자가 붙는다.

이러한 복리의 원칙은 개인 뿐 아니라 조직에도 연관이 있다. 복리 조직은 첫 주기 만든 결과물로 다음 주기에 더 좋은 위치에서 다음 결과물을 만들어낸다. 결과물이 다음 단계의 도구가 된다.

A, B, C 작업으로 진행해라. A는 첫 작업, B는 개선하는 작업, C는 개선 작업을 개선하는 것이다.

그러기 위해서는 개인이나 조직에서 더하기보다 곱하기를 해야한다.

  1. 자신이 이미 가지고 있는 것들을 잘 활용하라
    • 새로운 것을 유입하기보다 이미 가지고 있는 것을 연결하여 시너지 효과가 나게 한다.
    • 새로운 것은 이미 가지고 있는 것과 연결하도록 해라
  2. 외부 물질을 체화하라
    • 하지만 내부 순환만 하면 수렴할 위험이 있기 때문에 외부 자극을 받으면 좋다.
    • 하지만 외부 자극을 빨리 자기화 해야 한다.
  3. 자신을 개선하는 프로세스에 대해 생각해 보라
    • A를 돌아보는 회고/반성 활동을 주기적으로 해라.
    • 나를 개선하는 과정을 어떻게 개선할지 고민해라.
  4. 피드백을 자주 받아라
    • 사이클 주기를 짧게 두어서 작은 실험을 해 순환율을 높여라.
    • 일찍, 자주 실패해라. 실패에서 학습하라
  5. 자신의 능력을 높여주는 도구와 환경을 점진적으로 만들어라.
    • 완벽한 환경에서 시작하기 보다 점진적으로 자신의 환경을 개선시켜라.
    • 완벽한 환경은 어느날 갖추어지기는 어렵다.

학습 프레임 vs. 실행 프레임

학습 프레임은 학습을 하고 성장하기 위한 것에 초점이 맞추어져 있고, 실행 프레임은 잘하고자 하는 것에 초점이 맞추어져 있다. 실행 프레임은 목표를 달성하고 나면 더이상 이야기하지 않고, 학습 프레임은 지속적으로 관심을 가지고 하는 경향이 있다.

업무를 하거난 학습하기 어려운 조건이라고 하더라도 학습과 성장의 기회를 찾고 그 조건에서 자신에게 유리한 조건을 찾는 사람이 있다.

“업무적으로 꼭 해야하는 건 아니지만 당신이 도와주는 사람은 누구이고, 또 당신이 도움을 요청하는 사람은 누구입니까?”라고 했을 때 업무 성과가 좋은 사람들이 더 좋은 대답을 한다.

똑같은 1년차도, 1년차 밖에 되지 않아서 혼자 코드와 책을 보며 공부하는 사람이 있고, 1년차 밖에 되지 않아서 많은 사람들에게 물어보고 많은 스터디를 하고 부딪히며 도움을 주려고 하는 사람이 있다. 후자가 더 많은 잠재력이 있다.


달인이 되는 비결

  • 명확한 동기
  • 피드백 제때 받기

전문성을 높이는 방법

  • 타당성(어떠한 일을 하는데 규칙이나 인과관계)과 피드백이 있어야 한다.
  • 일하는 방식과 개발하는 방식을 바꿔서 타당성과 피드백을 높여야 한다.
    • 타당성을 높이기 위해 변수를 제한하고 실험을 하면서 규칙성과 인과관계를 찾으려고 노력해야한다.
    • 상사, 고객 등에게 적극적으로 피드백을 요청한다.

당신이 제자리걸음인 이유

  • 실력을 높이기 위해서는 의도적 수련이 중요하다.
    • 의도적 수련이 되려면 현재 나의 실력과 작업의 난이도가 비슷해야한다.
    • 난이도와 실력이 엇비슷해야 몰입을 경험할 수 있다.
    • i + 1 처럼 딱 한단계 높은 수준으로 학습해야 유의미하게 진전한다.
  • 실력이 늘지 않는 이유는 너무 난이도가 낮아 지루한 환경에 있거나 너무 어려워 의욕을 잃는 환경에 있기 때문이다. 뛰어난 사람들은 자신의 실력보다 조금 더 어려운 것에 끝임없이 도전한다.

제자리걸음에서 벗어나기

현재 난이도가 낮아서 지루함을 느끼는 경우

  1. 실력 낮추기: 평소에 쓰는 보조도구 없애거나 실력을 발휘하기 어려운 환경 만들어서 도전하기
  2. 난이도 높이기: 남들보다 일을 더 효율적으로 하기 위해 직접 나만의 도구 만들어서 활용하기 등등

현재 난이도가 높아서 불안함을 느끼는 경우

  1. 실력 높이기:
    1. 사회적 접근: 나보다 뛰어난 전문가의 도움을 받기 (인터넷, 책, 상사 등등)
    2. 도구적 접근: 좋은 도구의 도움 받기. 디버거, 코드 분석툴, 라이브러리 등등
    3. 내관적 접근: 비슷한 일을 했던 경험을 되살려 비유적으로 문제를 해결
  2. 난이도 낮추기:
    1. 먼저 자신이 맡은 일의 가장 간단한 아기 버전을 첫번째 목표로 삼기. 낮은 난이도에 먼저 도전한 그룹이 더 정확도가 높다.

동적인 균형

메타인지 전략: 난이도와 실력은 계속 바뀐다. 중요한 것은 자신의 상태(지루한지 불안한지)를 지속적으로 체크하고 알아차리는 것이 꼭 필요하다.


프로그래밍 언어 배우기의 달인

인지적 작업 분석을 한다. 프로그래밍 언어를 배울 때 어떻게 효과적으로 배울 수 있을까?

  1. 튜토리얼을 읽을 때 뭘 만들지 생각하고 읽는다.
    • 적극적 읽기를 한다 - 작성할 프로그램을 염두에 두고 읽다가 프로그램을 만들 수 있으면 멈추고 만든 후에 다음에 만들 것을 생각하고 돌아온다. 무언가를 읽을 때 구체적인 질문이나 목적을 가지고 있는 방법이다.
  2. 공부할 때 표준 라이브러리 소스코드를 읽는다.
    • 실제 해당 언어의 스타일을 따르는 사용례이므로 해당 언어의 표준 라이브러리 코드를 읽는 것이 좋다.
  3. 공부 중 다른 사람의 코드에 내가 필요한 기능을 추가한다.
    • 자신이 필요한 기능을 직접 추가하여 사용해보는 것이다.
    • 이때 중요한 것은 초기 단계에 내가 추가할 수 있는 작고 간단한 추가 기능을 생각해내는 것이다.

이렇듯 이미 잘하고 있는 사람에게서 많은 것을 배울 수 있다. 하지만 전문가에게 단순히 잘하는 방법에 대해서 물어보면 유의미한 대답을 얻기는 힘들다. 구체적인 사건에 대해서 말하도록 유도하고 그 안에서 잘하는 방법을 파악할 수 있도록 이끌어내는 것도 중요하다. (예를들어 제일 최근에 배운 언어는 무엇이고 어떻게 학습했는지 물어보는 것.)


실수는 예방하는 것이 아니라 관리하는 것이다

실수 예방은 실수가 생기지 않도록 계속 주의하는 것이다.

실수 관리는 실수를 했을 때 그것이 나쁜 결과가 되기 전에 얼른 발견하여 고치고 그것에 대해서 학습하는 것이다.

실수 예방 문화에서는 실수가 일어나면 당사자를 비난하고 처벌하여 협력하거나 실수에 대해서 논의하기를 꺼리게 된다. 실수 관리는 나쁜 결과 이전에 회복하도록 돕고, 실수를 공개하고, 그것에 대해서 이야기하며 고치도록 하는 분위기가 형성된다.

다양한 실수를 경험하고 그 사례를 배워서 어떻게 대처해야하는지 배우는 것이 더 중요하다. 예방법보다 대처법을 배우자.


나홀로 전문가에 대한 미신

  • 좋은 기술에 대한 전문가가 가서 그것을 적용하면 성공적으로 변화가 이루어질 것이라고 생각하는 것은 미신이다.
  • 성공적으로 좋은 기술이 한 사람에 의해서 어떤 팀에 전파가 되기 위해서는 사회적 자본과 기술이 필요하다.
    • 팀원들을 설득하고 주변에 물어봐서 도움을 받을 수 있어야 한다.
    • 주변에서 그것이 왜 필요하고 좋은지 인지하지 못한다면 아무리 좋은 것이라도 적용하게 되기 힘들다.
  • 사람 사이에는 신뢰가 있어야 하며 그것으로 인해 변화를 일으킬 수 있다. 그 신뢰가 사회적 자본이다.
    • 사회적 기술이 뛰어나서 사람 사이에 신뢰를 잘 구축하며 커뮤니케이션한다.
  • 따라서 전문가는 기술에 더해서 사회적 자본과 사회적 기술이 뛰어난 사람이다 ‼️
    • 뛰어난 소프트웨어 개발자일수록 타인과 인터랙션에 더 많은 시간을 쓴다.
    • 전문가는 고독한 천재가 아니다.
  • 어떤 기술적 지식을 전달할 때 사회적 맥락 속에서 가르치고 경험하게 하도록 노력해야한다.
    • 도움받기, 피드백 주고받기, 영향력 미치기, 가르치고 배우기, 위임하기 등등.
  • 그 조직에 신뢰를 받아야지 필요한 기술을 전파하고 적용할 수 있다. 프로그래밍 능력 중 커뮤니케이션은 필수 부분이다.

🛋 느낀 점

  • 잦은 피드백과 실수를 교정하는 것!! 자라기 파트를 관통하는 두 키워드이다 .
  • 스스로에 대한 회고, 다른사람이 주는 피드백, 실수를 했을 때 자책보다 문제에 집중하여 실수를 관리하는 것이 매우 중요하다.
  • 나는 내 스스로를 좀 몰아세우면서 학습하는 스타일인데, 개발은 그렇게 학습했을 때 프로그래밍에 대한 흥미만 떨어지고 추진력을 얻지 못했다. 이 책에서 말한 것처럼 적절한 난이도에 메타인지와 점진적인 개선을 통해서 멘탈도 관리하며 성장하는 것이 중요한 것 같다는 것이 절실히 느껴졌다.
  • 마지막에 책에서 “뛰어난 소프트웨어 개발자일수록 타인과 인터랙션에 더 많은 시간을 쓴다”, “이제는 프로그래밍을 잘한다는 정의 안에 의사소통 능력을 그 일부로 보게 된 겁니다” 라는 문장이 굉장히 임팩트 있었다.
    • 기술에는 사회적 자본(신뢰)이 뒷받침 되어야 한다. 그렇지 않으면 해당 기술이 얼마나 좋은지는 소용이 없어질 수도 있다.