Skip to Content
우아한테크코스 9기 선발 안내는 11월 중 공개합니다. 공지 보기 →
목차

책을 펼치는 중…

2부 · 강의 없는 학습 환경

5장

강의가 없다면 무슨 일이 벌어질까

미리 읽기 원고지금 보시는 원고는 집필 중인 초안입니다. 출간되는 책과는 문장과 구성이 다를 수 있습니다.

수영을 배운다고 해보자. 강사님이 시범을 보여줄 때는 어떻게 하는지 알 것 같다. 팔을 젓고, 고개를 돌려 숨을 쉬고, 다리를 움직이면 된다. 그런데 물에 들어가 따라 해보면 자세는 우스꽝스러워지고 물을 먹으며 첨벙거리게 된다. 팔과 다리를 따로 움직일 때는 되던 것도 한꺼번에 하려면 뜻대로 되지 않는다.

익숙하지 않은 것을 배울 때 우리는 비슷한 시행착오를 겪는다. 책이나 강의에서 예제를 풀어나가는 방식을 보고, 간단한 실습도 따라해 본다. 하지만 조금 다른 문제를 혼자 해결하려 하면 막막해진다. 설명을 더 들어야 하는지, 이미 들은 것을 잘못 적용하고 있는지, 내가 무엇을 모르는지 스스로도 구별하기 어렵다.

이번에는 가르치는 신입 수영 강사의 입장이 되어보자. 수강생들이 자유형을 배우며 어려워할 만한 부분을 미리 생각한다. 보여줄 자세를 연습하고, 물의 저항을 줄이면서 앞으로 나아가는 원리를 최대한 쉽게 설명할 준비를 한다. 주의할 점까지 알려주면 수강생들은 고개를 끄덕인다. 하지만 막상 레인을 따라 헤엄치게 하면 온몸이 따로 움직이는 수강생들을 보게 된다. 설명을 알아들었다고 해서 몸이 곧바로 따라주지는 않는다.

우테코에도 이런 고민이 있었다. 우리가 만나는 크루들은 프로그래밍을 직업으로 삼으려는 사람들이다. 수업에서 본 예제를 따라 만드는 데서 끝나서는 안 된다. 회사에 들어가면 수업에서 다루지 않은 문제도 만나고, 배운 적 없는 기술을 써야 할 수도 있다. 그런 문제 앞에서도 필요한 것을 배우고 해결해나갈 수 있어야 한다. 설명을 더 잘 준비하는 것만으로 이 경험을 충분히 줄 수 있을까.

우테코는 그래서 강의를 점차 줄이고, 크루가 직접 만들어보고 고치는 시간을 늘리는 쪽을 선택했다. 그 시간을 위해 준비한 과제가 미션이다. 미션을 해결하면서 얻은 경험으로 더 어렵고 복잡한 현업의 문제도 해결해나갈 수 있는 힘을 기르고 싶었다.

배운 것을 익힐 수 있도록

해결하고 싶은 문제가 있으면, 무엇을 배워야 하고 배운 것을 어디에 써볼지가 분명해진다. 수영에 빗대어보면 이런 차이다. 자유형의 원리와 동작을 차례로 가르칠 수도 있고, 언젠가 저 50m 레인을 스스로 건너는 것을 목표로 삼을 수도 있다. 50m를 건너겠다는 목표가 있으면 발차기는 앞으로 나아가기 위한 방법이 되고, 호흡은 중간에 멈추지 않고 헤엄치기 위해 연습할 일이 된다. 물론 처음 물에 들어가는 사람에게 곧바로 50m를 건너게 할 수는 없다. 강사가 곁에서 돕고, 지금 시도할 수 있는 거리와 동작부터 연습해야 한다.

배우고 익히는 두 과정은 ‘학습’이라는 말에도 담겨 있다. ‘배울 학(學)’과 ‘익힐 습(習)’의 글자 모양을 보며 두 장면을 떠올려볼 수 있다. ‘學’에는 지붕처럼 보이는 부분 아래에 아이를 뜻하는 ‘子’가 있다. 누군가의 가르침을 받으며 배우는 아이의 모습이 떠오른다. ‘習’의 위쪽에는 깃과 날개를 나타내는 ‘羽’가 있다. 옛 자전인 《설문해자》에서는 ‘習’을 새가 거듭 날아보는 것으로 풀이했다. 날개를 움직이며 나는 법을 익히는 장면이다.

