10장 복잡한 문제 해결을 더 잘하려면
1. 문제 해결이란 무엇인가?
- 문제 해결 요소
- 목표 상태 - 우리가 달성하고자 하는 것
- 문제를 해결해야 하는 시작 상태
- 시작 상태에서 목표 상태에 도달하는 방법을 규정하는 규칙
- 상태 공간
- 프로그램을 해결할 때 고려할 수 있는 모든 단계를 문제의 상태 공간이라고 한다.
- 문제해결은 가능한 적응 단계로 목표 상태에 도달하기 위해 상태 공간을 최적의 방식으로 탐색해나가는 것을 의미한다.
2. 프로그래밍 문제를 해결할 때 LTM의 역할은 무엇인가?
- 두뇌는 익숙한 문제를 해결하는 것이 더 쉽다.
- LTM은 올바른 기억을 인출하기 위한 단서가 필요하다.
- 단서가 구체적일수록, 올바른 기억을 찾을 가능성이 높다.
- 문제 해결을 위한 LTM 교육법
- 작업 기억 공간이 문제 해결을 위한 결정을 내리기에 앞서 두 가지를 먼저 한다.
- STM으로부터 문제의 상황에 대한 정보를 가져오는 것
- 동시에 LTM은 관련 배경 지식을 검색한다.
- 문제 해결에 역할을 하는 두 가지 유형의 기억
- 운동 능력이나 의식하지 않고 발휘하는 기술에 대한 기억인 절차적(암시적)기억
- 문제를 해결할 때 수행하는 기억은 선언적(명시적)기억이다.
- 선언적 기억은 일화적 기억과 의미적 기억의 두 가지 범주로 나뉜다.
- 일화적 기억은 우리가 일상적으로 흔히 기억이라는 단어를 사용할 때 의미하는 그 기억이다.
- 의미적 기억은 의미, 개념, 또는 사실에 대한 기억이다.
- 플래시카드로 연습해서 기억한 것이 바로 의미적 기억이다.
- 일화적 기억은 추가적인 노력을 하지 않아도 생성되지만, 의미적 기억과 마찬가지로 기억을 많이 생각해야만 인출 강도가 높아진다.
- 문제를 해결할 때 어떤 유형의 기억이 역할을 수행하는가?
- 일화적 기억은 과거에 문제를 어떻게 해결했는지 기억할 때 사용된다.
- 새로운 해결책을 찾는 대신 이전에 유사한 문제에 효과가 있었던 해결책에 의존한다.
- 탈학습
- 암시적 기억이 만으면 유연성이 저해될 수 있다.
- 예를 들어 쿼티 키보드 타이핑법을 배우고 나서 드보락 키보다 사용법을 배우는 것은 키보드를 사용할 줄 모르는 상태에서 배우는 것 보다 어렵다.
- 처음 한 프로그래밍 언어를 배우고 나서 두 번째 언어를 배울 때 문법이 처음 배웠던 언어의 문법과 차이가 많다면 청므 배운 언어에 대해 암시적으로 기억된 학습 내용을 취소하는 데 어려움을 겪을 것이다.
3. 자동화: 암시적 기억 생성
- 문제 해결 능력을 높이는 두 가지 방법 중 하나는 자동화다.
- 걷기, 신발 끈 묶기 와 같은 어떤 기술을 여러 번연습한 후에 아무 생각 없이 할 수 있을 정도가 되면 이 기술을 자동화했다고 한다.
- 기술을 자동화하는 방법을 알려면 먼저 암시적 프로그래밍 기억을 강화하는 방법을 살펴봐야 한다.
- 암시적 기억의 흥미로운 점은 암시적 기억을 충분히 훈련하면, 그것을 사용하는 데 뇌가 거의 에너지를 소모하지 않는다는 것이다.
- 시간 경과에 따른 암시적 기억
- 프로그래밍에 대한 암시적 기억이 많을수록 인지 부하를 더 많이 절약할 수 있기 때문에 더 큰 문제를 해결하기 쉽다.
- 암시적 기억은 반복에 의해 생성된다.
- 인지단계 → 연상단계 → 자율단계 를 거쳐 암시적 기억이 생성됨.
- 자동화를 통해 보다 신속하게 프로그램을 실행할 수 있는 이유
- 자동화는 LTM의 일화적 기억이 저장된 부분으로부터 기억을 인출함으로써 이루어진다고 주장한다.
- 유사한 작업을 마주했을 때 유사 인스턴스 기억이 부족하면 그 작업에 대해 추론해야 하지만 인스턴스 기억을 많이 가지고 있다면 이전에 수행했던 방법을 기억하고 동일한 방법을 적용할 수 있다.
- 추론을 전혀 사용하지 않고 순간적인 기억에 전적으로 의존할 때 자동화는 완전해진다.
- 자동화에 의해 작업 수행을 하게 되면, 당면한 과제에 대해 기억에서 인출하는 속도가 능동적으로 생각하는 것보다 빠르고 의식적으로 주의를 거의 기울이지 않고도 수행할 수 있기 때문에 과제 수행이 빠르고 쉽다.
- 암시적 기억 개선
- 연습하고자 하는 기술이 필요한, 유사하지만 다른 프로그램을 많이 작성해보기
- 보다 복잡한 프로그래밍 개념을 이해하는 데 어려움을 겪고 있다면 프로그램을 처음부터 작성하는 것보다 이미 작성된 프로그램을 수정하는 것도 고려해봐라.
- 플래시카드와 마찬가지로 간격을 둔 반복은 학습의 핵심이다.
4. 코드와 해설에서 배우기
- 두 그룹에게 문제를 줬다. 한 그룹에게는 풀이법과 문제를 같이 줬고 다른 그룹에게는 문제만 풀도록 함.
- 첫 번째 그룹이 더 잘 했는데, 놀라운건 두 번째 그룹보다 문제를 5배나 빨리 풀었다.
- 학생들이 레시피를 기계적으로 따라해서 푼 것이지 실제로 배운 것은 없다고 생각해 레시피를 가르치기를 주저하는 사람들도 있을 수 있다.
- 하지만 두 번째 실험에서 첫 번째 그룹 학생들은 레시피에 나와 있는 계산 규칙을 적용할 수 있는 다른 문제에서도 더 뛰어난 결과를 보였다.
- 새로운 유형의 인지 부하: 본유적 부하
- 우리는 종종 아이들이 문제 해결을 잘 할 수 있기를 바란다면 스스로 문제를 해결하도록 내버려두어야 한다고 생각한다.
- 마찬가지로 좋은 프로그래머가 되고 싶다면, 많은 프로그램을 작성해봐야 한다고 생각한다.
- 그러나 반드시 그렇지만은 않다.
- 본유적 부하는 두뇌가 정보를 LTM에 다시 저장하기 위해 수행하는 노력을 의미한다.
- 여러분이 가지고 있는 모든 인지 부하가 내재적 부하와 외재적 부하로 가득 차면, 본유적 부하를 위한 여지는 남아짔지 않게 된다.
- 즉 문제와 그 해결책을 기억할 수 없다.
- 힘든 코딩 작업을 마친 후 때때로 자신이 한 일을 기억하지 못하는 경우가 있을 것이다.
- 두뇌가 해결책을 저장할 수 없을 정도로 몰입했기 때문
- 위의 연구에서 첫번째 그룹은 인지부하가 그렇게 높지 않았기 때문에 이러한 레시피를 자세히 검토하고 이후에 기억할 수 있었다.
- 하지만 두 번째 그룹은 깊은 사고를 하면서 일반적인 규칙보다는 당면한 문제에 더 집중했다.
- 레시피를 가르치는 것에 대해 걱정하는 사람들은 이것을 반대로 생각한다.
- 아이들이 문제 해결을 잘하기를 바란다면 문제를 많이 해결해야 한다는 생각은 합리적인 것처럼 보인다.
- 더 나은 프로그래머가 되고 싶다면 프로그램을 많이 작성하고 사이드 프로젝트를 통해 여러 가지를 시도해보면서 배우는 것이 있을 것이다 등
- 이런 생각은 항상 옳은 것은 아니다.
- 개발 작업시 풀이된 예제 사용하기
- 동료와의 협업
- 깃허브 탐구
- 소스 코드에 대한 책 또는 블로그 게시물 읽기