파란하늘의 지식창고
Published 2022. 11. 17. 17:53
[책 리뷰] 프로그래머의 뇌 Study/ETC
반응형

책 소개

프로그래머의 뇌는 2022년 1월 12일 출간되었다.
 
개발을 하는 동안 개발자의 뇌가 어떻게 개발을 하게 만드는지 인지과학의 관점으로 설명한 책이다.
 
개발 서적은 보통 '어떤걸' 개발하려면 '이렇게 하면 된다'를 설명하는게 일반적인데 이 서적은 개발을 하는 동안 '개발자'의 뇌의 동작을 설명하기 때문에 개발이 아닌 개발자를 설명하는 책이면서 개발을 하는 개발자의 뇌의 동작을 설명하기 때문에 내 경험에 비추어 생각하게 한다.
 
개발에 대한 지식을 얻는 책이 아닌 개발의 방법에 대한 이해를 풀어쓴 책이다.
 

구성

책은 13장으로 이루어져 있고 크게 4 part로 구분된다.
 
  • Part 1 코드 더 잘 읽기
    • chapter 1 코딩 중 겪는 혼란에 대한 이해
    • chapter 2 신속한 코드 분석
    • chapter 3 프로그래밍 문법 빠르게 배우기
    • chapter 4 복잡한 코드 읽는 방법
  • Part 2 코드에 대해 생각하기
    • chapter 5 코드를 더 깊이 있게 이해하기
    • chapter 6 코딩 문제 해결을 더 잘하려면
    • chapter 7 생각의 버그
  • Part 3 좋은 코드 작성하기
    • chapter 8 명명을 잘하는 방법
    • chapter 9 나쁜 코드와 인지 부하를 방지하는 두 가지 프레임워크
    • chapter 10 복잡한 문제 해결을 더 잘하려면
  • Part 4 코딩에서의 협업
    • chapter 11 코드를 작성하는 행위
    • chapter 12 대규모 시스템의 설계와 개선
    • chapter 13 새로운 개발자 팀원의 적응 지원
 

개인적인 소감

 
오랜 기간 일한 개발자에게도 필요한 책이고 특히 3, 4부는 팀으로서 소프트웨어 개발을 할 때 유용한 방법론을 많이 소개하고 있다고 머리말에서 소개를 하고 있다.
내 경우 4부는 그닥 재미없었고 1~3부까지는 흥미롭게 읽었다.
 
보통 개발 서적은 챕터마다 중요도가 달라 특정 챕터룰 주의깊게 읽고 나머지는 부수적이었는데 이 책의 경우는 각 챕터마다 설명하는 주제들이 다르고 각각 나름대로 중요했다.
 
뇌의 동작을 장기 기억 공간 (Long-term memory, LTM), 단기 기억 공간 (Short-term memory, STM), 작업 기억 공간 (Working memory)으로 나누어 연동되는 것을 설명하는 부분, 사람이 한번에 2~6개의 항목을 STM에 저장하고 여기서 더 나아가 청크 단위로 저장한다는 개념, 실제 코드의 동작을 이해하기 위한 개념적 기계에 대한 설명, 이를 기반으로 개발에 대해 분석하고 어떻게 개발하는게 좀 더 개발을 좋게 할 수 있는지 설명해주는데 이런 설명의 과정들이 "아 그래서 그렇구나" 하고 흥미롭게 읽게 해주었다.
 
변수에 대해서도 그냥 많이 쓰면서 무심코 넘어갔던 부분을 11가지의 역할로 나누어 분석한 부분을 읽으면서 프로그래밍이란 분야가 기계와 사람 사이에 소통하기 위한 추상화 단계가 있고 그로 인해 변수라는 하나의 방법에 11가지의 역할이 묶여있는 거구나 싶었다.
 
3부의 내용은 구현 패턴에서 설명하고자 하는 것과 상당 부분이 겹치는 느낌을 받았고 사람이 보기 편하고 이해하기 편한 개발을 하는 것이 왜 중요한 것인지를 한번 더 생각하게 해준다.
 
