베끼기 학습법

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  

Learning by Copying

In my mid-20s, liberal arts major, returning student. This was me when I started learning programming in NEXT. It was very difficult. All the new information pouring out was overwhelming. It was frustrating to continue not even knowing what I didn’t know. Over time, I was able to gradually learn the learning style that suits me and it greatly helped me become a real programmer. The difficulties that everyone faces in the beginning, what you need is ‘finding the learning style that suits you.’ The learning style that suited me the most was copying.

The Beginning of Copying: The Programming Assignment that Left Students in a Mental Breakdown

There was an incident that left students in a mental breakdown after only a few weeks into the first semester. Due to a communication error between the professors of the lecture and lab classes within the ‘Data Structure and Algorithm’ course, we got a ‘Tower of Hanoi’ coding assignment before learning about recursion theory. So about a month into learning programming, I had to solve the Tower of Hanoi without knowing about the concepts of recursion. Back then, there was no way of knowing about the horrors of that assignment. After the weekend, I came back to school on Monday, which was the deadline. It was a mess. There were so many people who didn’t go home and stayed in school all weekend trying to solve the problem. There were a lot of them who got almost no sleep, and they all looked worn out. Even then, almost no one was able to solve the problem. It was a scene of shock and fear.

I did it differently. I was able to solve the problem in a few hours. I tried a few times with my own knowledge and found the solution through Googling. I did not copy-paste the results from the Internet but figured it out as I ran it line by line, and understood the solution until I could write the same thing on my own. But when I came to school and saw the other students who stayed up for two nights trying to solve the problem on their own, I felt like I did something wrong. I felt guilty as if I cheated or studied in a way that was too convenient. I was reminded of my high school teacher who said that you won’t get better in math if you see the answer.

Copying Codes: Blindly copy codes when your brain is in sleep mode

I listened to online classes when I lost concentration in the evening or when I just didn’t want to use my head. I signed up for Treehouse’s paid membership and purchased paid courses at Udemy. App development courses usually have theoretical explanations and most of them are in the form of completing a sample app by copying the codes that the instructor types on screen. These types of lectures quickly get boring when you’re in a good state of mind. Online lectures seem like good study tools to use when your mind is kind of in a void state.

When I made several sample apps without paying much attention, they became good reference codes for my own. I opened up the sample apps and looked for the codes to learn how they’re done again whenever I remembered them but couldn’t remember how they were done. It was a code I’d written anyway so I was able to find what I wanted, and when I did, my memory came back quickly. These sample apps that I collected for months stayed useful for almost a year after I started learning programming.

Copying an app: Refer to well-made apps and copy them

The security card widget app which got first place in the App Store also began by copying. But this was not a copy of just one app. I got parts that I liked from several apps. Especially for UI/UX, I copied Apple’s basic apps or other well-made apps. For example, when I was working on the screen which shows the security card in the notification center, I installed several calculator apps that support widgets and got the UI that I thought was the best. As you copy well-made apps, you get your own ideas and your skills improve as you develop in ways you couldn’t have come up on your own.

Perfect match with copying: applying and repeating

Thankfully, my coding skills continuously improved over time. I looked for the best practice, copied them as needed, and made them mine. Copying was a learning style that suited me well. I couldn’t sit in one place for too long, and I realized that I’ve been gaining knowledge by imitating the optimal methods established by the people before me, or copying someone who is better than me. For example, when starting a game for the first time, it was more fun to learn by looking for strategies and imitating good gamers by watching their videos rather than trying to play blindly. The important thing is, even if I start by imitating, once I find the pattern and figure out the principle, I quickly apply them to find my own methods. Programming is no different. There is a pattern. Just like there is something called a ‘software design pattern,’ once you learn how to solve a problem, you can apply it to solve other problems as well.

There is a similar aspect in programming with physical exercise, so even if you understand it with your head, if you don’t keep training yourself with your own hands, you’ll soon forget it and continue to stay unable to do it on your own. I followed the online lectures without any thoughts, but as I kept repeating, there were more than 20 apps that I made by following the lectures. Actually, there are lots of repetitions after making a couple of sample apps. You get to repeat creating a ViewController from the storyboard, create a class, assign it, and connect IBOutlet/IBAction countlessly. But after repeating it several times, my hands started to move before my eyes. The moment I finished working before the instructor, and waiting for the lecture to catch up with me was very satisfying. It was copying at first, but as I kept on repeating, it became my muscle memory.

🥑 Job Survival Strategy 1: Imitating how a good developer works

‘Learning by copying’ naturally became my method of growth in actual work. I was lucky to have a senior who sat beside me and made me watch him work and it helped me greatly. I learned a lot from watching and copying the way he moved back and forth between windows in IDE, the way he opened and closed source files, frequently used shortcuts, how to use debugging tools, how to get through situations where you get stuck when you’re writing or modifying a code.

Also, in Xcode, the ID of the person who generated the source file remains as an annotation. So I studied by collecting the codes written by my mentor by searching for his ID in the whole project and looking for codes that I can imitate. While doing that, I learned as the new knowledge I acquired would fuse with or replace the ones I had.