'배우고, 익히는 두 장면'. 왼쪽은 배울 학(學) 아래 지붕 밑에서 어른이 아이에게 책을 짚어 주는 그림(子·아이, 글자 모양에서 떠올린 배움의 장면), 오른쪽은 익힐 습(習) 아래 날개를 펴고 나는 새 그림(羽·날개, 거듭 날아본다는 옛 풀이)
왼쪽은 글자 모양에서 떠올린 장면, 오른쪽은 《설문해자》의 풀이를 그린 것이다.

우테코는 배운 것을 직접 써보고, 뜻대로 되지 않으면 도움을 받아 고쳐보는 ‘습’의 시간을 충분히 마련하고 싶었다.

우테코에서 미션은 주어진 기능을 갖춘 프로그램을 직접 만들어보는 과제다. 가령 장바구니 미션에서는 인터넷 쇼핑을 할 때 사용하는 장바구니를 만든다. 상품을 선택하거나 수량을 바꾸면 결제 금액도 맞게 바뀌어야 한다. 크루는 완성할 화면과 지켜야 할 조건을 보고, 그것이 작동하도록 코드를 작성한다.

아래는 실제 미션 시안에서 상품 목록과 금액 부분을 가져온 것이다. 두 화면 모두 상품 A는 선택되어 있다. 왼쪽에서 상품 B에도 체크하면 오른쪽처럼 바뀐다. 상품 금액뿐 아니라 배송비도 함께 달라진다.

장바구니 시안 두 장. 왼쪽 '상품 A만 선택'은 주문 금액 70,000원, 배송비 3,000원, 총 결제 금액 73,000원. 오른쪽 '상품 B도 선택'은 주문 금액 120,000원, 배송비 0원, 총 결제 금액 120,000원. 두 화면 모두 '총 주문 금액이 100,000원 이상일 경우 무료 배송됩니다' 안내가 있다
실제 시안 일부. 상품 B를 추가로 선택하면 무료 배송 기준인 10만 원을 넘는다.

사용자에게는 체크 표시 하나를 바꾸는 일이다. 하지만 만드는 사람은 주문 금액과 배송비, 최종 결제 금액이 함께 바뀌도록 해야 한다. 상품 B를 골랐는데 배송비가 남아 있으면, 무료 배송인데도 3천 원을 더 내는 화면이 된다.

이제 크루에게는 구체적인 질문이 생긴다.

  • 상품 선택이 바뀌었다는 것을 프로그램이 어떻게 알아차리게 할까?
  • 선택한 상품의 가격과 수량으로 주문 금액을 어떻게 계산할까?
  • 주문 금액이 무료 배송 기준을 넘었는지 확인하고, 배송비를 어떻게 정할까?
  • 선택을 바꿀 때마다 금액을 다시 계산하고, 그 결과가 화면에도 바로 나타나게 하려면 어떻게 해야 할까?

막힌 부분에 필요한 설명을 찾아 공부한 뒤에는, 방금 만들던 장바구니에서 상품 B를 선택하거나 선택을 취소해보면 된다. 주문 금액과 배송비, 최종 결제 금액이 함께 맞게 바뀌는지 확인하는 것이다.

미션을 하는 동안 코치는 크루가 시도한 코드를 함께 살펴보고, 막힌 부분에 질문이나 설명을 보탠다. 동료나 코드를 검토해주는 개발자에게도 도움을 받을 수 있다.

미션을 하다 막히면 무엇을 공부할까

장바구니에서 배송비가 잘못 표시되면 결과가 틀렸다는 것은 알 수 있다. 하지만 왜 틀렸는지, 원인을 찾으려면 무엇부터 공부해야 하는지는 여전히 막막할 수 있다. 기초가 부족한 것 같아 강의를 처음부터 다시 듣고 싶어질 수도 있다.

장바구니와는 다른 미션에서도 비슷한 고민이 있었다. 프로그래밍 연습 문제를 풀며 자신의 공부 방법을 돌아보던 한 크루는, 기초 강의를 이미 들었는데도 문제가 풀리지 않자 이렇게 생각했다고 적었다.

강의를 다시 들어야겠다는 생각이 들었습니다.

이 크루는 책이나 강의의 순서대로 공부하다 보면 이미 아는 내용도 다시 배우고, 지금 필요하지 않은 내용까지 따라가다가 목적을 잃곤 했다고 했다. 이번에는 짧은 설명으로 기본을 파악한 뒤 문제를 풀어봤다. 막히면 문제를 더 작게 나누고, AI와 대화하며 어느 개념을 모르는지 확인했다. 그 부분을 공부한 뒤 곧바로 문제에 써보려고 했다. 이렇게 하니 자신이 무엇을 모르는지 더 구체적으로 알 수 있었다는 회고였다.

