베끼기 학습법
20대 중반, 문과, 복학생. NEXT에서 프로그래밍을 배우기 시작했을때 나의 모습이다. 그야말로 난관이었다. 한번에 쏟아지는 새로운 정보가 버거웠다. 무엇을 모르는지조차 모르는 상태가 지속돼 답답했다. 하지만 시간이 지나면서 내게 맞는 학습법을 점차 익힐 수 있었고 프로그래머로 자리잡는데 많은 도움이 됐다. 누구나 초반에 맞닥뜨리는 난관, 결국 필요한 것은 ‘자신에게 가장 맞는 학습법을 찾는 것’이다. 나에게 가장 잘 맞는 학습법은 베끼기였다.
베끼기의 시작 : 학생들을 멘붕에 빠뜨렸던 프로그래밍 과제
첫 학기가 시작하고 몇 주 지나지 않아 학생들을 멘붕에 빠뜨린 사건이 있었다. ‘자료구조와 알고리즘’ 과목의 실습 수업, 이론 수업 각각의 교수님 사이 커뮤니케이션 실수로 인해 재귀 이론을 배우지 않은 상태에서 ‘하노이의 탑’이 코딩 과제로 나온거다. 그러니까 프로그래밍을 처음 접한지 약 한 달 정도 된 상태에서 재귀의 개념도 모른채 하노이의 탑을 풀어야 했다. 당시에는 그 과제의 무시무시함을 알 길이 없었다. 주말을 보내고 과제 제출일인 월요일에 학교를 왔더니 난리도 아니었다. 문제를 풀려고 집에 안가고 주말 내내 학교에서 먹고 자고 했다는 사람들이 넘쳐났다. 잠을 거의 안 잤다는 사람도 많았고, 다들 초췌했다. 그럼에도 문제를 풀었다는 사람은 거의 없었다. 충격과 공포의 현장이었다.
나는 달랐다. 몇시간 걸리지 않아서 문제를 풀었다. 내가 아는 지식으로 몇번 시도한 뒤 구글 검색으로 해답을 찾은 것이다. 구글링 결과를 그대로 복붙한 것은 아니었고, 해답을 찾은 뒤 한줄 한줄 실행해보면서 풀이를 파악하고 혼자서도 똑같이 작성해볼 수 있을 정도로 익혔다. 그러나 학교에 왔을 때 다른 학생들은 어떻게든 직접 풀어보려고 이틀을 지새웠다니까 괜히 찔리고 내가 뭔가 잘못한 것 같았다. 편법인가 내가 너무 편한 방법으로 공부했나 싶었다. 수학문제를 풀 때 정답을 보면 실력이 늘지 않는다고 말했던 고등학교 선생님이 생각났다.
코드 베끼기 : 뇌가 절전모드일 때는 온라인 강의로 무작정 코드 따라쓰기
하루의 집중력이 소진된 저녁 시간대나 머리쓰기 싫은 날에는 온라인 강의를 들었다. 트리하우스의 유료 멤버십에 가입했고 유데미에서 유료 강좌를 구매했다. 앱 개발 강좌는 보통 이론 설명이 약간 있고 대부분은 강사가 화면에 치는 코드를 보고 따라 치면서 샘플 앱을 완성하는 형식이다. 그래서 머리가 잘 돌아가는 상태면 이런 형식의 강의는 금방 지루해진다. 온라인 강의는 약간 무념무상의 상태일때 활용하기 좋은 공부 수단인 것 같다.
딱히 집중을 하지 않고도 샘플 앱을 여러개 만들고나니 나만의 훌륭한 레퍼런스 코드가 돼있었다. 분명히 언젠가 해본적은 있는데 기억이 안날때, 내가 만들었던 샘플 앱을 열어서 코드를 찾아보고 방법을 다시 익혔다. 어찌됐든 내 손으로 직접 짰던 코드다 보니 원하는걸 빨리 찾을 수 있었고 코드를 보면 기억이 금방 되살아났다. 이렇게 몇 달에 걸쳐 모은 내 샘플 앱들은 개발을 배우기 시작한 후 거의 1년 동안 유용하게 활용됐다.
앱 베끼기 : 잘 만든 앱들을 참고해 따라 만들기
앱스토어 1위를 하게 해준 보안카드 위젯 앱도 베끼는 것으로 시작했다. 다만 앱 하나를 그대로 베낀 것은 아니었다. 여러 앱에서 마음에 드는 부분들을 가져왔다. 특히 UI/UX적인 부분에서는 애플 기본 앱이나 잘 만든 다른 앱을 보고 따라했다. 예를 들어 알림센터에서 보안카드를 조회하는 화면을 만들때는 위젯을 지원하는 계산기 앱을 여러 개 깔아보고 제일 나은 키패드 UI를 가져왔다. 잘 만든 앱을 따라 만들다보면 나만의 아이디어가 생겨나기도 하고 혼자서는 생각해내지 못했을 방법으로 개발을 하면서 실력이 는다.
베끼기와 찰떡 궁합 : 응용하고 반복하기
다행스럽게도 시간이 흐를수록 나의 코딩 실력은 꾸준히 늘었다. 모범 답안(best practice)을 찾아보고 필요하면 베낀뒤 나의 것으로 만들었다. 베끼기는 나와 잘 맞는 학습법이었다. 애초에 엉덩이가 무겁지 못한 측면도 있고 새로운걸 배울 때 앞선 사람들이 개척해놓은 최적의 방법을 따라하거나 나보다 잘하는 사람을 보고 모방하는 방식으로 초기 지식을 습득해왔다는걸 깨달았다. 가령 어떤 게임을 처음 시작할 때도 직접 삽질하기보다는 공략을 찾아보고, 잘하는 게이머의 영상을 보고 따라하면서 익히는게 더 재밌었다. 중요한건 처음에는 그렇게 베껴서 따라하더라도 패턴을 발견하고 원리를 파악한 이후부터는 금세 응용해 나만의 방식을 찾아낸다. 프로그래밍도 다르지 않다. 패턴이 있다. ‘소프트웨어 디자인 패턴’ 이라는게 존재하듯 특정 문제를 푸는 방법을 익히면 그걸 약간 응용해서 다른 문제도 풀 수 있게 되는 것 같다.
프로그래밍은 운동을 배우는 것과 비슷한 측면이 있어서 머리로는 이해했어도 직접 손으로 반복해서 훈련하지 않으면 내 것이 될 수 없다. 금방 까먹고 스스로 할 수 없는 상태가 지속된다. 무념무상으로 따라했던 온라인 강의지만 반복하다보니 강의를 따라 만든 앱이 20개가 넘어있었다. 사실 샘플 앱도 두어개 정도 만들고 나면 그 다음부터는 중복되는 내용이 많다. 스토리보드에서 뷰컨트롤러를 만들고 클래스를 만들어서 지정해주고 IBOutlet/IBAction을 연결하는걸 수도 없이 반복하게 된다. 하지만 이렇게 여러번 반복을 하다보니 언젠가부터는 눈보다 손이 먼저 움직이기 시작했다. 강사보다 빨리 개발을 끝내고 영상이 나를 따라잡기를 기다리던 순간은 쾌감있었다. 처음에는 보고 베끼는 것이었지만 반복하다보니 나의 근육 기억이 됐다.
🥑 현업 생존 전략 1 : 잘하는 사람이 개발하는 모습 따라하기
‘베끼기 학습법’은 현업에 와서도 자연스럽게 나의 성장 방법으로 자리잡았다. 그래서 첫 직장에서 옆자리에 앉은 사수님이 본인 개발하는 모습을 지켜보게 해주셨던 것이 너무 좋았고 나에게는 행운이었다. IDE에서 창을 왔다갔다 하는 모습, 소스 파일을 열었다가 닫는 방식, 자주 사용되는 단축키, 디버깅 툴은 어떻게 쓰는지, 코드를 작성하거나 고치다가 막혔을때 어떻게 헤쳐나가는지 그런 행동을 보고 따라하면서 엄청 많이 배웠다.
또 Xcode에서는 소스 파일을 생성한 사람의 아이디가 주석으로 남게 되는데 멘토님 아이디로 프로젝트 전체 검색을 돌려서 멘토님이 작성한 코드를 모으고 따라해볼 만한 코드가 없을까 찾아보고 이리저리 뜯어보면서 공부했다. 그러면서 습득한 지식이나 발견한 새로운 패턴이 내 기존의 것들과 융합이 되기도 하고 대체되기도 하면서 배움이 일어났다.
🥑 현업 생존 전략 2 : 회고 노트 만들기
프로그래밍을 배우는 와중에 반복적으로 좌절감이 찾아올 때가 있었다. 분명 여러번 했었던 건데도 다시 하려고 하면 기억이 잘 안나고 손이 키보드에서 잘 안 움직였다. 하는 방법을 다시 찾아보려고 해도 어디서부터 찾아봐야 하는지조차 기억이 안났다. 그래서 언젠가부터 회고 노트를 쓰기 시작했다. 처음에는 자유 형식으로 쓰기 시작했는데 쓰다보니 일정한 포맷을 갖추기 시작했다. (1) 하려고 했던 것
, (2) 해결한 방법
, (3) 새로 배운점 혹은 잘 안되고 막혔던 것
을 기록했다. 코드가 많이 들어갔는데 코드도 다 손으로 썼다. 공책을 첫 장부터 쓰기 시작해서 마지막 장까지 다 쓴 건 살면서 처음이었던 것 같다. 샘플 앱과 마찬가지로 이 공부용 회고 노트도 거의 1년 동안 너덜너덜해질 정도로 자주 들춰봤다. 그만큼 프로그래밍 처음 배울때는 단번에 익혀지는게 거의 없고 똑같은걸 수십번 반복해봐야 겨우 내 것으로 소화가 된다.
프로그래밍 공부할 때 회고 노트의 도움을 굉장히 많이 받았기 때문에 현업에 와서도 이어서 했다. 업무를 하면서 새로 배운 것, 특히 처음에는 막혔다가 해결한 것을 중점적으로 기록했다. 공부용 노트와 마찬가지로 업무용 회고 노트도 들춰볼 일이 자주 생겼다. 근데 문득 돌이켜보니 2년차부터는 회고 노트를 안쓰게 됐다. 다시 시작해볼지 고민을 해봐야겠다.
마치며
마지막으로 프로그래밍의 재미를 찾는게 장기적인 동기부여 차원에서 큰 도움이 된다. 1년 정도 개발을 배운 시점에 슬럼프가 찾아왔다. 수업에서 시키는 것들은 얼추 할만한거 같은데, 왠지 재미가 없었다. 없친대 덮친 격으로 html/css를 하다가 개발을 영영 포기할 뻔한 순간까지 갔었다. NEXT를 계속 다닐 것인지, 포기하고 대학교로 돌아갈 것인지 선택의 기로에 있었다.
다행히 모바일 앱 개발을 접하고 나서 상황이 바꼈다. 앱 개발은 흥미진진했고, 때마침 창업 전공이 새로 생겨서 마음 맞는 친구들과 팀을 만들어서 ‘무엇’을 만들지부터 같이 정하면서 개발하는 과정이 너무 즐거웠다. 뭐가 재밌는지도 사람마다 다를 것이다. 특히 초심자들은 본인의 흥미과 호기심을 자극하는 개발 분야를 찾아서 재밌게 개발을 배울 수 있기를 응원한다.
이 글의 초안을 읽어준 조소현, 류성두 님에게 고마움을 전합니다.
Tags: learning to program, mooc, next institute