🥑 Job Survival Strategy 2: Making a Retrospective Note

There were times when I repeatedly faced frustration while learning programming. I knew I did it several times, but I couldn’t remember as I tried to do it again, and my hands wouldn’t move well on the keyboard. I tried to look for ways to do it again, but I couldn’t even remember where to start looking. So I started to write retrospective notes at some point. I started writing without any format at first, but as I kept on writing, it started to have a certain format. I recorded (1) what I tried to do, (2) how I solved it, (3) things I learned or things that didn't work well, or points I got stuck in. There were a lot of codes, and I wrote all of them by hand. For the first time in my life, I used a notebook until the final page. Just like the sample apps, I looked at this notebook for almost a year until it wore off. When you first start programming, you rarely learn something at once, and you need to repeat something dozens of times to make it your own.

The retrospective notes were very helpful for my programming studies, so I kept on writing them even in actual work. I mainly recorded the new things I learned from work, especially the things I got stuck in at first and resolved after. Just like the study notes, I referred to the retrospective notes from work quite often. Then I found out that I did not write any retrospective notes starting from my second year as a developer. I should think about whether I should start writing them again.

Wrapping Up

Lastly, finding the fun of programming greatly helps in terms of long-term motivation. I experienced a slump after learning development for about a year. I could do things that I was told to do in class, but somehow it was not fun. I almost gave up on development as I was working on Html/CSS. I was at the crossroads of whether I should continue to attend NEXT, or give up and go back to college.

Fortunately, things changed after I encountered mobile app development. App development was interesting, and a new major in start-ups was created just in time. The development process of a team of friends deciding what to make together was so fun. The definition of fun is going to vary from person to person. I encourage beginners to explore development areas that stimulate their interests and curiosity, and learn about development in a way in which you can have fun with it.

이 글의 초안을 읽어준 조소현, 류성두 님에게 고마움을 전합니다.

Tags: learning to program, mooc, next institute  

[번역] 초짜가 된 기분

원문: Paul Graham의 Being a Noob

어렸을 때는 나이가 들면 모든걸 알게 되겠지 생각했다. 막상 내가 나이 들어 보니 전혀 그렇지 않다.

요새 여러 방면에서 초짜가 된 기분이 자주 든다. 창업자들과 얘기를 나누면 그 분야에 대해 전혀 모르겠고, 읽는 책의 주제는 생소하고, 새로운 나라에 가보면 당최 일이 어떻게 돌아가는지 모르겠다.

초짜로 돌아간 기분은 썩 달갑지 않다. 초짜라는 단어도 별로 좋은 뜻이 아니다. 그런데 오늘, 초짜가 되는 것에 담긴 긍정적인 의미를 깨달았다. 가까이서 봤을때는 초짜처럼 보일지언정, 멀리서 보면 덜 초짜라는 것이다.

예를 들어 당신이 고향을 떠나 머나먼나라로 여행을 떠난다면 처음에는 낯선 곳에서 자신이 더 바보같고 어색하고 이방인처럼 느껴질 것이다. 그러나 막상 가보면 고향에 남았을 때보다 훨씬 많은걸 보고 배울수 있다. 그러니 초짜가 되는 것과 무지(無知)는 음의 상관관계이다.

근데 새로운 분야에서 초보가 돼보는 것이 실제로 우리에게 좋은 거라면, 우리는 왜 그 느낌이 싫은걸까? 그런 거부감이 대체 어떤 진화론적 의미가 있는걸까?

내 생각에 초짜가 된 기분을 느끼는 원인은 두 종류가 있다. 무지할 때와 새로운 것을 시도할 때. 내가 초짜일 때 느끼는 불편함은 우리의 뇌가 ‘어서 빨리 상황을 좀 파악해봐’라고 명령하는 것이다. 인류의 역사를 돌이켜 봤을때 옛날에는 주변 상황을 빨리 파악해서 위험으로부터 벗어나는게 생존에 유리했다. 수렵/채집 생활을 하던 인류도 자신의 인생은 복잡하다고 생각했겠지만 오늘날만큼 주변 상황이 빠르게 바뀌지는 않았다. 어느날 갑자기 암호화폐를 어떻게 받아들여야 할지 결정할 일은 없었다. 그러니 옛날에는 새로운 문제를 발견하는 능력보다는 당장의 배고픔을 해결하는 편이 생존에 유리했다. 식량이 부족했던 시대에 배고픔을 경계했던 것 때문에 인간은 초짜가 된 느낌을 경계하게 된 것이다.

이제는 도리어 식량이 넘쳐나서 문제인 시대에, 배고픔을 두려워하는건 엉뚱하다. 초짜가 된 느낌을 두려워하는 것도 마찬가지다.

새로운 걸 시도할때는 처음엔 불편한 느낌도 들고 우스갯거리가 될 것 같은 두려움이 들기도 한다. 하지만 당신이 초짜가 된 느낌을 자주 느낄수록, 더 좋다.

Tags: being a noob, paul graham