업데이트:

22년

저는 2022년을 정확하게 상반기, 하반기로 나눌 수 있을 것 같습니다.
상반기의 카뎃생활과 하반기의 학교생활로요.


생활 패턴과 주변 환경이 극명하게 갈린 시기였기에 이렇게 나누는게 좋을 것 같습니다.

상반기

상반기에는 카뎃생활이 주를 이뤘습니다.
운 좋게 42서울 본과정을 공부할 수 있었고, 주변에 같은 공부를 하는 다양한 분들을 만나뵈어
학교생활에서 느낄 수 없던 것들을 많이 느꼈습니다.
한 가지 문제에 봉착했을 때, 혼자 공부할때는 몇 시간이고 끙끙 앓아야했던 것들을 주변에 여쭤보고, 찾아보면서
스스로 많이 부족하다는 것을 깨닫고, 더 많이 노력해야한다는 것을 느끼기도 했습니다.


학교를 다니면서 본과정에 집중할 수 없을거라는 생각에 42본과정에 몰입하던 시기이기도 합니다.

42에서의 공부

  • 공부법

과제를 해결하고 진도를 빨리 나가는 게 중요한게 아니라는 생각에
저는 과제가 주어지면 일단 과제에 대한 몇가지 준비를 가집니다.

  1. 과제의 기본 요구사항
  2. 이 요구사항을 지키기 위해 무엇을 공부해야하는지?
  3. 무엇을 어떻게 공부해야할지?
  4. 얼마나 깊게 공부해야하는지?


철학자 문제를 예로 들어보겠습니다.

요구사항 파악

과제 요구사항에는 system call을 사용하는 함수들이 주어지고, 이 system call들은 모두 man page가 만들어져있습니다.

  • man page에는 특정 키워드를 중심으로 설명이 되어있는 것을 확인할 수 있습니다.
  • 예를 들어 man pthread를 확인해보겠습니다.
NAME
 pthread – POSIX thread functions

SYNOPSIS
	 #include <pthread.h>

DESCRIPTION
	 POSIX threads are a set of functions that support applications with requirements for multiple flows of control, called threads, within a process.  Multithreading is used to improve the performance of a program.

	 The POSIX thread functions are summarized in this section in the following groups:

	   •   Thread Routines
	   •   Attribute Object Routines
	   •   Mutex Routines
	   •   Condition Variable Routines
	   •   Read/Write Lock Routines
	   •   Per-Thread Context Routines
	   •   Cleanup Routines

Thread Routines
 int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void *arg)
		 Creates a new thread of execution.

 int pthread_cancel(pthread_t thread)
		 Cancels execution of a thread.

 int pthread_detach(pthread_t thread)
		 Marks a thread for deletion.

 int pthread_equal(pthread_t t1, pthread_t t2)
		 Compares two thread IDs.

 void pthread_exit(void *value_ptr)
		 Terminates the calling thread.

 int pthread_join(pthread_t thread, void **value_ptr)
		 Causes the calling thread to wait for the termination of the specified thread.

 int pthread_kill(pthread_t thread, int sig)
		 Delivers a signal to a specified thread.

이걸 다 이해하신다면 전공자 분이실 것이고, 공부했던 내용을 기반으로 과제를 수행하실 겁니다.
다만 저같은 비전공자들은 process, thread, multithreading과같은 키워드를 보고 이게 뭔 소리지? 싶습니다.


무엇을 공부해야하지?

쓰레드와 프로세스에 관련해 구글링을 해봅니다.
대충 어떤 개념인지는 알겠습니다.
다만, 구글링을 통한 공부는 오개념이 많을수도 있다는 것입니다.
저도 블로그를 쓰는 입장에서 개발 블로그를 작성하시는 분들께 죄송한 말씀이지만, 퇴고를 반복해 고품질의 지식을 만들어내시는 분들이 있는가 하면,
다른 블로그를 기반으로 공부하고, 짜집기해서 글을 올리시는 분들도 많습니다.
구글링을 통해 특정 정보를 찾다보면 여기도 저기도 문장 자체가 똑같은 경우가 있습니다.


어떻게 공부해야할까?

