읽을 거리/잡담

POCU 아카데미 COMP 2300 (어셈블리 프로그래밍) 후기

hwi.middle 2025. 4. 22. 13:38

한 줄 요약

수강을 망설이는 것은 시간낭비일 뿐이다. 강력하게 추천!

 

POCU 아카데미는 어떤 곳인가?

어셈블리 프로그래밍 과목에 대해 언급하기에 앞서, POCU에 대한 내용을 짧게 훑어보자. POCU는 저명한 프로그래머 '김포프'가 만든 교육기관이다. POCU에 대한 리뷰를 찾아볼 정도로 프로그래밍과 컴퓨터 공학에 관심이 있는 사람이라면, 그가 누구인지에 대해 부연설명은 불필요할 것이다.

유튜브에 무료로 공개된 부분을 발췌하였습니다.

기본적으로 동영상 형태로 강의가 진행되며, 추가 비용을 결제하면 '풀코스'로 수강할 수 있다. 풀코스는 실습과 과제를 부여받고, 강사(김포프)와 조교, 해당 학기 수강생들이 모여있는 slack 대화방에 참가할 수 있다. 이 대화방에서 실습/과제에 대해 토론 및 질문을 할 수 있다.

수업은 어떻게 진행되는가?

잘 갖추어진 대학 시스템을 표방하기 때문에, 학기 당 15주의 수업 기간을 가지고 각 주차별로 실습 및 과제가 주어지는 형태이다. 내용을 공개할 수는 없지만, 각각의 실습/과제는 명세에 따라 프로그램을 작성하는 형태이다. 이 때, 명세가 모호한 경우가 있는데 이는 의도적인 것이다. 실무에서도 명세가 항상 명확하지는 않기 때문이다. 그러므로, 더 자세한 설명을 요구하더라도 유의미한 정보를 얻지 못할 수 있다. 여기에서 POCU의 교육철학을 엿볼 수 있는데, 이들은 '실무에서 활약할 수 있는' 프로그래머를 양성한다.

 

그리고 그 실습과 과제를 '빌드봇'을 통해 평가받는다. 각 과목을 원활하게 pass하기 위해서는 모든 실습과 과제에서 만점을 받아야하는 구조라서, 배웠던 개념을 온전히 이해하고 제대로 구현해야만한다. 웬만한 대학에서는 과제에 대한 평가를 이렇게 엄격하게 하지 않는다. 그냥 간단한 테스트만 하거나, 심지어는 그냥 실행 스크린샷(혹은 영상)만 제출받는 경우도 있다.

 

하지만 POCU는 그렇지 않다. 마치 알고리즘 사이트에서 코드를 채점받듯이 나의 코드를 검증한다. 뿐만 아니라, 코딩 스타일과 컴파일러 경고 여부까지 점수에 포함한다. 이를 통해 POCU에서 제시하는 코딩 스타일을 준수하고, '좋은 습관'을 들일 수 있게 된다.

 

앞에서 언급했던 slack 대화방에서는 실습/과제에 대한 질문을 올려 조교의 도움을 받기도 하고, 제출이 마감된 후 각자의 코드를 올려서 수강생들끼리 리뷰를 하기도 한다. 이러한 학습 공간이 마련되는 것은 매우 좋았다. 일반적으로 온라인 과정이라고 하면 discussion 탭 하나 두고, 강사와 1:1로 질의를 하는 형태인데, POCU는 slack 대화방이 있으니 수강생들끼리의 교류가 활성화된다.

 

사실 이러한 내용은 다른 리뷰에서도 많이 다루고 있으니 이 쯤에서 줄이고, '어셈블리 프로그래밍' 과목 자체에 대한 이야기로 넘어가자.

어셈블리 프로그래밍 과목에 대하여

이제, 어셈블리 프로그래밍 과목에 대해 소개해보겠다.

왜 어셈블리만 '멍석말이'를 하는걸까?

나는 어셈블리 프로그래밍 과목을 수강하기에 앞서 고민이 많았다. 과연 어셈블리를 배우는 것이 도움이 될까. 다들 '비효율'이라며 손가락질 하던데 괜찮은 걸까. 그런 의심으로 수강을 시작했지만, 수강 첫 주에 그런 걱정은 사그라들었다. 몇 주가 더 지나서는 어셈블리를 배우는 것이 도움이 되지 않는다거나, 먼 길을 돌아가는 것이라는 세간의 인식에 대해 도저히 동의할 수 없는 지경이 되었다.

 

'어셈블리 배워서 어디에 씀?'

어셈블리 프로그래밍을 공부하는 것에 대한 사람들의 부정적인 인식은 교육적 목적과 실용적 목적을 구분하지 않는 것에서 기인한다. '배워서 어디에 쓰냐?'라는 식의 논리.

 

