코드 더 잘 읽는 방법

코드 더 잘 읽는 방법

프로그래머의 뇌를 읽으며 파트1 내용을 정리합니다.

·

4 min read

프로그래머의 뇌 책 사진

꼭 기억하고 제대로 소화하고 싶은 책 프로그래머의 뇌의 내용을 나름대로 요약 정리하기 위한 글입니다.

챕터 1 - 코딩중 겪는 혼란에 대한 이해

간단 요약

  • 인간의 기억 세가지

    • 단기 기억(Short Term Memory): 정보를 잠시 동안 저장하는 기억 시스템. 몇 초에서 몇 분 동안 지속되며 용량이 제한적(보통 2-6개, 최대 12개 수준)입니다.

    • 장기 기억(Long Term Memory): 정보를 오랫 동안 저장하는 기억 시스템. 이론적으로 저장 용량에 제한이 없고, 몇 분에서 수십년까지 보관 됩니다.

    • 작업 기억 공간(Working Memory): 현재 인식하고 있는 정보를 임시적으로 저장하고 처리하는 기억 시스템. 단기 기억보다 더 동적인 개념. 단순 저장이 아닌 정보를 조작하고 작업하는데 중요한 역할을 합니다.

  • 코드를 읽는 세 가지 인지 과정

    • LTM에서 정보 인출, 키워드 등의 문법 요소 등이 해당됩니다.

    • 코드를 읽는 과정에서 발생하는 정보를 STM에 일시적으로 저장합니다. 변수나 메서드의 이름이 해당됩니다.

    • 작업 기억 공간에서 코드를 읽고 처리합니다.

간단 감상

  • 결국 코드에서 어떤 부분이 STM인지, LTM 인지, 그리고 어떤 부분을 작업 기억 공간에서 굴리는 것인지 구분할 수 있는 숙련도를 쌓아야 한다고 생각됐습니다.

    • 첫째로 그래야 처음 보는 코드가 읽기 힘든 코드인지 여부를 알아낼 수 있습니다.

    • 둘째로 제가 짜는 코드가 다른 사람이 읽기 힘든 코드인지 판단할 수 있습니다. 그리고 어떤 부분을 읽기 쉽게 풀어 줘야 할 지 알 수 있습니다.

챕터 2 - 신속한 코드 분석

간단 요약

  • 책에서는 코드를 읽고 재현해보는 연습을 하도록 유도함으로써 생소한 코드를 읽고 기억하는 것이 어려운 이유는 STM의 용량이 제한적이기 때문임을 강조합니다.

  • 하지만 체스 선수들의 사례를 예시로 우리가 많은 것을 기억할 때는 청킹(chunking)이라는 묶음 단위로 기억을 한다는 점을 강조합니다. 청킹을 통한다면 상대적으로 매우 적은 정보 만을 STM에 저장할 수 있기 때문입니다.

  • 생소한 지식을 청킹할 때 활용하기 좋은 것이 우리가 이미 LTM에 보관하고 있는(하면 좋을) 디자인 패턴, 프로그램 구성 요소, 도메인 지식등입니다.

간단 감상

  • 매우 유명한 체스 선수들의 체스판 외우기 사례에서 알 수 있는 청킹의 위대함. 결국 덩어리로 쪼개어 인지할 수 있을 수록 진짜 집중 해야 할 것의 범위를 좁힐 수 있고 속도가 빨라집니다.

챕터 3 - 프로그래밍 문법 빠르게 배우기

  • 챕터 1, 2가 뇌가 어떻게 동작하는지, 그리고 결국 우리가 코드를 빠르게 분석하는데 어떤 능력이 필요한지를 설명해줬습니다. 결국 기본이 되는 프로그래밍 문법이나 디자인 패턴과 같은 우리가 합의한 지식들을 공유하는 것이 중요합니다. 챕터 3에서는 배움에 대한 스킬이 소개됩니다.

