////
Search
Duplicate
🛬

1장. 프로그래밍 공부법

동의되지 않는 권위에 굴복하지 않기

지금까지 당연시하던 생각들을 비판적으로 받아들이기 위함이다.
의구심을 가지고 비판적으로 바라볼 때, 그동안 받아들여지던 것과는 다르게 현상을 다르게 볼 수 있고 나만의 주관을 세우는 데 도움이 된다.
지식 중심의 공부법이라는 권위에 도전하기
프로그래밍 학습국영수 학습과는 다르다. 프로그래밍은 무엇인가를 만드는 작은 성취감을 느끼는 것부터 시작해야 한다.
문제 상황을 정의하고 해당 문제 상황을 해결하기 위해 프로그래밍을 도구로 활용하는 것부터 시작해야 한다. 이렇게 했을 때, 우린 프로그래밍에 재미를 느낄 수 있다.
지금까지 우리가 학습해온 습관으로 본다면 프로그래밍을 잘 하기 위해선 먼저 지식을 폭넓게 학습한 후 만들기를 시작하는 것이 자연스러워 보인다.
이는 잘 동기부여가 되어있는 경우에 성공할 가능성이 높다. 시작하는 단계에서는 흥미가 먼저다.
미래지향적인 공부는 지식이 중심이 아닌 경험이 중심이 되어야 한다. 즉 경험을 통해 자신이 필요한 것을 알고 학습하는 방법이 좋다.
사람들은 내가 현재 학습하고 있는 지식이 어느 곳에 활용될 것인가에 대한 가늠이 될 때 깊이 있게 몰입할 수 있으며 오래 기억하기에도 쉬워진다.
내가 프로그래밍을 공부하는 방법은
프로그래밍은 지속적으로 공부해야 되기 때문에 스스로 할 주제를 찾고 효과적인 공부법을 찾는 것은 중요하다.
장기적인 공부법을 찾는다면 개인의 성장에 집중하는 공부법을 실행하자.
내가 권위에 집착하는 이유
기존의 권위에 도전하고 의심하는 행동이 프로그래밍 학습에 도움이 되기 때문이다.
타인의 사례
그냥 따라 가는 학습과 주도적인 학습 중 어떤 것이 더 좋은 결과를 낳을까?
스스로 만들고 싶은 것을 하다 보면 저절로 공부가 된다.

프로그래머가 내 직업이 되기까지

