학습은 애자일하게 해야 한다.
•
일반적으로 프로젝트에 있어서 애자일 기법의 특징은 다음과 같다.
◦
실질적인 코딩을 통한 프로토타입을 만들어내며 그때그때 피드백을 반영한다.
•
학습을 애자일하게 한다면 특징은 다음과 같아질 것이다.
◦
실질적인 코딩을 통한 프로토타입을 만들어내며 필요한 학습에 대하여 덧붙이고 수정하는 것을 수행하는 방법
•
즉 직접 만들어 보는 작업을 통해 학습하는 것이 애자일 프로그래밍 학습이라는 것이다.
⇒ 기존에 알고 있었던 GPAM을 활용하라는 느낌을 받았다.
•
애자일이란 무엇일까?
◦
애자일에는 스크럼, 칸반 등의 대표적인 기법들인 존재한다.
▪
스크럼
•
스크럼은 럭비에서 나온 용어로 공격 진영의 선수들이 공을 중심으로 어깨와 머리를 맞대고 있는 모습이 하나의 팀이 서비스 개발을 위해 머리를 맞대고 있는 모습과 유사하다하여 붙여지게 되었다.
•
일하는 방식이 럭비와 매우 유사한데, 럭비는 주어진 공격권에 조금씩 나아가 최종적으로 목표에 도달해야 점수를 얻는다. 스크럼도 주어진 기회에 최소한의 목표를 정하고 이를 달성해 나가며 최종적인 목표로 나아간다.
•
스크럼의 목표는 제품의 완성에 있다. 제품을 만들기 위해서 반드시 필요한 작업들이 있는데 이를 프로덕트 백로그라고 한다. → 요구사항에 대입해서 이해했다.
•
럭비에서 한 번의 공격권이 주어졌을 때, 목표를 정해 전략을 결정하듯이 스크럼도 한 번의 스프린트 목표를 정하고 이를 이루기 위한 전략을 수립한다.
•
공격이 끝나면 작전의 성공여부와 무엇이 적절했는지 작전타임을 가지기도 하는데, 이는 스크럼에서 스프린트 리뷰와 스프린트 회고와 유사하다.
•
럭비는 스포츠이기 때문에 감독, 코치 등이 존재하는데 스크럼에도 감독 역할을 담당하는 프로덕트 오너와 코치 역할을 담당하는 스크럼 마스터가 존재한다.
▪
칸반
•
스크럼의 경우, 어느정도 형식이 갖춰졌다면 칸반의 경우, 진행사항을 쉽게 파악하기 위해서 특화한 방법론으로 볼 수 있다.
•
칸반은 토요타라는 회사에서 사용한 방식으로 일의 진행상태를 시각화하여 표현해 이를 통해 일의 진행상태를 공유하고 관리하기 위한 방식이다.
◦
스크럼과 칸반은 일하는 방식에 대한 방법론이다. 일은 더 넓은 범위에서 목표를 달성하는 일이고 공부는 좁은 범위에서 목표를 달성하는 일이므로 충분히 이를 공부법에 적용시킬 수 있다.
◦
스크럼에서 차용해, 큰 목표에서 작은 목표를 정하고 이를 달성하는 방식이다.
◦
칸반은 학습을 진행하면서 학습할 것, 학습하고 있는 것, 학습이 잘 안되는 것 등으로 세분화하여 구분해 학습 상황을 파악하는데 용이하게 하는 것이다.
•
왜 애자일하게 해야하는가?에 대한 답을 충분히 줄 수 있었던 부분이었다.
•
빠르게 시도하고 실패해야하는 과정에서, 스크럼과 칸반의 방법을 차용해 본인의 목표를 정하거나 상황을 명확하게 규정하고 주변의 피드백을 통해 빠르게 개선하라는 것이다.
•
이때문에 다른 사람과 함께 학습하는 것을 예시로 들어주셨다.
목표는 목적지가 아니라 첫걸음 자체가 되어야
•
저자는 실제로 시도해보면서 다양한 지식들을 활용하는 것이 제대로된 프로그래밍 공부법이라고 생각한다.
•
그러기 위해서는 본인에게 적합한 공부법을 가지고 있어야 하는데, 첫 단계가 구체적인 목표를 세우는 것이다.
•
이 장에서는 목표 설정 및 관리에 대한 이야기를 다룬다. 이는 학습의 첫걸음이며 지속적으로 관리되어야하는 것이다.
•
구체적인 목표가 없거나 많은 학습 목표로 인하여 학습을 멈추거나 포기할 수 있다.
•
구체적인 목표를 수립하라, 학습의 목적을 토대로한 학습의 목표를 구체적으로 설정하자.
◦
목표를 구체화하면 필요한 학습 대상이 규명된다. 무엇을 다루어야하고 무엇을 할줄 알아야한다든지 말이다. 이들이 학습 대상이 된다.
•
구체적인 목표를 세분화하라. 하나의 구체적인 목표는 스프린트가 되어 목적성을 가지고 나아갈 수 있게 해준다. 한 스프린트의 끝은 다음 스프린트의 시작이며 다음 스프린트에 피드백을 줄 수 있다.
◦
세분화한 단계를 하나씩 수행해나가면서 피드백을 거쳐 목표를 수정해나가자. 1단계, 2단계 단계별로 스텝을 만들어 나아가야 한다.
•
측정하지 않는 것은 개선할 수 없다.
◦
학습을 하다보면 난이도에 따라 목표는 변화하게 되는데 이 목표의 진행사항을 확인하기 위해 측정이 필요하게 된다.
◦
정량적, 정성적 측정 지표들이 있으며 이런 것들을 토대로 피드백을 거치므로 기록해두자.
•
학습 방법
◦
새로 배운 것을 인출하는 연습
▪
직접 해보기다. 인출은 머릿속에 있는 것을 끄집어 내는 행위를 얘기한다.
▪
보고 듣고 이해하는 것보다 인출하는 행위를 통해서 기억이나 이해가 강하된다고 한다. 때문에 학습한 내용을 장기적으로 기억하기도 하고 제대로 알고 있는지 확인하기 위해 인출 작업을 수행하는 것이다.
▪
직접 해보면서 머릿속의 기억들을 밖으로 끄집어 내자.
◦
시간 간격을 둔 인출 연습
▪
인출은 좋은 기억법의 일종이다. 하지만 인간은 시간이 지나 자주 접하지 않게된다면 결국 잊어버리게 된다.
▪
때문에 이미 학습한 내용을 다시 인출해보는 연습이 필요하다.
▪
적절히 시간 간격을 두고 인출하는 연습을 반복한다면 이 과정으로 기억력을 높이고 더 많은 것을 학습할 수 있을 것이다.
◦
다양한 문제의 유형을 섞어서 공부하기
▪
생소한 유형의 문제를 풀어내려할때, 우리는 기존에 자주 사용하던 지식을 인출하지 않고 기억속 저편의 지식을 인출하기 위해 많은 노력을 들인다. 이때 해당지식을 뇌는 더 강하게 기억하게 된다.
▪
다양한 유형의 문제를 통해 익숙함을 깨려는 새로운 행위가 필요하다.
◦
새로운 지식을 기존의 지식과 연결하는 정교화
▪
새로운 지식을 기존의 지식과 연결하는 방법은 프로그래밍보단 개념 지식을 익히는 데 유용한 방법이다.
▪
뭔가 아하하는 순간이 있었다면 넘어가지 말고 이를 다시 인출해보는 작업을 수행해보자.
◦
나름대로 문제를 풀어보고 표현하는 생성
▪
정답이나 해답을 보기 전 질문에 답을 해보거나 문제를 풀어보는 시도를 하라는 것이다. 이를 통해 새로운 지식을 받아들이기 위한 마음이 만들어지기 때문이다.
▪
Best Practice를 먼저 찾지 말고 내 스스로 답을 내려보자. 채팅을 구현한다면 머릿속으로 먼저 그려보고 예시를 찾아보자.
◦
배운 것은 검토하고 스스로 질문해보는 반추
▪
반추란 학습한 것을 되돌아 보고 스스로에게 질문을 던지는 행위를 얘기한다.
▪
어떤 부분이 잘 되었는지, 잘 될 수 있었던 요인은 무엇인지, 능숙해지려면 무엇을 배워야 하는지 질문을 해보는 것이다.
▪
반추는 배운 것에 다양한 관점을 더해 지식을 넓히기도 하고 강화하기도 하는 등 정교하게 인출하는 연습을 말한다.
▪
프로그래밍에 있어서 리팩토링이 이에 해당한다고 할 수 있다.
◦
기억을 붙잡아두는 정신적 도구, 기억술
▪
기억을 어떻게 할 것인가에 대한 방법을 일관적으로 머릿속으로 그려놓자.
▪
저자는 그림 기억법을 선호한다고 한다.
◦
무엇을 알고 무엇을 모르는지 알아보는 측정
▪
앞서 저자는 측정하지 않으면 개선할 수 없다고 했다. 학습에 대해서 내가 알고 있는 것이 무엇이고 모르는 것이 무엇인지 측정을 해야 한다.
▪
이는 인출 작업을 해보면 알 수 있다. 프로그래밍을 하다가 막힌다던지 그림 기억법으로 기억했던 내용을 그려보다가 막힌다던지 여러 방법을 통해 확인할 수 있다.
▪
이렇게 확인하는 방법을 간단하게 얘기하면 인출이다. 공부한 내용을 남들과 공유한다던지 방법으로 해보자.
전문가가 되기 위하여 전문가가 필요하다
•
학습을 진행하면서 피드백을 받아야 한다.
•
실력있는 개발자나 유튜버도 괜찮고 학습을 함께하고 있는 사람도 괜찮다.
•
코드 리뷰, 페어 프로그래밍, 몹 프로그래밍 등을 통해 가지고 있는 지식의 범위를 확장시켜나갈 수 있다.
•
학습이란 익히 알고 있는 길에서 마라톤을 하는 것이 아니라 전혀 모르는 길을 지도를 보며 찾아가는 모험이다.
•
다양한 도구가 있으면 좋지만 길잡이의 도움이나 동료가 더 필요하다.
반드시 되돌아 보는 시간이 필요하다
•
스프린트 리뷰는 목표한 소프트웨어를 잘 만들었는지 고객과 함께 살펴보는 과정이고 회고는 기간동안 우리가 한 일에 대해 살펴보고 개선할 점을 찾는 행위다.
•
학습에 있어서 리뷰는 잘 알고 있는 복습이라고 할 수 있다.
◦
효과적인 학습 방법에서 얘기한 인출을 의미한다.
•
회고는 앞서 말한 반추라는 것과 유사하다고 할 수 있다.
◦
과정을 살펴보고 더 잘할 수 있었던 부분이 무엇인지 질문해보고 방법을 찾는다는 관점에서 반추와 유사하다
•
회고는 회고 분위기 만들기 → 데이터 모으기 → 회고하고 통찰 찾기 → 개선할 사항 도출하기 → 회고 종료하기의 단계로 이루어진다.
◦
데이터 모으기는 지난 시간 동안 무엇을 했는지 주요한 이벤트들에 대해 자료를 찾아내고 모으는 것이다.
◦
회고하고 통찰 찾기는 이렇게 모인 자료를 통해 무슨 일이 있었는지, 무엇을 잘 했는지, 무엇을 더 잘 할 수 있었는지에 대해 확인하는 작업이다.
•
회고에서는 대표적으로 3가지 질문이 있는데 다음과 같다.
◦
우리가 잘 하고 있는 것은 무엇인가?
◦
우리가 잘 하지 못하는 것은 무엇인가?
◦
아직도 우리를 괴롭히는 것은 무엇인가?
학습하려면 회복 탄력성이 필요하다
•
시간만 채워서는 학습을 했다고 할 수 없다. 오롯이 의식적인 목적을 가지고 학습을 해야 한다는 것이다.
•
이 과정에서 소모되는 체력이나 정신력을 빠르게 회복하는 것이 중요한데, 이를 회복탄력성이라고 부른다.
•
저자는 여기서 사티어의 변화 모델을 가지고 새로운 학습 시의 감정 변화를 설명한다.
◦
1단계 Late Status Quo : 익숙하고 안정적인 상태다.
◦
2단계 Resistance : 갑작스런 외부 요인의 등장으로 익숙함이 깨지는 순간이다.
◦
3단계 Chaos : 안정성이 깨지고 변화로 인한 혼돈의 상태다.
◦
4단계 Intergration : 외부 요인에 대응할 수 있는 전환이 되고 있는 상태다.
◦
5단계 New Status Quo : 변화에 성공하고 성과를 만든 상태다.
•
저자는 여기서 2, 3단계에 회복 탄력성이 필요하다고 했다.
소프트웨어 장인이 되도록 하자
•
우리의 근본적인 목표는 소프트웨어 장인이 되는 것이다. 장인이 되기 위한 마음가짐을 우리는 소프트웨어 장인정신 선언문에서 확인할 수 있다.
◦
동작하는 소프트웨어뿐만 아니라 정교하고 솜씨 있게 만들어진 작품을
◦
변화에 대응하는 것뿐만 아니라 계속해서 가치를 더하는 것을
◦
개별적으로 협력하는 것뿐만 아니라 프로페셔널 커뮤니티를 조성하는 것을
◦
고객과 협업하는 것뿐만 아니라 생산적인 동반자 관계를
•
구체적으로 소프트웨어 장인이 되기 위해 알아야 할 것과 노력해야 할 것들에 대해 살펴보자.
◦
최신 정보를 유지하는 노력
▪
기술 명세 서적
•
Java, C, C++ 등 개발 언어에 대한 서적
▪
개념 서적
•
기술에 대한 개념을 설명하고 있는 서적이다. 객체지향 설계, TDD, FP 등과 같은 개념에 대해 설명해준다.
▪
행동 지침서
•
개발 방법론에 대한 책이나 기술 철학, 조직 관리 등 개발 관리자를 위한 서적이다.
▪
혁신 서적
•
반드시 읽어야하는 책들로 디자인 패턴, 클린 코더, 리팩토링 등의 책이 있다.
◦
의도적 수련, 의도적 수련, 의도적 수련
▪
명확한 목표를 가지고 다양한 학습방법을 활용하여 의도적으로 수련해야 한다.
▪
알고리즘을 기반으로 한 코딩 훈련이 있다.
•
CodeKata와 같은 코드 수련 관련 사이트를 활용하는 것이다.
•
저자는 코딩도장이라는 사이트를 애용한다고 한다.
▪
직접 어플리케이션을 만들어보는 방법이 있다.
•
적당한 펫 프로젝트를 추천한다.
◦
사회적 자본의 활용
▪
학습을 위해서는 사회적 자본을 활용하는 것을 추천한다.
•
커뮤니티나 스터디 모임이 발달되면서 쉽게 찾을 수 있다.
•
사내 스터디를 만들어서 코드 리뷰, 페어 프로그래밍 등을 진행해보는 것도 괜찮다.
◦
반드시 필요한 자기 관리
▪
TODO 관리 도구 등을 적극적으로 활용하자
◦
가치와 원칙
▪
애자일 개발 방법론에는 익스트림 프로그래밍이 존재하는데, 여기선 3가지 중요한 요소를 얘기하고 있다.
▪
가치, 원칙, 실천방안이다.
▪
가치에는 커뮤니케이션, 존중, 용기, 피드백, 단순성 등의 5가지 요소가 있다.
▪
실천방안에는 테스트 주도 개발, 리팩토링, 단순한 설계, 짝 프로그래밍 등이 있다.