서울대학교 컴퓨터공학부 전공과목 (주관적인) 소개
가장 쓸 말이 많은 3설계 과목 (소개원실, 하시설, 창통설) 은 별개의 글로 남길 예정입니다.
(UPD) 교재 질문 주신 분이 계셔서 추가했습니다 :)
1학년 과목
컴퓨터의 개념 및 실습
- 2018년 1학기 (1학기차) 에 수강했습니다.
- 교재는
Introduction to Computing Systems: From Bits and Gates to C and Beyond
라는 책입니다. 아래의 이유때문에 저는 처음 배우기에 이게 좋은 방법인지 사실 잘 모르겠습니다만… 어차피 다수가 프로그래밍을 해보고 들어오는 지금 컴공과라서 가능할지도 모르겠습니다. - 굉장한 과목입니다. 들을 때는 몰랐는데, 다른 학교의 1학년 첫 컴공과 기초 과목이 보통 파이썬이나 C를 가르치는데 비해 이 과목은 무려 컴퓨터구조에 대해 배웁니다. LC-3라는 toy computer의 어셈블리는 물론, 기계어로 직접 뭔가를 짜게 합니다.
- 이게 무슨 말이냐면, 보통 C를 배운 후 어셈블리로 넘어가서 C를 통해 어셈블리와 컴퓨터 구조를 이해하는게 일반적인 테크지만, 저희는 반대로 컴퓨터의 폰 노이만 구조와 Program counter, memory model을 먼저 배운 뒤, 어셈블리 (진짜 어셈은 아니지만) 단계에서 이를 이해해보고, 거꾸로 C를 그 위에서 쌓아 나갑니다. 이렇게 배우면 포인터가 안 어렵다는 정도? 장점이 있는것 같습니다.
- 힘들었지만 재밌었습니다. A-인가? 받았습니다. 저는 입학하고 프로그래밍이라는걸 처음 배워본지라… 이때까지는 과고 친구들과 경쟁자체가 안 되더군요 ㅋㅋ
- 제가 듣고 2-3년 후에는 Python으로 과목 자체가 바뀌었다고 들었습니다.
라떼는...
을 잠깐 하자면, 시작을 C로 하는건 어차피 평생 컴퓨터를 잡을 사람들이라면 꽤 이점이 있지 않은가…하는 생각이 듭니다.
프로그래밍 연습
- 2018년 2학기 (2학기차) 에 수강했습니다.
- C언어의 기초를 배웁니다.
- 기말프로젝트가 카드 뒤집으면서 기억력으로 페어 맞추는 게임 (게임 이름을 까먹었네요) 만드는 거였는데, 재밌었습니다.
이산수학
- 2021년 1학기 (7학기차) 에 수강했습니다. (왜?? ㅋㅋㅋ)
- Logic, Group, Probability, Graph, Algorithm 등 종횡무진 뛰어다니며 넓고 얕게 배웁니다.
- 저는 CS/MATH이고 7학기차였으므로 저는 이 과목에서 배우는 모든 내용을 다른 과목에서 배워본 상태였습니다. 처음 듣는 컴공 전공이라면 증명이나 논증을 체계적으로 하는 법을 익히는 좋은 과목이라고 생각합니다. 저는 그 역할을 해석개론이 대신해 줬습니다.
- 너무 늦게 들어서 쉬웠습니다. 1학년 때였다면 느낌이 좀 달랐을것 같습니다.
- 교재는 Rosen의
Discrete Mathematics and Its Applications
였습니다. 이산수학은 거의 국룰인것 같습니다.
2학년 과목
컴퓨터 프로그래밍
- 2019년 1학기 (3학기차) 에 수강했습니다.
- 객체지향 프로그래밍, 객체지향의 개념에 대해 배웁니다.
- 기말 과제로 체스를 구현하는 과제가 있었습니다. 처음 하면서 꽤 어려웠던 기억이 있습니다.
- 이런걸 익히려면 해보는 방법밖에 없다는 말을 체감하게 됩니다. 코딩을 하다보면 아 이게 그런 말이구나 할 때가 있습니다.
- 교재도 뭔가 있었는데 딱히 기억에 남지는 않고, 개인적으로 프로그래밍 언어는 워낙 빠르게 바뀌니 배우는 시점에 최대한 최신버전으로 배워놓는게 좀 의미가 있다고 생각합니다.
논리설계
- 2019년 1학기 (3학기차) 에 수강했습니다.
- 표지가 초현실주의 유명한 작품 (정확히 기억은 없는데, 찾아보니 ) 이라 매우 인상적인
Contemporary Logic Design (Katz)
를 교재로 씁니다. - Boolean Algebra와 카르노 맵으로 시작해서, 논리 게이트, Adder 등 간단한 논리 회로에 대해 배웁니다. 끝부분에는 FSM을 다룹니다.
- 마지막에는 베릴로그로 CPU 짜는 과제가 있었습니다.
- 강의가 정말 재밌고 흡입력있었지만 저는 내용에서 고통받았습니다. 이 강의를 기점으로 시스템은 하지 말아야겠다는 생각을 했던것 같습니다
- Verilog 3부작 중 1부인데, 저는 정말 힘들었습니다. 저는 Verilog와 진짜 안 맞는다는걸 깨달았습니다. B+. ㅋㅋ!
자료구조
- 2019년 2학기 (4학기차) 에 수강했습니다.
- 책이 있었던것 같은데 본 기억은 없고, PPT로 다 수업 나갔습니다. 지금은 문병로 교수님의
쉽게 배우는 자료구조
가 있고 이게 꽤 괜찮다는 소문을 들었는데, 알고리즘 책이랑 좀 겹치는것 같습니다. - 저는 입학하자마자 SNUPS에서 kipa00님한테 PS를 배우면서 C++를 익히는 것으로 시작해서, PS를 꽤 열심히 했었기 때문에 이때는 블루~퍼플 근처의 실력이었습니다. (지금도 퍼플을 못 벗어나고 있네요 ㅋㅋ 2년 더 이때처럼 Training했으면 제가 PS를 더 잘 했을까요?)
- 가장 집중적으로 PS를 공부했던 시점이라서 자료구조는 쉽게 공부했습니다. A+.
컴퓨터구조
- 2019년 2학기 (4학기차) 에 수강했습니다.
- 이때 어셈블리를 저희는 많이 배우지 않았고, 결정적으로 ARM으로 배웠습니다. 그래서
CS:APP
을 쓰지 않았는데, 굳이 ARM을 사용한 이유는 아직 잘 모르겠습니다. 다른 수업은CSAPP
으로 나가는것 같습니다. - 컴퓨터공학이 뭔지 알기 위해 딱 2개의 수업만 들을수 있다면 저는 알고리즘과 컴퓨터구조를 뽑겠습니다. 컴퓨터구조에서는 논설의 끝부분을 시작으로, CPU의 내부 구조, Pipelining, Memory Hierarchy, 멀티코어와 멀티스레드 등을 다룹니다.
- 컴퓨터 자체에 대해 가장 많은 내용을 배울 수 있습니다. 언젠가 고급 컴퓨터 구조를 듣고 싶은데 여력이 될지 모르겠습니다.
- Verilog로 파이프라이닝이 있는 CPU를 짜는 과제가 나왔었는데, 여기서 거의 0점에 가까운 점수를 받았습니다. 이 과제가 아니었다면 나머지는 A+를 충분히 받을 수 있는 성적이었는데 이 과제 하나 때문에 A0를 받았습니다. Verilog는 너무 어려워요…
프로그래밍 언어
- 2019년 2학기 (4학기차) 에 수강했습니다.
- OCaml로 함수형 프로그래밍, 메모리 관리, 재귀 호출 등 PL의 핵심 아이디어들을 배웁니다.
- 인터프리터 만드는 과제가 꽤 많은데, 과제가 재밌지만 오래 걸렸습니다.
- OCaml 프로그래밍이 굉장히 생소했습니다. 그후로 한번도 안써서 이제는 많이 잊어버렸습니다.
- 과제만 잘 하면 되는, 시험 없는 꿀과목입니다만 시험이 없어서 공부를 덜 한것 같기는 합니다.
전기전자회로
- 2019년 2학기 (4학기차) 에 수강했습니다.
- 일반적인 전기전자회로 수업입니다.
- 힘들고 어려웠습니다. 돌이켜 생각해보면 내용이 막 어렵진 않았는데, 공부하기가 너무 힘들었습니다.
- B+ 받았는데, 논설이랑 이건 좀 얘기가 다릅니다. 이과목은 미적분학이나 공학수학 내용 (미방 풀기) 에 대한 기본 이해가 필요하고, 수식전개를 잘 해야 합니다. 저희과는 지금 고등학교때 문과였던 / 공학수학을 이수하지 않은 복부전생들이 많아서, 이런 과목은 (특히 수학 복전인 저한테는) 엄청나게 어드밴티지가 있습니다. 그럼에도 불구하고 B+를 받았다는건 제 놀라운 물리 실력을 imply합니다.
3-4학년 과목
컴퓨터공학부의 경우, 3-4학년 과목 상당수가 선수관계에 있지 않고 난이도 면에서 큰 차이가 없다고 느껴 같이 서술합니다.
대부분의 빡센 전필 과목이 3학년 과목이라서 그렇기도 합니다.
알고리즘
- 2020년 1학기 (5학기차) 에 수강했습니다.
- 자료구조와 같은 이유로 비교적 편하게 들었습니다.
-
쉽게 배우는 알고리즘
책을 교재로 사용합니다. CLRS와는 전혀 다른 이유로 좋은 책이라고 생각합니다. CLRS가 Rigorous함과 Extensive함을 장점으로 갖는다면, 이 책은 직관이 좀더 잘 나타나고 좀더 컴팩트합니다. 알고리즘 랩을 와있는 지금은 필요한게 있으면 CLRS를 찾아보지만, 처음 공부한다면 쉽배알은 추천할만한 책입니다. - 모든 알고리즘 강의에서 강의하는 시간복잡도, 정렬, 탐색, DP, 그리디, 그래프, 최단경로, MST까지 배웁니다.
- 그 후로는 NP-Complete 문제들과 그 환원, matroid 등 재밌는 개념들을 좀 배웠습니다. 이쪽이 주력이셨던 교수님이셨기 때문에 특히 그랬던듯 합니다.
- 비슷한 PS 실력의 다른 사람들에 비해, 저는 이론적인 알고리즘에 관심이 많은 편입니다. 이때쯤에는 이쪽 분야 진학을 계획하기 시작했기 때문에, PS 공부를 이 이후로는 거의 못 했습니다. 그와는 별개로 알고리즘 수업은 정말 재밌게 들었습니다.
- 그리고 뭐… 어쨌든 퍼플이면 학부 알고리즘 수업은 무난하게 들을 수 있습니다. 특히 construction에 강한 사람들보다 (PS를 진짜 잘하는건 이분들입니다) 저처럼 대학와서 PS를 시작해서 academic하게 공부한 사람은 더 그렇습니다. A+ 받았습니다.
양자 컴퓨팅의 기초
- 2020년 1학기 (5학기차) 에 수강했습니다.
- Neilson의
Quantum Computation and Quantum Information
을 교재로 쓰는데, 대략 양자물리가 나오는 시점부터 정신이 멍했던 기억이 있습니다. - 물리학이라고는 1학년 1학기에 교양 B0 맞은 이후로 쳐다본적도 없는데, 갑자기 양자역학의 기초 원리들을 배우게 되어 어려웠습니다.
- 선형대수학을 열심히 들었다면 할만하고, 그렇지 않다면 듣기 힘든 과목인것 같습니다.
- 나머지 CSE 과목들과 아예 다른 트랙 위에 서 있어서, 이것만 들어도 들을만 합니다 (Lin Alg를 안다면)
- 새롭고 재밌었습니다. 아예 새로운 내용을 배우는 과목은 대체로 좋아하는 편입니다. A+ 받았습니다. 코로나버프가 살짝 있었던듯 합니다.
데이터베이스
- 2020년 1학기 (5학기차) 에 수강했습니다.
- 이것도 데이터베이스 원리?를 논의하는 꽤 두꺼운 책이 있었는데, (
Database System Concepts (Silberschatz)
) 딱히 본기억은 없습니다. - 제게는 학부 지도교수님이신 교수님께서 강의하시는 과목입니다. 상담때 정말 많은 조언을 받았기 때문에 항상 감사한 마음입니다.
- 무려 JAVA로 밑바닥부터 SQL 쿼리를 파싱하고, 이를 처리하는 프로젝트가 있습니다.
- 모든 DB 강의에서 배우는, DB의 원리들, SQL, DB가 가져야할 원칙 등을 배우는, standard한 수업입니다.
- 공대지만 Engineering스러운 과목은 많이 듣지 못했는데, 이 과목은 좀 CS에서는 Engineering스러운 마인드의 과목이라서 나름의 재미가 있었습니다.
- 하지만 프로젝트의 코딩량이 정말 충격적입니다. 저는 주언어가 C++이었고 JAVA 코딩은 컴프-자구 과제 해본게 다였기 때문에 정말 어려웠습니다. 솔직히 C++로 짰으면 짤 수 있었을것 같은데, 뭐 이건 제 코딩실력의 문제이므로 수업 자체의 난이도와는 좀 다른 얘기가 아닌가 싶습니다.
- 지도교수님께서 강의하시는 과목이라서 그런지 나름 더 열심히 들었고, 재밌었지만 제 JAVA 실력에 의해 B+를 받았습니다. 그와는 별개로 여기서 배운 내용은 이후에도 많은 도움이 됩니다.
소프트웨어 개발의 원리 및 실제
- 2020년 2학기 (6학기차) 에 수강했습니다.
- 실제 개발의 프로세스, 디자인 패턴 등을 배우고, 팀플로 하나의 웹앱을 직접 만들어서 출시해야 하는 과목입니다.
- 어느순간부터 머신러닝을 포함해야 한다는 요구조건이 붙었습니다.
- 대략 5,000 단어 분량의 5부작 후기가 준비되어 있었으나, 다양한 사정으로 퇴고를 거듭한 끝에 블로그에 올리지 못했습니다.
- 학교 다니는 중 가장 힘들었습니다. 4학점 과목이지만 체감 로드는 15학점 이상 됩니다. 저는 2020-1학기 전체 18학점과 이 과목 하나가 비교할 만 하다고 생각합니다.
- 배우는것은 많습니다. SNULife에 있었던 강의평의 일부를 인용하며 짧은 소개를 마치겠습니다. 참고로, snulife 평점 7.8임에도 당도 1.5에 빛납니다.
이 강의평 이상으로 이 과목을 표현할 자신이 없습니다.
“강의가 끝나고 나면 내가 이전의 나와는 다른 프로그래머가 된 것을 느낄 수 있습니다. 그런데 그건 이전의 내가 프로젝트 하다가 죽어서 그런겁니다.”
“여튼 이걸 아직 안 들었다면 마음의 준비 단단히 하시고, 윗공대 오실 떄 왠만하면 이불이나 담요 챙겨오시길 바랍니다. 파이팅.” - 정말 많은 노력을 (15학점 분량 정도) 했고 A-를 받았습니다.
시스템 프로그래밍
- 2020년 2학기 (6학기차) 에 수강했습니다.
- CS:APP (
Computer Systems: A Programmer's Perspective
) 을 교재로 사용하고, 대략 뒷부분 반을 나갑니다. 저는 비록 결국 이 시스템 프로그래밍과는 거리가좀 있는 알고리즘 랩에 와있지만, 이 책의 내용은 CS를 전공했다면 (그리고 좋은 프로그래머라면) 모두가 그냥 꿰고 있어야 한다고 생각합니다. - 컴퓨터구조 수업에 이어서, 컴퓨터 내부의 핵심 원리들을 배웁니다. I/O로 시작해서, Virtual memory, malloc의 원리, Pipe와 프로세스간 통신, 멀티스레딩을 배웁니다. 마지막에는 네트워크 기초를 좀 배웁니다.
- Malloc을 직접 구현하는 malloc lab이 상당히 악명 높습니다.
- 굉장히 유익하고, 배우는게 많으며, 어렵지만 재밌습니다. 컴구와 함께 반드시 들어야 할 컴퓨터공학과 수업입니다. 크게 컴구/시프와 자구/알골 이렇게까지 4개만 들으면 컴공과의 코어 아이디어는 다 가져갔다고 생각합니다. 이후로는 다 개별 과목이라서요…
- 소개원실 플젝이 모든것을 잡아먹어서 기말을 터트렸습니다.
앞으로의 CS 인생에서 제가 멀티코어 프로그래밍이나 네트워크에 약한 건 모두 소개원실 탓입니다.
하드웨어 시스템 설계
- 2021년 1학기 (7학기차) 에 수강했습니다.
- FPGA 보드로 행렬곱셈을 가속해서 CNN을 빠르게 돌리는… 뭐 그런걸 합니다. 로직은 C++로 짜고, FPGA는 베릴로그를 씁니다.
- 베릴로그를 정말 못 하는 제게는 너무 힘든 과목이었지만, 베릴로그 파트는 훌륭한 팀원이 멱살잡고 캐리했습니다. 그 대가로 저는 C++ 코드를 하루종일 들여다보고 포인터 연산을 열심히 해야 했지만 그래도 팀원과 제 로드 배분이 6:4 정도로 제가 조금 버스 탔다고 생각합니다. 이 은혜는 창의통합설계 때 갚아야한다고 다짐했습니다.
- 짧은 후기를 블로그에 쓸 예정입니다.
- 어렵지만 돌이켜보면 남은건 꽤 많습니다. 아쉬운 점은, 플젝을 한학기 내내 했음에도 실제 로드는 마지막 한주에 몰아져 있었다는 점입니다.
- 선배들이 사람에 따라 0.2~0.4 소개원실이라고 조언했는데, 마지막 주가 되기 전까지는 전혀 이해를 못 했습니다. 마지막 주에는 왜 그런지 납득하긴 했지만, 그래도 저는 동의할 수 없습니다. 소개원실 로드의 1/10도 안 됩니다.
- 혹시 이 글을 보는 19~학번 설컴공이라면 한번쯤 고려해보세요. FPGA같은 유망한 기술에 대해 이정도 이해를 위해 이정도 노력은 들일만한 가치가 있습니다.
- 학점은 A0 받았습니다. 팀원이 한단계 정도는 버프해줬다고 생각합니다.
창의적 통합 설계
- 2021년 2학기 (8학기차) 에 수강했습니다.
- 3인 팀을 짜고, 참여하는 기업과 학생팀을 하나씩 매칭해서 기업에 제안하는 프로젝트를 수행하는 과목입니다.
- 굉장히 할말이 많습니다. 가위바위보 한방에 학기가 결정나는 팀배정, 기업 과제 에 대한 의문, 조별과제와 프리라이더 문제 등이 있겠습니다만, 저희는 가위바위보를 승리했고 평소 친분이 깊은 좋은 팀원들과 함께했기 때문에 저는 좋았습니다.
- 저희 학부 김선 교수님이 설립하신 Aigendrug이라는 회사에서 제시한 프로젝트를 수행했고, 저는 이후 이 회사에서 인턴십 기회를 얻어 8개월간 다녔습니다. 개인적으로 저는 제가 이번 학기 창통설의 최대 수혜자였다고 생각합니다.
- 회사에서의 경험과 과목에 관해서는 별도로 언젠가 쓸것 같습니다.
대학원 과목
계산이론
- 2021년 2학기 (8학기차) 에 수강했습니다.
- 교수님 PPT로 대부분 수업이 이루어졌는데, snu ocw에 찾아보면 (꽤 오래된) 자료가 있습니다 :)
- 이 과목을 강의하시는 교수님 연구실로 석사 진학을 계획하던 시점이었기 때문에, 꽤 열심히 공부했습니다.
- 과목 이름이 계산이론 (Theory of Computation) 이지만, 실제로는 고급 알고리즘이라고 생각하면 비슷합니다. 주로 스트링 알고리즘 (Suffix Tree, Suffix Array, Aho-Corasick, 2D String Matching 등), 압축 알고리즘 (Lempel-Ziv)을 배우고, 온라인 알고리즘과 확률적 알고리즘 등을 간단히 다룹니다.
- MIT의 고급 알고리즘/자료구조, Stanford의 그래프/확률적/…등 해외 유명 대학에서는 다양한 고급 알고리즘 강의가 제공되고 있으나, 서울대에는 이 과목이 사실상 유일합니다. 수업 첫 시간에 교수님께서도 비슷한 부분에서 아쉬움을 좀 말씀하셨는데, 이론분야에서의 격차?를 조금 체감하게 되는것 같습니다.
- 저는 PS를 하면서 스트링 알고리즘을 어쩄든 KMP, Aho-Corasick 정도 수준까지는 알고 있기도 해서…그렇게 힘들지는 않았습니다. 특히 실용적으로도 압축 등 알고리즘은 사용 여지가 많아서, 저는 후배들에게 적극 추천하고 있습니다 ㅎㅎ
생물정보학을 위한 기계학습
- 2022년 1학기에 Aigendrug에서 인턴십을 하게 되면서, “생물정보 (Bioinformatics)” 및 “화학정보 (Cheminformatics)” 라는 매우 생소한 분야를 접하게 되었습니다. 관련 지식을 좀 쌓아보고자 수강했습니다.
- 주로 Classical ML 알고리즘들을 배우고, 후반에는 CNN/RNN등을 좀 배웠습니다.
- 사실 CNN/RNN은 요즘 워낙 찾아볼 자료도 많고 Bioinfo보다도 Vision/NLP라는 명확한 플래그십 응용분야가 있어서 공부하기가 어렵지 않습니다만, 수학적 sense를 넘어서 응용분야에서 Expectation-Maximization, Hidden Markov 등을 배워볼 수 있었던 좋은 기회가 되었습니다.
- Classical ML은
Pattern Recognition and Machine Learning
책에 모든 내용이 있지만, 그 내용과 실제 문제에의 응용은 약간 별개라서… 특히 그런것 같습니다. - 생물정보학이라는 context에 대해서는 제가 아예 문외한이었기 때문에 조금 장벽이 있었지만, 인턴십 반년과 수업을 듣고 나서 생각해보니 재밌는 응용분야였다고 생각합니다 :)
한…2-3학년때는 학점을 나름 열심히 챙겼는데 그럼에도 별로 안 좋아하는 과목들은 성적도 어김없이 그저 그랬던것 같습니다. 오히려 그 이후에는 학점고민에서 좀 자유로워져서 (대학원 진학을 마음에 두게된 이후로는 특히) 뭔가…뭐 어딘가 갈수 있겠지 하는 생각을 하면서, 재밌어 보이는 것들에 많은 시간을 투자했던것 같습니다. 학부때 배운것중 가장 이후에 많은 도움이 되는 과목은 자료구조/알고리즘, 컴퓨터구조/시스템프로그래밍의 4개인것 같습니다. 저 4개과목이 기억에 부전공생에게도 전필이었던것 같은데, 아마 여기까지는 크게 이견이 없을것 같네요. 학부때 OS를 못들은것정도는 (절반은 시스템 하고 싶지 않아서 고, 절반은 수학과 과목 듣느라…) 약간 아쉬움이 남습니다.