프로그래머의 뇌 9, 10 chapter

박경준·2022년 2월 10일
0

해북팩토리

목록 보기
1/1

Chapter 9

코드를 이해하기 어려운 이유는 너무 많은 인지 부하 때문인데 인지적 관점에서 코드를 작성하는 법에 대해 알아본다.

구조적 안티패턴 문제

코드 스멜 : 작동은 하지만 개선의 여지가 있는 코드를 의미함.

  1. 메서드 수준 코드 스멜 : 너무 많은 기능을 갖는 메서드
  2. 클래스 수준 코드 스멜 : 너무 많은 기능을 갖는(서서히 추가되어) or 너무 적은 기능을 갖는(서서히 다른 클래스로 기능 이전하여 껍데기만 남은) 클래스
  3. 코드베이스 수준 코드 스멜 : 서로 다른 위치에 유사한 코드가 포함, 서로 정보를 계속해서 전달하는 메시지 체인

** 단순히 위 사례 뿐만 아니라 잘못된 네이밍, 정석적이지 않은 indent 등도 코드 스멜임.

  • 코드 스멜이 있으면 작업 기억 공간의 용량 초과, 청킹 불가, 잘못된 청킹 등으로 인해 오류 발생 확률이 높아지고 더 나아가 추후 수정 확률이 높아진다.

혼란스러운 내용의 코드 문제

언어적 안티패턴 : 코드의 언어적 요소와 그 역할 사이의 불일치

** 언어적 요소 : 메서드 입출력 정의, 설명 문서, 속성 이름, 데이터 타입, 주석 등

실험 결과 : 언어적 안티패턴에서는 실제로 인지 비용이 더 많이 든다. 그런데...! 구조적 안티패턴에서 인지 비용이 더 많이 든다는 유의미한 통계적 근거는 없었다고 한다;;


Chapter 10

복잡한 문제 해결을 하기 위해서는 LTM을 강화해야 한다.

  • 우리는 어떤 문제를 풀때 원하는 목표 상태와 적용해야 할 규칙에 대한 지식을 염두에 둔다.
  • 단서가 구체적일수록, 올바른 기억을 인출해내기 쉽다.

기억의 종류 : 절차적(암시적) 기억, 선언적(명시적) 기억 - 일화적 기억, 의미적 기억

  1. 절차적 기억 : 자전거 타기 같이 의식하지 않고 사용하는 기억
  2. 선언적 기억 : 기억할 수 있는 사실이 있고, 내가 그것을 기억한다는 것을 안다. ex) 현 대통령은 문재인
  3. 일화적 기억 : 경험한 기억 ex) 캠핑 간 기억
  4. 의미적 기억 : 의미, 개념, 사실에 대한 기억 ex) 3 곱하기 5는 15 / 플래시카드로 기억하는 것이 바로 의미적 기억

** 일화적 기억은 추가적인 노력을 하지 않아도 생성되지만, 의미적 기억은 많이 생각해야만 인출 강도가 높아진다.

  • 문제 해결에는 물론 의미적 기억이 필요하지만, 지난 문제 해결 경험을 대입하여 현재 문제를 똑같이 해결한다는 점에서 일화적 기억도 크게 사용된다.

자동화 : 작은 것들을 알아내는데 시간을 많이 쓰지 않을수록 어려운 문제들을 더 쉽게 풀 수 있기 때문에 이 기술은 유용.

자동화를 강화하기 위해서는 암시적 기억을 이용해야 한다. 암시적 기억은 반복에 의해 생성된다.

  1. 인지 단계 : 새로운 것을 배우는 단계. 이 단계에서는 새로운 정보를 더 작은 부분으로 나누고 당면한 작업에 대해 명시적으로 생각한다.
    ex) 0에서 시작하면 인덱스가 3인 원소는 4번째 원소구나.

  2. 연상 단계 : 이 단계에서는 응답 패턴이 나타날 때까지 새 정보를 적극적으로 반복해야 한다.
    ex) 인덱스를 계산할 때는 항상 1을 빼면 되네.

  3. 자율 단계 : 기술이 완벽한 자율성을 갖게 된다. '명시적으로' 생각하지 않더라도 답을 알게 된다.
    ex) 리스트의 인덱스를 한 눈에 파악할 수 있다.

** 반면 플래시 카드를 이용해 암기하는 기억은 명시적 기억이다. 내가 이것을 외우고자 하는 마음이 있고 의도적으로 암기하려 한다면 명시적 기억에 남는다. 이는 자동화를 강화하는 행동이 아니다...!

자동화가 보다 신속한 사고를 할 수 있게 해주는 이유

  • 각각의 기억 즉 인스턴스 기억이 많으면 이전에 수행했던 방법을 기억하고 동일한 방법을 적용할 수 있다. 의식적으로 주의를 기울이지 않더라도 순간적인 기억에 의존하게 되므로 수행이 빠르고 쉽다.

문제 해결 능력 훈련 방법

  1. 의도적 연습 (암시적 기억)
  • 연습하고자 하는 기술이 필요한, 유사하지만 다른 프로그램을 많이 작성해보는 것.
  • 이미 작성된 프로그램을 수정하는 것.
  • 간격을 둔 반복은 학습의 핵심.
  1. 다른 사람들의 코드에 대한 의도적 연구 (명시적 기억)
  • 풀이된 예제를 학습.
  • ex) 방정식 풀이를 할때 해설지를 받은 그룹이 그렇지 않은 그룹보다 수식 풀이 속도가 5배 빨랐다. 이는 스스로 해결하도록 내버려둬야 한다는 교육 이론과 상반되어 흥미롭다. 더욱이 프로그래밍에서...

    본유적 부하 : 두뇌가 정보를 LTM에 다시 저장하기 위해 수행하는 노력을 의미.
    모든 인지 부하가 내재적 부하와 외재적 부하로 가득차면, 본유적 부하를 위한 여지는 남아있지 않게 된다. 즉 문제와 해결책을 기억할 수 없다.
    이를 토대로 방정식 예시를 이해할 수 있다.
    해설지를 받은 그룹은 인지 부하가 그렇게 높지 않았기 때문에, 이를 잘 기억해 다른 문제에도 쉽게 적용할 수 있었다.

'전문가들이 하는 일을 한다고 해서 여러분이 전문가가 되는 것은 아니다.'

코드 공부 방법

  1. 동료와의 협업, 코드 읽기 동아리
  2. 깃헙 탐구 - 도메인이 조금이라도 익숙한 저장소를 선택해야, 낯선 단어와 개념으로 인한 외재적 부하를 줄여서 프로그래밍 자체에 집중할 수 있다.
  3. 프로그래밍 문제를 해결한 방법에 대해 설명하는 블로그 게시물 읽기.
profile
빠굥

0개의 댓글