////
Search
Duplicate
⛸️

2장. 의도적 수련과 소프트웨어 장인정신

학습은 애자일하게 해야 한다.

일반적으로 프로젝트에 있어서 애자일 기법의 특징은 다음과 같다.
실질적인 코딩을 통한 프로토타입을 만들어내며 그때그때 피드백을 반영한다.
학습을 애자일하게 한다면 특징은 다음과 같아질 것이다.
실질적인 코딩을 통한 프로토타입을 만들어내며 필요한 학습에 대하여 덧붙이고 수정하는 것을 수행하는 방법
즉 직접 만들어 보는 작업을 통해 학습하는 것이 애자일 프로그래밍 학습이라는 것이다.
⇒ 기존에 알고 있었던 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가지 요소가 있다.
실천방안에는 테스트 주도 개발, 리팩토링, 단순한 설계, 짝 프로그래밍 등이 있다.