아래의 요약은 매 챕터마다 마지막에 정리되어 있는 요약의 글을 그대로 옮겨둔 것이다.
챕터마다 어떤걸 설명하려고 했는지를 다시 되뇌이게 도와주어서 따로 적어두었다.
 
아래 적어둔 요약만으론 이 책의 설명들을 전부 보여주지 않기 때문에 책을 읽어보는 것을 추천한다.
 

챕터 별 요약 내용 발췌

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

 
 
  • 코드를 읽을 때 혼란이 생기는 이유는 지식 부족, 쉽게 찾을 수 있는 정보의 부족, 두뇌의 처리 능력의 부족, 이렇게 세 가지다.
  • 코드를 읽거나 작성할 때 세 가지 인지 과정이 일어난다.
  • 첫 번째 과정은 LTM에서 정보를 인출하는 것으로, 키워드의 의미 같은 것들이 여기에 해당된다.
  • 두 번째 과정은 메서드나 변수의 이름과 같이 코드를 읽는 과정에서 발생하는 정보를 STM에 일시적으로 저장한다.
  • 마지막 과정은 작업 기억 공간에서 일어난다.
    코드를 읽고 처리하는 일이 여기서 이루어지는데 예를 들면 '인덱스 값이 하나 작다'라고 판단하는 것이다.
  • 코드를 읽는 동안 이 세 가지 인지 과정은 다 같이 일어나며 서로 보완적으로 작용한다.
    예를 들어 STM이 n과 같은 변수명을 보게 되면 과거에 읽었던 그와 관련된 프로그램을 LTM으로부터 찾는다.
    모호한 단어를 보면 작업 기억 공간이 활성화되어 문맥 속에서 적합한 의미를 찾으려고 한다.
 

2 신속한 코드 분석

  • STM의 2개에서 6개 사이의 항목을 저장할 수 있는 용량을 갖는다.
  • 정보를 기억할 때 STM은 크기에 대한 제약을 극복하기 위해 LTM과 협업한다.
  • 새로운 정보를 읽을 때 우리 두뇌는 그 정보를 청크라는 몇 개의 묶음으로 나눈다.
  • LTM에 지식이 부족하면 코드를 읽을 때 하위 수준의 정보들 이를테면 문자나 키워드 같은 것에 의존해야 한다.
    이럴 때 STM의 공간이 빠르게 소진된다.
  • LTM이 코드와 관련 있는 지식을 충분히 가지고 있다면 코드의 하위 수준의 요소들을 STM에 저장하는 대신 "자바에서의 for 루프" 혹은 "파이썬으로 된 선택 정렬 알고리즘" 같은 식으로 추상 개념을 기억하기 때문에 STM의 공간을 절약한다.
  • 코드를 읽을 때 그 내용은 우선 영상 기억 공간에 저장된다.
    그 후 코드 중 아주 적은 일부만이 STM으로 보내진다.
  • 코드를 기억해내는 일은 프로그래밍에 대한 지식이 어느 정도인지 가늠해볼 수 있는 자가 진단 도구로 사용될 수 있다.
    이미 알고 있는 것을 기억하는 것은 쉽기 때문에 기억해낸 코드는 자기가 이미 잘 알고 있는 디자인 패턴, 프로그래밍 구성 요소, 도메인 지식 등을 드러내 준다.
  • 코드는 우리 두뇌에서 처리하기 쉽게 만드는 특징들 가령 디자인 패턴, 주석문, 명확한 표식 같은 것들을 가질 수 있다.
 

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

  • 문법에 대한 지식이 더 많을수록 청킹을 쉽게 할 수 있기 때문에 문법을 외우는 것이 중요하다.
  • 앞면에는 프롬프트를, 뒷면에는 코드를 적어놓은 플래시카드를 사용해서 새로운 문법을 연습하고 기억할 수 있다.
  • 기억이 없어지는 것을 방지하기 위해, 새로운 정보를 기억하는 연습을 정기적으로 하는 것이 중요하다.
  • 최상의 연습은 기억한 것을 두뇌로부터 인출하는 연습이다.
    다른 곳에서 해당 정보를 찾기 전에 기억해내려고 노력해야 한다.
  • 기억하는 지식의 양을 최대로 하기 위해서는 연습을 긴 시간에 걸쳐 고르게 해야 한다.
  • LTM 속 정보는 관련된 사실들이 서로 연결되어 있는 네트워크 형태로 저장된다.
  • 새로운 정보를 능동적으로 정교화하면 그 새로운 기억이 연결할 기억의 네트워크를 강화하고 이는 인출을 쉽게 하는 데 도움이 된다.
 

