코드스쿼드 CS16 과정 회고록

2023. 3. 1. 13:23카테고리 없음

개요

 2023년 1월 2일 ~ 2월 28일기간 동안 코드 스쿼드의 마스터즈 MAX 과정중 CS16 과정을 수료하게 되면서 회고록을 작성하게 되었습니다. 이 글을 작성하게 된 이유는 CS16 과정을 재학하면서 느꼇던 CS를 학습해야 하는 필요성과 딱딱한 기술을 다루는 CS를 학습할 때 어떻게 하면 소화시킬 수 있을까에 대해서 공유하고자 작성하게 되었습니다.

 

CS 학습의 필요성

 필요성에 대해서 말하기에 앞서 코드 스쿼드 시스템에 말하고자 합니다. 코드 스쿼드는 1주 또는 2주마다 5~6명 규모의 인원이 하나의 조를 이루어 진행하는 방식이었습니다. 오전에는 30분간 학습 진행 상태와 목표와 같은 점들을 공유하는 데일리 스크럽을 진행하고 오후에는 자신이 CS 미션을 해결하기 위하여 학습한 것들이나 자신이 겪고 있는 문제점에 대해서 공유하는 그룹 리뷰라는 것을 진행하였습니다. 

 

 2달동안 여러 조원들과 데일리 스크럽과 그룹 리뷰를 하며 나누었던 이야기중 자주 나왔던 주제는 "CS 학습을 왜 배워야 하는지에 대한 이야기"였던 것 같습니다. 이런 주제가 나왔을 때 저 역시도 명쾌한 대답을 할 수는 없었습니다. 물론 지금도 이 대답을 하기 위해서 계속 CS 학습을 하는 것이 아닌가 싶습니다. 

 

 하지만 CS16 과정을 수료하면서 제가 생각하는 CS를 학습해야 하는 이유에 대해서 말하고자 한다면 어떤 기술이 내부적으로 어떻게 작동하는지를 추상적으로라도 인지하여 적절한 상황에서 그 기술을 사용할지 안할지 판단하기 위해서 학습해야 한다고 말할 수 있을 것 같습니다. 저는 예전 윤성우 저자의 "열혈 자료구조"라는 책을 공부한 적이 있습니다. 책의 진행 방식은 자료구조에 데이터들이 어떤 순서로 저장되고 삭제되는지에 대해서 그림으로 설명하고 C언어로 구현하는 방식으로 진행되었습니다. 책을 보면서 들었던 생각은 추후에 데이터를 관리할 일이 생겼을때 이러한 자료구조를 직접 구현해서 사용해야 겠다는 생각을 하였습니다. 하지만 우습게도 저는 그때 컬렉션 프레임워크와 같은 것들에 대한 존재를 모르는 상태였고 결국 나중에 가서는 직접 만든 자료구조를 사용하는 것이 아닌 이미 표준화된 컬렉션 프레임워크를 사용하고 있는 저를 발견했습니다. 이 사례에서 말하고자 하는 바는 만약 제가 자료구조를 배우지 않고 컬렉션 프레임워크를 사용했다면 ArrayList와 LinkedList의 특성에 대해서 생각하지 않고 사용하거나 ArrayList만을 사용했을 거라는 점입니다. 아시다시피 ArrayList는 배열 기반이기 때문에 탐색은 뛰어나나 삽입과 삭제 연산에서 많은 리소스가 발생하기 때문에 삽입과 삭제가 많은 기능에는 좋지 않습니다. 반면 LinkedList는 탐색은 좋은 성능을 내지 못하지만 삽입과 삭제와 같은 연산에서 많은 리소스가 발생하지 않아 삽입과 삭제 기능에는 좋은 성능을 내는 특징이 있습니다. 이처럼 어떤 기술을 사용할때 구현은 할 수는 없더라도 이 기술이 어떤 방식과 흐름으로 작동하는지를 추상적으로라도 파악하다면 개발할때 좋은 성능을 낼 것이라고 생각하였습니다.  따라서 이와 같은 이유로 CS를 학습해야 하는 이유로 CS의 학습은 프로그램 개발시 성능을 높이기 위해서 그 기술을 사용할지 안할지 판단하기 위함이라고 말할 수 있을 것 같습니다.

 

