안녕하세요 교수님, 박사님. 이번 학기 컴시이실 수업을 들으며 수업이 변화하는 과도기라 그런지 독특한 점이 많다고 생각했습니다. 수업을 들으며 느낀 문제점과 피드백을 적어 보았습니다. 아래 내용은 어디까지나 저의 개인적인 생각이나, 많은 학생들이 공감할 것입니다. 다음학기 수업을 운영하시는 데에 참고가 되셨으면 좋겠습니다.
컴시이실 수업의 가장 큰 문제점은 이론과 실습이 완전히 별개의 학문이라는 것입니다. 이론 수업에서는 컴퓨터 시스템, 그중에서도 어셈블리를 중심으로 수업이 진행되지만 실습(Lab)에서는 클라우드와 인프라 기술만을 다루고 있습니다. 학생들이 많은 어려움을 호소하는 bomblab, buflab 과제의 경우 순전히 어셈블리를 이용하는 과제이나 어셈블리를 이론으로만 배웠기에 실습 환경도 제대로 구성되지 않은 학생들에게 부담이 심했습니다. MobileX 과제의 경우 이론은 빈약한 MOOC 강의과 실습 때 사용한 markdown 몇 문단 뿐인데 웹, 서버, 인프라 개발의 방대한 지식을 요구하므로 이쪽 분야 경험이 없던 학생들은 단기간의 노력만으로 좋은 결과물을 내기 어려웠습니다.
컴시이실을 현재 수만 교수님이 진행하시는 이론 수업 위주로 구성한다면 일관성이 있고 알찬 수업이 될 것입니다. 이론 수업에서는 컴퓨터가 low-level에서 어떻게 동작하는지를 상세히 배울 수 있었고, 어셈블리를 통해 컴퓨터가 실제로 어떻게 작업을 처리하는 지를 배울 수 있었습니다. 지금의 실습 시간에 어셈블리 실습을 진행한다면 bomblab과 buflab 과제도 재미있는 과제로 기억되었을 것입니다. 진도가 느린 점이 다소 아쉬웠으나 컴퓨터 시스템 (low level) 위주로 수업을 재구성한다면 해결이 가능할 것입니다.
실습 시간에 진행되는 클라우드, 인프라의 경우 이 수업에 포함하기에는 과도합니다. 실습 시간에 교수님께서 가르치시려던 내용은 컴퓨터 시스템이 어떻게 발전을 거듭해 클라우드 시스템으로 발전했는지와 클라우드 시스템 개발로 보입니다. 그러나 실습에 주어진 시간은 주 1회 최대 4시간이며 한 학기라는 짧은 시간에 이 내용을 전부 가르치는 것은 무리가 있었습니다. 매주 2~3시간 정도 실습 시간에 클라우드와 인프라를 배웠다면 학생들이 어느정도 배워갈 수 있었겠지만, 실제로 이 수업에선 도합 6시간의 MOOC 강의로 대부분의 이론을 대체해버렸습니다.
동영상 강의의 내용 자체는 좋았습니다. 컴퓨터 시스템과 발전 과정에 대해 교양 지식을 얻고 싶다면 지루하지 않게 들을 수 있는 흥미로운 강의입니다. 그러나 전공 지식을 얻으려는 목적이며, 이 강의가 시험공부의 대상이 된다면 조금 다릅니다. 동영상 강의는 체계적으로 구조화 되어있다기보단 교수님이 말씀하시는 대로 이야기처럼 흘러갑니다. 컴퓨터 시스템의 발전 과정을 알기에는 좋을 지 모르나, 각각의 상세한 기능과 목적을 배우기에는 나쁜 방식입니다. 대부분의 개념은 이름을 언급되는 정도에 그치지만, 그렇게 6시간의 강의를 편성할 수 있을 정도로 강의에서 다루는 범위가 넓습니다. 학생들이 자신이 뭘 모르는지를 깨닫은 메타인지를 하기에는 좋습니다. 그러나 이 수업만으로 이후의 클라우드, 인프라 실습을 따라갈 순 없습니다.
이 수업에서 가장 기형적인 부분은 실습이라고 생각합니다. 일반적인 실습은 이렇게 진행됩니다. 박사님이 오늘 실습할 챕터를 알려주시고, 학생들을 각자 챕터의 마크다운을 읽습니다. 마크다운에는 그날 실습 내용의 이론이 한두문단 적혀있고 (각 기술 공식 문서의 introduction에도 미치지 못합니다) 학생들이 순차적으로 실행해야 할 커맨드가 수십개 나열되어 있습니다. 학생들은 각 커맨드의 의미는 하나도 배우지 못하고 그저 커맨드를 복사하고 터미널에 붙여넣기를 반복합니다. 학생들이 붙여넣다가 실수를 하거나, 실습 환경이 이상해 문제가 발생한다면 조교들이 찾아와 처음부터 다시 하라는 말을 반복합니다. 학생, 조교 모두 귀찮은 일을 빨리 끝내고 집에 가려는 듯 합니다. 저는 계속 문제가 발생해 동일한 랩을 처음부터 7번이나 시도한 적이 있습니다. 이때 조교에게 왜 문제가 발생하냐고 묻고 받은 답변은 '너는 운이 없었다' 입니다.
실습에서 다루고자 하는 내용은 너무 많고, 학생들의 수준은 이에 미치지 못합니다. 이론이 부족해 학생들의 수준이 향상되기도 어렵습니다. 실습은 기초적인 우분투 설치로 시작해 쿠버네티스로 끝납니다. 일반적으로 기업에서 쿠버네티스를 다루는 인프라 개발자는 경력 3년차 이상부터 채용 포지션이 열립니다. 많은 학생들은 우분투 설치가 난생 처음이며, 수업이 정말 알차게 진행되더라도 쿠버네티스까지 배우기는 현실적으로 불가능합니다. 그러나 이 실습에서는 매주 실습할 내용에 대해 1~2문단의 간단한 설명을 적어두고 학생들이 쿠버네티스까지 성공적으로 따라오기를 기대합니다. 저는 이 점이 굉장히 무책임하다고 느꼈습니다.
실습 내용을 보면 학생들이 많은 것을 알고 있다고 가정하시는 것 같습니다. 학생들이 터미널이 뭔지 알고, 인프라에서 노드의 의미를 알고, 서버가 서로 어떻게 통신하고, http가 무엇인지 정도는 알고 있다고 가정하시는지 설명하지 않고 넘어갑니다. 그러나 학생들은 OS가 무엇인지, 컴퓨터는 어떻게 통신하는지, 터미널에서 디렉토리는 어떻게 만드는지, ip가 무엇인지도 잘 모릅니다. 이들을 배울 수 있는 수업은 코스트리상 컴시이실 이전에 없으며, 이후에도 4학년 수업인 Operating System이나 Computer Networking 쯤은 되어야 합니다. 학생들은 실습의 이론은 커녕 선수지식조차 없으니 실습을 따라갈 수 없으며 문제가 발생하면 전적으로 조교에게 의존합니다. 제가 봤던 한 케이스는 이렇습니다. 매뉴얼에 다음과 같이 적혀 있었습니다. echo {NUC Hostname: One of nuc01, nuc02, nuc03} | sudo tee /etc/hostname 이를 본 학생은 echo 명령어에서 중괄호의 의미를 몰랐는지, 혹은 그저 복사와 붙여넣기에 너무 익숙해졌는지 이를 그대로 복사해서 터미널에 붙여넣었고 그 학생의 hostname은 'nuchostnameoneofnuc01nuc02nuc03'이 되었습니다.
이 이상한 hostname을 발견한 조교는 어떻게 대처했을까요? {NUC Hostname: One of nuc01, nuc02, nuc03} 대신 {NUC Hostname: nuc01} 을 입력해줬고 그 학생의 hostname은 이제 nuchostnamenuc01이 되었습니다. 이를 옆에서 지켜본 다른 학생은 자신의 hostname을 nuc02에서 nuchostnamenuc02로 변경했습니다. 이 놀라운 케이스에서 볼 수 있듯 실습의 어려움은 조교들의 미숙에서도 기인합니다. 이런 실습 방식에서는 실습 내용을 이해할 수 없으며, 동일한 실습을 했던 조교들 또한 수강생과 큰 차이가 없어보입니다. 실습 도중 문제가 발생했을 때 진정으로 문제 원인을 찾고 이를 해결할 수 있는 조교분들도 있었지만, 이분들은 전부 컴시이실 수업을 우수하게 수강했던 게 아니라 휴학을 하고 따로 인프라 공부를 하신 분들이었습니다. 그러나 학교에 이런 분들은 많지 않을 것입니다. 대부분의 조교는 그렇지 못하며, 결국 실습 도중 문제가 발생하면 그냥 처음부터 다시 진행하라고 합니다. 이런 일은 아주 흔하며, 학생들은 점차 수업과 조교에 대한 신뢰를 잃고 그저 빨리 실습을 끝내고 싶어합니다.
우분투 설치 실습 화요일 분반에서는 조교들의 예행연습 때는 알 수 없었던 문제가 발생했습니다. 20명 이상의 학생들이 동시에 https://ubuntu.com/download/desktop 에서 다운로드를 시도했고 같은 네트워크 회선을 이용해서인지 각 학생의 다운로드 속도는 수십 B ~ 수십 KB 정도로 매우 느려졌습니다. 학생들은 설치에만 30분 ~ 1시간 이상을 소요했고, timeout 에러로 설치에 실패해 계속 처음부터 다시 시도해야 했습니다. 이 문제는 한 학생이 우분투를 카카오, 카이스트 mirror에서 받자는 아이디어를 내 해소되었습니다. 저는 이 문제 경험을 선배들에게 말했고 선배들은 작년에도 동일한 문제가 있었으며 동일한 방법으로 해결했다고 알려줬습니다. 작년에도 발생했던 문제를 올해 대비하지 못했다는 것이 이해가 되지 않아 조교에게 왜 다운로드가 느릴 시 mirror를 사용하라는 안내를 매뉴얼이 넣지 않았냐고 물었습니다. 조교는 '학생들은 mirror를 선택할 실력이 되지 못한다'라는 어처구니없는 답변을 내놓았습니다. 이 사례를 보면 실습에서 발생한 수많은 이슈와 해결책이 그 다음해에 제대로 전달되지 않음을 알 수 있습니다. 매년 같은 문제가 발생하고, 대부분은 그냥 처음부터 다시 시도하며, 일부가 발견한 소수의 해결책은 전혀 공유되지 않습니다.
학생들의 불만이 극에 달한 것은 MobileX 프로젝트입니다. 올해부터 수업에 프로젝트가 추가되어 학생들에게 프론트엔드와 백엔드, 인프라, ai를 적절히 사용해 제대로 작동하는 서비스 제작을 요구했습니다. 왜 이런 프로젝트가 생겼는지는 공감할 수 있었습니다. CS 지식을 배우는 가장 좋은 방법 중 하나는 프로젝트를 진행하며 스스로 찾아 배우는 것이고, 각 기술의 쓸모와 등장배경을 이해할 수도 있습니다. 그런 측면에서 쿠버네티스를 배우려면 인프라를 이용한 프로젝트가 있어야 했고, 쿠버네티스를 배우는 이유를 이해하려면 막대한 컴퓨팅 자원과 분배가 필요한 AI가 적당했으며, 유저들이 사용하게 하려면 프론트엔드와 백엔드가 필요합니다. 그러나 이 프로젝트를 하기 위해서 학생들에게 요구되는 지식은 무엇인가요? 프론트엔드와 백엔드 중 적어도 하나는 해보았어야 하며 (GIST에 프론트엔드를 가르치는 수업은 존재하지 않으며 기초적인 백엔드는 4학년 수업인 Computer Networking에서 다룹니다) 불친절한 수업에서 가르치는 인프라 지식을 전부 이해했어야 하고, 최신 AI 모델을 내려받아 직접 작동시켜 보았거나(4학년 AI 수업들에서 다룹니다) 프롬프트 엔지니어링(가르치는 대학을 찾기 어렵습니다)이라는 생소한 분야를 해보았어야 합니다. 무엇하나 쉽지 않습니다.
그래서 제시된 해결책은 템플릿입니다. 조교님께서 프론트엔드, 백엔드, 인프라가 어느정도 구성된 템플릿을 만들어 제공해주셨습니다. 프론트엔드는 streamlit, 백엔드는 fastapi를 이용해 어느정도 기본 틀이 구성되어 있고 여러개의 예제를 준비해주셨습니다. 그리고 가장 까다로운 쿠버네티스도 템플릿으로 구성되어 간단한 커맨드 몇개만 실행해두면 작동하게 제공되었습니다. 템플릿이 제대로 작동하고 템플릿의 각 기능을 설명하는 상세한 매뉴얼이 있었다면 문제가 없었을 것입니다. 그러나 짧은 기간 안에 만들어진 템플릿에는 몇몇 버그가 있었고 복잡한 템플릿 속 버그를 해결하는 것은 처음부터 짜는 것보다 어려웠습니다. 템플릿은 최소한의 필수 기술로 구성되지 않고 응용 기술인 streamlit, langchain 등으로 구성되었습니다. 그리고 이런 함수들이 직접적으로 드러나지 않고, 많은 추상화와 객체화가 되어있었습니다. 템플릿을 만드신 분들 입장에서는 개발자 유지보수에 편리한 형태로 만들어주셨을지 모르나, 이는 이미 어느정도의 실력이 있는 사람에게만 해당 됐을 뿐 이 기술들을 처음 접하는 학생들은 방대한 템플릿의 코드를 전부 이해해야지 진정으로 프로젝트를 진행할 수 있고 버그를 수정할 수 있었습니다. k8s 배포조차 템플릿과 주어진 매뉴얼만으로는 동작하지 않았고, 매뉴얼에 누락된 부분을 yaml 파일을 보고 추론해 직접 설정해주어야지 작동했습니다. 또한 템플릿에는 학생들에게 친숙하지 않은 Docker, Poetry 등의 기술이 도입되어 있습니다. 쿠버네티스를 활용하려면 어느정도는 불가피한 기술이기는 하나, 제대로 설명되지 않았기에 학생들이 이 기술들을 파악하는데는 과도한 시간이 소요되었습니다. 얘를 들어, 파이썬 패키지를 anaconda만 이용해서 관리해본 일반적인 학생이 템플릿에 새로운 패키지를 추가하려면 다음 과정을 거쳐야 합니다.