간단 요약

  • 문법에 대한 지식이 많을 수록 청킹을 쉽게 할 수 있기 때문에 문법을 많이 외워야 합니다.

  • 기억 오래 하는 법: 오랜 시간 반복, 플래시 카드를 소개하고 추천합니다.

    • 인출retreival 과 정교화elabolation
  • 저장 강도와 인출 강도: 기억은 잘 나는데 인출이 어려운 것은 저장 강도가 높고 인출 강도가 낮은 것입니다. 반복은 저장 강도를 높이고, 알고 있는 것을 떠올리는 것은 인출 강도를 높입니다.

  • 기억은 네트워크 형식으로 저장됩니다. 그래서 정교화는 인출 강도를 높이는데 탁월합니다.

간단 감상

  • 이 책에서 뿐만 아니라 Anki 등을 통한 플래시 카드 학습법은 여러가지 책에서 추천 하고 있습니다. 제가 개인적으로 매우 좋아하는 IT에 몸담은 이들을 위한 지적생산기술 책에서 소개해줬을 때부터 열심히 실천하려고 노력 중인데 생각보다 쉽진 않았습니다.

  • 지식의 정교화의 경우 현재 저처럼 블로그 글을 쓰는 것도 매우 좋지만, 몇 년간 좀 유행하고 있느 제텔카스텐 등을 통해 지식의 연결을 디지털적으로 보조하는 것도 유효하다고 생각합니다. 저 같은 경우 옵시디언 메모 앱을 통해 이런 수단을 실천하고 있습니다.

챕터 4 - 복잡한 코드 읽는 방법

간단 요약

  • 복잡한 코드를 이해하는 것이 왜 어려운지 살펴보기

    • 내재적 부하: 문제 자체가 복잡한 경우

    • 외재적 부하: 외부적 요인에 의해 문제에 복잡도가 추가됨

      • 주로 프로그램에서 일어나는 우발적 복잡성과 유사합니다.

      • 특정 개념을 많이 경험할 수록 인지 부하가 적어집니다.

    • 본유적germane 부하: 생각을 LTM에 저장하는 과정에서 일어나는 인지 부하(10챕터에서 소개 예정)

  • 인지 부하 줄이기 기법

    • 인지적 리팩터링(conitive refactoring): 유지 보수하기 쉬운 코드로 변경할 뿐 아니라 추가로 현 시점에서 개발자가 읽기 쉬운 코드로 변경하는 것을 의미합니다.

    • 생소한 언어 구성요소를 다른것으로 대체하는 기법

    • 플래시 카드 활용: 코드 동의어 앞 뒷면 통해 연습하는 기법

  • 작업 기억 공간에 부하가 왔을 때 사용할 만한 보조 수단: 의존 그래프, 상태표

    • 의존 그래프: 복잡하고 서로 밀접하게 연결 되어있는 코드 이해에 도움

    • 상태표: 계산이 많이 수행되는 코드를 파악하는데 유용

간단 감상

  • 개인적으로 대부분의 웹 개발 업무에서 복잡해서 이해하기 어려운 코드들은 내재적 부하보단 외재적 부하의 비율이 압도적으로 높았습니다. 초반에는 간단하게 쳐내기 위해 추가된 기능에 덕지 덕지 요구사항을 붙이다 보면 인간의 형상은 유지하고 있는 프랑켄슈타인 보다도 더 심하게 변형된 코드를 마주하게 됩니다.

  • 외재적 부하가 심각한 코드의 경우 강력한 LLM들(Chat GPT 등)도 제대로 해석해내지 못하는 경우가 파다합니다. 이런 문제들을 해결하는 연습을 해내는것 또한 귀한 기회일수도 있겠다는 생각이 들었습니다.

  • 사실 여기 챕터쯤 와서 책에서 요구하는 간단한 과제들을 따라하기 매우 부담스러워졌습니다. 하지만 부담되기 때문에 이것을 활용한 열매가 더 달콤하고 오래 갈거라는 생각도 듭니다.

마치며

  • 인지 과학이라는 틀을 갖고 프로그래밍이 어떤 활동인지 분석해보는 과정은 매우 즐겁습니다. 개인적으로 이 책을 읽으며 새롭게 배우는 점도 많고 스스로의 부족한 점도 많이 깨우치게 됩니다.

  • 책의 제일 첫 파트 '코드 더 잘 읽기'에 대한 간단한 요약과 정리를 해봤습니다. 앞으로 남은 파트의 정리도 계속해서 틈틈이 진행해보도록 하겠습니다.