프로그래머의 뇌, 펠리너 헤르만스 저
📅 2023년 8월 14일 ~ 9월 11일
"프로그래머의 뇌" 책을 읽으며 기억하고 싶은 내용을 정리한 글입니다.
📑 Ch 1. 코딩 중 겪는 혼란에 대한 이해
두뇌의 인지 과정
- 장기 기억 공간(Long-Term Memory, LTM)
- 단기 기억 공간(Short-Term Memory, STM)
- 작업 기억 공간(Working Memory)
- LTM, STM의 정보를 처리하고 실제 사고 작용이 일어나는 공간
코드가 초래하는 혼란의 유형
- 프로그래밍 언어나 알고리즘, 도메인 등의 지식이 없는 경우 → LTM 문제
- 코드를 이해하기 위한 정보가 부족한 경우 → STM 문제
- 코드가 너무 복잡한 경우 → 작업 기억 공간 문제
📑 Ch 2. 신속한 코드 분석
- STM은 2개 ~ 6개 사이의 항목만 저장 가능하다.
- STM은 LTM과 협업하여 크기에 대한 제약을 극복한다.
- 관련된 정보를 청크(Chunk)로 묶어 STM의 공간을 절약할 수 있다.
- 디자인 패턴, 주석문, 표식을 가진 코드는 두뇌에서 쉽게 처리할 수 있다.
- 단순 표식: 연산자,
if / else
같은 구조문 - 복합 표식:
for
문과 같이 여러 정보를 한 번에 제공하거나, 각각의 정보를 합쳐 하나의 표식이 되는 경우
- 단순 표식: 연산자,
📑 Ch 3. 프로그래밍 문법 빠르게 배우기
"문법을 많이 안다 → 청킹을 쉽게 할 수 있다 → 기억 공간 절약"
문법을 기억하는 방법
- 플래시 카드 활용
- 긴 시간에 걸쳐 정기적인 연습
- 기억하려고 노력하기 (바로 검색 X)
- 기억은 네트워크 형태로 저장되기 때문에 관련된 기존 기억과 연관 지어 생각하기
📑 Ch 4. 복잡한 코드를 읽는 방법
프로그래밍과 관련한 인지 부하의 종류
- 내재적 부하: 문제 자체의 복잡성
- 외재적 부하: 외부적 요인에 의해 문제에 추가된 것
- 본유적 부하: 생각을 LTM에 저장하는 과정에서 일어나는 인지 부하
인지 부하 줄이기
- 읽는 사람의 지식에 맞춰 코드 리팩터링
- 의존 그래프 생성
- 변경되는 변수 값을 보여주는 상태표 작성
📑 Ch 5. 코드를 더 깊이 있게 이해하기
변수의 11가지 역할
- 고정값: 초기화를 통해 값이 할당된 이후 값이 변경되지 않는 변수
- Javascript의
const
- Javascript의
- 스테퍼: 루프를 반복 실행하며 값이 단계적으로 변하는 변수
for
문의i
- 플래그: 무엇인가 발생했거나 어떤 경우에 해당하는지를 나타내는 변수
isError
,isAvailable
등 주로 불리언 변수
- 워커: 스테퍼와 유사하지만 자료구조를 순회하는 방식
- 포인터나 정수 인덱스, 연결 리스트에 새로운 값을 추가할 위치나 이진 트리에 사용되는 검색 인덱스
- 최근값 보유자: 어떤 값이 변해갈 때 가장 최근에 변경된 값을 갖는 변수
- 목적값 보유자: 반복을 통해 어떤 특정한 값을 찾고자 하는 값 또는 현재 발견된 값 중에서 찾고자 하는 조건에 부합하는 값을 갖는 변수
- 모집자: 데이터를 모으거나 모은 데이터에 대해 어떤 연산을 수행하여 없는 값을 저장하는 변수
- 컨테이너: 값을 새로 추가하거나 삭제할 수 있는 자료구조
- 추적자: 이전 값 혹은 다음 값을 추적해야 할 때 그 역할을 수행하는 변수
- 조직자: 다른 값을 저장하기 위한 목적으로 사용하는 변수
- 임시: 잠시만 사용하기 위한 변수
텍스트 지식 대 계획 지식
- 텍스트 구조 지식: 코드에 사용된 문법 개념을 아는 것
- 계획 지식: 코드 작성자의 의도를 이해하는 것
📑 Ch 6. 코딩 문제 해결을 더 잘하려면
정신모델
- 풀어야 할 문제에 대해 추론하기 위해 사용할 수 있는 작업 기억 공간 내의 추상화
- 우리가 문제를 생각할 때 형성하는 정신적 표상
- 정신 모델이 정확하고 구체적일수록 시스템을 생각할 때 더욱 도움이 된다
개념적 기계
- 컴퓨터가 코드를 실행하는 방법에 대해 추론할 때 사용하는 모델
- 실제 컴퓨터가 무엇을 하고 있는지에 대한 추상적 표현
- 두뇌가 프로그래밍 개념을 설명하고 프로그래밍에 대한 추론을 할 때 사용
📑 Ch 7. 오개념: 생각의 버그
전이
- 이미 배운 지식을 다른 지식을 배울 때 사용하는 것
- 학습 도중 전이: LTM에 저장된 정보를 사용해 새로운 내용을 쉽게 배우는 과정
- 학습 전이: 완전히 낯선 상황에 이미 알고 있는 내용을 적용할 때 일어남
- 긍정적 전이: 무언가를 알고 있어 새로운 것을 배우거나 작업을 할 때 도움이 되는 전이
- 부정적 전이: 기존 지식이 새로운 것을 배우는데 방해가 되는 전이
오개념
- 오개념은 강한 확신 속에 있는 잘못된 사고방식
- 오개념을 바로잡기 위해서는 새로운 정신 모델이 필요하다
- 잘못된 사고방식의 오래된 기억이 남아있기 때문에 올바른 모델을 배워도 오개념을 다시 사용할 수도 있다
오개념 바로잡기
- 열린 마음 유지. 자신이 옳다고 확신하더라도 여전히 틀릴 수 있다
- 흔하게 발생하는 오개념에 대해 의도적으로 연구하라
- 오개념이 일어날 수 있는 잠재적 영역을 파악하는데 도움이 됨
- 다른 프로그래머들에게 조언을 구하라, 페어 프로그래밍도 좋은 방법
- 테스트와 문서화를 사용하자
📑 Ch 8. 명명을 잘하는 방법
이름이 중요한 이유
- 코드베이스의 상당 부분을 차지한다
- 표식 역할을 할 수 있다.
- 도메인 또는 프로그래밍에 대해 생각할 때 도움이 된다.
- 잘못된 이름이 있는 코드에서 버그가 발생할 가능성이 높다.
더 나은 이름을 선택하는 방법
- 이름 틀의 수를 줄여라
- 이름 틀이란, 변수 이름의 요소가 결합되는 패턴
- 페이텔슨의 3단계 모델을 적용한다.
- 이름에 포함할 개념을 선택한다.
- 각 개념을 나타낼 단어를 선택한다.
- 이 단어들을 사용해 이름을 구성한다.
📑 Ch 9. 나쁜 코드와 인지 부하를 방지하는 두 가지 프레임워크
코드 스멜이란?
작동은 하지만 개선의 여지가 있는 코드. 매우 긴 메서드나 지나치게 복잡한 스위치 문이 속한다.
코드 스멜이 인지 과정에 악영향을 미치는 방식
- 긴 매개변수 목록, 복잡한 스위치문 → 작업 기억 공간의 용량 초과
- 신의 클래스, 긴 메서드→ 효율적인 청킹이 불가능
- 코드 클론 → 청킹이 잘못됨
언어적 안티패턴
코드가 실제 수행하는 작업과 맞지 않는 이름을 의미하며, 높은 인지 부하를 초래한다. 또한, 이름과 코드의 의미가 맞지 않기 때문에 잘못된 청킹으로 이어질 수 있다.
📑 Ch 10. 복잡한 문제 해결을 더 잘하려면
문제 해결 시 LTM의 역할
- 문제를 이해한다
- 계획을 세운다(해석)
- 계획을 실행한다(해결)
LTM이 저장하는 기억의 유형
- '근육 기억'으로 의식하지 않고 발휘되는 기술들의 절차적(암시적) 기억
- 능동적으로 기억을 불러와야 하는 선언적(명시적) 기억
- 일상생활 가운데 경험한 것을 기억하는 일화적 기억
- 의미, 개념 또는 사실을 기억하는 의미적 기억
간격을 둔 반복 학습을 통해 암시적 기억을 강화할 수 있고, 명시적 기억을 강화하려면 깃허브, 책, 블로그를 이용해 코드를 작성한 과정을 이해하고 해당 코드를 연구하는 것이 도움이 된다.
📑 Ch 11. 코드를 작성하는 행위
프로그래밍 중 이루어지는 다양한 활동
- 검색: 코드베이스를 살펴보고 특정 정보를 검색하는 작업
- 이해: 코드를 읽고 실행해 봄으로써 그 기능을 이해하는 작업
- 전사: 단순히 코딩하는 활동
- 증가: 검색, 이해, 전사가 합쳐진 활동
- 탐구: 코드 작성 및 실행, 리팩토링, 테스트 등 코드를 탐구하는 것
프로그래머의 업무 중단
프로그래밍 중 작업이 중단되면 코드에 대한 정신 모델을 재구성하는 데 시간이 걸리기 때문에 생산성에 나쁜 영향을 미친다.
중단에 잘 대비하는 법
- 작업하던 내용을 메모나 주석문을 작성해 정신 모델을 남긴다.
- TO DO나 작업할 내용을 단계화하여 미리 작성해 놓는다.
📑 Ch 13. 새로운 개발자 팀원의 적응 지원
프로그래밍 활동을 바탕으로 새 팀원 지원하기
- 탐구: 코드베이스의 전체적인 이해를 위한 코드 훑어보기
- 검색: 특정 인터페이스를 구현할 클래스 찾기
- 전사: 구현할 메서드에 대한 명확한 계획을 알려주기
- 이해: 코드의 여러 측면에 대해 이해하기, 예를 들면 특정 메서드를 요약하기
- 증가: 향후 계획을 포함해서 기존 클래스에 한 가지 기능을 추가하기
📚 느낀 점
내가 읽는 게 IT 책인지 심리학인지 과학책인지 모르겠다..! 생각했던 거보다 생소하고 전문적인 개념이라서 조금 머리가 아팠지만 재밌게 읽었다. 코드를 읽을 때 머릿속에서 어떤 일이 일어나는지 한 번도 생각해 본 적이 없는데 책에 나온 대로 생각하고 있는 거 같기도 하다.
처음에는 이 책이 도움이 될까?라는 의문점이 들었는데 후반부에 나오는 오개념, 이름 틀, 새로운 팀원 지원하기와 같은 내용들은 실제로 잘 활용할 수 있을 것 같다.