소프트웨어를 소비하다. 생산하게 되는 순간, 막막함이 밀려온다. 어디서부터 어떻게 해야할까?
프로그래밍 공부가 어려운 이유와 프로그래밍 공부를 시작해 프로그래머로 취업하기까지의 과정에 대해 살펴본다.
프로그래밍 공부가 어려운 이유는?
단계별 자신감 곡선을 따라 변화하기 때문이다.
단계별 자신감 곡선
첫번째, 맛보기 단계
책과 동영상 자료를 활용해 따라하기 수준의 경험을 하는 단계로 특별히 문제가 발생해 실패할 가능성도 적고, 머리를 써야 하는 일도 많지 않아 즐거움을 느낀다.
시작 시, 약간의 두려움이 있었지만 시간이 지나면서 자신감이 높아지는 단계이다.
두번째, 당황하는 단계
그러나 따라하기 수준의 경험을 끝낸 후, 자신이 생각한 소프트웨어를 만들려고하는 순간 막막함이 밀려온다.
따라할 때, 다루지 않았던 내용이 등장하고 해결방법이 떠오르지 않는 문제들이 발생한다. 시간이 지나도 도저히 진전이 보이지 않는다.
맛보기 단계에서 올랐던 자신감이 서서히 떨어진다. 많은 사람들이 여기서 포기한다.
세번째, 절망하는 단계
자신감은 바닥이 어딘지 모를 정도로 무너진다. 희망은 보이지 않고 자신감은 바닥을 긴다. 그럼에도 묵묵히 해나간다.
마지막, 회복하는 단계
자신감을 회복하는 커브가 점차 가파르게 향상되면서 프로그래밍에 대한 즐거움을 회복하는 단계이다.
물론 아직도 두려움과 불안감이 공존하는 단계이지만 앞으로 어떻게 성장하고 학습해야 할지, 본인의 주관적인 방향을 잡으면서 앞으로 나아간다.
각 단계를 극복하는 방법
맛보기 단계를 극복하는 방법
맛보기 단계에서 달성해야 할 가장 큰 목표는 감을 잡고 흥미를 느끼는 것이다.
거창한 계획을 세우기보단 무엇이라도 만드는 작업을 해보며 흥미를 느끼는 것이 중요하다.
당황하는 단계를 극복하는 방법
가장 큰 절망을 맛보는 단계로 많은 사람들이 여기서 포기한다. 저자는 이 단계를 극복하기 위해선 사람들과 함께하는 것을 추천한다.
맛보기 단계에서 온라인 컨텐츠 위주의 학습을 했다면 여기선 오프라인으로 나가서 사람들과 함께 공부를 하자. 힘들 때 같이 공감해주고 어려운 문제를 같이할 동료를 찾아라.
스터디를 운영하는 것도 좋은 방법이다.
절망하는 단계를 극복하는 방법
희망은 보이지 않고 자신감은 떨어진지 오래다. 묵묵히 헤쳐나가기 위해선 목표를 설정하고 목표에만 집중하는 것이 좋다. 잡념은 떨쳐내버려라.
배움이 깊지 않고 얕기 때문에 자신이 하는 공부에 대한 의심이 많아지는 시기다. 과연 이 길이 맞을까? 다른 언어는 어떨까와 같은 것들은 모두 잡념이다.
그렇지 않아도 배울 것이 많다. 너무 많은 것에 관심을 두기보다 명확한 계획을 세우고 그것을 집중하자.
이 단계를 극복하는 과정에서 책을 통해 지식을 습득하는 일이 많다. 그런데 우리가 책을 활용해 학습하는 경우도 선입견에 빠져있는 경우가 많다. 다음과 같은 내용들을 학습에 참고해보자.
필요한 부분부터 흡수한다.
책의 전체가 똑같은 중요도를 가지고 있다고 할 수 없다. 목적이 명확하고 목적 달성을 위해서 어디를 읽어야 할지 알고 있다면 다른 페이지는 과감하게 제껴라
부분만 읽는 것보다 전부 읽으려다 포기하는 것이 더 별로다.
대략적인 부분을 잡아서 조금씩 구체화한다.
목차를 통해 전체 구조를 대략적으로 파악한다. 그리고 본문을 속독으로 읽어나간다.
회복하는 단계를 극복하는 방법
여기까지 왔다면 딱히 극복할 것은 없다. 다만 필요한 것이 하나 있다. 누군가의 피드백이다. 우리는 혼자 학습하는 것에 익숙해져있으나 이는 많은 지식을 습득하기 위한 방법이다.
프로그래밍은 무엇을 더 많이 아느냐보다 무엇을 할 수 있느냐가 더 중요하다. 공동 학습을 통해 피드백을 주고 받고 토론하는 것이 더 의미있는 학습법이다.

전문가로 성장하기 위한 의식적인 연습

