이 글은 넥스트에서 함께 학생들을 가르쳤던 정호영 님이 초보 웹 개발자를 위하여 내용으로 작성한 문서를 기반으로 작성한 내용
웹 개발자의 길을 걷기로 마음 먹은 친구들에게 환영의 메시지를 전한다. 개발자의 길을 걷는다는 것에 많은 장애물과 어려움이 있겠지만 그 보다 더 큰 즐거움이 있다. 아직까지 웹 애플리케이션을 개발한 경험이 없다면 1장의 가이드 문서를 참고해 기본적인 내용을 학습할 것을 추천한다. 1장은 기술적으로 학습할 내용뿐만 아니라 개발할 때 참고할 웹 사이트, 학습 방법 등에 대해서도 다루고 있다. 이 가이드 문서에서 제공하는 모든 내용을 한번에 학습하려고 하기보다 현재 자신의 관심사에 초점을 맞춰 학습 계획을 세운 다음 마음의 여유를 가지고 도전해 볼 것을 추천한다.
본격적인 내용을 다루기 전에 현재 대한민국(전 세계적으로도 비슷하다.) IT 산업에서 개발자 직군으로 어떤 종류가 있는지 살펴보도록 하겠다. 대한민국 산업의 형태로 볼 때 과거에는 대다수가 자바를 기반으로 하는 웹 서버 개발자였는데 현재는 다양한 직군이 늘어나고 있다.
- 웹 백엔드 개발자: 자바, C#, 루비, 파이썬 등의 언어로 서버 쪽의 로직을 개발하는 역할을 한다. 대부분의 경우 데이터베이스도 잘 알아야 한다. 일부 프론트엔드 개발 작업도 담당하는 경우가 일반적이다.
- 웹 프론트엔드 개발자: HTML/CSS, 자바스크립트를 주로 사용하며 디자이너와 협업을 하는 개발자이다. 센스와 끈기가 필요하다. 최근에는 JQuery, Angular.js, React.js와 같은 라이브러리도 잘 사용해야 하고, node.js를 통해 웹 백엔드 개발까지 가능하다.
- 모바일 앱 개발자: 글을 쓰는 요즘은 자바 기반의 안드로이드 개발자와 오브젝티브C(또는 Swift)기반의 iOS 개발자가 이 범주에 속한다. 안드로이드 개발자 수요가 더 많은 반면 iOS 개발자가 조금 더 멋있어 보인다.
- 기타: 시스템 프로그래머, 모바일 게임 개발자, 게임 서버 및 게임 클라이언트 개발자가 있는데 이 직군들은 상대적으로 높은 실력에 비해 구직이 어렵고 대우가 좋지 않다. ‘이 직군이 매력적이다’라고 생각하면 해외 취업을 권하고 싶다.
- 비개발자 직군: 중요한 비개발자 직군으로 DBA, 시스템 엔지니어, 빅데이터 전문가가 있다. 빅데이터 전문가가 최근 매우 유망하고, 시스템 엔지니어들도 클라우드가 나타난 이후로 과거에 비해 대우가 좋아진 듯 하다. DBA는 실력과 연륜에 따라 연봉의 차이가 매우 크게 나는 직업으로 알려져 있다.
소프트웨어 분야는 정말 빠르게 발전하고 있기 때문에 모든 지식을 알 수 없다. 빠르게 바뀌는 기술의 흐름을 파악하려면 온라인을 통해 지식을 습득하고 다양한 개발자와 소통해야 한다. 또한 모르는 문제는 검색을 통해 해결할 수 있어야 한다. 그런 측면에서 개발자들이 좋아하는 사이트를 소개해 본다. 이들 사이트에 방문해서 익숙하게 사용할 수 있도록 노력해 본다.
- google.com: 모르는 내용에 대한 검색은 구글을 사용한다. 네이버 지식인, 페이스북 그룹, 빙 등의 사용은 추천하지 않는다. 프로그래밍을 시작하는 개발자 중에 검색을 부끄러워하는 친구들이 있는데 검색은 절대로 부끄러워할 일이 아니고 개발자가 키워야할 능력 중의 하나이다.
- stackoverflow.com: 개발자들의 지식인 같은 곳이다. 구글에서 프로그래밍 문제를 검색하면 상당부분 이쪽으로 연결이 된다. 질문을 올리고 답변을 달아보는 경험을 해볼 것을 추천한다.
- github.com: 소셜 코딩이라고 부르기도 한다. Git의 사용법과 함께 필수적으로 알아야 한다. Github 자체의 사용법을 배우는 게 좋다. 참고로 Git과 Github은 전혀 다르다. 전자는 소스코드에 대한 버전관리용 도구이고, 후자는 Git을 지원하는 웹 서비스이다.
- slideshare.net: 다양한 기술을 예쁘고 쉽게 볼 수 있다. 깊이가 깊지는 않은 경우가 많지만 그래도 매우 유용하다. 새로운 기술이 무엇인지 보고 싶을 때 우선적으로 검색해 볼 것을 권한다.
- trello.com: 칸반이라는 툴을 적용할 수 있는 도구이다. 프로젝트를 진행할 때 프로젝트 관리를 위한 협업 도구로 유용하다.
- 페이스북 그룹, 다양한 온라인 커뮤니티: 생소한 분야인 소프트웨어를 독학으로 학습하는 것은 쉽지 않다. 특히 학습을 지속하는데 한계가 있다. 이 같은 한계를 극복할 수 있는 길이 다양한 온라인 커뮤니티이다. 온라인 커뮤니티는 항상 열려있다. 문을 두드리면 된다. 최근 개발자 커뮤니티 그룹의 상당수가 페이스북 그룹으로 활동하고 있으니 페이스북을 통해 개발자들과 친구를 맺고 소통할 것을 추천한다.
- MOOC 사이트들: 최근에는 다양한 MOOC 사이트들을 통해서 공짜로 공부할 수 있는 곳이 많아졌다. codecademy, codeschool, khanacademy 등을 통해 신규 언어를 직접 실습으로 익히길 권한다.
프로그래밍을 처음 학습하는 학생들을 보면 프로그래밍 언어를 학습하는데 어려움을 느끼기도 하지만 컴퓨터를 사용하는 것이 아직 익숙하지 않아 어려움을 느낀다. 예를 들어 소프트웨어를 설치/삭제, 터미널 사용 등이 익숙하지 않아 어려움을 겪는다. 이에 대한 해결책은 정도가 없다. 일단 많이 사용해보고 새로운 시도를 두려워하지 않아야 한다. 컴퓨터에 무슨 짓을 하더라도 폭발하지 않는다. 너무 조심 조심 다루지 않아도 된다. 사용하다 문제가 생기면 청소하듯이 깨끗하게 밀어버리고 처음부터 다시 시작하면 된다. 소프트웨어가 하드웨어와 다른 점이 그것이다. 언제든지 초기화하고 다시 시작할 수 있다. 겁내지 마라.
- 맥 / 리눅스 사용법: 개발자 커뮤니티에 초보 개발자들이 가끔 떡밥으로 ‘맥을 사용하면 개발이 잘 되나요?’ 라는 글을 던지고 싸움이 일어난다. 답은 yes이다. 맥에서 맥os를 사용하는 것 자체가 개발자에게 도움이 된다. 더불어 리눅스를 배워야 한다. 예쁜 맥을 사서 부트캠프 + 윈도우를 사용하는 건 자제했으면 한다. 맥이 비용 측면에서 부담이 되어 구매하기 힘들다면 아마존 웹 서비스(AWS)와 같은 클라우드 서비스를 통해 무료로 리눅스 서버를 경험할 수 있다.
- 다양한 프로그래밍 언어: 쉽고 재미있는 프로그래밍 언어를 배우는 것을 추천한다. 개인적으로 파이썬을 선호하는데, 웹 개발자라면 시작 언어로 자바스크립트와 루비, 모바일 개발자라면 파이썬을 배우면 좋을 것 같다. 나중에 실력이 조금 붙으면 반드시 C 언어와 포인터에 대해 배우길 권한다. 그리고 모바일 개발자라면 Objective-C, Swift도 공부하길 추천한다. 마지막으로 내공이 쌓이면 함수형 프로그래밍 언어(Scala, Haskell, Rust 등)를 배우는 게 좋겠다. 웹 개발자에게 기본적으로 추천하는 언어는 HTML, CSS, 자바스크립트, 루비, 파이썬, 자바, 쉘 스크립트이다.
- 내 전문분야에 대한 방향성을 결정하자: 웹 개발자라 하더라도 전문 분야는 앞서 본 것처럼 백엔드 개발자와 프론트엔드 개발자로 나뉘게 된다. 사물의 내면이나 돌아가는 원리를 생각해 보는 걸 좋아한다면 백엔드 개발자가 되는 걸 권장한다. 디자인 감각이 있고 꾸미는 걸 좋아하고 반복작업도 질리지 않고 잘할 수 있다면 프론트엔드 쪽일 가능성이 높다.
웹 애플리케이션 개발에 대한 학습을 시작하는 단계에서는 가능하면 웹 프론트엔드와 웹 백엔드 모두 학습할 것을 추천한다. 이는 웹 뿐만 아니라 모바일, 게임 모든 분야에 해당한다. 자신이 프론트엔드와 백엔드를 직접 경험하기 전에 어느 쪽에 성향이 맞는지 정확하게 파악하기 힘들기 때문이다. 또 다른 이유는 같은 작업을 프론트엔드와 백엔드 모두에서 구현할 수 있는데 각 상황에 따라 프론트엔드에서 구현하는 것이 효과적인 경우가 있고, 백엔드에서 구현하는 것이 효과적인 경우가 있다. 이와 같이 내가 백엔드 개발자라 하더라도 프론트엔드에 대해 알고 있어야 효과적인 해결책을 찾을 수 있고, 반대의 경우도 발생한다. 애플리케이션 개발에 대한 참 맛을 느끼려면 프론트엔드부터 백엔드까지 혼자 힘으로 구현해보는 경험을 하는 것도 큰 의미가 있고, 애플리케이션에 대한 전체적인 큰 그림을 그릴 수 있다는 측면도 있다.
웹 애플리케이션 개발에서 프론트엔드는 HTML, CSS, 자바스크립트 학습에 집중하면 된다. 하지만 웹 백엔드의 경우 자바, 루비, 파이썬, 자바스크립트와 같이 다양한 언어 기반으로 개발이 가능하다. 웹 백엔드의 경우 어떤 언어로 시작할 것인지 추천하기 힘들다. 현재 자신이 목표로하고 있는 지향점에 따라 달라질 수 있기 때문이다. 국내 대부분의 큰 회사들은 웹 백엔드 언어로 자바를 사용하는 경향이고, 스타트업의 경우 파이썬과 루비를 사용하는 경향이 강하다. 이와 관련해 선택하기 어렵다면 학습 비용 측면만 고려해보면 프론트엔드와 같은 언어인 자바스크립트를 웹 백엔드 언어로 시작하는 것도 좋은 선택이 될 수 있다.
이 책이 다루고 있는 자바 기반 웹 개발자가 되는 것을 목표로 학습한다면 공부의 순서는 (1) HTML (2) CSS (3) 자바스크립트 (4) 자바 (5) 자바 웹 프로그래밍 (6) 데이터베이스 순으로 학습할 것을 추천한다.
소프트웨어를 만든다는 거창한 계획을 세우기 보다 일단 무엇이라도 만드는 작업을 시작해 보자. 굳이 책을 사지 않아도 온라인으로 학습할 수 있는 좋은 컨텐츠가 많다. 일단 온라인으로 시작해보고 관심이 생기고 더 깊이 있는 학습을 하고 싶다면 본격적으로 도전해 보자.
앞으로 추천하는 실습들은 상당 부분 내용이 중복된다. 하지만 코딩이라는 우리에게 필요한 작업은 머리와 손이 함께 배우는 부분이 많다. 반복이 매우 중요하기 때문에 아는 거 또 나왔네? 라고 넘어가지 말고 반복해서 학습을 하길 권한다.
- 제일 먼저 시도해 볼 것으로 1시간 정도 투자해서 http://code.org/learn 의 hour of code로 놀아 본다. 안나 + 엘사가 재밌는 것 같다. 컴퓨터에서 중요한 기초 개념인 순차, 반복, 조건문의 개념을 배우기 바란다. 프로그래머는 바보같은 일을 하는 천재적인 사람이다. 컴퓨터는 위대한 일을 하는 바보같은 기계이다. 이 둘은 그래서 찰떡궁합! 출처는 기억이 안 난다.
- 칸 아카데미의 컴퓨터 교육: 자바스크립트의 감을 잡게 해준다. 참고로 이 강의는 자바스크립트 분야의 세계 최고의 대가 중 한 분인 John Resig 님이 만들었다. John Resig 님은 유명한 jQuery도 만들었다.
소프트웨어를 학습하는 좋은 방법 중의 하나는 일단 무엇인가 만들어보는 경험을 한 후 이론적인 개념을 학습하고, 다시 다음 단계의 경험을 하고 이론적인 개념을 학습하는 과정을 반복하는 것이라 생각한다. 앞의 온라인 과정이나 또 다른 과정을 통해 따라하기 식으로 무엇인가 만들어 보는 경험을 했다면 다음 단계는 과정 속에 담겨 있는 이론적인 내용, 소프트웨어 업계에서 사용하는 용어들에 친숙해지는 시도를 해보자.
앞의 경험을 하면서 등장했던 새로운 용어들이 무엇이며, 이 용어들이 왜 등장했으며, 무엇인지, 프로그래밍을 하는 과정 등에 대한 기본적인 내용에 대해 기초 튼튼 코드 튼튼 다 함께 프로그래밍(타니지리 카오리 저/타니지리 토요히사 감수/정인식 역, 제이펍/2016년) 책을 통해 학습해볼 것을 추천한다.
소프트웨어에 대한 개념을 조금 확실하게 잡기 위한 목적으로 하버디 대학교의 CS50 수업을 들어보는 것도 추천한다. 기사에 따르면 “정의란 무엇인가?” 강의보다 인기가 많은 수업이었다고 한다. 영어를 잘 못한다고 기죽을 필요는 없다. 한 번에 모든 동영상을 듣기보다 재미삼아 하루에 한편씩 보다보면 나름 재미도 있으며, 우연히 배우는 내용도 생긴다. 특히 우리나라 대학 교육과 비교해 보는 재미도 있다.
- 생활코딩의 작심 40시간 라이브: 웹 프론트엔드부터 백엔드까지 전체를 경험해 볼 수 있다. 단, 서버측 언어가 자바가 아닌 PHP이지만 웹 애플리케이션 개발의 전체 흐름을 이해할 수 있다.
- https://www.codecademy.com/learn: 웹 애플리케이션 개발과 관련해 필요한 지식을 각 지식별로 학습할 수 있다.
- http://www.w3schools.com/: codecademy와 같이 병행해 학습할 수 있는 곳으로 프론트엔드 지식을 학습할 수 있다.
책은 개인마다 선호하는 스타일이 다르기 때문에 이 책에서 추천하는 책이 반드시 좋은 책은 아니다. 자신의 현재 수준과 맞고, 자신이 선호하는 스타일과 맞는 책이 좋은 책이다. 이 책에서 추천하는 모든 책들은 학습을 하기 위한 참고 자료로 활용했으면 한다. 자신에게 맞는 책을 고르는 것도 능력이고, 연습이 필요하다. 누군가 추천하고, 좋다고 이야기하는 책을 무조건 구매하기 보다 자신이 직접 선택할 수 있는 능력을 기를 것을 추천한다.
- 프로가 되기 위한 웹 기술 입문(고모리 유스케 저/김정환 역, 위키북스/2012): 처음 웹 애플리케이션 개발에서 어려운 점 중의 하나는 기본적으로 사용하는 용어와 기본적인 흐름에 대한 이해가 없기 때문이다. 웹 애플리케이션 개발에 대한 기본적인 용어와 흐름을 이해하는데 좋다.
- 자바스크립트 & 제이쿼리 : 인터랙티브 프론트엔드 웹 개발 교과서(존 두켓 저/장현희 역, 제이펍/2015년): 이 책은 프로그래밍을 처음 시작하는 개발자가 읽어도 괜찮은 책이다. HTML, CSS, 자바스크립트 기초 지식에 대해 잡지 책을 읽는 느낌으로 구성되어 있어 지루함도 적다. 이 책을 통해 HTML, CSS, 자바스크립트에 대한 기초 지식을 쌓은 후 좀 더 깊이 있는 내용을 다루는 책으로 넘어가도 좋겠다.
- 웹 표준 가이드 : HTML5 + CSS3(존 앨섭 저/김지원,홍승표 공역, 한빛미디어/2010년): HTML과 CSS에 대해 한 단계 더 깊이 있는 지식을 다룬다.
- 자바스크립트를 말하다 : 가장 간결하면서도 완벽한 자바스크립트 입문서(악셀 라우슈마이어 저/한선용 역, 한빛미디어/2014년): 자바스크립트 에 대해 한 단계 더 깊이 있는 지식을 다룬다.
- 국내에 자바 언어를 학습할 수 있는 많은 기본서가 있다. 기본서마다 각자 다른 색깔을 가지고 있기 때문에 자신에게 적합한 책을 골라 학습한다. 인기 있는 책이 무조건 좋은 책은 아니다. 자신의 학습 스타일과 맞는 책이 좋은 책이다. 나는 좀 오래된 책이지만 “자바 프로그래밍(Jeff Langr 저/권오근 역, 교학사/2005)” 책과 같이 무엇인가를 만들어 가면서 관련된 내용을 학습하는 방식을 선호한다. 이 책이 번역 품질이 나쁘지만 책 진행 방식은 마음에 든다.
- 열혈강의 자바 웹 개발 워크북 - MVC 아키텍처, 마이바티스, 스프링으로 만드는 실무형 개발자 로드맵(엄진영 저, 이한디지털리/2014): 서블릿, JSP에서부터 시작해 스프링 프레임워크까지 자바 웹 애플리케이션 개발 전반에 대해 따라하기 식으로 구성되어 있다. http://blog.eomjinyoung.com/2014/05/blogpost.html 문서를 보면 각 장별로 동영상 강의도 제공하고 있다. 일단 이 책 한 권으로 자바 기반 웹 애플리케이션 개발에 대한 전반적인 내용을 파악할 수 있다. 하지만 자바 프레임워크를 직접 구현하는 내용도 포함하고 있기 때문에 다소 난이도가 있는 책이다. 따라서 이 책 또한 자신의 색깔과 맞는지 검토할 것을 추천한다. 단순히 따라하기 식의 책이라도 자신의 현재 역량에 맞는 책이 가장 좋은 책이다.
- 백엔드 웹 개발자가 반드시 학습해야할 주제 중의 하나가 데이터베이스이다. 데이터베이스 책으로 추천하고 싶은 책은 “SQL 첫걸음 : 하루 30분 36강으로 배우는 완전 초보의 SQL 따라잡기(아사이 아츠시 저/박준용 역, 한빛미디어/2015년)” 책이다. 데이터베이스에 대한 학습을 시작할 때 유명하지만 엄청 어려운 책을 사 놓은 후 거의 읽지 않은 기억이 난다. 이 책은 SQL문의 작동 원리에 대해 그림을 통해 설명하고 있어 초보 개발자가 읽기에 적합하다.
웹 애플리케이션 개발을 시작할 때 모르는 내용이 많더라도 일단 무엇인가를 만드는 경험을 해볼 것을 추천한다. 모르는 것이 많다는 것이 반드시 나쁜 것은 아니다. 내가 무엇을 모르는 것인지 알 수 있기 때문에 일단 무엇인가를 만드는 경험을 하면서 웹 애플리케이션 개발에 대한 재미를 느껴본 후 모르는 부분에 대해 추가적으로 학습해 나가면 된다. 웹 애플리케이션 개발에 대해 조금씩 눈이 뜨이면 모르는 내용은 점점 더 많아질 것이다. 이와 같은 단계가 정상이다. 알면 알수록 학습할 내용이 더 많아지고, 더 깊이 있게 알고 싶은 욕구가 생긴다. 이 같은 상황이 발생하면 개발자로 잘 성장해 가고 있구나라고 생각하면 된다.
일단 시작하지 않으면 내가 무엇을 모르는지 조차 모른다. 내가 모르는 것이 무엇인지에 대해 알고, 다음 단계로 학습할 것이 무엇인지 인식할 수 있다는 것만으로도 한 단계 성장한 것이다. 이 책은 자바 웹 애플리케이션 개발에 대해 시작 단계를 벗어나 한 단계 더 깊이 있는 지식을 학습하고 싶은 개발자를 위한 책이다. 웹 애플리케이션 개발에 대한 기본적인 학습이 끝나고 라이브러리, 프레임워크의 내부가 어떻게 동작하는지 알고 싶은 마음, 내가 만든 코드를 좀 더 깔끔하게 구현하고 싶은 마음, 내가 만든 웹 애플리케이션을 배포하는 과정에 대해 학습하고 싶은 마음이 드는 단계에서 읽으면 학습 효과가 가장 높을 것이다.
우리가 지금까지 학습하는 방식을 보면 이론적인 기초부터 탄탄하게 다진 후 무엇인가를 만드는 경험을 하는 방식으로 학습을 해왔다. 대표적으로 음악과 미술 같은 경우에도 경험을 통해 음악과 미술에 대한 즐거움을 먼저 느끼는 것이 아니라 이론적인 학습에 치중함으로써 음악과 미술에 대한 즐거움을 느끼는 것이 아니라 거부감을 가지도록 만든다.
물론 기초부터 탄탄하게 쌓는 것도 하나의 학습 방법이지만 경험을 통해 즐거움을 느낀 후 이론적인 학습을 하는 것 또한 좋은 학습 방법이다. 하지만 초, 중, 고등학교를 거치면서 기초부터 이론 위주의 학습 습관이 우리 몸에 자연스럽게 베어 있어 소프트웨어 학습 또한 같은 방식으로 접근하는 것이 일반적이다. 하지만 나는 소프트웨어를 학습하는데 있어 이런 접근방식이 맞는 학생도 있지만 그렇지 않은 학생이 대부분이라고 생각한다. 사람들은 내가 현재 학습하고 있는 지식이 어느 곳에 활용될 것인지 공감이 될 때 깊이 있게 몰입할 수 있으며, 몸으로 체화할 수 있다. 그런데 어느 곳에 활용될 것인지도 모르는 상태에서 전달하는 지식은 사람을 고통스럽게 할 뿐이며, 쓰레기 지식이 될 수도 있다. 이는 소프트웨어 뿐만 아니라 다른 분야를 학습하는데 있어서도 같다.
지금부터라도 이 같은 접근 방식을 깨고 이론적인 지식은 모르더라도 일단 무엇인가를 만들면서 즐거움을 느껴보는 경험을 하면 어떨까? 특히 양파 껍질을 깨는 첫 번째 단계에서 가장 중요한 것이 프로그래밍을 통해 무엇인가를 만들어 보는 즐거움이다. 이런 즐거움을 느낀 후 두 번째 양파 껍질을 벗겨 나가는 단계에서 이론적인 지식을 조금씩 쌓아나가면 된다. 앞의 “일단 시작해 보자.” 절에서 제안한 온라인 자료들을 활용해 일단 무엇이라도 만들어 보자. 일단 무엇이라도 시작해 프로그래밍, 컴퓨터에 대한 두려움을 깨야 한다. 프로그래밍, 컴퓨터가 만만해 보이고, 이 만만한 놈을 활용해 내가 원하는 무엇인가를 만들어낼 수 있다는 것에 대한 즐거움과 흥분된 경험을 해봐야한다. 이 즐거움과 흥분이 있어야 앞으로 두 번째, 세 번째 양파 껍질을 벗기면서 경험하게 될 힘든 산을 슬기롭게 넘길 수 있다. 처음부터 기초 이론에 집중하면 프로그래밍과 컴퓨터는 거대한 산처럼 느껴져 넘지 못할 산이라 생각하고 넘을 시도조차 하지 않게 된다.
프로그래밍과 컴퓨터는 정말 만만한 놈이다. 누구나 정복할 수 있다. 정복할 수 없는 것은 두려움 때문이다. 첫 번째 양파 껍질을 깨기 위해 가장 중요한 것은 두려움이 자신을 압도하기 전에 즐거움과 자신감이 충만하도록 자신을 탄탄히 하는 것이다.
코딩을 지탱하는 기술(니시오 히로카즈 저/김완섭 역, 비제이퍼블릭/2013) 이라는 책을 보면 다음과 같이 학습할 것을 추천한다. 나 또한 공감하는 부분이 많아 인용해 본다.
첫 번째 단계, 필요한 부분부터 흡수한다.
책이나 자료 전체가 동일한 정도로 중요하다고 말할 수 없다. 목적이 명확하고, 목적 달성을 위해서 어디를 읽어야 할지 알고 있다면 다른 페이지는 신경 쓰지 말고 바로 그곳을 읽도록 한다. 전체 모두 읽지 않은 것이 께름칙한가? 하지만 좌절하고 전혀 읽지 않는 것보다는 낫다. '전부 읽지 않으면'이라는 완벽 주의가 배우고자 하는 동기를 짓누르고 있다면, 버려버리는 것이 낫다. 동기는 매우 중요하다. 이 전략을 사용하기 위해서는 읽고 싶은 부분이 어디인지 대략적으로 전체적인 구조를 파악하고 있어야 한다. 만약 그게 어려우면 다음 전략인 '대략적인 부분을 잡아서 조금씩 상세화한다.'를 시험해보도록 하자.
두 번째 단계, 대략적인 부분을 잡아서 조금씩 상세화한다.
책이나 문서에는 목차가 있다. 목차를 보면 전체 구조를 대략적으로 알 수 있다. 그리고 나서 본문을 속독으로 읽어나간다. 자세히 보지 않고 우선은 소제목이나 강조 부분, 그림과 그림 제목 등을 본다. 소스 코드를 읽을 때는 우선 디렉토리 구조와 파일명을 본다. 그리고 파일을 속독으로 읽고 거기서 정의하고 있는 함수나 클래스 이름, 자주 호출되는 함수명 등을 본다. 이 방법들에는 '우선 대략적인 구조를 잡고, 조금씩 상세한 정보로 접근한다'는 공통점이 있다. 이것이 기본 원칙이다. 소스 코드에는 다른 방식의 독해 방법이 있다. 디버거의 과정을 사용해서, 실행되는 순서나 호출 계층으로 읽는 방법이다. 이 경우도 동일하게 우선은 대략적인 처리 흐름을 따라가고, 조금씩 깊이를 더해서 함수 안의 처리를 따라가는 것이 중요하다. 이 방법으로 읽어도 정보가 한쪽 귀로 들어와서 한쪽 귀로 나가버리는 느낌을 받는 경우가 있다면, 마지막 방법인 '끝에서부터 차례대로 베껴간다'를 시도해보자.
세 번째 단계, 끝에서부터 차례대로 베껴간다.
명확히 '하고 싶은 것', '조사하고 싶은 것'이 없이 '대충 읽으면' 읽은 내용이 뇌를 그냥 스쳐 지나갈 뿐이다. 이런 상태에서 어떻게 배울까를 고민한다고 해도, 판단을 위한 지식 자체가 없기 때문에 무의미하다. 그래서 지식의 밑바탕을 만들기 위해서 교과서를 그대로 베껴 쓴다. 이것이 '베끼기'라 불리는 기술이다. 지식이 없는 상태에서 고민하는 것은 무익하기 때문에 우선 아무것도 생각하지 않고 지식을 복사하는 것이다. 이 이상의 방법은 없다. 저자는 시간을 정해서 '25분간 어디까지 베낄 수 있는지' 도전하는 것을 좋아한다. 분량으로 나누는 것도 좋은 방법이다. 중요한 것은 간격을 적절히 해서 목표를 이루었다는 만족감을 얻을 수 있도록 하는 것이다.
대부분의 학습은 첫 번째 단계(필요한 부분부터 흡수한다)만 잘 습관화해도 지치지 않고 학습을 지속할 수 있다. 처음 시작 단계부터 모든 부분을 완벽하게 이해하고 넘어가겠다는 마음을 버리고 현재 상태에서 이해할 수 있는 부분까지만 이해하고 이해하지 못한 부분은 6개월, 1년이 지난 후 다시 도전하겠다는 마음가짐으로 접근하면 좋겠다. 프로그래밍이 0과 1로 나뉘고, 정확하게 정답이 떨어지는 디지털의 세상이지만 우리 사람은 아날로그적인 성향을 가진다. 자기 자신을 너무 완벽함 속으로 밀어 넣기보다 한 번에 모두 이해하지 못해도 괜찮다는 너그러운 마음으로 자기 자신을 다독이면서 학습할 때 오랜 시간 동안 지속할 수 있다. 지금까지 가지고 있던 자신의 학습 스타일을 프로그래밍을 학습하면서 깰 수 있다면 이는 프로그래밍을 학습하는 것보다 자신의 삶의 틀을 깨는 더 중요한 학습이 될 것이다.
“코딩을 지탱하는 기술” 책은 위 학습 방법과 관련한 내용 이외에도 프로그래밍 언어가 어떻게 변화 발전해 왔는지에 대해 흥미롭게 풀어내고 있기 때문에 읽어볼 것을 추천한다.
학습에 도움이 될만한 책을 추천하면서 이 장을 마친다.
- 습관의 힘(찰스 두히그 저/강주헌 역, 갤리온/2012): 삶에 있어 가장 중요하면서도 힘든 일이 좋은 습관을 만드는 것이다. 배움 또한 좋은 습관을 만들 때 가능하다.
- 이너 게임-배우면 즐겁게 일하는 법(티머시 골웨이 저/최명돈 역,오즈컨설팅/2006): 배움에 대하여 다른 관점을 느낄 수 있는 책이다. 특히 다른 사람과 비교하고 경쟁하는 것에 집중하지 않고 자기 자신에게 집중함으로써 몰입하는 방법에 대해 다루고 있다.
- 몰입의 즐거움(미하이 칙센트미하이 저/이희재 역, 해냄/2007): 행복한 삶을 살기 위해 몰입하는 것이 얼마나 중요한 것인지에 대해 다루고 있는 책이다. 몰입하는 것이 왜 어려운지에 대해서도 다룬다. 개발자에게 있어 몰입은 특히 즐겁고도 재미있는 경험이다.
많은 독자들이 첫 번째 양파 껍질을 벗고 두 번째 양파 껍질을 벗기기 위한 도전을 했으면 좋겠다. 두 번째 양파 껍질을 벗기는 도전에 이 책이 조금이나마 도움이 되었으면 한다.