Vallista
TIL

2022년 8월 15일

· 5 min read · 2,279 words

로고
로고

오늘 한 일

블로그 개선 작업을 계속 진행하면서, 프로그래머의 뇌 독서를 진행했다. 최근 굉장히 인기있는 책이고, 개발자로써 꼭 읽어야 하는 책이라고 해서 읽기 시작했다. 첫 1,2장을 읽는데 초장부터 굉장히 흥미로운 내용이 많이 나왔다. 인상깊었던 구절은 “코드를 쓰는 법은 많이 배우는데, 코드를 읽는 법은 배우지 않는다” 이었다. 생각해보니 코드를 읽는 것은 짬이 차면서 나왔던 결과였고 그 것을 전문적으로 공부하는 생각은 해본적이 없었다. 그렇기에 이 책에서 이야기하는것은 흥미로웠고, 금방 빠져들게 되었다.

프로그래머의 뇌 1장 : 코딩 중 겪는 혼란에 대한 이해

  • 코딩 중 혼란이 발생하는 것은 세 가지 이유가 있다.
  • 지식의 부족: 문법과 같이 기본적으로 알고 있는 지식이 없어서 모르는 경우
    • 예를 들자면 개발자는 누구나 if문을 알지만, 개발자가 아닌 사람은 if를 영단어로만 이해할 수 있을 것이다.
  • 정보의 부족: 현재 읽는 코드상에서 결과를 추측할 수 없는 절대적인 정보량이 부족한 경우
    • 예를 들자면 함수 사용만 보여주고, 함수 로직 내부를 알려주지 않는 경우
  • 처리 능력의 부족: 로직이 너무 복잡하고 어려워서 한 눈에 알 수 없는 경우
    • 예를 들자면 함수 하나를 이해하는데 로직이 300줄이면 이를 전부 유추하기 어렵다.
    • 그래서 적어두거나 주석을 달곤 한다.
  • 혼란이 발생하는 이유는 두뇌가 수행하는 인지 과정과 연관이 있다.
    • 지식이 없다는 것: **장기 기억 공간(LTM)**에 내용이 없는것
    • 정보가 부족하다는 것: **단기 기억 공간(STM)**에 내용이 없는것
    • 처리 능력이 부족하다는 것: **작업 기억 공간(working memory)**의 문제
  • LTM
    • 오랫동안 보관됨
    • 추상적인 알고리즘, 프로그래밍 언어의 문법, 키보드로 입력하는 동작 기억 등의 역할
    • LTM은 프로그래밍과 관련해서 여러 가지 다른 종류의 정보를 저장한다
  • STM
    • 정보를 잠시 보관함
    • 누군가와 통화 중 전화번호를 알려줄 때, 코드에서 키워드/변수명/자료구조 등
    • 보통 6~12개 정도 기억함
  • 작업기억공간
    • STM/LTM은 기억장치
    • 실제 사고를 하는 공간 (두뇌의 프로세서)
    • 머리가 코드를 실행하면서 무슨 일이 일어날지 이해한다 이 과정을 트레이싱 이라고 함.
  • 정보가 STM으로 들어오면 연관 데이터를 LTM에서 가져오고, 가져온 데이터를 작업기억공간에서 사고를 처리한다.
  • 프로그래밍을 뿐만 아닌, 모든 곳에서 이런 프로세스가 사용된다.
  • 코드 분석을 할 때 STM에 저장되고, 몇 개월 전에 구현한 내용을 LTM에서 가져온다. 또한 해결법이나 정보등이 LTM에 같이 저장되어 있기 때문에 버그 해결법이나 개인적인 기억이 작업기억공간으로 들어오게 되고, 사고하게된다.

