6. 코딩 문제 해결을 더 잘하려면
<aside>
📚 프로그래밍 문제를 더 효과적으로 해결하기 위해 모델을 적용할 수 있다.
</aside>
6.1. 모델을 사용해서 코드에 대해 생각해보기
- 모델이란?
- 실재를 간단하게 표현한 것. 상태표, 의존 그래프 등 역시 모델에 해당
- 모델의 장점
- 프로그램에 대한 정보를 다른 사람과 공유할 때 유용하다.
- 문제를 풀 때 도움이 된다.
- 두뇌에서 한 번에 처리할 수 있는 한계에 도달했을 때 모델을 만들면 인지 부하를 줄일 수 있다.
- 시스템 설계를 화이트보드에 적어놓기 등
- 올바른 모델의 정의하는 것은 중요하다
- 코딩테스트 풀 때 어떻게 접근할지 정하는것이랑 비슷
- 예) DP 로 풀면 잘 풀리는 문제 : 올바른 모델링 / 이 문제를 반복문으로 풀려 했다면 : 잘못된 모델링
6.2. 정신 모델
- 정신 모델이란?
- 두뇌의 외부에서 만들어 지지 않은 모델
- 풀어야 할 문제에 대해 추론하기 위해 사용할 수 있는 추상화
- 예) 트리 구조
- 코드와 컴퓨터에 실제 트리는 존재하지 않는다. 트리 구조라고 생각하는 메모리 내의 값이 있을 뿐
- 한 노드의 자식 노드 라고 생각하는 것이 요소라 가리키는 다른 요소 라고 생각하는 것보다 쉽다.
- 정신 모델의 특징
- 정신 모델은 불완전하다. 시스템을 완전하게 표현하지는 못한다.
- 정신 모델은 불완전하다. 사용되면서 자주 변경된다.
- 여러개의 정신 모델이 공존할 수 있다.
- 새로운 정신 모델을 점차적으로 배우기도 한다.
- 정신 모델은 이상한 것처럼 여겨질 수 있고, 미신처럼 느껴질 수도 있다. (기도메타 등)
- 사람들은 정신 모델을 가급적 사용하지 않으려 한다. 두뇌 에너지 소모가 크기 때문이다. 차라리 육체적인 일을 추가로 하는 것을 선호한다.
- +) 어떤 상황에 대해 보다 정확하고 구체적인 모델을 만드는 것이 추론에 큰 도움이 된다.
- +) 정신 모델에 세부 정보가 많을수록 시스템에 대한 추론이 더 쉽고, 시스템에 대한 질문에도 정확한 대답을 할 수 있다.
- 정확하고 구체적인 정신 모델을 만드는 방법
- 국지적 모델을 만든다. (쪼개서 작업)
- 코드에서 관련된 모든 객체와 객체 간의 관계를 나열해 본다.
- 시스템에 대한 질문을 만들고 이 질문의 답을 사용해서 모델을 개선한다.
- 시스템에서 가장 중요한 요소는 무엇이며 모델에 그것들이 포함되었는가?
- 중요한 요소들 간의 관계는 무엇인가?
- 프로그램의 주요 목표는 무엇인가? 목표는 위 두가지 사항과 어떻게 관련되어 있는가?
- 일반적인 사용 사례는 무엇이며, 모델이 그것을 보여주는가?
- 정신 모델은 작업 기억 공간이 아닌, LTM 에 저장하면 더욱 유용하다.
- LTM 에 저장된 정신 모델은 작업 기억 공간의 정신 모델 구축에 영향을 미칠 수 있다.
- 플래시카드를 이용하자 : 한쪽 면에는 정신 모델의 이름을, 다른 쪽에는 정신 모델의 간략한 설명 또는 시각화된 정보를 적는다.
6.3. 개념적 기계
- 개념적 기계란?
- 정신 모델은 일반적으로 세상의 모든 것의 모델이 될 수 있다.
- 개념적 기계는 컴퓨터가 코드를 실행하는 방법에 대해 추론할 때 사용하는 모델이다.
- 예)
중위 표기법
= 개념적 기계 , 후위 표기법
= 추상화 되지 않은 기계식 계산
- 개념적 기계의 층위
6.4. 개념적 기계와 언어
- 기계의 작동 방식에 대해 추론할 때 뿐만 아니라, 코드에 대해 이야기할 때도 개념적 기계를 사용한다.
- 변수가 값을
보유
한다.
- 파일이
열림
또는 닫힘
상태이다.
- 포인터가 값을
가리킨다
.
- 함수가 값을
반환
한다.
- 실제 세계로부터 차용한 비유는 유용하게 사용될 수 있지만 혼란을 초래할 수도 있으니 주의하자.
6.5. 개념적 기계와 스키마타
- 효과적인 개념적 기계는 프로그래밍 개념을 일상생활의 개념과 연관 짓는다.
- 일상생활의 개념에 대해서는 강한 스키마가 이미 형성되어 있기 때문에 인지 부하가 적게 발생한다.