CS를 소화시키는 방법

 기본적으로 CS 과목(운영체제, 네트워크, 자료구조, 알고리즘, 데이터베이스, 컴파일러 등)들은 재미가 없습니다. 자료구조나 알고리즘, 데이터베이스와 같은 과목들은 코딩을 통해서 결과물을 만들어보거나 명령어를 날려보면서 시각적으로 결과들이 눈에 보이면서 그나마 재미가 있습니다. 하지만 운영체제, 네트워크, 컴파일러와 같은 과목들은 대개 모든 설명이 그림이나 글로 이론이 설명되어 있고 코딩을 통해서 어떠한 결과물을 만들어 내는 부분이 상대적으로 적습니다. 또한 저는 CS와 같은 과목들은 범위가 매우 방대하고 어려워서 내가 지금 무엇을 하고 있나, 내가 지금 옳은 방향으로 나아가고 있나라는 생각에 빠지기 쉽다고 느꼈습니다. 따라서 이번 주제에 대해서 말하고자 하는 바는 이러한 재미없지만 꼭 학습해야하는 CS와 같은 과목들을 어떻게 하면 덜 지루하고 잘 소화시킬 수 있는지에 대해서 공유하고자 합니다.

 

결과물을 만들어보면서 기술의 필요성을 느끼기

 코드 스쿼드의 CS16 과정은 단순히 CS 과목들에 대한 이론을 설명하는 과정은 아니었습니다. 어떤 특정한 기술이 주어지고 이 기술을 이용하여 간단하고 단순한 미니 시뮬레이터와 같은 것들을 구현하면서 미션을 해결하는 방식으로 진행되었습니다. 예를 들어 CS16 과정중 자바 언어를 이용하여 체스 게임을 객체지향적으로 구현하는 미션이 있었습니다. 미션을 구현하면서 발견한 불편함은 코드들간에 중복이 발생한다는 점이었습니다. 결국 이러한 코드간에 중복을 해결하기 위해서 캡슐화, 다형성과 같은 객체지향적인 기술이 필요하게 되었고 기존에 이론과 몇몇 책의 예제로만 배웠던 것을 다시 복습하게 되고 미션 구현에 적용하므로써 코드간의 중복을 줄이는데 도움이 되었었습니다. 이 사례에서 말하고 싶은 것은 어떤 기술을 배울때 이론만을 배우는 것이 아닌 체스 게임과 같은 기술이 적용된 간단한 결과물들을 만들어 보면서 기술의 필요성을 느끼고 다시 찾아보면서 적용하는 과정이 저에게 몰입갑을 높여서 이해가 더 잘되게 했다는점입니다. 

 

목차를 만들어 내가 배운것들을 시각적으로 보이게 하기

아시다시피 CS 과목들은 학습해야할 범위가 넓고 어렵습니다. 당장에 운영체제에서 그 유명한 공룡책인 "Operating System Concepts" 책만 보더라도 1000페이지가 넘는 양을 자랑합니다. 제가 운영체제를 학습할 때 실수한 부분은 2가지가 있었습니다. 첫번째는 이론적인 내용만 배우고 코딩을 하여 결과물들을 만들려고 하지 않은 것입니다. 결과물들을 만들어보면서 필요성을 느끼지 않게 되고 단순히 외우는 방식으로 진행하였습니다. 두번째는 내가 지금 무엇을 배우고 어느 위치에 있는지 파악하지 않으면서 진행하는 것이었습니다. 이러한 방식을 진행하면서 느낀점은 범위가 작은 경우 문제가 없을 수 있지만 학습해야할 범위가 넓을수록 "내가 지금 무엇을 하는거지?"라는 생각을 자주하게 된다는 것을 느꼈습니다. 이러한 문제를 조금이라도 해결하고자 제가 시도한 방법은 내가 지금까지 학습한 것들을 시각적으로 보이게 하는 것이었습니다.  시각적으로 보이기 위해서 시도한 방법은 어떤 기술을 배워할때 내가 학습해야 하는 것들을 목차로 만드는 것이었습니다. 다음 그림은 제 GitHub에 있는 운영체제를 학습한 목차를 저장한 Repository입니다.

위와 같이 내가 학습해야 하는 것들을 목차로 만들고 단원별로 학습한 내용들을 블로그나 마크다운 파일에 작성하여 링크를 추가하였습니다. 위와 같이 목차를 만들어 하나하나 채워갔을때 제가 생각했을 때 좋았던 점은 내가 지금 몇%정도 왔는지를 시각적으로 파악할 수 있다는 점과 다시 찾아볼때 편리하다는 점이었습니다.

 

코드스쿼드 CS16 과정을 수료하면서 느낀점

코드스쿼드 CS16 과정은 CS 과목들의 처음부터 끝까지 마스터하는 과정이 아닙니다. 하지만 CS와 같은 딱딱한 기술들을 어떻게 학습하고 대해야 하는지 배우는 과정이라고 저는 생각하였습니다. 이러한 부분이 제가 처음 들어왔을때 원했던 목표와 비슷한 것에 좋았습니다.