4 복잡한 코드 읽는 방법

  • 인지 부하는 작업 기억 공간이 처리할 수 있는 한계를 나타낸다.
    인지 부하가 너무 크면 두뇌가 코드를 적절하게 처리할 수 없다.
  • 프로그래밍과 관련해 두 가지 종류의 인지 부하가 있다.
    내재적 인지 부하는 코드에 존재하는 복잡성에 기인하고 외재적 인지 부하는 우발적으로(코드가 표현되는 방식에 의해) 혹은 코드를 읽는 개발자의 지식의 부족에 기인한다.
  • 리팩터링은 코드를 읽는 사람이 이미 가지고 있는 지식에 맞춰 코드를 변경함으로써 외재적 인지 부하를 줄이는 방법이다.
  • 의존 그래프는 복잡하고 서로 밀접하게 연결되어 있는 코드를 이해하는데 도움이 된다.
  • 코드의 실행 도중에 변수가 갖는 값을 보여주는 상태표는 계산이 많이 수행되는 코드를 파악하는데 유용하다.
 

5 코드를 더 깊이 있게 이해하기

  • 생소한 코드를 읽을 때는 스테퍼나 목적 값과 같은 변수의 역할을 이해하는 것이 코드를 깊이 이해하는데 도움이 된다.
  • 코드의 이해에 관해서는 텍스트 구조 지식과 계획 지식 사이에 차이가 있다.
    텍스트 구조 지식은 코드에 사용된 문법 개념을 아는 것을 의미하고 계획 지식은 코드 작성자의 의도를 이해하는 것을 의미한다.
  • 코드를 읽는 것과 자연언어 텍스트를 읽는 것 사이에는 유사한 점이 많고, 자연언어를 배우는 능력으로 프로그래밍을 배우는 능력을 예측할 수 있다.
  • 시각화나 요약같이 자연언어 텍스트를 심도 있게 이해하기 위해 사용하는 전략들을 코드의 이해를 위해서도 적용할 수 있다.
 

6 코딩 문제 해결을 더 잘하려면

  • 문제를 표현하는 방법은 문제에 대한 생각에 큰 영향을 미칠 수 있다.
    예를 들어 고객을 목록과 집합으로 생각하는 것은 고객 객체를 저장하고 분석하는 방법에 영향을 줄 수 있다.
  • 정신 모델은 우리가 문제를 생각할 때 형성하는 정신적 표상이다.
    사람은 서로 경쟁하는 여러 정신 모델을 가질 수 있다.
  • 개념적 기계는 실제 컴퓨터가 어떻게 기능하는지를 추상적으로 표현한 것으로, 프로그래밍 개념을 설명하고 프로그래밍에 대한 추론을 할 때 사용한다.
  • 개념적 기계는 기존의 스키마타를 프로그래밍에 적용할 수 있기 때문에 프로그래밍을 이해하는데 도움이 된다.
  • 여러 다른 개념적 기계는 때때로 서로를 훌륭하게 보완하지만 상충되는 정신 모델을 만들 수도 있다.
 

