[Book] 프로그래머의 길, 멘토에게 묻다 - 5장 끊임없는 학습
학습을 하는 법 1
소프트 웨어 개발이란 ‘학습과 의사소통’의 두 가지 기본 활동으로 이루어진다. - 앤디 헌트
배움이란, 숙달의 경지로 향하는 ‘긴 여정’에 오른 이들에게는 영속적인 활동인 것이다.
능력의 폭을 넓혀라
견습생 과정에선 효과적으로 개발을 학습하는 방법을 배워야 한다.
개발을 학습하는 여러 방법
기본서 및 온라인 강의와 영상을 통한 학습은 기본 베이스이다.
지역에서 모이는 사용자 그룹에 참석하자.
관련된 국내 컨퍼런스 중 참석하고 싶은 것이 있는지 조사하자.
컨퍼런스의 연사 중 한 사람이 지은 책을 읽고, 몇 가지 질문을 담은 메일을 보내자.
구글 리더 같은 블로그 모아보기 사이트에 가입하자.
트위터에서 유명 개발자들을 팔로우하고 그들이 관심을 쏟는 분야에 주의를 기울이자.
활동이 적당히 활발한 톡방이든 어디든 참여해서, 사람들이 올린 이슈를 재현하고 해결책을 제시해보자.
관심도와 열정의 유지, 그리고 나의 단점 (나의 생각)
사실 책에서 위의 내용처럼 학습하는 여러 방법을 소개해 주고있다.
하지만 개발에 정말 흥미와 열정 그리고 관심을 가지고 있다면, 스스로 알아서 찾을 수 있는 방법들이라 생각한다.
오히려 커뮤니티나 모임, 컨퍼런스 같은 곳에 가는 방법들을, 열정과 상관없이 못쓰는 경우가 있다. 이유는,
- 내가 아직 그런 모임이나 커뮤니티에 참석할만한 기본적인 실력도 되지 않을 것으로 생각하기 때문이다.
- 많은 사람들을 만나는 것 자체에 많은 에너지를 뺏기는 편이기 때문이다.
그래도 나의 이러한 점들은 분명한 단점이고 고쳐나가야 할 부분이라 생각한다.
- 개발자는 실력만큼이나 많은 사람들과의 커뮤니케이션 능력도 굉장히 중요하다고 생각하기 때문이다.
관심도와 열정을 최대한 유지하도록 노력함과 동시에 나의 단점도 고쳐나가도록 노력하자.
연습, 연습, 또 연습
실수해도 마음 편한 환경에서, 방해받지 않고 기예를 연마할 시간을 확보해야 한다.
- 그게 힘들다면, 직업적인 일과 연습을 구분할 방법을 모색한 뒤에 업무 중 연습을 진행해야 한다.
- 이 방법은 개인적으로 위험할 수 있으니 되도록 하지 않는 것이 좋을 듯 싶다..ㅋ
- 그게 힘들다면, 직업적인 일과 연습을 구분할 방법을 모색한 뒤에 업무 중 연습을 진행해야 한다.
요점은 스트레스 없고 쾌활한 분위기에서 소프트웨어를 개발할 수 있는 시간을 스스로 개척하는 것이다.
연습 시간에 짧은 피드백 루프를 넣어야 한다.
- 주기적인 피드백을 받지 못하면, 오히려 나쁜 습관을 들일 수도 있다.
스스로 무엇을 연습하는지 주의를 기울이고, 진부함으로 빠지지 않도록 끊임없이 연습에 대한 평가를 해나가야 한다.
- 마스터들이 연습하기를 좋아하는 이유 중 하나는, 연습을 할 때마다 뭔가를 조금씩 달리 하기 때문이다.
- 기억에 의존해서 기술을 연마하지 않고, 끊임없이 미묘한 차이를 발견해 낸다.
효율성을 논하려면 절대적인 연습량이 기본적으로 받쳐줘야 한다. (나의 생각)
내가 중학생때부터 22살까지 드럼을 전공하면서 느낀 바가 있다.
기본적인 연습량이 받쳐주지도 않으면서 효율성을 논하는 것은 미련한 짓이라는 것이다.
- 연습의 ‘효율성’은 기본적인 연습량 안에서 시행착오를 거듭하면서 찾아가는 것이지, 처음부터 완벽하게 구성할 수 없다. 절대로.
지금은 개발 공부를 하면서 운동도 같이 하고 있지만, 처음 운동 시작할 때 어떻게 운동해야 효율적인지 찾아보기에만 바빴다.
- 그걸 이틀정도 하다보니 깨달은 것은, 이럴 시간에 직접 가서 한 세트라도 직접 해보며 조정해나가는 것이 좋다는 것이다.
- 그대로 바로 헬스장에 가서 운동을 하니, 그제서야 어떻게 해야 올바른 자세인지, 효율적인지에 대한 방향이 직접적으로 잡히기 시작햇다.
깨달은 것을 끝까지 기억하자. 효율성은 우직한 연습량에서부터 나온다는 것을.
부숴도 괜찮은 장난감
경험이란 성공할 때만큼은 아니겠지만 실패로부터도 쌓인다.
오직 과감한 일을 하고, 실패하고, 그 실패로부터 학습하고, 또 다시 시도해야만 어려운 문제를 해결해 나갈 사람으로 성장할 수 있다.
업무 때와 비슷한 도구를 써서, 업무 때 구축하는 시스템 범위에는 들지 않는 토이 시스템을 설계하고 구현하여 실패해 볼 수 있는 여지를 만들어라.
- 물론 그것들은 본시 장난감이며 그러므로 재미있어야 한다는 것을 잊지 말자.
토이 프로젝트 (나의 생각)
내가 가장 좋아하는 학습 방법이고, 가장 효율적인 학습방법이라 생각하는 방법이다.
- 그리고 이 책에서도 이 방법을 굉장히 강추한다.
국비학원에서 수업을 들을 때와 직접 프로젝트를 진행해 나갈 때, 나의 실력 향상의 속도가 완전히 다르다는 것을 체감했다.
- 당연히 프로젝트에 열심히 임했다는 조건이 있다.
내가 왜 이 부분을 학습해야 하는지, 실제론 어떤식으로 쓰이는지 등등 너무나 중요한 부분들을 학습하게 된다.
가장 중요한 점은, 정말 개발에 관심이 있는 사람이라면 토이 프로젝트는 재미가 있다.
- 이것이 가장 큰 학습 유지의 원동력이 아닐까 싶다.
소스를 활용하라
오픈소스를 통해 다른 사람들의 코드를 찾아서 읽어라.
- 내가 짠 코드가 제대로 짠 것인지 스스로 구별할 수 있는 유일한 방법이다.
- 그들처럼 프로그래밍 하는 법을 배우게 된다.
이런 과정은 다른 이들의 실수를 통해 배우기 때문에 ‘가르침 받지 않고서도 배우는 능력’을 얻을 수 있다.
이때까지 태어난 모든 프로그래머가 작성한 코드 한 줄 한 줄이 모두 나의 스승이다.
알고리즘이 복잡한 오픈소스 프로젝트를 하나 골라서 공부해보자. (Git 프로젝트 같은 것들)
레거시 코드를 분석하는 능력의 중요성 (나의 생각)
사실 난 오픈 소스를 이용해 학습하는 방법을 꺼려했다.
- 이미 짜여진 코드들을 분석하는 일이 어렵게 느껴졌기 때문이다.
하지만 요즘 이 책에서든 다른 학습 루트에서든 많이 듣는 내용은, 다른 사람의 코드들을 분석하는 능력이 굉장히 중요하다는 것이다.
- 이 능력이 있다면, 굳이 다른 곳이 아닌 오픈소스에서 스스로 학습해 나갈 수 있는 엄청난 능력이 생기기 때문이다.
- 그리고 실력 좋은 많은 개발자들의 노하우와 지식을 스스로 습득할 수 있다.
나도 어서 지금 하고 있는 기본 공부를 졸업하고 오픈소스를 분석하는 능력을 키워나가고 싶다.
일하면서 성찰하라
사색하는 소프트웨어 개발자가 되어라.
- 일상에서 내가 어떻게 일하고 있는지 스스로 성찰해야 한다.
승진에 스스로 대비하고 있지 않다면, 어느 순간 ‘피터의 법칙’의 희생자가 되어있을 것이다.
- 피터의 법칙 : 조직에서 일하는 모든 사람은 자신의 무능력 수준에 도달할 때까지 승진한다.
‘나의 습관 도표’같은 것을 만들고 사용하자.
- 자신의 습관을 기록한 구체적이고 가시적인 도표이다.
- 이것이 있다면, 자신이 사용하는 기법을 바꿨을 때 가져오는 효과에 대해 더 깊이 성찰하게 된다.
내 팀의 숙련공들과 마스터급 장인들의 훈련, 프로세스, 사용하는 테크닉을 분석하자.
- 그리고 나의 경험과 연관지을 수 있는 부분이 있을지 생각해보자.
‘반경험’이란 해마다 쌓이는 ‘경험’이라는 것이 나쁜 습관을 더해주는 것에 지나지 않게 되는 현상이다.
- 이것이 경험을 쌓기보다 숙련됨에 목표를 두어야 하는 이유다.
기본적인 연습량 위에서의 효율성 (나의 생각)
연습, 연습, 또 연습 패턴에서 기본적인 연습량에 대한 강조라면, 이 패턴은 효율성에 대한 강조라고 생각한다.
기본적인 연습량이 받쳐준다면, 이젠 내가 정말 제대로 연습하고 있는가에 대해 성찰해야 할 시간이다.
난 현재 nextstep 의 TDD, 클린 코드 with Java 15기 를 진행중에 있다.
- 이 과정을 시작한 가장 큰 이유는, 자기 주도적인 학습과 함께 이 책에서 그렇게 강조하는 신속하고 정확한 피드백이 공존하기 때문이다.
- 견습생이 학습하기에 정말 최적의 교육코스라고 생각했기에, 금액이 좀 부담되더라도 고민없이 신청하게 되었다.
지금도 한창 학습을 진행중이지만 굉장히 만족하고 있다.
- 평소에 검색해도 잘 안나오고, 물어볼 곳도 잘 없는 그러한 상세 부분들까지 리뷰어들에게 바로바로 질문하고 피드백 받는 것이 가능하다.
- 그리고 나의 질문 외에도, 내가 예상치 못한 수많은 곳에서 정말 질 좋은 피드백을 많이 해주신다.
이러한 교육코스가 만들어지는 데엔, 이 교육 코스를 만드신 박재성님이 ‘장인정신’을 가지고 계시기 때문이라 생각한다.
앞으로도 이러한 효율적인 학습 기회들을 더욱 놓치지 말고 잡아가려고 노력할 것이다.
배운 것을 기록하라
내가 걸어가는 여정의 기록을 일지나 개인 위키, 블로그 등으로 남겨라.
- 내가 멘토링하는 사람들에게 영감을 줄 수 있다.
- 내가 의지할 소중한 자원이다.
- 마음 맞는 사람들을 만날 수 있다는 부수적인 이점이 있다.
배운 것을 기록만 하고 그냥 잊어버리는 덫에 빠지지 않게 노력하라
내가 썼던 글을 정기적으로 다시 읽어라.
자신의 일지를 리뷰함으로써, 미래를 만들어 내기 위해 과거와 현재를 재배치 할 수 있다.
기술 블로그의 용도 (나의 생각)
사실 처음 기술 블로그를 운영하려 생각했던 계기는, 취업할 때 내 학습들의 증거물로 쓰기 위함이었다.
- 하지만 나의 학습 내용들이 하나 둘 씩 쌓여가는 것을 보면서, 곡식 창고에 곡식이 차곡차곡 쌓이듯 내 마음이 풍성하게 채워지는 느낌을 받았다.
- ‘내가 이러한 학습들을 했었구나.’
- ‘내가 이만큼 노력을 했구나. 기특하다.’
- ‘이러한 점을 학습했었는데 제대로 활용 못하고 있었네. 고치자.’
- ‘이땐 이 내용을 이런식으로 받아들였었구나.’
나의 학습 기록은 단순한 증거물에 그치지 않는다.
이 책에서 말하듯, 나의 ‘긴 여정’에 있어서 내가 의지할 소중한 자원이다.
배운 것을 공유하라
배운 것을 정기적으로 공유하는 습관을 견습과정 초기에 들여 놓아라.
- 블로그 운영
- ‘마음 맞는 사람들’ 끼리의 모임
동료 견습생들은 자신들 중 누군가가 복잡한 주제에 대해 알기 쉽도록 설명해 주려 애쓴다면 고맙게 여길 것이다.
스스로 하는 공부와 그렇게 익힌 지식을 겸손하게 공유하는 것, 둘 다를 가치있게 여기는 개인들이 모인 커뮤니티의 일원이 되자.
- 이것이 견습 과정이 가진 가장 강력한 측면이다.
누군가를 가르칠 때가 가르침 받을 때보다 더 많이 배운다.
지식 공유에 대한 중요성 (나의 생각)
- 향로님과 호돌맨님이 운영하시는 유튜브 ‘개발바닥’에서 오늘 올라온 영상, ‘외부활동만 하는 입개발자’ 를 보았다.
- 이 영상의 주제가 딱 공유에 대한 중요성에 대한 것이다.
- 이 영상을 찍게 된 이유는 컨퍼런스나 책 출간과 같은 외부활동 즉, 지식 공유를 하는 개발자들에 대한 안좋은 인식 때문이라고 한다.
- 자기 회사에서도 할 일이 많을텐데 그런 외부활동을 할 시간이 있냐는 것이다.
- 그러한 외부활동, 지식 공유를 많이 하는 사람들은 실력이 떨어지는 개발자일 것이라는 편견이 생긴다고 한다.
- 난 그 의견에 절대 동의하지 않는다.
- 그러한 활동들이 자신의 개발 공부의 한 방법일 수 있다.
- 개발의 세상은 지식 공유의 문화로 인해 빠르게 발전해왔다.
- 외부활동을 하는 개발자들이라고 실력이 떨어질 것이라는 것은 편견에 불과하다.
- 난 오히려 그러한 활동을 하는 사람들이 존경스럽다.
- 이기적으로 자신의 지식을 퍼주지 않을 수도 있는데 그러한 시간을 따로 떼서 기여를 한다고 생각하는 것이라 생각하기 때문이다.
- 나도 숙련공, 장인의 수준 혹은 견습생이라 할지라도 내가 가치있는 무언가를 깨닫게 된다면, 외부활동을 적극적으로 할 생각이다.
- 그것이 세상의 소프트웨어 세계에 선한 영향력을 끼치는 일이기 때문이다.
- 향로님과 호돌맨님이 운영하시는 유튜브 ‘개발바닥’에서 오늘 올라온 영상, ‘외부활동만 하는 입개발자’ 를 보았다.
피드백 루프를 만들어라
나의 수행 능력을 평가하는 데 어느 정도 객관성 있는 외부 데이터를 정기적으로 수집할 방안을 마련하자.
- 일찍, 자주, 효과적으로 피드백을 얻으려 애쓸수록, 나의 무능함을 자각할 가능성을 높인다.
유용한 피드백을 구별하는 능력이 있어야 한다.
- 나쁜 피드백 종류
- 비판
- 나에게 무엇을 기대하는지 아무것도 얘기해 주지 않는다.
- 내가 아닌 다른 사람에 대한 얘기
- ex) “내가 자네 나이 때에 그랬으니, 그렇게 하세”
- 흔히 ‘스톱 에너지’ 라고 한다.
- 내가 왜 목표를 달성할 수 없고 왜 실패를 감수하기보다 지금 즉시 포기하는 것이 좋은지 이야기한다.
- 비판
- 유용한 피드백이란??
- 그것을 기반으로 삼아 실천할 수 있는 데이터이다.
- 특정한 행위를 더 하거나 덜 하도록 선택의 여지를 주는 데이터다.
- 나쁜 피드백 종류
성공적인 견습생들은, 어떤 행동을 더 하고 덜 할지 결정하기 위한 데이터를 신속하고 자주 얻는 상황을 조성하는 법을 배운다.
nextstep (나의 생각)
- 현재의 나에게 피드백 루프는 nextstep 교육과정인 TDD, 클린 코드 with Java 이다.
- 사실 nextstep 의 교육 철학이 ‘장인 정신’ 에 굉장히 부합하다고 느낀다.
- 물론 아직까진 피드백 루프를 nextstep 밖에 찾진 못했다.
- 온라인 강의들도 엄밀히 따지면 결국 피드백 루프는 아니기 때문이다.
- 그러나 앞으로도 지속해서 피드백 루프를 찾고 만들기 위해 노력할 것이다.
- 돈이 들든, 시간이 들든 피드백의 중요성을 알고 있기 때문이다.
- 현재의 나에게 피드백 루프는 nextstep 교육과정인 TDD, 클린 코드 with Java 이다.
실패하는 법을 배워라
내가 어떤 식으로 실패하는지 확인하고, 고칠 부분은 바로 잡아라.
- 이 패턴의 목표는 나를 실패로 이끌어 가는 방식, 조건, 습관, 행동 양식이 무엇인지 스스로 인식하는 데 있다.
무엇이 내 발목을 잡는지 알게 되면, 그런 문제를 고치거나 그냥 털어버리거나 선택할 수가 있다.
실패를 대하는 자세 (나의 생각)
- 한국이 특히 실패에 대한 두려움이 크다고 생각한다.
- 성공을 하기 위해선 당연히 실패의 과정을 거쳐야 하는것을 알고 있음에도 말이다.
- 나는 어떠한가 되돌아 봤을 때, 나조차도 실패에 대한 두려움에서 자유롭지 못하다.
- 하지만 내가 감당할 수 있는 규모로 시도를 계속 하고 나의 레벨을 올려나가면 된다고 생각한다.
- 많은 성공한 사람들의 공통적인 이야기이기도 하다.
- 어떤 사업을 할 때도, 회사 면접을 볼 때도, 공부를 할 때도, 그 외의 어떠한 것에서도 마찬가지라 생각한다.
- 나의 ‘실패에 대한 인식’ 부터 고쳐야 한다는 것이 가장 크게 느껴진다.
- 한국이 특히 실패에 대한 두려움이 크다고 생각한다.
장을 마치며
근육통을 참고 견뎌야 하는 운동 선수처럼, 개발자는 새로운 것을 배울 때 따라오는 정신적인 부조화를 견뎌야 한다.
- 그런 부조화는 실력이 높아지는 표시일 수 있다.
무지를 줄이는 다른 대안은 내가 이미 알고 있는 것에만 오로지 집중하는 것이다.
- 이 길은 ‘장인정신’ 의 길이 아닌 전문적인 어떤 영역에 특화되는 전문가의 길이다.
몰입 (나의 생각)
- 어떤 실력, 기량을 높이기 위해선 근육통, 성장통을 겪어야 한다.
- 운동선수든 개발자든 어떤 분야든 마찬가지이다.
- 그리고 그러한 성장은 ‘몰입’을 통해 많이 일어나게 된다.
- 여러 몰입에 관한 책에서 말하는 몰입이 될 수 있는 조건이 있다.
- 자신의 수준보다 좀 더 높은 수준에서 공부를 해나가야 한다는 것이다.
- 너무 낮은 수준의 공부도, 너무 높은 수준의 공부도 몰입이 될 수 없다.
- 이러한 공부는 당연히 정신적, 물리적 인내력을 발휘해야 한다.
- 하지만 이것이 성장의 지름길임에는 틀림이 없는 사실이다.
- 피할 수 없으면 즐겨라.
- 어떤 실력, 기량을 높이기 위해선 근육통, 성장통을 겪어야 한다.