새 냉장고를 샀다고 해보자. 설명서를 처음부터 끝까지 읽은 뒤에야 사용하기 시작할까? 사용하다가 냉장실 온도를 바꾸고 싶어지면, 해당 부분을 찾아 읽고 설정을 바꿔볼 수도 있다. 이 크루에게는 풀던 문제가 그런 역할을 했다. 무엇을 알아봐야 하는지, 알아본 뒤 어디에 써볼지 정하는 데 도움이 된 것이다.

필요한 공부를 찾아가려면, 막혔을 때 무엇을 살펴볼지도 배워야 한다. 수업을 준비하는 우리에게는 이 과정에서 어떤 설명을 보탤지가 고민이었다. 무엇을 먼저 알려주고, 무엇은 직접 해본 뒤에 설명하면 좋을까.

설명은 언제 도움이 될까

교육 연구자 신하와 카푸르는 수학·물리 학습을 중심으로 수업의 순서를 비교한 53개 연구를 종합했다. 한쪽은 문제를 먼저 풀어본 뒤 설명을 들었다. 다른 쪽은 설명을 먼저 듣고 문제를 풀었다. 이미 배운 풀이 순서를 따라 문제를 푸는 능력에서는 두 순서의 차이가 뚜렷하지 않았다. 반면 원리를 이해하고 다른 문제에도 써보는 능력에서는 문제를 먼저 풀어본 쪽이 평균적으로 유리했다.

'순서에 따라 달라진 배움'. 위에는 '문제→설명'과 '설명→문제' 두 순서. 아래 왼쪽 '배운 대로 풀기'는 집 모양을 같은 조각으로 다시 맞추는 그림에 '뚜렷한 차이 없음', 오른쪽 '이해하고 응용하기'는 같은 조각으로 배 모양을 새로 맞추는 그림에 '문제→설명이 유리'
연구의 평균 결과를 요약했다. 효과 크기는 따라 풀기 −0.03, 이해·응용 +0.36으로, 점수나 퍼센트가 아니라 두 집단의 차이를 공통 척도로 나타낸 값이다. 도형은 두 능력을 구별하기 위한 비유다.

이 연구에서 문제를 먼저 풀어본 학습자들도 뒤에는 설명을 들었다. 연구자들은 학습자가 시도한 풀이와 뒤의 설명을 연결하는 방식도 중요한 조건으로 다뤘다. 우리에게도 미션에서 겪은 어려움을 수업에서 어떻게 다룰지가 중요한 일이었다.

만들어본 장바구니를 보며 수업하기

우테코의 공통 피드백 시간에서는 크루들이 미션을 하며 겪은 어려움과 자주 하는 실수를 함께 다룬다. 크루들이 만든 코드를 살펴보며, 왜 그런 문제가 생기는지와 어떻게 고칠 수 있는지를 이야기한다.

가령 앞의 장바구니에서 상품 B를 추가했을 때는 무료 배송으로 바뀌는데, 다시 뺐을 때는 배송비가 돌아오지 않는다고 해보자. 이때는 크루가 어디까지 확인했는지에 따라 수업에서 설명할 내용도 달라진다.

무엇부터 봐야 할지 모르겠다면, 상품 B를 넣었다 뺄 때 화면에서 달라지는 값을 함께 확인해본다. 주문 금액은 12만 원에서 7만 원으로 돌아왔는데 배송비만 0원에 남아 있다면, 상품 금액을 더하는 일과 배송비를 정하는 일을 나누어 살펴볼 수 있다. 주문 금액은 맞게 바뀌었으니, 배송비를 정하는 코드부터 살펴보면 된다.

배송비가 문제라는 것을 찾았다면, 크루가 생각하는 계산 결과부터 확인해볼 수 있다. 7만 원일 때 배송비가 얼마여야 하는지 모르겠다면 무료 배송 조건을 다시 짚어준다. 배송비가 3천 원이어야 한다는 것은 안다면, 상품을 추가할 때와 뺄 때 배송비를 다시 계산하는 코드가 모두 실행되는지 함께 살펴본다. 뺄 때의 계산이 빠져 있었다면, 이제 선택이 바뀔 때마다 계산하도록 만드는 방법을 설명할 수 있다.

크루는 방금 확인한 문제를 떠올리며 설명을 듣고, 자기 코드를 고친 뒤 상품 B를 골랐다가 다시 빼면서 배송비가 맞게 바뀌는지 확인할 수 있다.

이어서 상품의 수량을 바꾸는 경우까지 확인해보게 할 수도 있다. 선택한 상품이 같아도 수량이 달라지면 주문 금액이 바뀌므로 배송비를 다시 계산해야 한다. 앞서 배운 방법이 이 경우에도 통하는지 써보는 것이다.

