코딩 중 겪는 혼란에 대한 이해1.1 코드가 초래하는 세 가지 종류의 혼란1.1.1 혼란의 첫 번째 유형 : 지식의 부족1.1.2 혼란의 두번째 유형 : 정보의 부족1.1.3 혼란의 세 번째 유형 : 처리 능력의 부족1.2 코딩에 영향을 주는 인지 과정1.2.1 LTM과 프로그래밍APL 프로그램 : LTMSTM과 프로그래밍
들어가며.. 코드 읽기는 프로그래밍 작업에서 핵심적인 일이지만, 전업 개발자라도 코드를 읽는 법을 제대로 모를 수 있다. 코드 읽는 법을 배울 기회가 없기도 하지만, 연습하지도 않는다. 코드를 읽는 일은 종종 혼란스럽고 고된 일이다, 이 책의 앞부분에서는 코드를 읽는 것이 왜 어려운 일인지 설명하고 코드 파악을 잘하기 위해 무엇이 필요한지 이해할 수 있도록 돕고자 한다.
코딩 중 겪는 혼란에 대한 이해
이 장에서는 다음과 같은 내용을 다루게 된다. 1. 코딩 중에 혼란이 발생하는 다양한 방식의 차이점 이해 2. 코딩에서 작동하는 세 가지 인지 과정의 비교 3. 세 가지 인지 과정들이 어떻게 서로 보완적으로 작동하는지에 대한 이해
프로그래밍을 하다 보면 늘 혼란이 일어난다. 새로운 프로그래밍 언어나 개념 혹은 프레임워크를 배울 때는 새로 접하는 아이디어 때문에 겁먹을 수 있다.
익숙하지 않은 코드나 자기 자신이 오래전에 작성한 코드를 다시 열어볼 때, 그 코드가 무슨 일을 하는지 혹은 왜 그런 방식으로 작성했는지 이해가 안될 수 있다.
또는 이전에 접해보지 못한 비즈니스 영역에서 일을 새로 시작할 때 새로운 용어나 특정 영역에서만 사용하는 전문 용어 때문에 머리가 아플 수 있다.
물론 잠시의 혼란스러움은 문제가 되지 않겠지만, 그것을 필요 이상으로 오래 가져가서는 안된다.
이 장에서는 어떻게 그런 혼란을 인식하고 해석할 것인지를 다루려고 한다. 아마 지금까지 한 번도 생각해본 적이 없겠지만 이러한 혼란은 세 가지 서로 다른 방식으로 일어난다. 복잡한 알고리즘을 단계적으로 이해하려고 노력할 때 일어나는 혼란과 어떤 특정 영역에서 사용되는 개념을 잘 이해하지 못해서 일어나는 혼란은 서로 다른 종류의 혼란이다.
이들 여러 가지 종류의 혼란은 서로 다른 유형의 인지 과정과 관련이 있다. 이 장에서는 몇 가지 코드 예제를 통해 이러한 혼란에 대해 자세히 살펴보고 이 혼란이 우리의 인지 과정에서 어떻게 일어나는지를 설명하고자 한다.
이 장을 마치고 나면, 코드가 어떻게 다양한 혼란을 초래하고 각각의 경우에 인지 과정이 어떻게 다르게 일어나는지 이해할 수 있을 것이다. 세 가지 종류의 혼란과 이와 관련한 인지 과정을 이해하고 나서, 이후의 장들에서는 어떻게 그 인지 과정들을 개선할 수 있을지를 다룬다.
1.1 코드가 초래하는 세 가지 종류의 혼란
생소한 코드를 처음 접하면 누구나 어느 정도 혼란을 느끼기 마련이지만, 모든 코드가 다 같은 방식으로 혼란을 야기하는 것은 아니다.
다음 코드는 모두 주어진 숫자 N 혹은 n을 이진수로 바꾸는 일을 한다. 첫 번째 코드는 ALP이고, 두 번째는 자바, 세 번째는 베이직이다.
지금 당장은 코드를 읽을 때 뇌에서 어떤 일이 일어나는지 표현하기 어렵겠지만, 서로 다르게 작동하는 것을 느낄 것이다. 이 장을 마치고 나면, 코드를 읽을 때 두뇌에서 일어나는 서로 다른 인지 과정을 논의하는 데 필요한 용어에 익숙해질 것이다.
아래는 APL로 된 코드이고 숫자 n을 2진수 표현으로 변경하는 코드다. 이 코드를 읽을 때 혼란은 T가 무엇인지 모르기 때문이다. 1960년대 수학자가 아니라면 APL을 한 번도 사용해본 적이 없을 것이다. APL은 특별히 수학적인 계산을 위해 만들어진 언어이고 오늘날에는 거의 쓰이지 않는다.
// APL에서의 2진수 표현 2 2 2 2 2 T n
아래는 자바 언어로 숫자 n을 이진수 표현으로 변환하는 코드다. toBinaryString() 메서드가 내부에서 어떻게 동작하는지 모른다면 이 코드를 읽을 때 혼란이 있을 수 있다.
public class BinaryCalculator { public static void main(Integer n) { System.out.println(Integer.toBinaryString(n)); } }
아래는 베이직 언어를 사용해서 숫자 N을 2진수 표현으로 변환하는 프로그램이다. 이 코드는 실행되는 각각의 단계들을 모두 이해하지 못하면 혼란스럽다.
1. LET N2 = ABS(INT(N)) 2. LET B$ = "" 3. FOR N1 = N2 TO 0 STEP 0 4. LET N2 = INT(N1 / 2) 5. LET B$ = STR$(N1 - N2 * 2) + B$ 6. LET N1 = N2 7. NEXT N1 8. PRINT B$
1.1.1 혼란의 첫 번째 유형 : 지식의 부족
먼저 APL 코드를 보고 숫자 n을 어떻게 이진수 표현으로 변경하는지 살펴보자.
앞서 언급했지만 다시 한번 말하자면 이 코드가 혼란스러운 이유는 T가 의미하는 바를 모르기 때문이었다.
이 책을 읽는 독자 대부분은 APL을 모를 테니 연산자 T의 의미도 모를 것이다. 즉 코드가 혼란스러운 이유는 T에 대한 지식이 없기 때문이다.
1.1.2 혼란의 두번째 유형 : 정보의 부족
두 번째 예제 코드의 혼란은 조금 다른 이유 때문이다. 자바 언어의 전문가가 아니라 해도 프로그래밍 언어를 어느 정도 알고 있는 독자라면 이진수 표현으로 변환하는 부분을 찾을 수 있을 것이다.
하지만 toBinaryString() 메서드가 내부적으로 어떻게 작동하는지 모른다면 이 코드도 혼란스러울 수 있다.
이 프로그램이 어떤 일을 하는지 메서드 이름으로부터 유추할 수 있지만, 이 메서드가 구체적으로 어떤 일을 수행하는지 이해하려면 메서드의 내부를 더 살펴봐야 한다. 따라서 여기서 혼란의 원인은 이 메서드에 대한 정보가 부족하다는 점이다.
toBinaryString() 메서드가 정확하게 어떻게 동작하는지에 대한 정보를 얻으려면 메서드의 내부 코드를 따로 살펴봐야 한다.
1.1.3 혼란의 세 번째 유형 : 처리 능력의 부족
세 번째 예제 코드에서는 변수 이름이나 연산자를 통해 코드가 무슨 일을 하는지 유추할 수 있다.
하지만 코드를 따라가다 보면 머릿속에서 모든 과정을 처리하기가 어렵다. 이 코드는 각각의 단계가 실행되는 것을 한눈에 파악할 수 없기 때문에 혼란스럽다.
이러한 혼란은 처리 능력이 부족하기 때문이다. 변수에 임시로 저장되는 값을 모두 다 기억하거나 각각의 경우 어떤 동작들이 수행되는지를 동시에 알기가 쉽지 않다. 이 프로그램이 무슨 일을 하는지 이해하려면 변수들이 중간에 어떤 값을 갖는지 종이에 따로 적거나 코드에 적어놔야 한다.
코드가 이해하기 어렵고 혼란스러우면 불편하고 꺼림칙하기 마련인데 이러한 혼란을 초래하는 원인을 세 개의 예제를 통해 살펴봤다.
- 프로그래밍 언어나 알고리즘 혹은 업무 영역에 대한 지식이 없는 경우 혼란이 생길 수 있다.
- 코드를 이해하기 위해 필요한 정보를 충분히 가지고 있지 못하는 경우에도 혼란이 생길 수 있다.
- 요즘은 코드가 다양한 라이브러리, 모듈, 패키지 등 사용하기 때문에 코드를 잘 이해하기 위해서는 이들에 대한 정보를 얻기 위해 많이 찾아봐야 하고, 동시에 찾아보는 일을 하기 전에 무엇을 하고 있었는지도 기억해야 한다.
- 코드가 너무 복잡해서 혼란이 생기는 경우인데, 이는 두뇌의 처리 용량이 부족하기 때문이다.
1.2 코딩에 영향을 주는 인지 과정
앞에 대략 설명했듯이, 세 가지 서로 다른 종류의 혼란은 각각 서로 다른 종류의 인지 과정과 연관되고, 이 과정은 기억과 관련이 있다.
지식이 없다는 것은 두뇌의 장기 기억 공간에 해당 내용이 없다는 것을 뜻한다.
장기 기억 공간은 기억하는 내용을 반영구적으로 저장하는 곳이다.
반면에, 지식이 아닌 어떤 정보가 부족할 때는 단기 기억 공간에 해당 내용이 없기 때문이다.
정보를 수집할 때 단기 기억 장소에 일시적으로 저장하지만, 다른 정보를 찾는 과정에서 이미 수집해놓은 정보 중 일부는 잊어버린다.
마지막으로, 많은 정보를 처리할 때는 작업 기억 공간에 영향을 미친다.
우리는 사고할 때 이 영역을 사용한다.
요약하자면, 우리가 여러 종류의 혼란을 겪을 때 다음과 같은 서로 다른 종류의 인지 과정이 관련된다.
- 지식의 부족 = 장기 기억 공간의 문제
- 정보의 부족 = 단기 기억 공간의 문제
- 처리 능력의 부족 = 작업 기억 공간의 문제
이들 세 가지 인지 과정은 코드를 분석할 때 뿐만 아니라 코드를 작성하거나 시스템을 설계할 때 혹은 문서를 작성할 때와 같이 모든 종류의 인지 활동에 나타난다.
1.2.1 LTM과 프로그래밍
프로그래밍과 관련한 첫 번째 인지과정은 LTM이다. 여기에 있는 기억은 아주 오랫동안 보관된다.
대부분 사람은 몇 년 전에 일어났거나 심지어 몇십 년 전에 일어난 일조차 기억한다. 우리가 어떤 일을 할 때든 LTM이 사용된다.
이진 검색을 하는 프로그램을 작성할 때, 추상적인 알고리즘과 프로그래밍 언어의 문법을 기억하고 나아가 키보드로 입력하는 동작을 기억하는 일을 모두 LTM이 한다.
LTM은 프로그래밍과 관련해서 여러 가지 다른 종류의 정보를 저장한다. 예를 들어 어떤 기술을 성공적으로 적용한 순간, 자바 언어에서 키워드의 의미나 maxint의 값이 2147483647이라는 사실, 혹은 영어 단어의 의미 등이다.
LTM은 오랜 시간 동안 저장한다는 점에서 컴퓨터의 하드 드라이브와 비슷하다.
APL 프로그램 : LTM
APL 예제 코드를 읽을 때는 LTM을 가장 많이 사용한다. 우리가 APL 키워드 T의 의미를 알고 있다면 코드를 읽을 때 그것을 LTM으로부터 인출 할 것이다.
APL 예제 코드를 통해 언어의 문법에 대한 지식도 중요하다는 사실을 알 수 있다. APL에서 T가 의미하는 바를 알지 못하면 그 코드를 이해하기 어렵다. 하지만 T가 어떤 수의 값을 다른 진법의 수로 변환해주는 이항 부호화 함수라는 것을 알면 코드 분석은 훨씬 간단해진다.
말로 된 설명을 읽을 필요도 없고 각 단계별로 어떻게 동작하는지 이해하지 않아도 된다.
STM과 프로그래밍
두 번째 인지 과정은 STM과 관련이 있다. STM은 들어오는 정보를 잠시 보관하기 위해 사용된다.
누군가와 통화 중에 전화번호를 알려줄 때 이 번호는 LTM에 저장되는 것이 아닌 STM에 우선 저장된다.
STM은 크기에 제한이 있는데, 이 크기에 대한 추정치는 학자마다 다르지만 STM이 기억할 수 있는 항목의 최대치가 12개를 넘지 않는다는 점에는 대부분의 학자가 동의한다.
코드 분석을 예로 들자면, 코드에서 키워드, 변수명, 자료구조 등이 STM에 일시적으로 저장된다.