그러나 언어를 배운다고 해서 반드시 어딘가에 써야 하는 것은 아니다. 당장 C를 배운 컴퓨터 공학 전공자들이 실무에 나가 C를 '실용적으로' 사용하는 경우가 얼마나 되겠는가? 하지만 대다수의 사람들은 입을 모아 C를 배워야한다고 말한다. 대부분의 프로그래밍 언어가 C에 뿌리를 두고 있고, 메모리를 이해할 수 있고... 미주알 고주알.

사람들은 C에 대해서는 한없이 관대해진다. 그들 중 9할 이상은 실무에서 C를 사용하지 않을 것임에도 C를 공부하는 것에 대한 교육적 목적을 '너그러이' 이해해준다. 허나, 어셈블리는 왜 그러한 '자비로움'에서 예외가 되어야하는가?

 

어셈블리를 배우는 것도 교육적인 측면에서 큰 도움이 된다. 어셈블리는 필연적으로 컴퓨터 구조에 대한 학습을 요구하는데, 이 과정에서 얻게 되는 것이 많다. 이미 대학이나 독학 등으로 컴퓨터 구조, 운영체제에 대해 공부했더라도 더 깊은 이해를 하게 된다. 컴퓨터에 대한 큰 흐름을 이해하게 된다고나 할까. 기계와 코드 사이의 관계가 명확해지고, 컴퓨터라는 기계에 대해서 더 이상 '불명확한' 것은 없어진다.

 

뿐만 아니라, 어셈블리가 실용적 목적이 없다는 것 자체도 동의하기 어렵다. 내가 작성한 코드가 어떻게 컴파일 되었는지, 의도한 최적화가 잘 적용되었는지 확인하기 위해서는 어셈블리가 필요하지 않은가. 하물며 메모리 덤프는 어떻게 확인할 것인가. 어셈블리는 '불필요한'것이 아니다. 하지만 사람들은 유독 어셈블리를 미워한다. 난 슬슬 그들의 역량이 의심되기까지 한다.

 

개인적인 사례도 하나 언급하자면... 나는 최근에 관심있는 주제와 관련된 C++ 컨퍼런스 영상을 보았는데 해당 발표에서 어셈블리 코드를 보여주면서 의도한 최적화가 이루어졌는지 확인시켜주는 부분이 있었다. POCU에서 어셈블리를 배우지 않았다면 '그런가보다'하고 넘어갈 내용도 더 깊게 이해할 수 있었다.

 

어셈블리를 배워야하는 이유에 대한 포프님의 설명은 위 영상으로 확인할 수 있으니, 여전히 의문이 든다면 확인해보길 바란다.

 

왜 POCU에서 배워야 하는가?

어셈블리를 배우는 것에 대한 교육적, 실용적 실익에 대한 이야기는 충분히 말한 것 같다. 그렇다면 어셈블리 프로그래밍을 왜 하필이면 POCU에서 배워야하는가에 대한 이야기를 해보겠다.

POCU의 <어셈블리 프로그래밍> 과목은 위와 같은 커리큘럼을 가진다. 혹자는 8비트 어셈블리부터 시작하는 것이 과하다고 생각할지도 모르겠다. 나도 처음에는 그렇게 생각했다.

 

하지만, 전혀 과하지 않다. 6502 CPU를 기반으로 8비트 어셈블리를 익히는 것은 매우 중요한 과정이다. 여기에서 프로그램이 컴퓨터에서 어떻게 동작하는 것인지를 이해할 수 있게 된다. x86 기반의 어셈블리에서는 간략하게 제공되는 기능들을 6502 어셈블리에서는 모두 직접 구현해야하는데, 이 과정이 힘들긴 해도 확실한 이해를 돕는다.

 

그 다음에는 x86 기반의 16비트 어셈블리를 배우는데, 여기서 배운 내용들이 32비트로 (거의) 그대로 확장되는 개념이라서 이후에 32비트 어셈블리를 배우는데 무리가 없게 된다.

 

여기서 차별화되는 지점은, 어셈블리어를 차근차근 배워나간다는 점이다. 유튜브 등지에서 한두시간만에 끝내는 'crash course'와는 차원이 다르다. POCU의 어셈블리 강의는 단순히 어떤 명령어가 있고 어떤 레지스터가 있는지 소개하는 식으로 끝나지 않는다.

6502 어셈블리를 배우는 동안에는 무려 브레드보드에 직접 컴퓨터를 만들어본다. 이 과정은 POCU에서 제공하는 시뮬레이터를 통해 진행할 수도 있다. 이러한 과정에서 각 부품간의 타이밍 다이어그램을 확인하고, 사이클 하나하나를 소중히 하면서 코딩해나간다.

 

