Skip to main content

6. 코딩 문제 해결을 더 잘하려면

  • 문제에 대한 다양한 해결책은 각 장점이 존재합니다.

6.1 모델을 사용해서 코드에 대해 생각해보기#

  • 사람들은 문제를 풀 때 대부분 모델을 만듭니다.
  • 모델은 실재를 간단하게 표현한 것이며, 주된 목적은 문제에 대해 생각하고 해결하는 데 도움을 주기 위한 것입니다.

6.1.1 모델의 유익함#

  • 문제를 풀 때 코드의 모델을 명시적으로 사용하는 것은 두 가지 장점이 있습니다.
    • 첫째, 모델은 프로그램에 대한 정보를 다른 사람과 공유할 때 유용합니다.
    • 둘째, 문제를 풀 때 도움이 됩니다.

모든 모델이 동일하게 유용한 것은 아니다#

  • 문제에 대해 생각하기 위해 우리가 사용하는 모델이 동일한 것은 아닙니다.
  • 어떤 프로그래밍 언어는 가능한 표현의 개수를 제한하는데 이것은 문제를 푸는 데 도움이 되기도 하고 해가 되기도 합니다.

6.2 정신 모델#

  • 문제에 대해 생각할 때 두뇌의 외부에서 만들어지지 않은 모델을 사용할 수 있으며, 이러한 모델을 정신 모델(mental model) 이라고 합니다.
  • 정신 모델은 풀어야 할 문제에 대해 추론하기 위해 사용할 수 있는 작업 기억 공간 내의 추상화입니다.

6.2.1 정신 모델 자세히 보기#

  • 정신 모델은 다음의 특징이 있습니다.
    • 정신 모델은 불완전합니다.
    • 정신 모델은 불안정합니다.
    • 서로 간에 모순이 있더라도 여러 개의 정신 모델이 공존할 수 있습니다.
    • 정신 모델은 종종 이상한 것처럼 심지어 미신처럼 보일 수 있습니다.

6.2.2 새로운 정신 모델 배우기#

  • 언제나 부정확하거나 불완전한 정신 모델을 사용할 위험이 항상 있습니다.

6.2.3 코드에 대해 생각할 때 정신 모델을 효율적으로 사용하는 방법#

작업 기억 공간에서의 정신 모델#

  • 종종 추상적인 코드 모델을 갖는 것이 도움이 됩니다.
  • 코드를 다시 참조하는 것보다 모델 자체에 대해 추론할 수 있으므로 더 효율적입니다.

구체적인 모델이 더 효과적이다.#

  • 정신 모델에 세부 정보가 많을수록 시스템에 대한 추론이 더 쉽고 시스템에 대한 질문에도 정확한 대답을 할 수 있음을 시사합니다.

소스 코드에 대한 정신 모델을 작업 기억 공간에 생성하기#

  • 다음의 단계를 수행합니다.
    1. 국지적 모델을 만들기
    2. 코드에서 관련된 모든 객체와 객체 간의 관계를 나열하다
    3. 시스템에 대한 질문을 만들고 이 질문의 답을 사용해서 모델을 개선합니다.

LTM의 정신 모델#

  • LTM에 저장된 정신 모델은 데이터를 구성하는데 도움이 됩니다.

LTM에 소스 코드에 대한 정신 모델 생성#

  • 일반적으로 다음과 같은 사항을 고려해볼 가치가 있습니다.
    • 방샹/무방향 그래프 혹은 다양한 형태의 리스트 같은 자료구조
    • 관찰자 패턴과 같은 디자인 패턴
    • 모델-뷰-컨트롤러와 같은 아키텍처 패턴
    • 개체 관계도 또는 시퀀스 다이어그램과 같은 도표
    • 상태도 또는 페트리 넷과 같은 모델링 도구

정신 모델은 LTM과 작업 기억 공간에 다 있다#

  • 정신 모델에 대한 두가지 관점, 즉 작업 기억 공간에서 사용된다는 관점과 LTM에 저장된다는 관점이 있습니다.

6.3 개념적 기계#

  • 개념적 기계(notional machine) 은 컴퓨터가 코드를 실행하는 방법에 대해 추론할 때 사용하는 모델입니다.

6.3.1 개념적 기계는 무엇인가?#

  • 개념적 기계는 '기계'를 뜻하므로 자유롭게 상호작용할 수 있다는 점입니다.
  • 개념적 기계는 추상적 수준에서 컴퓨터의 동작에 대해 추론하는 것이 필요한 경우에 사용합니다.

6.3.2 개념적 기계의 예#

  • 개념적 기계는 코드를 실제로 실행하는 기계의 동작을 설명하기 위해 만들어졌기 때문에 몇가지 특성은 기계와 동일합니다.
    • 대표적인 예시는 상태(state) 라는 개념을 들고 있습니다.

6.3.1 개념적 기계의 층위#

  • 프로그래밍 개념에 대한 설명과 이해를 목적으로 개념적 기계를 사용할 때, 이것이 어떤 세부 사항은 숨기고 어떤 세부 사항은 나타내는지 의식적으로 생각해보면 좋습니다.

6.4 개념적 기계와 언어#

  • 프로그래밍에 관해 말할 때는 암시적으로 개념적 기계가 그 바탕에 깔려 있고 특정 정신 모델로 이어지는 경우가 많습니다.

6.4.1 개념적 기계의 확장#

  • 실제로 프로그래밍 언어에는 전체 범위를 아우르는 하나의 개념적 기계만 있는 것이 아니라 서로 겹치는 여러 개의 개념적 기곋즐이 있습니다.

6.4.2 여러 개념적 기계는 서로 충돌하는 정신 모델을 만들 수 있다.#

  • 개념적 기계가 만들어내는 정신 모델이 서로 충돌할 수 있습니다.
  • 변수에 대한 두 가지 서로 다른 은유가 각각 장단점이 존재합니다.
    • 이를 시각화하면 이해하기 좋습니다. 다만, 오해하기도 쉽습니다.

6.5 개념적 기계와 스키마타#

  • 개념적 기계는 단점이 있지만, 프로그래밍에 관해 생각할 때 일반적으로 효과적인 수단입니다.

6.5.1 왜 스키마타가 중요한가#

  • 스키마타는 LTM이 정보를 저장하는 방식입니다.

6.5.2 개념적 기계는 의미론인가#

  • 의미론(semantics)은 문법(syntax)이라는 프로그램의 외관보다는 의미에 대해 연구하는 컴퓨터 과학의 하위 분야입니다.
  • 의미론은 세부 사항을 추상화하는 것이 아니라 세부 사항을 정확하고 완전하게 명시하는 것을 목표로 합니다.

요약#

  • 문제를 표현하는 방법은 문제에 대한 생각에 큰 영향을 미칠 수 있습니다.
  • 정신 모델은 우리가 문제를 생각할 때 형성하는 정신적 표상입니다. 사람은 서로 경쟁하는 여러 정신 모델을 가질 수 있습니다.
  • 개념적 기계는 실제 컴퓨터가 어떻게 기능하는지를 추상적으로 표현한 것으로, 프로그래밍 개념을 설명하고 프로그래밍에 대한 추론을 할 때 사용합니다.
  • 개념적 기계는 기존의 스키마타를 프로그래밍에 적용할 수 있기 때문에 프로그래밍을 이해하는데 도움이 됩니다.
  • 여러 다른 개념적 기계는 때때로 서로를 훌륭하게 보완하지만 상충되는 정신 모델을 만들 수도 있습니다.
Last updated on