프로그래머의 뇌 : 훌륭한 프로그래머가 알아야 할 인지과학의 모든 것 / 펠리너 헤르만스 지음 ; 차건회 옮김(2022)
시작
올해 프로그래밍 학습을 다시 시작하면서 활동 중에 많은 분이 추천해주신 책이다. 책은 프로그래밍 과정에서의 사고의 과정이 어떠한지? 어떤 부분에 어떤 제약과 장애가 따르는지를 뇌 과학을 기반으로 설명한다. 개인적으로 어떤 대상이나 상황에 대해서 완전하지 않더라도 설명하려고 시도하는 편이 노력하지 않고 외면하는 것보다 유익하다고 생각한다.
뇌 과학적 설명을 통해서 프로그래밍 과정에서의 우리의 인지 과정을 이해해 앞으로의 만나는 어려움이나 율속반응단계, 병목지점이 어디에 있는지 확인하는 데 도움이 될 것을 기대했다.
전체를 한 번에 다 보는 것이 도움이 될 것 같지 않았다.(대부분을 그냥 그렇구나 하고 넘겼을 것이고, 정말 일부분만 남길 수 있었을 것 같다) 우선 각 쳅터의 요약을 읽어 전체의 분위기를 살피고 싶었다. 요약을 읽으면서 다행스럽게도 학부 때 ‘암기’와 ‘기억’에 대한 책을 읽어나간 적이 있었는데, 뇌 과학에서의 기억구조나 메타인지에 대해서 얼추 알고 있어 쳅터별 요약만을 가지고도 전반적으로 말하고자 하는 것을 확인할 수 있었다.
그렇구나! 끄덕끄덕 동의하면서 본문을 읽어나갈 수 있을 것으로 기대하고 있다. 4개 파트 13개 쳅터로 되어있고, 서로 독립적으로 보기는 어려울 것 같아 순서에 맞춰서 읽는 것이 좋겠다고 생각했다.
단순하게 지식적으로 많이 알고 있는 것이 중요한 게 아니고, 내 개발 실력 향상에 도움이 되도록 실천하고 활용해야 가치가 있다고 느끼고 있어 책을 읽는 목적을 실천 요소를 뽑아서 삶에 적용하기로 설정했다.
독서 기간은 총 4주가 될 것 같다. 목표는 주당 1개 쳅터를 읽으며 쳅터별로 실천할 요소를 뽑아 실천의 결과를 함께 공유하려고 한다. 오늘은 요약을 읽고 앞으로 집중할 포인트를 정리해 본다.
요약
part1. 읽기
- 기억의 종류
- 장기기억
- 단기기억
- 작업기억
- 두뇌에서 처리가 쉽도록 하려면?
- 인출 연습의 필요성
- 인지부하
- 내재적
- 외재적
part2. 생각
- 이해하기 좋으려면?
- 변수역할
- 텍스트 구조지식
- 계획지식
- 시각화/요약
- 표현 방식
- 개념적 기계
- 정신모델
- 기존 지식의 활용
- 전이
- 긍정적 전이
- 부정적 전이
- 오개념을 극복하기
part3. 작성
- 컨밴션의 효과
- 기억에 유리
- 식별에 유리
- 네이밍: 이름-개념-단어의 결합
- 코드스멜→인지부하 유발
- 구조적 문제
- 안티패턴→오해를 부르는 것들
- 이름과 구현의 불일치
- 사전 지식의 중요성
- 암시적 기억
- 명시적 기억
part4. 협업
- 중단이 미치는 영향
- 계획(문서화)로 대비 필요
- 지속할 수 있는 환경 조성
- 트레이드오프
- CDN→CDCB
- 최적화 대상
- 요구사항
- 주니어 성장
- 전문가→추상적 추록에 능함
- 새로 배운다: 추상적 용어, 예를 익힌다
- 기존지식과 연결
- 어떻게 지원할 수 있을까?
앞으로
꾸준하게 읽으며, 필요지식을 정리하고 적용해 좋은 습관을 만들고 싶다. 포스팅을 마치는 한달 뒤 어떤 배움이 있었는지, 추천하고 싶은 방법이 있는지 꼭 정리하고 싶다.
Part1.읽기
1장.
- 장기기억:HDD/SDD→지식: 외부 참조가 필요한 것
- 단기기억:RAM→정보: 적으면 해결할 수 있는 것
- 작업기억:CPU→처리: 생각/사고로 해결 가능한 것(일부는 장기기억으로 만들 수 있다.)
메타인지 높이기(*의식적으로 생각해보기)
어떻게 동작하는가?→어디가/무엇이 문제인가?→어떻게 발전시킬까?
- 어떤 기억을 사용하였는가?
- 구체적으로 어떤 정보를 인지하는데 사용했는가?
- 무시한 정보는 없는가?(필터링)
- 광범위하게 작업기억을 사용한 부분은 ?
활용: 학습하면서 어디서 무엇이 문제인지 인지하기
2장.
- 코드를 읽는 목적→특정 정보를 찾는다
- 기능 추가 → 적당한 부분
- 버그발견 → 마지막 수정에서 버그가 있을 법한 곳
- 더 큰 시스템의 이해 → 특정 메서드가 어떻게 구현 됐는지
- 영상기억공간
- 코드의 구조는 어떻게 되어있는가?
- 깊이 중첩된 구조인가? 아니면 중첩이 없는 평탄한 구조인가?
- 눈에 띄는 라인은 있는가?
- 코드에서 들여쓰기는 어떻게 되어 있는가?
- 코드에 간격은 있는가?
- 코드에 큰 뭉치처럼 보이는 것은 있는가?
- 기억에 유리한 코드 작성
- 의도적 연습
- 코드선정
- 코드파악
- 코드재현
- 회고
- 어느 부분을 쉽게 기억했는가?
- 부분적으로 기억한 코드가 있는가?
- 전체를 다 기억하지 못한 코드가 있는가?
- 기억하지 못한 라인들이 있다면 그 이유는 무엇일까?
- 기억하지 못한 라인에 본인이 익숙하지 않은 프로그래밍 개념이 들어 있지는 않은가?
- 기억하지 못한 라인에 본인이 익숙하지 않은 도메인 지식이 있지는 않은가?
- 코드에 다시 적용
- 다른 사람과 비교
활용: 코딩테스트를 준비하면서 다른사람의 코드를 이해하고 재현하기
3장.
- 업무 중단이 미치는 나쁜 영향→코딩을하면서 검색을 한다는 것은 흐름이 끊기게 된다.
- 플래시카드 사용 연습
- 앞면에 개념 적기 뒷면에 코드적기
- 안키 사용중이니 잘 활용해 보자
- 인출과 정교화
- 새로운 개념을 만나면 해야할 일
- 새로운 개념이 어떤 다른 개념을 생각나게 했는가? 모든 관련된 경험을 적기
- 위에서 적은 관련된 개념에 대해 다음 질문들에 답하기
- 새로운 개념은 왜 이미 알고 있는 그 개념을 생각나게 했을까?
- 문법에 공통적인 점이 있는가?
- 비슷한 환경에서 사용될 수 있는가?
- 이 새로운 개념은 이미 알고 있는 그 개념 대신 사용될 수 있는가?
- 동일한 목적을 달성하기 위해 작성할 수 있는 다른 방법의 코드를 알고 있는가?
- 어떤 문제를 해결하는데 도움을 주는가?
활용: 새로운 지식 학습시 적용, 프로그래밍 문법 플래시 카드 안키 활용
4장.
- 인지부하의 종류
- 내재적 부하: 문제 자체가 얼마나 복잡한지
- 외재적 부하: 외부적 요인에 의해 문제에 추가된 것
- 본유적 부하: 생각을 LTM에 저장하는 과정에서 일어나는 인지부하
- 부하줄이기→리팩터링
- 보조 수단
- 의존성 그래프 생성
- 모든 변수를 원으로 표시
- 비슷한 변수를 연결
- 모든 메서드나 함수 호출을 원으로 표시
- 메서드나 함수 호출을 정의와 연결
- 클래스의 모든 인스턴스를 원으로 표시
- 클래스와 그 클래스의 인스턴스를 연걸
- 상태표 사용
- 모든 변수를 나열
- 테이블을 만들고 각 열에 하나의 변수를 기입
- 코드의 실행단계마다 행을 만든다
- 코드를 각 단계별로 실행하고 그 단계에서 변수들의 값을 해당하는 열과 행에 적는다.
활용: 정보처리기사 실기 문제에 우선 적용.