프로그래머의 뇌 2장

  • 연구에 의하면 프로그래머의 일하는 시간 중 60%를 코드를 이해하는데 사용한다.
  • 정확도를 유지하면서 코드를 빨리 이해하도록 작성하면 프로그래밍 기술이 크게 개선된다.
  • 코드를 읽을 때 우리는 그 코드에 존재하는 특정한 정보를 찾는다는 것이 공통점이다.
    • 찾는 정보의 예로는 새로운 기능을 추가할 적당한 부분, 마지막으로 수정한 코드 중 특정 버그가 있을 만한 곳, 특정 메서드가 어떻게 구현됐는지 등이 있다.
  • 관련 정보를 신속하게 찾는 능력을 향상하면 코드를 다시 찾아보는 횟수를 줄일 수 있다.
    • 읽는 기술의 수준이 높아지면 추가 정보를 찾기 위해 살피는 횟수가 줄어든다.
  • 이상한 이름을 사용하면 패턴을 찾고 기억하는게 어려워진다. 그렇기에 익숙한 변수명을 사용하라
  • STM의 용량에 제한이 있다.
    • 코드의 모든 정보를 STM에 담는건 어려운 일이고, STM은 30초 후에 정보가 LTM에 저장되거나 잊게된다.
    • STM의 용량은 몇 개 정도 밖에 되지 않는다.
  • 이러한 제한을 극복하기 위해 단위로 묶어서 이해하면 좋다.
    • 네덜란드의 수학자 아드리안 더흐로트는 청크라는 개념을 사용했다.
    • 체스로 실험한 결과, 전문가 그룹이 비전문가 그룹에 비해 체스 말 위치를 더 잘 기억했다
      • 어떤 말이 어떻게 쓰이는지 LTM에 대한 지식으로 하여금 더 많은 것들을 뭉치 단위로 기억한다
    • LTM에 있는 지식을 활용해 개별 지식을 큰 그룹(청크) 단위로 묶을 수 있다.
  • LTM에 아직 저장되지 않은 익숙하지 않은 키워드, 구조, 도메인 개념을 기억하는건 어렵다
  • 정보는 STM에 도달하기 전 감각 기억 공간을 통과한다.
    • 감각 기억 공간은 시각, 청각, 미각, 후각, 촉각에 대해 각자의 임시 저장 공간이 있다.
    • 영상 기억 공간이라는 시각 관련 기억 공간만 쓰인다.
    • 시각을 통해 들어온 정보가 저장되는 곳이 영상 기억 공간이고 STM과 별도로 존재한다.
      • 모든 정보가 STM에서 처리되는 것은 아니다.
  • 코드의 어떤 자세한 부분을 무의식적으로 넘어가는 부분들이 있는데, 이 것은 STM이 처리할 수 있는 것보다 영상 기억 공간으로 저장하여 더 많은 것을 처리할 수 있다.
  • 기억하는 대상보다 기억하는 방식이 중요하다
    • 문법을 키워드로 주고 외울때, 초급 프로그래머는 영어 문장을 만들어서 외운 반면, 고급 프로그래머는 이미 가지고 있는 지식 기준으로 묶었다.
  • 디자인 패턴을 이용해 그룹으로 묶으면 쉽게 외울 수 있다
    • 디자인 패턴에 대한 지식을 갖게되면 청킹 능력이 향상 되고 코드를 더 빠르게 수정할 수 있게 된다/
    • 디자인 패턴에 따라 차이도 있다.
  • 코드에 주석문이 있으면 새로운 팀원이 코드를 쉽게 이해할 수 있다.
    • 주석문은 코드를 이해하는 데도 도움이 되지만, 개발자가 코드를 청킹하는 방식에도 영향을 미친다.
    • 개발자들은 코드를 읽을 때 주석문에 굉장히 많이 의존한다.
      • 고수준의 주석문은 코드를 청크 단위로 쪼개는 데 도움이 된다
      • 반면, 저수준 주석문은 청킹 작업에 부담이 된다
  • 코드를 청크로 쉽게 쪼개는 데 도움이 되는 것은 코드에 표식을 남기는 것이다.
    • 표식은 한 라인이 될 수도 있고, 한 라인의 일부가 될 수도 있다
    • 표식은 일반적으로 코드 내에서 사용하는 특정 자료구조, 알고리즘 혹은 접근 방식을 보여주는 라인을 뜻한다
  • 표식은 단순 표식복합 표식 두 가지 종류가 있다.
    • 단순 표식은 의미있는 변수명같이 문법을 통해 의미가 자명한 표식이다.
    • 복합 표식은 단순 표식으로 이루어진 좀 더 큰 단위의 코드이다.
      • 각각 개별적으로 의미가 없으나, 같이 보면 의미가 있다.
  • 표식은 여러 형태가 될 수 있다
    • 변수명/클래스명/메서드명/식별자 역시 표식이 될 수 있다.
  • 표식과 청크는 관련이 있지만 연구자는 그 둘을 다른 개념으로 본다.
    • 숙련된 개발자는 코드를 읽고 이해할 때 표식을 많이 이용하지만 초급 개발자는 그렇지 않다.
  • 청킹 연습은 의도적으로 해야한다.
    • 의도적 연습은 어떤 기술을 향상하기 위해 조금씩 연결하는 것을 의미한다.
    • 적극적으로 코드를 기억해내는 것을 훈련해라.