이야기

[책] 프로그래머의 뇌

moonong 2023. 4. 13. 00:50
반응형
 
프로그래머의 뇌
이 책은 인지과학에 기반을 둔 각종 방법론으로 개발자가 새로운 언어나 프레임워크를 빠르게 배워 생산성을 향상하도록 돕는다. 코드를 더 잘 이해하는 것에서 나아가, 버그 방지, 명확한 작명법, 리팩터링, 대규모 코드베이스 개선에 이르기까지 과학적으로 입증된 기법을 제시한다.
저자
펠리너 헤르만스
출판
제이펍
출판일
2022.01.12

 

프로그래머의 뇌: 훌륭한 프로그래머가 알아야 할 인지과학의 모든 것

1. 코딩에 영향을 주는 인지 과정: LTM 과 STM 

 

혼란의 3가지 유형은, 기억과 관련이 있다. 

 

- 지식의 부족 = LTM 의 문제

- 정보의 부족 = STM 의 문제

- 처리능력의 부족 = 작업 기억 공간의 문제

 

코드를 분석할 때 읽는 내용은 STM 에 저장되며 동시에 몇 개월 전에 구현한 내용은 LTM 에서 가져올 것이다. 즉 STM에 저장된 새로운 버그리포트의 내용, 그리고 LTM에 저장된 유사한 버그의 해결법이나 개인적인 기억 두 가지가 다 작업 기억 공간으로 들어오게 되고, 이들이 상호작용하며 비로소 당면 문제에 대해 생각할 수 있게 된다. 

 

2. 기억의 크기 제한을 극복하기: 청킹

 

하지만 STM은 제한된 크기를 갖기 때문에, 생소한 코드를 보았을 때 이를 분석하는 것은 시간이 오래 걸린다. 

이러한 기억의 크기 제한을 극복하기 위해 코드를 청크 단위로 묶어 기억하는 것이 효율적이다. 

 

예를 들어, 아래와 같은 키워드가 나열되어 있고 이를 암기 할 때, 나열된 순서대로 암기하는 것보다 

bits int short long string 

case when then

true false

등과 같이 키워드 그룹을 만들어(청킹) 하여 암기하는 것이 더 빠르게 내용을 기억할 수 있다. 

string case or null else
step do for while true
then false bits long and
short if end int break

 

코드를 작성할 때에도 마찬가지다. 청크로 묶을 수 있는 코드를 작성하기 위해, 아래 두 가지 방법을 기억하고 의도적으로 연습하자. 

 

1. 디자인 패턴을 사용하기

2. 주석을 활용하기

 

3. 복잡한 코드를 읽는 방법: 인지 부하를 줄이기

 

복잡한 코드를 이해하는 것이 왜 어려울까? 

STM 은 한 번에 2개에서 6개까지의 항목만 저장할 수 있다. 인식 가능한 청크로 정보가 나누어질 때에는 보다 많은 정보를 처리할 수 있다.

 

작업 기억 공간도 특정한 문제에 적용된 STM 이기 때문에, STM 과 같은 제한이 있다. 작업 기억 공간의 맥락에서 이 용량을 '인지 부하' 라고 부르는데, 너무 많은 요소가 있어 청크로 나뉘지 않는 문제를 해결하려고 할 때, 기억 공간은 과부하 상태가 된다. 

 

즉, 복잡한 코드는 작업 기억 공간에 과부하를 초래하는 코드이다. 인지 부하를 줄이기 위해서는 아래와 같은 시도가 필요하다. 

1. 리팩토링: 코드의 내부 구조를 개선하여 청크화 할 수 있도록 한다. 코드 블록의 길이가 너무 길면 함수로 쪼개거나, 중복된 코드를 제거하는 등이 이에 해당한다.

2. 생소한 언어 구성 요소를 다른 것으로 대치하기: 예를 들어, 파이썬 문법에 생소한 사람에게 리스트 컴프리헨션은 인지 부하를 야기하는 요소일 수 있다. 이해를 쉽게 하기 위해 리스트 컴프리헨션을 for loop 으로 변환할 수 있다. 

 

4. 코드 읽기에 적용해 볼 수 있는 텍스트 이해 전략

 

- 활성화: 기존 지식의 활성화

- 모니터링: 자신이 이해한 것과 그렇지 못한 것을 관찰하고 기록하기

- 중요도 결정: 코드에서 중요한 라인을 결정하기