이 과정의 핵심은, 직접 HW를 구성하면서 모든 SW를 작성해보는 것이다. 이 컴퓨터에서 나를 보조해주는 SW는 없다. 운영체제 조차도!

그 다음에는 MS-DOS에서 작동하는 프로그램을 직접 16비트 어셈블리로 작성해본다. 이 과정의 핵심은 운영체제 위에서 시스템 프로그래밍을 경험해보는 것이다. OS가 지원하는 다양한 기능을 활용하여 프로그램을 작성하고, 그 과정에서 소프트웨어 인터럽트에 대한 개념도 익힌다.

그리고 강의 후반부에서는 32비트 어셈블리를 배우게 되는데, 여기서는 C에서 인라인 어셈블리를 통해 코드를 작성한다. 이것이 현대 프로그래밍에서 어셈블리를 활용하는 방식이기 때문이다. 여기에 더해 SIMD까지 배우게 된다.

 

이러한 코스의 흐름은 어셈블리를 온전히 이해하고, 나아가 컴퓨터를 이해하게 해준다. 비약이 아니다. 정말로 그런 수준의 강의이다.

 

만약 어셈블리를 POCU에서 배우지 않고 그냥 '이건 이렇고, 저건 저렇다'는 식의 무료 강의로 배웠다면 나는 그냥 '어셈블리 코드를 읽을 줄 아는 사람'이 되는 것에 그쳤을 것이다. 하지만 POCU에서 어셈블리를 배운 결과 직접 어셈블리로 코드를 작성할 줄 알게 되었고, 지금은 간편하게 제공되는 명령어 뒤에서 어떤 일이 일어나는지 이해하게 되었고, 컴퓨터를 더 깊게 이해하게 되었다.

 

나를 못 믿겠다면, 김포프를 믿으라.

POCU의 강의는 완벽에 가깝다. 내가 왜 이렇게까지 극찬을 하느냐면, 강의를 듣는 중에도 강의 구성의 치밀함이 느껴졌기 때문이다. POCU의 코스들은 '어떻게 하면 잘 가르칠까'하는 깊은 고민을 거치고 나오는게 보인다. 신규 코스를 출시하는 텀이 긴 것도 이러한 맥락으로 생각된다.

 

김포프는 BCIT에서 C++을 가르칠 시절에 거의 만점에 가까운 학생 평가를 받았다고 한다. POCU에서 그의 강의를 들어보면 그 이유가 여실히 드러난다. 지금껏 만나본 교수자 중에서 가장 완벽에 가깝다. 컴퓨터 공학의 이론적인 부분도 전문적인 수준으로 갖추고 있으면서도, 실무 능력까지 톱 클래스에 속하는 그에게 강의를 들을 수 있다는 것 자체가 주니어들에게는 기회다.

 

POCU에서 (굳이 풀코스가 아니더라도) 강의를 듣고 나면 다른 교수자들은 웬만해선 성에 차지 않는 수준까지 다다른다. 부정확한 설명들이 자꾸 눈과 귀에 밟히기 때문이다. 예를 들어, 대다수의 C 프로그래밍 서적이나 일반적인 대학 강의에서는 C 표준 관점에서 완전히 틀린 내용을 전파하곤 한다. UB인 코드를 당당히 가르친다던가 하는 식이다. 하지만 포프는 C프로그래밍을 가르칠 때 UB, UsB에 대해 언급하고 더 정확하게 설명한다.

 

이런 강의를 듣지 않을 이유가 무엇 하나 없다. 나의 말을 못 믿겠다면, 김포프를 믿으라.

 

이런 사람들은 꼭 들어야한다!

- 스택 프레임은 지역변수 크기에 상관없이 한 번에 잡힌다. 하지만 어떻게? 애초에 스택 프레임이라는건 어떻게 잡히는거지?

- 함수가 반환되면 다시 호출자의 코드가 실행된다. 하지만 어떻게?

- switch문은 컴파일러가 최적화를 잘 해줄 수 있다는데, 왜 그런거지? (POCU 강의에서 직접적으로 다루지 않지만 직접 분석할 수 있음)

 

위와 같이 평상시에 근본적인 것에 대한 의문을 품는 사람들은 반드시 이 강의를 수강하길 바란다. 나 또한 이 강의를 듣고 많은 의문점들이 해결되었다. 현대의 컴퓨터라는건 어떻게 보면 '별거 아닌' 기계구나, 하는 생각이 들기 시작했다.

 

마치며

사실 POCU의 강의라면 무엇 하나 놓칠게 없다는 믿음이 있다. 개중에서도 <어셈블리 프로그래밍> 과목은 정말 주옥같은 과목이다. 억지로 '단점'을 찾아낼 노력도 하지 않겠다. 그저 추천, 또 추천한다.