우리의 성장은 계속되어야 한다.
새로 배우는 것은 익숙하지 않기 때문에 의식적으로 노력하게 된다. 이미 익숙해진 것들은 굳이 노력을 쏟지 않아도 자연스레할 수 있다.
두 작업에 있어서 어느 것이 성장하고 있다고 말할 수 있을까?
당연히 전자다. 우리의 만족하면 안 되는 이유는 의식적인 노력을 기울이지 않으면 성장이 멈추기 때문이다.
다음 단계로 성장하기 위해 의식적으로 노력하는 것은 힘들다. 따라서 자신이 계획한 목표에 도달했다면 결과를 즐길 필요가 있다. 즐길 수 있어야 오래할 수 있으니까.
이 장에서는 저자가 프로그래머와 교육자로 살아오면서 느꼈던 경험들을 공유한다.
프로그래밍을 하면서 느꼈던 설렘과 행복한 순간
성장하지 못하고 정체되는 느낌을 받는 순간
그 순간을 극복하기 위해 노력했던 과정
의식적인 연습
볼링 게임 점수판 구현을 통한 깨달음
저자가 TDD, 객체지향 프로그래밍을 주제로한 스터디의 미션을 수행하면서 몰입했던 경험이다.
매순간 테스트를 어떻게 구현하고 객체를 어떻게 설계할 것인가에 대해 고민했다.
이는 다른 어떤 순간보다도 행복하고 즐거웠다. 다시 경험해보고자 노력했으나 자주 경험하기는 힘들었다.
이 같은 경험이 가능했던 이유는 미션의 난이도가 흥미를 유발할 수 있는 수준이고, 본인이 가진 역량으로 충분히 도전해볼만한 수준이었기 때문이라고 생각했다.
외에도 다른 요소(데이터베이스의 의존성 등)가 없어 순수 자바 코드로 작성이 가능했다던지의 이유들도 있다.
의식적인 연습과의 만남
저자는 이와 같은 몰입을 프로그래머로서 살아가면서 몇번 경험했다.
온라인 강좌를 만들기 위해 짧은 연습 코드를 구현하면서 몰입했던 경험
책에 사용할 예제를 구현할 때, 연결 고리가 없던 부분의 연결 고리를 만들어 갔던 경험
경력이 쌓이면서 이런 설렘과 흥분되는 순간을 경험할 때마다 좀더 성장한다는 것을 깨달았다.
시간이 지나면서는 이런 설렘과 흥분으로 시간가는 줄 모르는 상태에 빠지는 것이 몰입이라는 것을 알게 되었다.
이 사실을 알고 저자는 몰입 경험을 자주 만들기 위해 부단히 노력했으나 쉽지 않았다.
그러다 첫 번째로 만난 책이, 말콤 글래드웰의 아웃라이어였다. 말콤은 여기서 우수한 학생, 약간 우수한 학생, 평범한 학생을 비교한 결과 그들 간엔 연습량에서 차이가 난다고 했다.
이 책을 통해 저자는 역시 연습밖에 없다는 생각을 했고 경력이 충분히 쌓인다면 전문가로 성장할 수 있겠다는 결론을 내렸다.
하지만 몰입을 경험할 수 있는 기회들은 점점 더 적어졌고 더 이상 성장하고 있지 않다는 느낌을 받으며 평범하게 살아가고 있었다.
어느날 비슷한 주제의 1만 시간의 재발견이라는 책이 출간됐다. 저자는 이 책을 읽고 그동안 가지고 있었던 모든 궁금증이 해소되는 느낌이었다고 한다.
이 책은 1만 시간의 연습량에 집중하기보다 목적 의식을 가지는 제대로 된 연습을 하는 것이 더 중요하다는 이야기를 하고 있다.
저자는 이를 본인의 경험에 비추어 봤을 때, 이 책에 많은 공감을 할 수 있었다고 한다.
그 책에서 목적의식 있는 연습의 특징을 다음과 같이 정의하고 있다.
목적의식 있는 연습은 명확하고 구체적인 목표를 가지고 있다.
목적의식 있는 연습에는 집중이 필요하다.
목적의식 있는 연습에는 피드백이 필요하다.
목적의식 있는 연습은 자신의 컴포트 존에서 벗어날 것을 요구한다.
컴포트 존은 편안함을 느끼는 상태를 의미한다. 즉 일정수준의 연습을 통해 더 이상 해당 행위를 수행하는데 의식적인 노력이 필요하지 않은 상태라고 할 수 있다.
1만 시간의 재발견목적의식 있는 연습의식적인 연습을 구분한다. 이 둘의 가장 큰 차이점은 심적 표상이라고 한다.
심적 표상은 사물, 관념, 정보 이외에 구체적이든 추상적이든 뇌가 생각하고 있는 대상에 상응하는 심적 구조물이다.
의식적인 연습의 핵심 목적은 심적 표상을 개발하는 것이며 심적 표상은 다시 의식적인 연습에서 핵심 역할을 한다.
의식적인 연습 설계 사례
목적의식 있는 연습을 적용해 연습하는 방법에 대해 공유한다.
TDD, 리팩토링, OOP를 학습하는데 어려운 이유는 웹, 모바일과 같은 응용 프로그램 단계에서 TDD, 리팩토링, OOP를 연습하기가 어렵기 때문이다.
요구사항에 맞춰 응용 프로그램을 구현하기도 벅찬 상황에서 난이도가 있는 TDD, 리팩토링, OOP를 연습하는 것은 쉽지 않은 도전이다. 따라서 저자는 순수하게 프로그래밍 언어만으로 프로그램을 구현하는 연습을 추천한다.
효과적인 프로그래밍 연습을 위해 첫번째로 고려할 부분은 자신의 수준에 맞는 난이도의 프로그래밍 요구사항으로 연습하는 것이다.
첫째, 게임과 같이 요구사항와 명확한 프로그램이 적합하다. 요구사항이 명확하지 않다면 요구사항을 파악하는 데 긴시간이 들어간다.
둘째, 의존관계가 없는 순수한 프로그램으로 연습할 것을 추천한다. 외부 API나 데이터베이스에 의존관계를 가지는 코드는 테스트하기 어렵다.
셋째, 약간은 복잡한 로직이 있는 프로그램이어야 한다. 너무 단순하면 TDD와 OOP의 참맛을 느끼기 어렵다. 복잡해야 테스트할 코드가 있고 지속적인 리팩토링이 가능하다.
다음은 그 예시다.
로또, 사다리 타기, 볼링 게임 점수판, 체스 게임, 지뢰 찾기 게임
연습하기 좋은 프로그램을 선택했다면 다음으로 고민할 내용은 어떻게 연습할 것인가이다. 연습 방법을 개인과 그룹으로 나눠 살펴보자.
개인
같은 요구사항을 구현하면서 하나씩 제약사항을 추가해 나가는 것이다.
예를 들어 객체지향 프로그래밍 연습을 위해 객체지향 생활 체조 9가지 원칙과 같이 구체적이고 정량적인 제약사항으로 연습할 수 있다.
그룹
혼자 연습하면서 기존의 프로그래밍 습관을 개선하기는 쉽지 않다. 따라서 타인의 피드백과 함께할 때 더 빠르게 성장할 수 있다.
서로 코드 리뷰할 스터디 그룹을 만든다. 앞에서 추천한 프로그램을 각자 구현하고 상호 코드 리뷰를 진행한다. 다른 사람의 코드나 피드백 받은 내용으로 리팩토링한다. 이를 반복한다.
시간이 지나 이를 다시 구현해본다. 단 이땐 제약사항을 추가해서 해본다. 다른 프로그램을 여러 개하는 것보다 하나의 프로그램을 여러번 개선시키는 경험이 더 낫다.
TDD, 리팩토링, OOP 연습은 좋은 글쓰기 연습과 같다. 좋은 글을 쓰려면 많이 읽고, 많이 쓰고, 많이 퇴고하는 방법 뿐이다.
특히 이 단계에서 가장 중요한 것은 퇴고하는 과정이다. 좋은 코드를 구현하기 위한 방법 또한 같다. 지속적인 리팩토링 과정을 거쳐야 한다.
우리는 지금까지 완벽한 설계를 통해 모든 변화에 대응할 수 있는 프로그램을 구현하기 위해 노력해왔다. 하지만 프로그램은 요구사항이 변화할 수 밖에 없다. 따라서 우리는 변화에 빠르게 대응하는 프로그램을 만들어야 한다.
지속적인 성장을 위한 의식적인 연습
다음 단계로 성장하기 위해 의식적인 연습이 필요한 것은 알았다. 그렇다면 어떻게 행동할 것인가?
의식적인 연습을 위한 가장 좋은 방법은 멘토를 통해 코칭과 피드백을 받는 것이다. 하지만 좋은 멘토를 찾는 것은 어렵고, 찾더라도 많은 비용이 발생할 수 있다.
효과는 다소 떨어질 수 있지만 이 같은 단점을 보완할 수 있는 활동으로 커뮤니티 활동을 추천한다.
멘토를 통한 의식적인 연습
자신만의 연습 방법을 가지고 있는 멘토나 피드백을 받을 수 있는 멘토를 찾아 조언을 구하는 것이다.
좋은 멘토를 찾기 위한 시도 또한 시행착오가 필요하다. 다른 사람의 말을 무비판적으로 수용하기보다 자신의 기준을 세우고 자신의 성향과 맞는 멘토를 찾기 위해 시간을 투자해야 한다.
온/오프라인 커뮤니티와 스터디를 통한 의식적인 연습
저자가 커뮤니티를 추천하는 이유는 혼자 힘으로 자신이 가지고 있는 사고의 틀을 깨는 것이 정말 힘들기 때문이다.
커뮤니티 활동 중에서도 스터디 활동을 추천한다.
첫째, 다양한 경력와 연령대의 사람들이 만나 다양한 관점을 가지고 토론할 수 있기 때문이다.
둘째, 사람이 남는다.
셋째, 도전하고 싶은 일들을 부담없이 도전하고 시도할 수 있기 때문이다. 발표 능력을 키우고 싶다면 발표 스터디를, 리더십 능력을 키워보고 싶다면 리딩을 도전해볼 수 있다.