- 추론: 명시적으로 주어지지 않은 사실을 유추하기 - 변수명의 의미를 추론하기

- 시각화: 깊이 있는 이해를 위해 코드 상태표를 작성하거나, 코드 흐름을 추적하는 등의 시각화 

- 질문: 스스로에게 질문하며 코드의 목적과 기능 이해하기

- 요약: 코드를 우리가 사용하는 언어로 요약하여 코드가 하는 일을 깊이 이해하기

 

5. 왜 두 번째 프로그래밍 언어가 첫 번째보다 쉬울까?: 전이

 

LTM에 저장된 프로그래밍 지식은 새로운 프로그래밍 개념을 배우는 데 두 가지 방식으로 도움이 된다. 

 

1. 프로그래밍에 대해 이미 알고 있다면, 그것에 대해 더 많이 학습하는 것이 쉬워진다. 

2. LTM에 저장된 정보를 사용하여 새로운 내용을 쉽게 배울 수 있다. (학습 도중 전이)

 

학습 전이는 완전히 낯선 상황에 이미 알고 있는 내용을 적용할 때 일어난다. 무언가를 알고 있어 새로운 것을 배우거나 작업할 때에 도움이 되는 '긍정적 전이' 도 있지만, 그 반대의 경우 역시 존재한다. 기존의 지식이 새로운 것을 배우는 데 방해가 될 때, 이것을 '부정적 전이' 라고 한다. 

 

6. 코드 스멜과 인지 부하: 명명의 중요성

 

1. 나쁜 이름을 가진 코드에 버그가 더 많다. 명확하지 않은 명명으로 인해 프로그래머의 인지 부하가 높았을 수 있기 때문이다. 

그렇기 때문에 우리는 더 나은 이름을 선택하기 위해 노력해야 한다. 

 

페이텔슨의 3단계 모델을 활용하여 더 나은 이름을 고민하자.

 

- 이름에 포함할 개념을 선택한다. 

- 각 개념을 나타낼 단어를 선택한다. 

- 이 단어들을 선택하여 이름을 구성한다.

 

2. 코드 스멜은 구조적 안티패턴 문제가 있는 코드다. 이것은 코드가 잘 작성되었으나, 파악하기 어려운 구조로 만들어졌다는 것을 의미한다. 파악하기 어려운 코드는 프로그래머의 인지 부하에 악영향을 준다.

 

긴 매개변수 목록이나 복잡한 스위치문은 청킹의 한도를 초과하여, 작업 기억 공간의 용량을 초과하게 만들다. 또한, 하나의 메서드에 많은 기능을 한데 모아둘 경우 역시 효율적인 청킹이 불가능하다. 

 

7. 프로그래밍 중 일어나는 다양한 활동

 

- 검색: 코드 베이스를 살펴보고 특정 정보를 검색하는 작업

- 이해: 코드를 읽고 실행해봄으로써 그 기능을 이해하기

- 전사: '단순히 코딩' 하는 활동

- 증가: 새 기능을 추가하는 것 == 검색, 이해, 전사하 합쳐진 활동

- 탐구: 코드 작성, 실행, 테스트 실행, 기존 코드 읽기, 리팩토링 등 프로그래밍 관련 작업을 연속적으로 수행

 

8. 중단에 대비하기

 

업무 중단은 생산성에 상당한 지장을 초래한다. 업무가 중단된 후 코드 작성 작업을 다시 시작하는 데 약 25분이 소요된다. 메서드를 작성하다가 중단되면, 프로그래머가 1분 내에 작업을 재개할 수 있었던 경우는 10%에 불과했다. 

 

하지만 업무 중단은 흔히 발생한다. 중단에 더 잘 대비할 수 있도록, 업무 중단 시 우리 두뇌에서 무슨 일이 일어나는지 살펴보고 대비책을 세우는 것이 중요하다. 

 

1. 정신 모델 저장: 모델의 일부가 코드와 별도로 저장되어 있으면 정신 모델을 빠르게 되찾을 수 있다. (ex 주석)

2. 미래 기억 향상: 추후 개선하거나 완성해야 하는 내용을 잊지 않기 위해, TODO 주석문을 활용한다. 

3. 하위 목표 라벨 붙이기: 구현할 내용을 작은 단계로 나눌 수 있는지 명시적으로 기록한다 (주석을 이용한 청킹)

 

반응형