WEEK 05(3/31~4/6)과 WEEK 06(4/7~4/13)가 순식간에 지나갔다. 시간을 내어 블로그 작성과 회고를 빠짐없이 작성하고 싶었지만 당면한 과제에 대한 압박과 귀찮음에 못견뎌 WEEK 07 발제가 끝나고 회고를 쓴다..!
WEEK 05는 Red-Black Tree를 구현하는 것이 최종 목표였다. 이를 위해 C language를 익히고 C로 linked list, tree, binary search tree 등 다양한 자료구조를 구현해보았다. 정글에서 공부를 할수록 새로운 언어, 새로운 내용에 대한 두려움이 없어져 간다. 코치님과 의장님께서 말씀하셨듯 개발자에게 필요한 것은 변하는 것들 속에서 변하지 않는 것을 볼 수 있는 능력이다. 계속해서 새로운 프레임워크와 기술들이 등장하지만 basis를 이루는 기술들은 몇십년간 변하지 않는 기술들이다. 개발자가 되고자 공부하는 입장에서 이런 핵심 개념 및 이론들을 강조하는 프로그램에 참여하고 있는 나는 옳은 방향으로 나아가고 있다고 생각한다.
환경은 이렇게 갖춰졌지만, 내가 최선을 다해 얻어갈 수 있는 모든 것을 얻어가는지에 대해서 매일 생각한다. 알고리즘이 끝나고 ‘왜 C를 활용해서 자료구조를 왜 구현해보라고 했을까?’ 라는 생각을 가지고 한 주를 보내봤을 때 내가 얻은 답은 ‘네 생각을 컴퓨터가 동작할 수 있도록 코드로 옮겨 봐라, 다만 더 low-level에서^__^’ 이다. 알고리즘 주간도 동일했다. 개발자라 함은 컴퓨터와 일하는 사람이다. 컴퓨터는 나를 위해 일해주는 도구이기에 컴퓨터를 활용해야 한다. 그 반대가 되면 정말 피곤하다.. RBTree를 하면서 Segmentation Fault를 굉장히 많이 만났다. C는 파이썬처럼 친절한 친구가 아니기에 내가 왜 이런일들이 일어나는지 곧바로 알 수가 없다.. 내가 일을 시켰던 코드를 샅샅이 뒤지며 로직을 점검하고, debugger를 활용해 범인을 색출해야 한다. gdb를 활용해 디버깅도 해보고, 각 함수에 printf를 찍어가며 디버깅을 해봤지만 결국 핵심은 로직을 점검하는 것이다. 문제 정의에 대해 작성한 해답인 코드를 처음부터 다시 살펴보고 내가 원하는 방향으로 가는지 점검하는게 가장 빠른 해결 방법이었다. 물론 Error의 타입마다 효율적으로 디버깅하는 방법은 차이가 있으나 TDD(Test-Driven Development)가 왜 중요한 개념인지 깨달아 가는 중이다. 류석영 교수님의 코드리뷰 강의에서 “문제 정의를 하고, 이에 대한 해답인 코드를 작성하기 전에 테스트 케이스부터 작성해라” 라는 말씀을 하셨는데, 처음에는 ‘이게 굳이 필요할까?’ 라고 생각했으나 매일 C로 컴퓨터와 대화하면서 테스트 케이스의 소중함을 느낀다.. compiler는 정말 최소한의 정보만을 주기 때문에 runtime에서 일어나는 일들로 대화하는게 정말 편하다.. 테스트 케이스를 주시는것에 감사해야 할일이다.. 마지막으로, Red-Black Tree 주간에는 Introduction to Algorithms 13장에 있는 Red-Black Tree를 읽고, Pseudo code를 참고해서 구현했는데 이 부분은 좀 후회가 된다. 앞에 도영이형이나 민규형은 정말 영상을 통해 개념만 보고 이것들에 대한 로직을 처음부터 다 작성해서 밑바닥부터 깡구현을 했다.. 나는 로직을 책에서 전부 알려준 상태에서 코드만 옮기면 됐기에 너무 허무하게 끝났고 내가 할 게 없었다. 이 때 다음주부터는 반드시 깡구현을 해야겠다고 생각했다. 정말 귀감이 되는 형들이고 그 방향성에 공감을 하기에 이런 사람들이 있는게 힘이 된다.
WEEK 06은 C의 동적 할당 프로그램 malloc() 을 직접 구현해보는 malloc lab이다. 저번주에서 깨달은 바로 이번주는 최소한의 개념파악만 하고 로직을 처음부터 짜보고 싶었다. Implicit free list allocator는 책에 나와있는 코드를 보고 팀원들과 같이 공부했다. 과제문제의 place(), find_fit()함수를 구현해야 완성되는 코드였는데, 내 로직대로 옮긴 코드가 쉽게 동작하지 않았다.. 옆에 진호형과 재원이형의 도움으로 해결했다. Explicit부터는 Implicit Free List 코드를 기반으로 작성해보기로 했다. PPT에 그림이 너무 잘 나와 있어서 핵심 로직들이 잘 그려졌다. 하지만 pointer를 사용하기에 이번에도 Segmentation Fault, Payload overlapping 등,, 많은 오류들과 만났다. 포인터는 해도해도 헷갈린다.. 마음이 급해서 대충대충 넘어가다 보니 개념 이해가 부족한 탓인것 같다. 그래도 실력은 없어도 근자감은 넘치기에,, 열심히 코딩을 했고 이틀간 싸운끝에 새벽3시에 Segmentation Fault와 안녕하고 기숙사로 들어가는데 너무 기분이 좋았다.. 형들이 이래서 깡구현을 하는구나.. 라고 생각하자마자 Simple Segregated Storage을 시작했고, 구현할 때는 아예 백지부터 새로 짜야되는 코드들이었는데, 로직은 정말 쉬웠다.. 그래서 빠르게 코드로 옮겼는데 결국 못이겨내고 Segregated Fit 방식으로 갈아탔다.. 이 방식은 Explicit Free List를 리스트로 여러개 관리해주면 되는거라 Explicit 방법을 그대로 가져간다면 정말 간단히 구현할 수 있다.. 그래서 금방 끝났다ㅠ 그렇게 바로 한주가 끝나버렸다. 주말에는 또 똠양꿍을 먹으러 본원 옆 ‘잇마이타이’에 갔었는데 여전히 맛있다.. 이런 (맛잘알..) 귀한 사람들 덕에 맛있는 음식도 먹고 재밌는 시간도 보냈다 🙂 ,, 그 다음날 같이 놀았던 두 사람 모두 아파서 괜히 미안했다... 우리 셋 다 기침을 콜록콜록 거리는데 너무 짠했다.. ㅠ (근데 웃김) 여튼 이번주는 WEEK 05의 피드백을 바탕으로 시도해본 방법들을 그래도 열심히 수행했고 많은 것을 얻어간다. 내가 기르고 싶은 ‘내 생각을 코드로 옮기는 능력’을 위해 부단히 노력해야 겠다. 더 잘하고 싶은 마음에 자기혐오 비슷한 것들이 생긴다. 여기에 연쇄적으로 안좋은 감정들이 올라올 때가 있다. 좀 더 강한 사람이 되고 싶다. 못할 수 있고 더 노력하면 된다. 이번 한 주도 감정에 휩싸이지 말고 내 갈길을 가야겠다🙏 ( + 블로그에 배운 것을 정리하고 내 생각을 넣어가며 정리하고 싶은데 일단 한 주에 주어진 것을 해내는게 최우선이기에 잘 될지는 모르겠다 ㅠ )