배송비 계산에 정말 그 기능이 필요했을까

장바구니를 만들다 보면 계산 결과가 맞는지에 더해, 그 결과를 만드는 방법이 적절한지도 고민하게 된다. 한 크루는 장바구니 미션에서 자신이 쓴 방법을 두고, 코드를 검토해주는 개발자와 온라인으로 이야기를 나눴다.

이 크루는 배송비와 최종 결제 금액을 계산하는 코드에, 계산에 쓰이는 값이 같으면 앞의 결과를 다시 사용하는 기능을 넣었다. 예를 들어 상품과 배송 조건이 그대로라면, 화면이 다시 그려질 때 같은 배송비를 거듭 계산하지 않아도 되는 것이다. 리뷰어는 이 계산이 그런 기능을 써야 할 만큼 성능에 영향을 주었는지 물었다.

크루는 성능을 측정해서 선택한 것은 아니었다고 답했다. 그러면서 실제 차이가 궁금해져 두 방식을 비교해봤다고 했다. 아래는 리뷰어의 질문과 크루의 답변 일부다.

GitHub 리뷰 대화. 리뷰어: '해당 계산들이 useMemo를 해야할 만큼 성능에 영향을 주었나요?' 크루(Author): '정확한 성능 수치를 근거로 useMemo를 도입했다기보다는, 해당 값들이 다른 값들로부터 파생되는 상태라는 점에서 useMemo를 사용하면 좋겠다는 판단이 들었습니다. 문득 성능상 차이가 실제로 존재할까 궁금해져서, 간단하게 두 가지 방식으로 테스트를 진행해 보았습니다. 테스트 코드를 아래 첨부합니다.' 계정명과 아바타는 가려져 있다
GitHub의 실제 대화 화면. 위는 리뷰어의 질문, 아래는 크루의 답변이다. 계정명과 아바타만 가리고, 답변은 앞부분을 발췌했다. useMemo는 앞의 계산 결과를 다시 사용하는 기능의 이름이다. 뒤에 이어지는 코드와 측정 결과는 생략했다.

크루는 해당 기능을 쓴 코드와 쓰지 않은 코드를 준비하고, 화면을 그리는 데 걸리는 시간을 여러 번 측정해 결과를 남겼다. 자신이 비교한 범위에서는 큰 차이가 없어 보인다는 판단이었다.

그런데 비교 결과를 얻은 뒤에도 질문은 남았다. 크루는 성능 차이가 작더라도, 다른 값에서 계산해 얻는 값이라는 점을 코드에 드러내는 데 의미가 있지 않겠느냐고 다시 물었다. 리뷰어는 그 관계는 기존 코드만으로도 알 수 있다는 의견을 남겼다. 같은 코드를 보고도 이 기능이 필요한 이유에 대해서는 생각이 달랐다.

이 크루는 리뷰어의 질문을 받고 자기 코드에서 두 방법을 비교해봤다. 비교한 결과를 보여주면서, 그래도 이 기능을 쓸 이유가 있는지 다시 물었다.

우리가 잘 배운다면, 무엇을 해보고 싶은가

배운 것을 자기 일에 써보고 싶을 때도 미션을 스스로 만들어 볼 수 있다. 크루가 자기 장바구니에서 두 방법을 비교해봤듯, 우리도 배우려는 방법을 실제로 써보고 확인할 일을 정하는 것이다. 가령 AI를 잘 쓰고 싶어서 공부하고 팀에도 전파하려 한다고 해보자. 기능을 익히고 활용 사례를 모을 수 있다. 그런데 업무에서 어디에 쓸지 정하지 못하면, 바쁜 일에 밀려 써보는 일은 자꾸 뒤로 미뤄진다. 이때 질문을 바꿔보는 것이다.

우리가 AI를 정말 잘 쓴다면, 그걸 가지고 뭘 하고 싶을까?

가령 쇼핑몰에서 일하는 우리가 AI를 활용해 고객이 장바구니에서 겪는 불편을 줄이고 싶다고 해보자. 피드백을 모으고, 비슷한 불편끼리 묶고, 고칠 문제를 고르고, 화면을 바꾼 뒤 효과를 확인해야 한다. 그중 AI의 도움을 받아 먼저 해볼 일로, 이미 모아둔 피드백 몇 개를 비슷한 불편끼리 묶는 미션을 정할 수 있다. 어떤 불편부터 고칠지 찾기 위한 첫 단계다.

