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.
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