다만, 구글링을 통한 공부는 오개념이 많을수도 있다는 것입니다.
저도 블로그를 쓰는 입장에서 개발 블로그를 작성하시는 분들께 죄송한 말씀이지만, 퇴고를 반복해 고품질의 지식을 만들어내시는 분들이 있는가 하면,
다른 블로그를 기반으로 공부하고, 짜집기해서 글을 올리시는 분들도 많습니다.
구글링을 통해 특정 정보를 찾다보면 여기도 저기도 문장 자체가 똑같은 경우가 있습니다.

그래서 책이 필요합니다. 대학교의 수강편람에서 수업에서 사용하는 원서를 보고, 읽어보도록 합시다.
저는 operation system concept 책에서 관련 개념을 찾았습니다.


얼마나 깊은 깊이로?

그런데, 여기서 한 가지 선택을 해야합니다.

  • 관련된 개념만 보고 갈 것인가?
  • 책 앞뒤로 펼쳐진 수많은 지식도 탐색할 것인가?

원서를 보니 어려운 단어, 처음보는 단어, 문장이 계속됩니다.
읽기 싫어지고 관련된 개념만 보고싶어지죠


하지만 시간적인 문제도 고려를 해야합니다.
저는 다음학기 복학이 계속 맘에 걸려 프로세스-쓰레드 이전 장까지만 공부하기로 결정했습니다.
책에서 다루는 메모리 이후의 개념은 다음에 공부하기로 부채로 남겨놓고 이 부분은 모른다는 것을 확실히 짚고 넘어갑니다.


한가지 확실한건, 공부하지 않은 부분을 어떻게 공부할 지, 언제 공부할지는 계획을 세워둬야한다는 것입니다.
outer circle의 ft_malloc은 brk system call로 malloc을 구현하게됩니다.
저는 이 과제를 진행할때 메모리 부분을 공부하기로 결정하고, 넘어갔습니다.



멘토링

복학 전에 멘토링을 받았습니다.
현재까지 공부했던 것들을 기반으로 앞으로 어떻게 학교생활을 해나가야할 지에 대한 조언을 부탁드렸습니다.

멘토님께서는 프로젝트 기반 학습의 핵심이 단순한 문제해결이 아닌, 문제해결을 위한 지식탐색이 중요하다고 말씀해주셨습니다.
그리고 이 지식탐색 방법을 어떻게하는지가 중요하다고 말씀해주셨고, 제가 하고있는 방식이 옳다고 말씀해주셨습니다.
단순히 과제해결을 위한 것 보다 더 많은 것을 얻어가야 한다고 강조해주셨습니다.


그리고 개발자가 되기 위해서 남은 학교생활에서 어떤 것들을 공부해야하는지, 어떤 수업을 들어야하는지에 대해 로드맵도 제공해주셨습니다.
본전공인 경영학을 배울때보다 학교 생활에 크게 의의를 둘 수 있게되는 계기가 되었습니다.



하반기

하반기는 데이터베이스가 주된 카테고리였습니다.
복학 첫 학기에 42본과정에 치중하기 어려우니, 학교 수업에서 한 가지 카테고리는 잡고가야한다고 생각했고, 그것이 데이터베이스였습니다.
휴학을 SQL로 시작해 복학을 SQL로 한다는 것도 저에게는 큰 의의였습니다.

데이터베이스

수강평은 꽝이지만 데이터베이스를 직접 사용해 웹 프로젝트를 개발하는 컴퓨터과학 전공 데이터베이스 수업,
경영대에서 처음 열리는 데이터베이스 관리수업을 들었습니다.
두 수업 모두 정말 좋은 수업들이었고, 즐겁게 공부하며 좋은 성적을 받을 수 있었습니다.


단순하게 데이터베이스 이론을 다루는게 아니라, 실세계의 문제를, 요구를 어떻게 접근해서 설계를 할 지에 대한 고민을 많이할 수 있었습니다.
개발자들이 데이터베이스를 공부하는 방식, 그리고 설계된 데이터베이스를 어떻게 관리해야할 지에 대해 두 가지 역할 모두에서 고민해보면서 공부했기에 더 즐거웠었던 것 같습니다.
강의로 제공되는 ppt를 전체적인 틀로만 잡고, 원서위주로 공부했는데 강의내용으로 충족되지 않는 인과관계들, 이유들에 대해 알아갈때마다 더 재미있었습니다.