7 생각의 버그

  • LTM에 이미 저장된 지식은 새로운 상황으로 전이될 수 있다.
    때로는 기존의 지식이 학습 속도를 높이거나 새로운 작업을 더 잘 수행하는 데 도움이 된다.
    이를 긍정적 전이라고 한다.
  • 한 도메인에서 다른 도메인으로의 지식 전이는 부정적일 수도 있는데, 부정적 전이가 일어나면 기존 지식은 새로운 것을 배우거나 새로운 작업을 수행하는데 방해가 된다.
  • LTM에서 관련 정보를 적극적으로 검색하면 긍정적인 전이가 일어나 새로운 것을 보다 효과적으로 배울 수 있다. (예를 들면 정교화에 의해)
  • 우리는 오개념을 가질 수 있다.
    자신이 옳다고 확신하지만 실제로는 틀릴 때 오개념을 갖게 된다.
  • 오개념은 단순히 자신이 틀렸다는 것을 깨닫거나 듣는 것만으로는 해결되지 않는다.
    오개념을 바로잡기 위해서는 오래되고 잘못된 모델을 대체할 새로운 정신 모델이 필요하다.
  • 올바른 모델을 배웠더라도 오개념을 다시 사용할 위험이 있다.
  • 오개념을 방지하는데 도움이 되기 위해 코드 베이스 내의 테스트 및 문서화를 사용하자.
 

8 명명을 잘하는 방법

  • camel case 같은 문법 규칙부터 코드 베이스 내의 일관성까지, 좋은 이름에 대한 다양한 관점이 있다.
  • 다른 차이가 없다면 snake case로 작성된 변수보다 camel case가 기억하기 쉽다.
    하지만 사람들은 snake case를 더 빨리 식별한다.
  • 잘못된 이름이 있는 코드에서 버그가 발생할 가능성이 높다.
    다만 이 둘 사이에 반드시 인과관계가 있는 것은 아니다.
  • 다양한 형식의 변수명을 만드는 데 사용할 수 있는 이름 틀이 많이 있으므로, 틀의 수를 줄이면 코드를 이해하는데 도움이 된다.
  • 페이텔슨의 3단계 모델 (이름에 사용할 개념, 해당 개념에 사용할 단어, 결합 방법)을 적용하면 고품질의 이름을 만들 수 있다.
 

9 나쁜 코드와 인지 부하를 방지하는 두 가지 프레임워크

  • 긴 메서드 등 코드 스멜은 코드의 구조적 문제를 의미한다.
    코드 스멜이 인지 부하를 높이는 데에는 여러 인지적 이유가 있다.
    예를 들어 중복 코드는 코드를 제대로 청킹하기 어렵게 만들고, 긴 매개변수 목록은 작업 기억 공간을 많이 차지한다.
  • 생체 인식 센서 등 인지 부하 측정 방법에는 눈 깜박임 비율, 피부 온도 측정 등 다양한 방법이 있다.
    자신의 인지 부하를 측정하려는 경우 일반적으로 파스 척도는 신뢰할 수 있는 도구다.
  • 언어적 안티 패턴이란 코드가 실제 수행하는 작업과 맞지 않는 이름을 의미하며, 높은 인지 부하를 초래한다.
    이는 우리가 사고할 때 LTM이 돕는 과정에서 잘못된 사실을 발견하기 때문에 일어날 수 있다.
    언어적 안티 패턴은 실제로 구현되지 않은 코드의 의미를 가정하기 때문에 잘못된 청킹으로 이어질 수 있다.
 

