2024년 가을학기를 마치며
어느덧 복학 후 첫 학기가 끝났다.
2년간의 회사 생활을 하다보니 마음껏 공부할 수 있는 환경의 중요성을 많이 깨달았고, 가장 열심히 했던 학기가 아닌가 싶다.
가장 열심히 했다고 해서 성적이 가장 잘 나온건 아니지만 확실히 얻어가는게 가장 많았던 학기였으며 평균 성적은 확실히 올라간 학기였다. 3학년이 되고 나서야 공부하는 방식을 조금 알게 된 것 같다.
디지털 시스템 설계 및 실험
어쩌면 가장 힘들었던 과목이 아니었나 싶다.
중간고사 전까지는 (3년 전에 배웠던) 논리 설계 내용을 아주 빠르게 다룬다.
다만 기본적인 logic gate 관련 내용보다는 Verilog의 문법에 좀 더 치중되어 있는 느낌으로,
여러가지 counter와 adder 등을 베릴로그를 통해 구현하는 시간들이었다.
structural modeling, dataflow modeling, behavioral modeling 등을 배우며, 특히 ‘합성 가능한’ 코드를 짜는데 좀 더 포커스가 맞춰져 있었다.
시험은 Q4 가까이 맞았는데, 아쉽게도 중간고사 비중은 그렇게 크지 않았다.
중간 이후에는 adder와 multiplier를 어떻게 하면 더 빠르고 효율적으로 구성할 수 있을지에 대한 논의가 주를 이뤘다. carry로 인한 시간이 늘어나는 것을 최대한 줄이기 위해 carry-skip adder, carry-save adder 등을 배웠으며 이것들을 잘 이용하여 곱셈과 나눗셈을 어떻게 할 수 있을지까지 배우게 되었다. 중간 이전과 이후의 내용 온도차가 많이 났다.
공부를 하며 어떻게 이런걸 생각해냈지 하면서 공부했던 것 같다. 특히, multiplier 부분은 머신러닝의 기본적인 convolution 연산의 기초가 되기에 꼼꼼히 공부했던 기억이 있다.
프로젝트는 이 과목의 꽃이자, 이번 학기 내 건강을 위협한(…) 과목이다.
무려 CNN Accelerator를 verilog를 이용해 코드 작성 후 합성, FPGA에 올린 후 돌리기까지 해야했었던, 그러면서도 기간은 두달도 채 안되게 있었던 프로젝트이다. 심지어 팀원들의 기말고사 기간이 프로젝트 진행 기간과 겹쳐버렸기 때문에 상당한 로드 부담이 있었다. 마지막 기말고사가 끝난 후 4일 넘게 301동 모랩에서 밤을 샜던 기억이 있다. 막판에는 팀원들끼리 돌아가며 불침번을 서며 코드를 짰는데 참 잊을 수 없는 기억이 되었다. 팀원들에게 항상 고마웠다.
나는 convolution layer 모듈을 맡았다. 이 모듈 혼자만 submodule을 4개씩이나 만들정도로 분량이 컸다. 모듈 별 통신 및 테스트벤치는 성공했지만, 빠른 구현을 위해 DRAM을 사용하지 않고 레지스터(SRAM)로 다 처리하니 합성에 매우 많은 시간이 걸리더라. 결국 프로젝트 마감 하루를 남겨놓고 매 합성마다 5시간 이상 걸리게되었고 보드 업로드는 실패하게되었다. 프로젝트 첫 실패라 책임감도 많이 들었고 아쉬웠다.
덕분에 Verilog 문법이나 모듈 설계 방식, 모듈 단위 테스트 등에 대해 더 익숙해질 수 있었고 이것이 이후 들었던 컴퓨터조직론 실습수업에서 큰 도움이 되었다.
컴퓨터 시스템 프로그래밍
프로그래밍 방법론에서 C++을 배우며 컴파일된 코드가 어떻게 실행되는가? 에 대한 의문을 가졌었다. 이 과목이 그 의문을 풀어주는 과목이라고 할 수 있겠다.
전반적으로 컴퓨터 아키텍처, 소위 전기과의 ‘컴텍’이라고 불리는 과목들을 듣기 위해 알아야하는 기본적인 개념들을 배운다. 다만 마이크로 아키텍처(캐시 등등) 수준까지는 안 내려가고 C언어에서 확인할 수 있는 아키텍처 수준까지만 배운다.
어셈블리 코드부터 시작하여, stack, heap, compile&linking, virtual memory, exception, process, signal, debugger, IO, thread, synchronization 등을 배운다. 기본적으로 CMU의 CSAPP 커리큘럼을 따라간다고 보면 되며, 과제도 해당 수업의 랩 과제 위주로 나왔다. 수업을 맡으신 이병영 교수님께서 보안 관련 연구를 하시기 때문에 CTF 과제가 거의 매주 나왔다. stack overflow, heap overflow, data race 등 여러 보안 취약점을 파악하고 exploit하는 과제였는데 정말 재미있게 한 것 같다. 종강 후 직접 CTF 문제도 만들어봤는데, 검토 중에 치명적인 버그가 발생하여 결국 조교님께 공유드리지는 못하였다. CTF 문제가 8개 정도 있었던 것 같은데 조교님들이 참 대단하다고 느낀 순간이었다.
malloc lab이 가장 기억에 남는데, 나만의 메모리 할당 구조를 만들겠다는 야심찬 시작과 달리 결국 교과서 구조로 회귀하게 되었다. 왜 각 헤더와 푸터 등 메모리 할당 구조가 이런식으로 짜여졌는지 알게되는 계기가 되었다(ㅠㅠ)
시험은 기말고사만 봤는데, 아키텍처 특유의 동화책 읽는 느낌으로 읽었더니 성적이 안좋게 나왔다. 아키텍처 과목 특성상 ‘뭔가 이해된 것 같은’ 느낌이 들기 쉽다. 한번 더 원리까지 차근차근 공부하도록 하자.
데이터 통신망의 기초
네트워크에 대해서 배운다. 기본적으로 Computer Networking: A top-down approach의 교재 순서를 따라 application layer부터 top-down 형식으로 배웠다. HTTP, TCP/IP, Routing 등을 배웠으며, 네트워크 프로토콜과 congestion control, RDT 등 네트워크 통신의 신뢰성을 높이고 throughput을 높이기 위한 많은 기술들과 방식들을 알 수 있었다. physical layer는 상대적으로 덜 다룬 점은 아쉽다.
프로젝트는 크게 3개 있었는데, HTTP 통신, 소켓 통신 그리고 Distributed DNN 관련 프로젝트였다. 다소 Application layer에 치중된 프로젝트였지만 지난 2년간 프론트엔드 개발을 하며 자바스크립트 하나는 정말 잘할 수 있었기에 프로젝트 진행에 큰 어려움은 없었다.
퀴즈는 총 3번. 기말고사 한 번으로 생각보다 공부량은 많았다. PPT를 먼저 읽고 교재를 이해한 뒤, 수업 시간에 교수님께서 강조하신 부분에 대해 추가적으로 찾아본 결과 매번 Q3 이상의 점수를 받았다. 만족스러웠다.
프론트엔드 개발을 하다보면 네트워크에 대해 궁금해질 때가 많다. 이미 추상화가 잘 되어있기 때문에 ‘어떻게어떻게 내 HTTP 요청이 잘 도착하겠지’라고 생각한 부분을 채울 수 있는 과목이었다.
인상깊었던 부분은 기말고사 마지막 문제에 드론 통신 관련하여 현재 상황을 주고, 실제 네트워크 프로토콜을 각 layer에 대해 설계해보라는 문제가 나왔다는 점이다. 채점은 후하게 하신 것 같은데, 어쨌든 우리가 이 과목을 왜 배우는지에 대한 종합적인 문제라고 생각해서 좋은 인상을 받았다.
전체적으로 재미있고 흥미로운 과목이었다. 아마 HCI라는 분야를 미리 알지 못했다면, 네트워크 아키텍처 설계쪽으로 가지 않았을까…하는 생각이 든다. (물론 지금도 열려있다.) 졸업 프로젝트도 해당 과목 교수님께 진행할 계획이 있다.
선형대수학
2021년 2학기 (수강 시점으로부터 3년전…)에 들었다가 처참히 당하고 재수강했다.
전체적으로 프리드버그 선형대수 책을 따르며 vector space, linear transformation, matrix 연산, determinant, diagonalization, inner product space, SVD 까지 배웠다.
이번에는 지난 번의 과오를 다시 범하지 않기 위해, Theorem 들을 직접 정리하고 증명하며 지식을 쌓았던 것 같다. 연습 문제도 (거의)모두 풀어보며 중간/기말 공부를 했던 기억이 있다.
확실히 ‘수학적, 증명적 사고’에 대해 배울 수 있었다. 단순히 det 구하는 공식, 역행렬 구하는 공식 이런걸 외우는 게 아니라 그 의미를 파악하고 각 식이 어떻게 나왔는지 고민하고 증명하면서 공부했다. 초수강 때와는 차원이 다른 이해를 체감할 수 있었다.
덕분에 중간은 어느정도 잘 보았으나, 기말고사는 매우 어렵게 출제되었다. (수강생 모두 처참히 당했다.) 아마 올해부터 교수님이 시험시간을 3시간으로 늘리고 어렵게 출제하시기로했나보다.
이때 배운 선형대수 지식은 ‘신호 및 시스템’에서 아주 도움이 되었다. (공학수학을 열심히 들었다면 더 일찍 도움이 되었을텐데 말이다.) 확실히 열심히 공부한 과목은 학점과 관계 없이 다른 과목에 도움이 되는 것 같다!
기계공학개론
서울대학교 공대생이면 공학개론을 들어야한다. (물론 본인 주전공 과목은 들을 수 없다.) 나는 제일 암기가 적고, 쉽다는 기계공학개론을 골랐다 ㅋㅋㅋ. 기계공학에 대해 배웠다기보다는 여러 힘과 열, 토크 등등 고등학교 물리에서 배운 내용들이 심화된 느낌을 받았다. 시험도 연습문제에서 나왔고, 여러모로 고등학교 물리 시간이 생각나는 수업이었다.
CAD로 레고 조립하는걸 중간 1 전까지 진행한다. 정말 재미있었다! 나중에 3D 프린터 쓰게 될 일이 있다면, 요긴하게 쓰일 지식이었다. 물론 타임어택형 CAD 시험은 처참히 망했다. 중간2와 기말을 잘봐서 다행히 만회되었지만 당시에는 참 슬펐다. ㅠ
그 외에도 ‘추러스’라는 중앙 추리동아리에서 회장을 맡아 열심히 활동을 기획하고 퍼즐을 설계했다.
나만의 콘텐츠를 제작하는 취미는 추러스에서 어느정도 이루고 있다. 너무 재미있지만 취미로 일단 남기려고 한다!