인상깊었던 것

컴퓨터과학과 교수님께서 질문하시길, fundamentals fo database system 번역판 산 사람 있나요? 당장 버리세요, 무조건 영어에 익숙해지세요 특히 개발자를 준비하는 학생들은, 이유가 뭘까요?라고 하셨는데, 수강하던 60명의 학생들 모두 그 이유에 대해 대답하지 못했습니다.

저를 비롯해 42서울 본과정생들은 모두 그 이유를 잘 아실거라고 생각합니다.
영어로 주어지는 subject들
영어로 주어지는 평가지들
영어로 설명되는 man page들
영어로 설명되는 시험 문제들
그리고 영어로 되어있는 수많은 stack overflow 글들

이것들의 가장 기본 밑바닥에는 영어로 작성된 기술의 documentation이 있습니다.
RFC에서 규정된 HTTP, bash의 man page에서 설명되어있는 pipe, redirection, cpp reference, V8과 NodeJS의 documentation들…
기술을 만든 프로젝트의 documentation들에는 오정보는 있을수가 없습니다. 특히 널리 알려진 기술은 그렇습니다.


프로젝트

데이터베이스 수업에서 사용자 데이터베이스의 분석 및 결합추천 시스템 프로젝트를 진행했습니다.
2명, 3명이 아닌 6명이 한 조가되어 진행하는 과제였고 사용자의 데이터베이스 connection information을 받아서 연결해
테이블에 담긴 데이터들의 통계치와 결합키 추천 여부, 속성 편집 등의 기능을 개발했습니다.

6명 중, 저를 포함한 3명이 비전공자였기에 사용할 수 있는 기술스택은 한정적이었습니다.
프로젝트 조장님께서 전공자 + 자바 위주 기술스택을 가지고 계셨고, 복수전공 2분은 JS기반 기술스택을 가지고 계셨습니다.
저는 Java 프로그래밍은 전혀 개념이 없었지만 NodeJS 관련 공부는 했었기에 NodeJS의 express server를 사용하기로 했습니다.

서버는 정해졌고, 프론트엔드 기술스택이 문제였는데, React나 Vue 등 SPA방식 프레임워크를 다루실 수 있는 분들이 없었다는 것입니다.
다른 분들 모두 프론트엔드 기술스택보다는 백엔드 기술스택에 집중하시는 것 같아 전통적인 MPA로 개발하기로 결정했습니다.


11월 중순경시작해 기말고사 기간을 거쳐서 약 한달, 실제 투입할 수 있는 시간은 2주 ~ 3주정도였기에 빠르게 개발환경을 세팅했습니다.
브랜치 전략을 나누고, mysql 라이브러리를 통해 사용자의 DB connection information을 세션으로 저장할지 아니면 서버 DB에 저장할 지, static file들을 어떻게 전달하는지, JS의 특징인 비동기처리가 내부적으로 어떻게 수행되는지 등 많은 커뮤니케이션을 통해 즐겁게 과제를 했었던 것 같습니다.


다만, 이때는 디자인 패턴에 대한 공부가 전혀 없었기에 코드를 분할하는 정도에서만 멈췄었습니다.
커넥션 풀링과 같은 기법, 사용자측 DB와 서버측 DB의 테이블을 조인하는 Federaate table 등에 대해서도 몰랐었기에 여전히 리팩토링해야하는 기술부채로 남아있습니다.(언제하냐 진짜…졸업은 언제…)


하나씩 처리해나갈 생각입니다. 저기에 사용자 table에서 data를 직접 조회하게끔 하는 기능과 chance package를 적용해 dump data 추가기능, typescript 적용, 그리고 서버 올리고 배포까지 다양한 방식으로 사이드 프로젝트를 깊게 파볼 생각입니다.



올해 포부

  • 상반기
    1. SQLP
    2. nestjs : docs에서 처음보는 단어가 많아서 익숙해지게끔
    3. production 경험 : 사이드 프로젝트로 공부
    4. docker, aws


  • 하반기
    1. outer circle 과제 ft_ping으로 네트워크, ft_malloc, file system으로 운영체제 공부
    2. 알고리즘 공부
    3. 등등


화이팅 해봅시다~!