행복한 프로그래머

프로그래밍이라는 일을 통해 즐거움과 행복을 느끼려면 어떻게 살아야할 것인가에 대해 같이 고민하는 기회를 만들어보고자 저자는 이 챕터를 썼다.
나한테 프로그래밍은 즐거움을 주는가?
일(노동)을 바라보는 관점의 변화
프로그래밍을 통해 즐거움과 행복을 느끼려면 먼저 우리가 일에 대해 가지는 부정적인 생각을 바꿔야 한다.
송재경 대표님과의 일화
프로그래머가 진정 즐거움을 느끼고 재미를 느끼려면 특정 기능에 대한 전체를 개발할 때, 즐거움이 최고조에 달한다.
최근에는 점점 더 전문화되어 프로그래머가 기계의 부품같은 조냊로 전락해 버려 이전과 같은 재미를 느끼지 못하는 것이 아쉽다.
테일러로부터 시작된 분업화와 전문화가 이같은 상황을 만들었다.
우리는 효율성이라는 명목하에 점점 더 세분화하고 전문화할 것을 요구받고 있다. 주류의 발전 방향성은 생산성인 상황에서 우리 프로그래머들은 앞으로 즐거움과 행복을 느낄 수 있을까?
E.F 슈마허의 내가 믿는 세상에서의 분업화
경제학 관점
노동은 필요악이다.
고용주의 관점에서 노동은 비용의 한 항목에 불과하며 자동화에 의해 제거되지는 못할 망정 축소되어야할 것으로 간주된다.
노동자의 관점에서 노동은 자신의 여가시간, 안식을 희생하는 것이다. 그리고 임금은 그 희생에 대한 일종의 대가이다.
고용주의 관점에서 이상적인 것은 고용자 없이 산출물을 만드는 것이고 노동자의 관점에서 이상적인 것은 고용되지 않고 소득을 얻는 것이다.
불교적 관점
일의 기능은 최소한 다음의 셋이 있다고 본다.
하나는 사람의 재능을 활용하고 발전시킬 기회를 주는 것
하나는 다른 사람들과 공동 작업을 함으로써 자기 중심성을 극복하는 것
하나는 생산 과정에 필요한 재화와 용역을 만들어내는 것
이러한 내용들을 바탕으로 프로그래머가 좀 더 즐겁고 행복하게 노동하려면?
특정 영역에만 관심을 가지지 말고 소프트웨어 전체에 관심을 가져야 한다.
돈을 쫓기보다 일을 통해 자신의 존엄성과 자유를 찾으려는 노력을 하라.
인간의 존엄성과 자유를 찾으려면 소비 습관을 개선해 자본주의의 노예가 되지 않도록 해야한다.
자동화와 관련해서는 첫번째 불교적 관점에 해당하는 사람의 기술과 능력을 향상시키는 기계화에 초점을 맞춘다. CI/CD가 이에 해당한다.
사람을 지향하는 소프트웨어를 만드는 데 더 많은 고민을 한다면 우린 더 재밌지 않을까
몰입을 통한 행복한 삶
우리가 일에 대해서 진정 고민해야할 것은 어떻게 하면 일을 덜할 것인가가 아니라 일을 어떻게 할 것인가여야 한다.
더 나아가 어떻게 일을 하는 것이 나의 자아를 실현하고 성장시킴으로써 행복한 삶을 만들 수 있을것인가여야 한다.
저자는 이에 대한 답을 몰입에서 찾으려고 했다. 물론 우리가 한번 몰입을 했던 대상을 천년이고 만년이고 계속 몰입할 수는 없다. 정말 재밌던 게임도 언젠간 질리기 마련이듯이 어떻게 할 것인가?
이는 앞에서 언급했던 학습 과정의 의식적인 연습을 통해 극복할 수 있다.
지금 상태의 단순, 반복적인 일을 자동화한다거나 현재 상태의 문제를 개선하는 방법을 찾는 모든 활동 속에서 우리는 다른 몰입경험을 할 수 있다.
몰입의 즐거움 책에서는 자신이 하는 일을 가치 있게 만들 수 있는 길은 일의 전체 맥락을 늘 염두에 두고 자신의 행동이 전체에 미칠 영향을 이해한다면 아무리 사소한 직업이라도 세상을 전보다 살 만한 곳으로 탈바꿈시키는 인상적 변화를 이끌어낼 수 있다고 한다.
문제의 해결책을 내가 일하고 있는 부분으로 한정하지 말고 좀 더 큰 영역으로 확대해 나간다면 이전과는 다른 방식으로 접근할 수 있다.
우리는 프로그래머다. 단순 반복작업을 자동화를 통해 해결하고 불합리한 부분은 프로그래밍을 통해 해결할 수 있다. 이와 같은 지속적인 개선을 할 때 우리는 좀 더 즐거운 일에 더 시간을 투자할 여유를 가질 수 있다.
몰입의 순간을 굳이 업무 외 시간에서 찾으려 하지말고 일 속에서 찾을 수 있다면 그보다 더 행복한 삶이 있을까?
작은 성공
시작부터 완벽하려는 마음을 버리고 일단 시작하자.
작은 목표부터 세우자. 대부분의 사람들은 거창한 목표를 세우고 그것만 바라보다 끝난다.
하나의 큰 문제는 쪼개서 해결해야 한다. 쪼개면 작은 문제가 된다.
작은 문제를 해결하면 성취감을 얻어 다음 단계로 나아갈 힘을 준다. 작은 성공을 꾸준히 맛보며 앞으로 나아갈 수 있게 되어보자.