10 복잡한 문제 해결을 더 잘하려면

  • 프로그래밍에 종사하는 많은 사람은 문제 해결이 일반적인 기술이라고 주장하지만, 그렇지 않다.
    프로그래밍에 대한 사전 지식이 현재 해결 중인 문제와 결합해 프로그래밍 문제를 얼마나 빨리 해결할 수 있는지에 영향을 미친다.
  • LTM은 다양한 유형의 기억을 저장하는데, 이들은 문제를 해결할 때 모두 각자 다른 역할을 한다.
    기억의 가장 중요한 두 범주는 암시적 기억과 명시적 기억이다.
    암시적 기억은 '근육 기억'으로, 터치 타이핑처럼 아무 생각 없이 실행할 수 있는 작업이다.
    명시적 기억은 for 루프 문법과 같이 능동적으로 불러와야 하는 기억이다.
  • 프로그래밍과 관련된 암시적 기억을 강화하려면 터치 타이핑, 관련 단축키 암기 같은 관련 기술을 자동화하는 것이 가장 효과적이다.
  • 프로그래밍과 관련된 명시적 기억을 강화하려면 기존 코드, 가급적이면 코드 설계 방법에 대한 설명이 포함된 코드를 연구하라.
 

11 코드를 작성하는 행위

  • 프로그래밍을 할 때 검색, 이해, 전사, 증가, 탐구 등 다양한 프로그래밍 활동을 함께 수행한다.
    각각의 활동은 서로 다른 기억 체계에 부담을 준다.
    따라서 여러 다른 기법을 사용해 이 활동들을 지원해야 한다.
  • 프로그래밍 중 중단은 성가실 뿐만 아니라 코드에 대한 정신 모델을 재구성하는 데 시간이 걸리기 때문에 생산성에 나쁜 영향을 미친다.
  • 중단에 잘 대처하려면 정신 모델을 노트, 문서 또는 주석문으로 작성해 놓는다.
  • 작업을 완료할 수 없다면 계획을 문서화해서 미래 기억을 의도적으로 도와주어야 한다.
  • 방해를 받더라도 가급적이면 인지 부하가 낮을 때 중단이 일어나도록 해야 한다.
    예를 들어 플로라이트를 사용한 자동화 또는 슬랙에서 상태를 설정할 수 있다.
 

12 대규모 시스템의 설계와 개선

  • CDN은 프로그래밍 언어의 사용자들에게 미칠 인지적 영향을 예측하는 데 도움이 되는 프레임워크이다.
  • CDCB는 코드 베이스, 라이브러리, 프레임워크가 사용자에게 미치는 영향을 이해하는데 도움이 되는 CDN의 확장판이다.
  • 대부분의 경우 서로 다른 차원 간의 트레이드오프가 이루어져야 한다.
    한 차원을 개선하면 다른 차원이 감소할 수 있다.
  • 설계 기동을 통해 프레임워크의 인지 차원에 따라 기존 코드 베이스의 설계를 개선하는 것이 이뤄질 수 있다.
  • 코드 베이스가 최적화할 대상인 차원에 대한 요구 사항은 수행하려는 활동에 따라 다르다.
 

13 새로운 개발자 팀원의 적응 지원

  • 전문가들은 초보자들과 다르게 생각하고 행동한다.
    전문가는 코드에 대해 추상적으로 추론할 수 있고 코드 자체를 언급하지 않고도 코드에 대해 생각할 능력을 가지고 있다.
    초보자는 코드의 세부 사항에 집중하는 경향이 있고 세부 사항에서 벗어나는 데 어려움을 겪는다.
  • 중급 프로그래머들도 새로운 정보를 배우다 보면 초급 수준의 사고방식으로 떨어질 때도 있다.
  • 새로운 개념을 배우는 사람들은 추상적인 용어와 구체적인 예를 모두 배울 필요가 있다.
  • 새로운 개념을 배우는 사람들은 또한 새로 배운 개념을 기존 지식과 연결할 시간이 필요하다.
  • 적응 지원 과정에서 새 팀원이 수행할 프로그래밍 활동은 한 번에 한 개로 제한해야 한다.
  • 적응 지원 과정에서 새 팀원의 장기, 단기, 작업 기억 공간을 지원하기 위해 관련 정보를 준비해야 한다.
반응형
profile

파란하늘의 지식창고

@Bluesky_

내용이 유익했다면 광고 배너를 클릭 해주세요