일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 프로그래머스
- SpringMVC
- Kubernetes
- CI
- builder-pattern
- Spring
- programmers
- 알고리즘
- DevOps
- 코딩테스트연습
- IntelliJ
- k8s
- Oracle
- 자바
- Di
- CKA
- Vue
- JPA
- docker
- hibernate
- 뷰
- CI/CD
- 해시맵
- ORM
- java
- map
- vuejs
- dabase
- superBuilder
- cd
- Today
- Total
문홍의 공부장
[책] 프로그래머의 뇌 본문
프로그래머의 뇌: 훌륭한 프로그래머가 알아야 할 인지과학의 모든 것
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. 하위 목표 라벨 붙이기: 구현할 내용을 작은 단계로 나눌 수 있는지 명시적으로 기록한다 (주석을 이용한 청킹)
'이야기' 카테고리의 다른 글
2023년 4월 월간 회고 (0) | 2023.05.01 |
---|---|
[책] 개발자 원칙 / 테크리더 9인 공저 (0) | 2023.04.26 |
2023년 3월 월간 회고 (0) | 2023.04.12 |
WWCS Tech Lounge 후기: 자기검열은 그만, 글로벌 커리어로 나아가자 (1) | 2023.04.06 |
2023년 2월 월간 회고 (1) | 2023.03.12 |