변화를 만드는 데 도움을 주는 책

여기서 추천하는 책들을 통해 공부법, 의식적인 연습, 몰입 등에 관심을 가지는 계기가 되었으면 한다.
삶에 변화를 만드는 시작은 어떻게 해야하는 걸까? 저자는 그 시작이 작은 성공을 맛볼 수 있다면 무엇이라도 괜찮다고 생각한다.
스몰 스텝
쉽게 도전할 수 있는 작은 실천을 통해 큰 변화를 만들어 가는 과정을 볼 수 있다.
습관의 힘
가장 중요하면서도 힘든 일은 습관을 만드는 일이다. 배움 또한 좋은 습관을 만들 때 가능하다. 습관을 만드는 과정에 대해 구체적으로 다루고 있다.
자신의 실력이 정체된 느낌이 드는 순간 읽으면 좋은 책들이다. 의식적인 연습, 몰입에 대해 깊이있게 다루면서도 좋은 조언들을 포함하고 있다.
이너 게임 - 배우며 즐겁게 일하는 법
배움에 대한 다른 관점을 느낄 수 있는 책이다. 남과 비교하지 않고 자기 자신에 집중함으로써 몰입하는 방법에 대해 다루고 있다.
몰입의 즐거움
행복한 삶을 위해 몰입하는 것이 얼마나 중요한 것인지 다루고 있는 책이다.
1만 시간의 재발견
역량을 향상시키기 위한 목적의식 있는 연습, 의식적인 연습의 중요성에 대해 다루고 있는 책이다.
일상 생활과 직장 생활 속에서 의식적인 연습을 통해 효과적으로 성장하는 방법에 대해 구체적으로 다루고 있다.
어떻게 살 것인가?에 대한 고민이 깊어졌을 때 삶의 방향성을 잡는데 도움을 줄 수 있는 책들이다.
작은 것이 아름답다, 내가 믿는 세상
슈마허는 실천적 경제학자이자 환경운동가로 유명하다.
현 시대의 경제 구조 속에서 어떤 자세로 살아가야하는 가에 대한 새로운 대안을 제시해준다.