직접 몇 개를 읽어 묶어보고, AI에게도 같은 일을 부탁한다. 이때 왜 그렇게 묶었는지 알 수 있도록 근거가 된 구절도 함께 표시하게 한다. 다음은 이 연습을 위해 만든 예시 피드백이다.

배송비가 비싸고, 얼마를 더 담아야 무료인지도 모르겠어요.

사람은 이 문장을 ‘배송비 부담’으로, AI는 ‘무료 배송 안내’로 분류했다고 가정해보자. 어느 한쪽이 틀렸다고 하기 전에, 한 문장에 불편 두 가지가 함께 담겨 있는 것은 아닌지 볼 수 있다. 그러면 하나의 피드백에 분류를 여러 개 붙이도록 기준을 바꿔볼 수 있다.

이제 공부할 것도 구체적이다. AI에게 분류 기준과 예시를 어떻게 알려주면 좋을까. 원문에 없는 이유를 지어내지 않도록 하려면 무엇을 확인해야 할까. 필요한 방법을 찾아 방금 그 피드백에 써본다. 처음에 맞춰본 문장 외에 다른 피드백도 넣어보면, 고친 기준이 다른 경우에도 통하는지 확인할 수 있다.

이렇게 분류한 피드백에서 무료 배송 조건을 알기 어렵다는 의견이 여러 번 나타났다고 해보자. 다음에는 고객이 어떤 안내를 보고 있는지 실제 장바구니 화면을 살펴본다. AI로 의견을 분류한 결과를 고객의 불편을 줄이는 일에 써보는 것이다.

작은 미션에도 전체 목적은 기억해야 한다

화면을 살펴보니 현재 배송비는 표시되어 있지만, 무료 배송까지 얼마를 더 담아야 하는지는 알 수 없었다고 해보자. 다음 미션은 고객이 그 금액을 쉽게 알 수 있도록 안내를 바꾸는 일로 정할 수 있다.

직접 기능을 만드는 사람이라면 계산부터 나누어 해볼 수 있다. 앞의 장바구니에서 상품 A만 선택했을 때 무료 배송까지 남은 3만 원이 맞게 나오는지 확인하고, 그 결과를 화면에 표시한다. 상품 선택이나 수량을 바꿔도 안내가 맞는지 확인한다. 화면 구성을 맡은 사람이라면 고객이 금액을 확인하기 쉬운 위치와 표현을 몇 가지로 그려 비교해볼 수 있다. 맡은 작업에 따라 첫 시도는 달라도, 고객이 배송비를 미리 알 수 있게 한다는 목적은 같다.

금액을 정확히 계산해도 안내가 눈에 띄지 않으면 고객은 여전히 배송비를 알기 어렵다. 화면을 처음 보는 사람에게 상품을 골라보게 하고, 배송비와 무료 배송까지 남은 금액을 찾을 수 있는지 확인해볼 수 있다. 찾지 못한다면 표시할 위치나 표현을 다시 바꿔본다. 이렇게 고객이 배송비를 미리 알고 주문할 수 있는지까지 살펴봐야, 작게 나눈 미션이 처음 해결하려던 문제로 이어진다.

우테코는 크루의 학습이 미션 하나를 완성하는 데 머무르지 않기를 바랐다. 미션을 해결하면서 얻은 경험으로 더 어렵고 복잡한 현업의 문제를 해결해나갈 수 있는 힘을 기르고 싶었다. 문제를 지금 시도할 수 있는 작은 일로 나누고, 막힌 부분에 필요한 설명과 도움을 구하고, 배운 방법이 통하는지 확인하는 경험이 다음 문제를 만났을 때도 도움이 되기를 바란 것이다.

그래서 강의를 줄이며 우리는 크루가 직접 해결해 보는 경험과 막혔을 때 도울 방법을 함께 준비해야 했다. 크루가 막힌 부분을 함께 살피고 필요한 설명을 해준 뒤, 크루 스스로 코드를 고쳐보게 하는 일이었다.

배우고 싶은 것이 있다면, 그것을 잘 배워서 무엇을 해보고 싶은지 떠올려 보자. 그 일을 지금 아는 만큼 시도할 수 있는 작은 미션으로 나누어보고, 해보다 생긴 질문에 필요한 설명과 도움을 찾아보자. 한 가지를 해냈다면 조건을 조금 바꾼 문제에서도 배운 방법을 써보자. 어디까지 통하고 무엇을 더 알아야 하는지 확인하는 일이 다음 배움과 성장으로 이어질 수 있다.

5장 미리 읽기는 여기까지입니다.
다른 장은 책이 나오면 만날 수 있습니다.

목차로 돌아가기