[POCU 아카데미] COMP2200 C 언매니지드 프로그래밍 풀코스 수강 후기
2020년 1월 학기 POCU Academy의 C 언매니지드 프로그래밍 강의 풀코스를 수강하게 되어 후기를 남깁니다. 포큐 아카데미에서 강의의 풀코스 수강에 관심이 있으신 분들에게 도움이 되었으면 좋겠네요.
작년 1년간 게임 개발을 하면서 부족한 실력으로 쓴맛을 많이 보았고, 전자공학 공부를 마치고 대학을 졸업하였을 때 내가 4년간 소프트웨어만 공부한 학생들과 경쟁할 수 있을까란 의문이 들었다. 일단은 학교 공부를 진행하며 짬시간에 웹프로그래밍이나 공부 해야겠단 생각이었는데 갑자기 유튜버 김포프님이 직접 강의한다던 교육기관이 떠올라 찾아보았다. 첫인상은 음… ‘강의는 고작 4개에 수강료는 왜이리 비싸지?? 믿어도 되는건가?’ 였다. 이 때는 풀코스 수강이란게 있는지 모르고 동영상 강의만 제공되는줄 알았고 또 동영상 강의의 분량이 얼마나 되는지도 모르고 있었기 때문. 이후 교육기관에 대한 소개, 코스의 구성, 수강 후기들을 쭉 살펴보았고 들으면 분명 도움이 된다는 판단에 이르러 결국 수강신청을 하게되었다.
COMP2200의 특징과 배울 수 있던 것들
표준에 기반한 C언어 강의
본인은 고등학교에서 C언어를 입문했고 대학교에서 C를 알려주는 수업을 2개나 듣었다. 심지어 지금 또 1개를 듣고 있다.(커리큘럼이 얼마나 꼬였으면 기초수업만 주구장창 -_-;;) 덕분에 C의 문법을 어느정도 알고 있었고 이를 활용한 기초적인 자료구조도 공부 했었다. 하지만 그렇다고 C언어의 표준에 대해 잘 알고 있던건 아니었다. 들어봤던 모든 C 관련 수업 중 어디에서도 C표준에 대한 언급이 없었고 C를 사용하면서 Undefined Behavior와 같은 주의해야할 사항들 또한 알 수 없었다. 그나마 군대에서 C 표준의 중요성에 대해 강조했던 고수분의 블로그 글을 읽고 KNK C 프로그래밍 책을 조금 읽어봤던 것이 전부다.
표준을 안다는 것은 어떤 C 컴파일러를 사용하더라도 공통된 동작을 하는 코드를 작성할 수 있다는 것과 특정 플랫폼을 위해 작성된 (표준에서 벗어난)코드들을 올바로 사용할 수 있게 되는 것이다. Comp2200에서는 이걸 알려주었다. C89 부터 시작하여 C99, C11에 이르기까지 각 표준의 차이와 특징들을 하나하나 짚어주었다. 적어도 내가 들었던 기초 프로그래밍 강좌 중에서 C 표준을 강조한 강의는 Comp2200이 처음이었다. 또한 각 표준 함수들을 뜯어보며 C 언어에서 표준 함수들의 왜 이렇게 동작되도록 설계되었는지 배울 수 있었고 직접 표준함수들을 작성하는 실습과 과제는 C라는 프로그래밍 언어를 온전히 이해하는데 도움이 되었다.
만만히 볼 수 없는 난이도와 분량
그동안 들어봤던 C 강의들은 보통 한학기 동안 기본 문법을 떼는데 그치는 강의들이었다. 보통 파일 포인터까지 배우고 길면 동적할당 맛보기 학생들이 진도를 잘 못따라오면 포인터 까지만 하고 끝나기도 했다. 근데 Comp2200은….
????
3주만에 포인터 수업이 끝난다.
C언어의 핵심이라 할 수 있는 포인터지만 일반적으로 대학에서 진행하는 3,4학점 강의로는 포인터를 제대로 활용해보기 전에 학기가 끝나게 된다. 그렇기에 포인터를 활용하며 그 개념을 머릿속에 새길 시간이 없어 이후 과목에서 교수님이 포인터를 다시 설명하는 모습이 보이기도 한다. 이는 프로그래밍을 처음 입문한 학생들에게 기초적인 프로그래밍 지식을 함께 알려주어야 하기 때문에 C언어 까지 깊게 들어가기엔 절대적으로 시간적으로 부족할 수 밖에 없기 때문이다.
하지만 포큐 아카데미는 C언어를 배우기 전에 다른 기초과목을 수강할 것을 권장한다.(Comp1000, Comp1500) 이 두 과목에선 C#을 활용한 프로그래밍 기초와 컴퓨터 공학용 수학을 가르치는데 이 두가지의 내용을 다 알고 있다는 가정하게 수업을 진행한다.(C# 과목에서 참조의 개념도 살짝이나마 배우고 오는 것 같다.) 즉 C를 배우지만 프로그래밍 입문 과목이 아니다. 언어마다 겹치게 되는 문법들은 간단하게 언급만하고 다른 언어와의 차이점 위주로 설명하여 컴파일 및 함수 호출과 스택메모리의 관계까지 단 2주만에 기본 문법을 끝내버린다.
기본 문법이 이렇게 빨리 끝난다는 말은? 그 뒤 내용은 더 어려운 내용들을 알려준다는 이야기다. 중간고사 이후 수업에서 메모리 동적할당에 대해 배우면서 본격적으로 C 프로그래머가 메모리 관리를 어떻게 할 수있는지를 공부한다.(강의 제목이 왜 C 언매니지드 프로그래밍인지 알 수 있게 되는 순간이다.) 기초적인 자료구조도 직접 구현해보는데 본인은 이 수업을 통해 처음으로 해쉬맵을 직접 구현해볼 수 있었다.
이러한 수업 계획은 이미 기초가 다져진 학생들이 다시금 기초 문법을 보느라 시간을 낭비하지 않고 이미 C언어를 알고 있는 학생들도 그 외에 배울 내용이 많기에 이 강의를 들을 가치가 있다고 생각한다.
다만 난이도가 쉽지 않았던 만큼 중간에 수강포기하는 수강생들도 많다. 초반부 어려웠던 난이도에 놀라 재빨리 수강취소를 하신 분도 있었고 중간고사 점수가 낮아 재수강을 위해 수강포기를 하는 분도 있었다. 이러한 점을 봤을 때 위에서 말한 ‘기초’의 수준부터가 어설픈 수준이 아님은 분명하다.
또 풀코스는 일반 대학의 6학점 정도 학습 분량이라 하니 시간을 꽤나 잡아먹는다. 매주 2~3시간 분량의 동영상 강의가 있고, 그 수업을 듣고 수행해야하는 실습과 과제들도 짧으면 2시간 밖에 안걸리지만 길게는 8,9 시간을 쓰기도 한다. 본인의 경우 학기가 막 시작되었을 때 출퇴근을 하는 한 달 동안 [일 포큐 일 포큐 일 포큐 주말 조금 휴식]의 반복이었다. 만약 풀코스 수강을 고민하는 분이 있다면 자신에게 충분한 학습시간이 있는지 고민을 해봐야 할 것이다. 직장을 다니는데 야근이 잦다거나 학점을 꽉꽉 채워 듣는 대학생이라면 학습할 시간이 부족할지도 모른다.
매주 주어지는 실습과 과제 그리고 시험
풀코스 수업에선 실습과 과제가 있다. 1주 기한의 실습과 3주 기한의 과제를 수행해 제출해야 하는데, 실습은 수업을 듣고 진행하면 그리 어렵지 않게 해낼 수 있는 난이도이고 과제는 어느정도 응용이 필요하다. 주어진 명세에 따라 코드를 작성하여 깃 저장소에 푸시한 후 이를 자동 빌드봇에게 채점을 받는 식이다. 과제 내용이 꽤나 자세한 편인데(가끔 요상한? 스토리도 포함되어 있다) 학생들은 명세에 주어진 상황과 조건에 맞는 함수들을 구현해서 제출해야 한다. 함수들의 동작이 명확한 경우가 있고 아닌 경우도 있는데 이러한 경우 어떠한 입력이 들어올 수 있는지 해당 입력엔 어떻게 동작해야 올바른 동작일지 고민해야 한다. 다 고려해서 짰다고 생각하더라도 빌드봇에게 채점을 받아보면 꼭 실패하는 테스트가 있더라. 무자비한놈.
그래도 테스트가 실패한 사유들을(원인을 추측할 수 있을 정도의) 알려주는데 이는 풀코스 수강생들에게 열리는 위키문서를 통해 확인할 수 있다. 위키에서 수강생들이 자신이 만든 테스트 케이스들을 공유하기도 하기도 하였다.
퍼센트를 채워가는 재미가 있어서 그런지 100% 점수를 받으려고 꽤나 열심히 했던 것 같다. 결과적으로 문제를 해결하기 위해 고민하는(삽질 하는?) 시간들이 수업에서 배웠던 내용을 복기하고 생각을 넓히는데 큰 도움이 되었다. 살짝 아쉬웠던 점은 수업 후반부로 갈수록 실습과 과제가 초반보다 힘이 빠진다는 느낌을 받았다. 그래서인지 학기 막판엔 살짝 널널했는데 그냥 내 수준이 올라간 것일 수도 있다. 풀코스를 진행하며 강해진 것일까? ^오^
Git을 통해 과제를 제출하다보니 Git 저장소를 활용하는 법도 간단하게나마 익힐 수 있었다. Git 에 대한 세세한 개념들은 직접 찾아봐야 했지만 어설프게라도 사용해본 사람이 더 빨리 배우는 것 아니겠는가? 덕분에 따로 참여하고 있는 스터디 모임에서도 다른 사람들 Git을 저장소 세팅하느라 고생할 때 나는 쉽게쉽게 할 수 있었고 뭣보다 6년간 방치되었던 내 Github 계정에도 잔디가 깔리기 시작했다 ㅠㅠ
학기제로 운영되는 풀코스 답게 중간고사와 기말고사가 준비되어 있다. 신분증 검사가 있고 캠을 통해(노트북 캠도 된다) 감시를 받는 듯한 환경을 조성하여 생각보다 긴장된 상태에서 시험에 임했던 것 같다. 문제는 매우 흉악한(?) 난이도였다. 음… 정확힌 어려운 문제들도 있었지만 시간에 비해 문제 수가 많았다. 2시간 가량의 쏟아지는 문제들에 묻혀 ㅠㅠ… 전부 주관식 문제이며 컴파일 여부 판별, 코드 작성, 서술형 문제 등 문제 유형은 다양했다.
특이한(?) 수업 순서
이건 나만 특이하게 생각하는 부분일 수도 있는데 Comp2200에선 포인터,문자열을 전부 공부한 뒤 입출력 함수를 배운다. 포인터와 문자열 온전히 익히기 전 까지는 scanf와 같은 입력 함수들을 일체 다루지 않는다는 것이다. 수강신청 할 때는 입출력 함수를 조금 늦게 다루는 것을 의아하게 생각했는데 해당 부분 까지 듣고 왜 이렇게 수업 순서를 정했는지 알 수 있었다.
입력 함수들의 경우 기본적으로 스트림 버퍼를 사용하는 함수이고 사용자는 스트림을 통해 ‘문자열’을 입력한다. 또한 scanf와 같은 함수들은 포인터를 사용된 함수이다. scanf는 정말 편하고 유용한 함수이지만 이러한 개념이 잡히지 않은 상태에서 사용하면 이래저래 실수할 가능성이 높다.
실제로 대학교 후배들에게 질문을 받다보면 scanf, scanf_s를 사용하다 생기는 문제들을 많이 볼 수 있다. 처음엔 매개변수에 &를 붙이지 않는 실수를 하다 &를 붙이는게 습관이 되었는데 문자열을 입력 받으려면 이번엔 & 빼야 한다니 이래저래 헷갈려한다. 또 자신의 프로그램을 테스트 하겠다고 반복문에서 scanf를 돌리다가 버퍼가 비워지지 않아 프로그램이 망가져 고통 받는 친구도 보았다.
나는 이 친구들에게 문제를 해결하는 코드를 알려줄 수는 있어도 어떤 원리로 문제가 해결되는지 이해시키는건 쉽지 않았다. 이해에 필요한 개념들이 숙지되지 않았기 때문이다. 그러다보니 문제는 해결되었으나 그 이유는 제대로 알지 못한채 찝찝하게 넘어가는 경우들이 보였다. 일단 나 부터 그런 과정을 거쳤으니…
하지만 Comp2200로 C를 배운 사람이라면 위와 같은 시행착오를 겪지 않거나 겪더라도 스스로 극복할 수 있을 것이다. 필수적인 개념을 확실히 숙지한 상태에서 함수 내부 동작 방식을 살펴보기 까지 했으니 해결 못하는게 이상하다. 다만 입력 함수를 배우기 전 까진 실습에서 입력 함수를 활용한 테스트를 할 수 없어 불편함이 있을 수도 있겠다. 뭐 아는 사람들은 알아서 사용했겠지만 ㅎ.ㅎ
떠오르는데로 쓰다보니 생각보다 길어지고 내용도 난잡해진 것 같다 -_-;; 아무튼 풀코스의 난이도는 분명 쉽지 않다. 하지만 그런만큼 보다 효율적으로 공부할 수 있도록 환경을 만들어주는데 의의가 있다. 만약 내가 동영상 강의만 구매했다면 과제와 시험공부를 통해 강의의 내용을 복습하기는 커녕 4개월만에 강의를 다 듣는 못했을 것이다. 동영상 강의만으로도 충분히 좋은 강의지만 풀코스를 진행 했기에 강의 내용을 제대로 익혔다 생각한다.
결론은 상황이 된다면 풀코스 수강을 추천한다. 비싼 수강료 값은 분명히 하는 것 같다.
그래도 사람마다 수준과 환경이 다른 만큼 Comp2200 풀코스 수강을 고민하는 분들은 아래 내용을 고려하길 바란다.
수업을 통해 배울 수 있는 것
아래 내용 중 모르는게 많다면 수업이 도움이 될 수 있을 것이다.
- C 표준 문법과 올바른 응용법
- C 표준에 대해 알고 있는가? 표준과 비표준을 구분할 수 있는가?
- 정의되지 않은 동작(Undefined Behavior)이 무엇인지 어떠한 경우 발생하는지 설명할 수 있는가?
- goto문이 왜 존재하는지 어떤 경우 사용할 수 있는지 알고 있는가?
- 전처리기가 무슨 일을 하는지 설명할 수 있는가?
- 빌드시 링크 단계에 대해 설명할 수 있는가?
- string.h에 정의된 표준 함수들을 직접 구현할 수 있는가?
- C 오류 처리 방법
- 메모리 관리
- Comp2200은 단순히 C 문법만 배우는 것이 아닌 C 프로그래머가 직접 메모리를 관리하는 법을 배운다.
- 수업 중 어셈블리를 까보면서 메모리 레벨에서 빌드된 프로그램이 어떻게 동작하는지 확인할 수 있다.
- 프로그램 실행 중 어디서 메모리가 할당되고 해제되는지 알 수 있다.
- 프로그래머가 직접 메모리 할당/해제를 자유롭게 할 수 있도록 훈련시킨다.(풀코스)
풀코스 수강 전 고려할 것
- 기본 개념
- 프로그래밍 기초가 온전히 잡혀 있어야 수업을 따라갈 수 있다.
- 변수와 상수, 비교연산, 비트연산, 분기와 반복, 함수, 재귀, 참조 등의 프로그래밍에 필요한 기본적인 개념들이 올바로 잡혀있는지 확인해보자
- 시간
- 충분한 학습 시간이 보장되어 있어야 한다. 학습 시간이 충분치 못하면 풀코스 진도를 따라가기 힘들 수 있다.
- 학습 동기와 의지
- 풀코스는 어디까지 충분히 공부할 수 있는 환경을 제공해주는 것이지 그러한 환경이 있어도 본인이 열심히 하지 않으면 의미가 없다. POCU 아카데미는 모두를 챙겨주는 친절한 교육기관이 아니며 풀코스가 적당히 한다고 수준이 올라가는 과정도 아님을 기억하자
Comp2200은 다음 9월 학기는 쉬고 다음 학기에 열린다고 하네요. 참고하시길