brunch

You can make anything
by writing

C.S.Lewis

by 최기형 Feb 09. 2023

왜 프로그래밍은 어렵지? 나는 개발자일까...

'프로그래머의 뇌'에서 발견한 문장과 시선

그동안 그렇게 많은 소스코드를 보고 버그를 고치고 문제를 해결해 왔지만 여전히 프로그래밍은 어렵습니다. 코로나 이후 이른바 개발자 전성시대가 열리면서, 많은 사람들이 '나도 개발자 해볼까?'라는 마음으로 하던 일을 접고 국비지원과정이나 부트캠프 등 교육과정으로 시작하는데 현실을 녹록지 않습니다. 


프로그래머의 뇌는 훌륭한 프로그래머가 어떤 식으로 사고하는지 인지과학적으로 설명하는 책인데요. 꼭 프로그래밍 관점이 아니어도 '뇌와 기억, 학습' 관점으로 흥미롭게 볼 수 있습니다.


1. 기억에 관하여

우리의 뇌는 정보를 어떻게 기억하고 저장할까요? 다양한 감각기관을 통해 정보가 들어오면 짧은 시간 동안에 감각기억공간에 유지하다 선별적으로 단기기억공간(short-term memory, STM)에 저장합니다. 이중 필요하다고 생각되는 정보는 장기기억공간(long-term memory, LTM)에 암호화하여 저장해 놓고 필요할 때 꺼내 쓰게 되죠. 작업기억(working memory)은 우리가 사고할 때 정보 처리하는 공간이고요. (좀 더 자세한 설명은 우리는 어떻게 기억할까를 참고하시면 좋습니다.)


2. 프로그래밍도 기억의 흐름에 따라

프로그램에 문제(Bug)가 발생하면 버그 리포트는 시작/청각 같은 지각을 통해 두뇌로 입력되고, 원인을 찾기 위해 몇 개월 전 작성한 코드 다시 읽게 되는데요. 이때 코드 분석 시 읽은 내용은 STM에 저장되고 몇 개월 전 구현한 내용을 LTM에서 가져옵니다. 이렇게 STM에 저장된 새로운 버그 리포트 내용, LTM에 저장된 유사한 버그의 해결법과 개인적인 기억 두 가지가 작업기억공간에 들어와서 문제를 이해하고 해결책을 도출하는 거죠. 이렇듯 프로그래밍이 잘 안 된다는 건 단기기억, 장기기억, 작업기억 영역 중 한 곳에 어려움을 겪는다는 뜻입니다.


3. 프로그래밍할 때 우리가 겪는 혼란

1) LTM 문제 = 지식의 문제

장기 기억 공간(LTM)은 일종의 하드 드라이브 역할로 추상적인 알고리즘과 프로그래밍 언어의 문법을 기억하고 키보드로 입력하는 동작을 기억하는 역할을 합니다. 프로그래밍 언어, 알고리즘, 업무 영역에 대한 지식의 영역이죠. 그래서 위 그림의 A Programming language에서 연산자 T의 의미를 모르는 것은 관련 지식이 없어서 혼란스러운 것입니다.(이런 개발언어도 있군요...) 


2) STM 문제 = 정보의 부족

단기 기억 공간(STM)은 일종의 캐시나 메인 메모리 역할로 읽거나 들은 정보를 30초 미만으로 저장하며 이후 LTM에 저장되거나 잊힙니다. 저장할 수 있는 크기는 제한되어 있는데 보통 2~6개 정도이고 최대 12개를 넘지 않는다고 합니다. 그래서 코드 분석 시 키워드, 변수명, 자료구조 등이 STM에 일시 저장되고  어떤 함수가 하는 일을 이해하고 나면 STM은 그 내용을 기억에서 지워버리는 거죠. 이런 측면에서 보면 어떤 일을 수행하는지 이해하려면 메서드에 대한 정보가 필요합니다. 자바에서 toBinaryString() 메서드가 어떻게 동작하는지에 대한 정보를 얻으려면 메서드의 내부 코드를 따로 살펴봐야만 알 수 있습니다.


3) WM 문제 = 처리 능력의 부족

작업 기억 공간(WM)은 프로페서 역할을 하는데 머릿속으로 코드를 실행하면서 무슨 일이 일어날지 이해하려 시도합니다(트레이싱/추적). 변수에 임시 저장되는 값을 기억하면서 코드를 이해해야 하는데 코드가 너무 복잡하면 두뇌의 처리 용량이 충분해야 해결 가능해지는 거죠.


4. 어떻게 하면 효과적으로 기억하고 프로그래밍 잘할 수 있을까?

1) 기억의 크기 제한 극복하기

청크 chunk는 몇 개의 그룹으로 묶은 정보를 뜻하는 데요. 이렇게 단위로 묶인 정보로 기억하면 보다 효과적으로 학습된다고 합니다. 영어를 배울 때 숙어를 익히는 것과 유사한 개념입니다. 그리고 디자인 패턴 학습 역시 청킹 능력이 향상되고 코드를 더 빠르게 수정할 수 있게 되어 도움이 됩니다. 또한 올바른 주석문 역시 개발자가 코드를 청킹하는 방식에도 영향을 미친다고 하니 좋은 주석문 작성하는 연습도 필요하고요.


2) 집중의 시간 확보하기

코딩 작성 도중 중단된 후 다시 그 업무로 돌아가는 데 얼마나 걸리까요? 보통 15분 정도 소요된다고 하며 수정 작업 도중 중단되고 나서 1분 이내 하던 일을 다시 시작하는 경우는 10% 미만이라고 합니다. 프로그래밍 진행 중 중단되면 생산성에 악영향을 주니 방해받지 않고 집중할 수 있는 시간을 확보하는 것이 중요합니다. 


3) 인출연습 - 무언가 일부러 기억하려 애쓰기

추가로 학습하지 않고 정보를 기억하려고 능동적으로 노력하는 것만으로도 더 많이 기억한다고 합니다. 매번 필요할 때마다 문법을 찾아보는 건 좋지 않은 습관인데요. 너무 쉽게 정보를 찾고 너무 일상적으로 이뤄지다 보니 우리 두뇌는 기억할 필요가 없다고 느끼기 때문에 프로그래밍 문법에 대한 인출 강도가 강화되지 않고 계속 약한 상태로 남아있게 된다고 합니다.


4) 정교화 - 기존 지식에 새로운 지식 연결하기

스키마/스키마타는 사고나 생각이 서로 관련되어 조직된 방식을 뜻하는데요. 새로운 프로그래밍 개념을 배울 때, 어떤 다른 개념을 떠올리게 하는지? 문법에 공통점이 있는지? 비슷한 환경에서 구현될 수 있는지? 등 생각하면서 기존 지식과 결합하면 도움이 된다고 합니다. 그래서 두 번째 프로그래밍 언어는 배우기 더 쉬운 거죠.


프로그래밍 언어도 '언어'의 일종으로 본다면, 새로운 외국어를 배울 때도 같은 원리를 적용할 수 있습니다. 그 언어가 가진 문법, 특징과 같은 기본적인 지식이 필요하고, 단어/단어로 기억하기보다는 청크 활용하여 숙어나 문구로 암기하고, 일부러 그 언어로 생각하고 말하려고 노력함으로써 언어 습득을 빠르게 하는 거죠. 근데 이건 이론적인 것이고, 20년 넘게 영어 공부해도 여전히 영어와 안 친한 거 보면... 그래도 계속 꾸준히 해나가는 수밖에 없겠죠?

                    

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari