[정글 45일차] 정글에서 45일을 되돌아보며

SeHoony·2022년 5월 12일
1

관찰일지

목록 보기
1/19

- 관찰일지를 쓰게 된 동기

WEEK01 ~ WEEK04에는 알고리즘 공부에만 집중했다. 그러다 지난주(WEEK05)에 C언어 학습 및 RB Tree 데이터 구조를 학습하게 되면서, 전에 공부했던 알고리즘과 RB TREE 과제 그리고 CS 공부까지 방대한 학습 범위에서 어떻게 공부하는 것이 좋은지에 대한 방향을 잡지 못해 힘들었다.

이런 상황을 벗어나고자 생활패턴과 공부 방식을 크게 바꿨다. 지금 상황에서 내게 가장 효율적인 공부 방식과 정신 및 육체의 상태를 찾고자 나름의 노력을 했다. 그 결과 지금은 지난 주와 비교했을 때 매우 안정된 상황이 되었다. 그리고 내 몸에 잘 맞는 생활 패턴을 찾은 거 같아 뿌듯하다.

이번 상황을 경험하면서, 문제에 부딪혔을 때 어떤 고민과 각오를 했으며 어떻게 나를 변화시켰는지에 대해 기록해야할 필요성을 느꼈다. 그래서 코치님께서 강조하신 개발일지를 부지런히 써보고자 한다. 다만 내가 쓰는 일지는 개발을 하면서 관찰한 나에 대한 내용을 주로 담는다.

정글은 20대의 추억 중에서도 강렬한 기억으로 남을 것이다. 지금부터 부지런히 기록하고 나와 함께 지금을 추억할 사람들에 대한 내용을 담겠다.

- 45일, 한 줄 요약

"결과적 행복이 과정의 행복을 보장하는 것은 아니다"
정글을 선택한 것은 결과적으로 행복으로 가는 길이라고 생각했다. 하지만 정글에서 제시하는 과정들을 버티는 일은 꽤 힘들었고, 지금까지도 계속 잘 버틸 수 있는 방법을 고민한다. 결과적으로 행복할거라해서 과정이 행복할거라는 건 오만이나, 지금의 과정을 잘 버티면 행복이 기다리고 있을 거라는 믿음으로 열심히 해야지라는 마음으로 살고 있다.

- 45일동안 아쉬웠던 점

  • 타협
    : WEEK01을 제외하고 WEEK02~WEEK04까지 코치님이 제시해주신 모든 문제를 푼 주는 한 번도 없었다. 그리고 4주가 지난 지금, 알고리즘 스터디에서 지난 4주동안 배웠던 알고리즘 문제들을 다시 복습하고 있다. 나는 여전히 그 때 제대로 풀지 않았던 문제들에 쩔쩔 매고 있다.

  • RB Tree 및 Malloc 구현에서 답부터 찾아 본 것
    : 조금만 디버깅이 힘들면 답지부터 찾고 그게 내 실력인양 안심했다. 그게 내 실력이 아닌 것은 이번 WEEK06 테스트에서 코드리뷰를 받으면서 밝혀졌다. 나는 리뷰이에게 해줄 코멘트가 많이 없었다. 왜냐 잘 모르니까. 그리고 리뷰어에게 받은 코멘트를 잘 이해할 수도 없었다.

  • 우선 순위 설정을 실패해 과제를 충실히 못한 것
    : Malloc 구현에서 implicit, explicit까지 구현하고 이후 seglist, buddysystem은 구현할 시간적 여유가 없었다. 참여하는 스터디가 3개가 되니 스터디 공부의 비중이 커졌다. 그러다보니 가장 중요한 과제를 성실히 수행하지 못한 점이 아쉽다.

- 45일동안 나는 나를 어떻게 변화시켰나

1. 운동

  • 아침 러닝
    : 정글에 입소하고 지금까지 꾸준히 아침러닝을 해왔다. 정글에 입소할 때 몸무게가 84킬로였는데, 지금은 78킬로를 유지되고 있다. 체력도 전보다 좋아진 것을 많이 느낀다. 현재는 저녁에 헬스를 하기 때문에 아침에 20분 정도 카이스트 캠퍼스 외곽 한 바퀴를 돈다.
  • 헬스
    : 저녁 식사 후 건엽이와 헬스를 한다. 시작한 지는 아직 1주일도 안됐지만 친구와 같이 헬스를 하는게 너무 즐겁다. 지금 내 삶의 낙 중 하나다.

2. 빠른 기상, 빠른 취침

: 정글 초입, 매일 새벽 2시 정도까지 공부하다보니 2주차가 되었을 때 완전 방전이 되었다. 그 때부터 체력 안배의 중요성을 깨닫고 취침시간과 기상시간을 조율하며 생활패턴을 바꿔보았다.
: 저번 주부터 유지하고 있는 생활패턴이 00시 30분(+- 10분) 취침// 05시 30분 기상// 점심 먹고 30분 취침// 저녁 먹고 30분 취침이다.

3. 그룹스터디 적극 활용

: 여태까지 공부 방식은 혼자 공부하는 방식이었다. 그래서 정글에서도 여태까지 CSAPP 책을 혼자 읽으면서 공부해왔다. 날이 갈수록 공부량이 많아져 더이상 혼자 해결할 수 없을 지경이 되었다. 그러다 CSAPP 9.9. 동적할당을 같은 조였던 건엽이민성이에게 강의식으로 알려주게 되었다. 오히려 이해도가 더 올라가는 것을 느꼈고, 잘못 이해하고 있는 부분도 동기들을 통해서 다시 알 수 있게 되어 좋았던 경험이 있다.
: 그 날 이후에 CS 스터디를 개설해 함께 효율적인 공부방법을 고민하며 구성원들과 공부를 해오고 있다. 뿐만 아니라 CS 면접 스터디와 알고리즘 스터디도 같이 하면서 하루 중 오후 시간은 스터디를 위한 시간으로 쓰고 있다.[위의 사진] 캠퍼스 잔디 밭에 돗자리 펴고 스터디 한 날(2022.05.10)

[위의 사진] 스터디를 위해 내가 맡은 부분 정리한 것

- 45일, 띵곡


: WEEK03이 DFS/BFS 관련 알고리즘을 학습하는 기간이었다. 이 때 재귀에 대한 개념이 잘 잡히지 않아 심적으로 많이 힘들었고 특히 BFS문제에 접근이 잘 안되었다. 시간을 투자한만큼 결과가 안나와서 잠이 오지도 않고, 그 와중에 집안일로 부산에 내려가야해서 심적으로 부담되었다.
부산으로 내려가는 길에 전날 현주 플레이리스트에 있던 "나이트 오프 - 잠"에 멜로디가 좋었던 것이 기억나 내려가는 KTX에서 이 노래를 들었다.

나 조금 누우면 안 될까
잠깐 잠들면 안 될까

라는 가사를 듣자마자 눈물이 주르륵 났었다. 스스로를 많이 몰아넣고 있었구나라고 생각했고 반성했던 순간으로 기억해 인상깊은 노래다.

- WEEK_06에서 공부한 것

1. 명시적 동적 메모리 할당(malloc) 직접 구현
: '동적 메모리 할당'이란 개념 자체가 참 개발자스럽다는 생각이 들었다. 결국 런타임 전에 미리 메모리를 할당해놓으면 진짜 필요한 데이터량과 차이가 있을 수 있으니까 싫다는 거다. 그래서 런타임 때 필요한 데이터량이 딱 정해지면 동적으로 메모리를 할당하겠다는 개념이었다.

2. 내부 단편화, 외부 단편화 문제 개선
: 동적 메모리 할당의 목표가 처리 속도를 향상 시키면서, 메모리 공간 활용도를 높이는 것이다. 이러한 목표를 저해시키는 것이 내부 단편화와 외부 단편화로 이해했다. 내부 단편화는 할당 공간보다 가용 메모리 공간이 커서 생기는 것이고, 외부 단편화는 모든 메모리 공간을 합치면 할당 공간이 마련되지만 블록 별로 메모리 공간이 잘려있어서 할당해줄 수 없는 문제를 일컫는다. 두 가지 모두 메모리 활용에서 문제가 있다는 것이다.

3. 가용 리스트 종류 선택
: 동적 메모리 할당을 하면 결국 힙이란 자료구조를 사용하게 된다. 이 때, 이 힙 리스트를 묵시적 가용 리스트로 구성할 지, 명시적 가용 리스트로 구성할 지 그것은 개발자의 몫이다. 전자는 블록 헤더에 블록 사이즈 값을 통해 순차적으로 검색하여 가용 블록을 찾아가는 방법을 채택한다. 이 때, 가용 블록을 찾는 방식에도 first-fit, next-fit, best-fit으로 방식이 나뉜다.
명시적 리스트는 할당 블록은 묵시적 리스트와 같은 모습이지만 가용 블록에 한해서 pred 포인터와 succ 포인터가 해당 블록 기준 앞에 있는 가용 블록과 뒤에 있는 가용 블록의 주소를 가리키게 된다. 따라서 묵시적 리스트보다 가용 블록 검색이 빠르다.

4. 디버깅
: next-fit을 구현할 때, segmetation error가 발생했다. implicit 리스트에서 first-fit으로 구현했을 때는 잘 돌아갔다. next-fit으로 수정하면서 변화가 생긴 코드들도 모두 확인했음에도 segmentation error가 없어지지 않아 고생했다. 결국 오타 하나 때문에 발생한 것을 발견하고 문제를 해결할 수 있었다.

5. 구현
: 나는 implicit 리스트에서 next-fit, explicit까지 구현했다. 이는 최고 득점을 받았던 explicit 구현 코드 중 말록 부분만 따로 떼어서 나타냈다.

/*
 * mm_malloc - Allocate a block by incrementing the brk pointer.
 * Always allocate a block whose size is a multiple of the alignment.
 */
void *mm_malloc(size_t size)
{
    size_t asize;
    size_t extendsize;
    char *bp;

    /*Ignore spurious requests*/
    if (size == 0)
    {
        return NULL;
    }
    /*Adjust block size*/
    if (size <= DSIZE)
    {
        asize = 2 * DSIZE;
    }
    else
    {
        asize = DSIZE * ((size + (DSIZE) + (DSIZE - 1)) / DSIZE);
    }

    /*Search the free list for a fit*/
    if ((bp = find_fit(asize)) != NULL)
    {
        place(bp, asize);
        return bp;
    }

    /* No fit found. Get more memory and place the block*/
    extendsize = MAX(asize, CHUNKSIZE); // minimum 16bytes
    if ((bp = extend_heap(extendsize / WSIZE)) == NULL)
    {
        return NULL;
    }
    place(bp, asize);
    return bp;
}


최종 82점을 받았다.

- WEEK_06에서 아쉬웠던 점

  • 스터디 공부의 비중이 과제 비중보다 커졌던 점
    : CS 스터디 준비에만 하루에 2~3시간 정도는 준비했다. 그리고 매일 오후 2시, 기본 1시간은 알고리즘 스터디를 하다보니 오후 시간대는 거의 스터디 관련 공부로 시간을 보내게 되었다. 그러다가 과제에 소홀하게 되어 explicit까지만 구현하게 되어 매우 아쉬웠다.
    => 시간을 내서라도 seglist와 buddysystem을 구현하고 싶다.

- 앞으로의 각오 및 WEEK_07에 대한 각오

  • 정글에서 나의 좌우명이 "내일은 모르지 않겠다"이다. 오늘 계획한 것은 오늘 끝내기 위해 남은 정글 기간동안 부지런히 노력해야겠다.
  • [WEEK07] CSAPP에서 개념이 부족한 부분들은 이번 주안에 다 공부할 수 있도록 노력하겠다.
  • [WEEK07] 알고리즘 부분에서 이코테의 주요 유형들에 대한 학습이 이번 주에 이루어질 수 있도록 노력하겠다.
  • [WEEK07] WEEK 07과제를 최우선적으로 하고 코치님이 제시하신 분량을 최대한 맞추기 위해 노력하겠다.
profile
두 발로 매일 정진하는 두발자, 강세훈입니다. 저는 '두 발'이라는 이 단어를 참 좋아합니다. 이 말이 주는 건강, 정직 그리고 성실의 느낌이 제가 주는 분위기가 되었으면 좋겠습니다.

0개의 댓글