이 장에서는 버그에 대해 중점적으로 알아본다. 버그는 생각에 착오가 있을때 발생한다. 코드를 작성할 때 잘못된 가정을 품기에 버그가 발생한다. 이 장에서는 아래 사항을 알아볼 것이다
- 기존 지식을 활용하여 새로운 프로그래밍 언어를 학습하는 방법과 언어 간의 차이로 인해 발생하는 어려움과 오류를 피하는 방법
- 프로그래밍과 관련한 다양한 오개념에 대해 다루고 오개념이 발생하는 이유
7.1 왜 두 번째 프로그래밍 언어가 첫 번째보다 쉬울까?
이미 배운 지식이 새로운 것을 하는데 도움이 되는 것을 전이(transfer)
라고 한다. LTM에 저장된 프로그래밍 지식은 새로운 프로그래밍 개념을 배우는데 두가지 방식으로 도움이 될 수 있다
학습 도중 전이 (transfer during learning)
- LTM에 저장된 정보를 사용해서 새로운 내용을 쉽게 배우는 과정
- 새로운 프로그래밍 개념에 대해 생각하면 작업 기억 공간이 활성화되고, 이는 LTM을 활성화시켜 관련 정보 인출이 시작된다
- 이렇게 인출된 관련 정보를 새로운 정보와 명시적으로 연관을 맺는다. (정교화 (3장))
학습 전이 (transfer of learning)
- 완전히 낯선 상황에 이미 알고 있는 내용을 적용할 때 일어난다.
- 때로 우리의 사고 활동 없이도 일어난다 (ex : 새로운 키보드를 구입해도 의식하지 않고 사용할 수 있음.)
기존 프로그래밍 지식을 활용할 가능성을 높이는 방법
모든 지식이 자동으로 새로운 상황으로 전이 되는 것은 아니다. 이는 여러 요인의 영향을 받는다
- 숙달 : LTM에 이미 저장되어 있는 지식과 관련된 작업에 잘 숙달되어 있을수록 전이가 잘 일어난다
- 유사성 : 두 작업 간의 공통점
- 배경 : 환경이 얼마나 유사한지 (IDE, 동료 등)
- IDE가 같으면 전이가 더 잘 일어난다. 따라서 언어가 달라도 IDE는 통일하는 것이 좋다
- 중요 특성 : 어떤 지식과 연관짓는게 효과적일지 알고 있는 경우
- 예를들어 파이썬을 배우는데 자바스크립트가 도움이 된다하면 적극적으로 연관지으려 할 것이다
- 새 작업에 도움이 될 지식이 무엇인지 스스로 질문해봐라
- 연관 : 두 작업이 비슷하다고 얼마나 강하게 느끼는지
- 감정 : 작업에 대해 어떻게 느끼는지
전이의 형태
다양한 전이의 형태에 대해 알면 프로그래밍 언어 간에 이뤄지는 전이에 대해 보다 현실적인 기대를 설정할 수 있다
고도 전이와 저도 전이
- 저도 전이 : 자동화된 기술을 이전하는 것. (ex : 별 생각 없이 ctrl + c, ctrl + v을 다른 에디터에서도 사용하는 것)
- 고도 전이 : 의식적으로 습득한 기술을 이전하는 것. 이때는 이러한 상황이 발생하는 것을 인지하는 경우가 많다.
근거리 전이와 원거리 전이
- 근거리 전이 : C#과 자바처럼 서로 가까운 영역 사이에서 전이될 때
- 원거리 전이 : 자바와 프롤로그처럼 서로 먼 영역 간에 일어나는 전이. 근거리 전이보다 발생할 확률이 적다
긍정적 전이와 부정적 전이
긍정적 전이
- 무언가를 알고 있어 새로운 것을 배우거나 새로운 작업을 할 때 도움이 되는 전이
- 새로운 정신 모델을 만들 필요가 없으며, 이미 저장된 정신 모델을 기반으로 새로운 상황에 대한 정신 모델을 형성한다
부정적 전이
- 기존 지식이 새로운 것을 배우는데 방해하는 전이
- 기존 지식을 기반으로 한 잘못된 가정으로 인해 부정적 전이가 발생할 수 있다
- 자바에서는 초기화 없이 변수를 사용할 수 없는데, 이를 파이썬에서도 적용할 수 있다.
- 함수형을 먼저 배운 사람이 객체 지향을 배우면 어려움을 겪을 수 있다
전이의 어려움
연구에 의하면 전이는 일어나기 매우 어렵고 대부분의 사람에게 전이가 자동으로 일어나지는 않는다. 많은 프로그래머들은 프로그래밍이 논리적인 추론력을 향상시키고 지능을 증가시킬거라 생각하지만, 이는 연구결과 거의 효과가 없다는 것이 밝혀졌다
중요한 점은 하나의 프로그래밍 언어를 숙달했다고 새로운 언어를 배우는 데 항상 도움이 되지는 않는다. 이러한 사실에 플래시카드를 사용하는 것 같은 초보적인 학습 활동이 자신에게는 불필요하다고 느끼는 전문가는 다소 당혹스러울 수 있다.
사고 방식을 확장하기 위해 새로운 언어를 배우기 시작했다면, 기존 습득한 언어와는 완전히 다른 언어를 선택하는 것이 중요하다. 이러한 원거리 전이는 발생할 가능성이 낮으며 새로운 전략, 문법을 많이 배워야한다. 공통점과 차이점에 의식적으로 주의를 기울이면 새로운 언어를 배우는 일이 쉬워진다
7.2 오개념 : 생각의 버그
작업 중인 코드에 대해 잘못된 가정을 할 때 버그가 발생할 수 있다. 코드가 작동한다고 확신함에도 오류가 발생한다면, 코드에 대한 오개념이 문제일 수 있다.
오개념의 정의는 다음과 같다
- 사실과 다르다
- 서로 다른 상황에서 일관되게 유지된다
- 확신에 사로잡혀 있다
개념 변화를 통한 오개념 디버깅
오개념은 강한 확신 속에 있기에 교정하기가 어려울 수 있다. 이때는 잘못된 사고방식을 새로운 사고방식으로 바꿔한다. 이러한 이미 알고 있는 프로그래밍 언어 때문에 생긴 오개념을 현재 학습 중인 새로운 언어에 맞는 정신 모델로 대체하는 과정을 개념 변화라고 한다. 여기서 기존의 개념은 근본적으로 바뀌거나 대체되거나 새로운 지식에 동화된다.
이 과정은 이미 학습된 지식을 LTM에서 바꿔야하기 때문에 개념 변화 학습은 일반적인 학습보다 더 어렵다
오개념 제압하기
최근 연구에서 기억은 잊히거나 대체되지 않는 것으로 간주된다. 따라서 잘못된 오개념은 기억에 계속 남아있고 인출되는 횟수가 적어지는 것이다. 하지만 기억은 계속 남아있고, 언제든지 갑자기 인출될 수도 있다. 문제에 대해 생각하다가 “아 이게 아닌거 같은데”라는 생각이 드는 경우가 그 경우다
두되가 어떤 저장된 개념을 사용할지 결정하는 기제는 “억제“가 일정역할 한다고 알려져있다.
프로그래밍 언어에 대한 오개념
유하 소르바의 연구인 초보 프로그래머가 가질 수 있는 162가지의 오개념 중 일부
- 오개념 15 : 원시 데이터 타입 변수에 대한 할당은 수식 또는 아직 연산 실행이 되지 않은 표현식을 저장한다.
- 오개념 33 : 조건이 거짓으로 변경되는 즉시 while 루프가 종료된다. (루프문 안에서 조건문에 사용되는 변수를 변경하였을때)
- 오개념 46 : 매개변수 전달에는 호출과 정의에 서로 다른 변수 이름이 필요하다
새로운 프로그래밍 언어를 배울 때 오개념 방지하기
오개념에 대해 할 수 있는 것은 많이 없다. 새로운 언어나 프레임워크를 배울때 부정적 전이를 피할 순 없지만, 도움이 될 몇가지 방법들이 있다
- 자신이 옳다고 확신하더라도 여전히 틀릴 수 있다는 것을 아는 것이 중요하다
- 흔하게 발생하는 오개념에 대해 의도적으로 연구해보자 (위 소르바의 연구 사례처럼)
- 같은 언어를 같은 순서로 배운 사람에게 조언을 구하라. 같은 어려움을 마주친 사람에게 조언을 구할 수 있다
새로운 코드베이스에서의 오개념 진단
새로운 코드베이스를 접하였을때도 오개념에 빠질 수 있다. 이미 알고 있는 지식을 기반으로 코드에 대한 가정을 할 때마다 변수의 의미, 작성자의 의도, 코드의 도메인에 대해 오개념에 빠질 수 있다
이때 오개념을 진단할 방법은 몇가지 있다
- 페어프로그래밍
- 코드 실행과 테스트를 통해 자신이 세운 가정이 맞는지 확인하라
- 문서화를 통해 자신과 다른 사람이 오개념에 빠지는 것을 방지할 수 있다.