코드를 더 깊게 이해하기들어가며5.1 “변수 역할” 프레임워크5.1.1 변수는 각자 다른 일을 한다.5.1.2 11가지 역할5.2 역할과 패러다임
5.2.1 역할의 이점5.2.2 헝가리안 표기법5.3 프로그램에 대해 깊이 있는 지식을 얻으려면5.3.1 텍스트 지식 대 계획 지식5.3.2 프로그램 이해의 여러 단계깊은 코드 이해 4단계 적용해보기5.4 텍스트를 읽는 것과 코드를 읽는 것은 유사하다5.4.1 코드를 읽을 때 우리 뇌에서는 무슨 일이 일어나는가?5.4.2 프랑스어를 배울 수 있다면 파이썬도 배울 수 있다5.5 코드 읽기에 적용해볼 수 있는 텍스트 이해 전략5.5.1 기존 지식의 활성화5.5.2 모니터링5.5.3 코드에서 중요한 라인을 결정하기5.5.4 변수명의 의미를 추론하기5.5.5 시각화5.5.6 질문하기5.5.7 코드 요약결론
코드를 더 깊게 이해하기
들어가며
익숙하지 않은 코드를 읽을 때 무슨 일을 하는지 이해하기 어려울 수 있다.
- 익숙하지 않은 코드를 읽을 때 인지부하가 높아진다.
- 문법과새로운 프로그래밍 개념을학습하도 리팩터링하면 인지 부하가 매우 낮아질 수 있다.
5장은 코드에 대해 생각하는 것이 주제다.
5.1 “변수 역할” 프레임워크
- 코드에 대해 추론할 때는 변수가 중심적인 역할을 한다.
- 변수가 어떤 종류의 정보를 담고 있는지 이해하는 것은 코드를 추론하고 수정하는 데 결정적인 역할을 한다.
- 어떤 변수가 나타내고자 하는 것을 이해하지 못하면 코드에 대해 생각하는 것이 매우 어려워진다.
5.1.1 변수는 각자 다른 일을 한다.
- 변수가 수행하는 여러 가지 다른 역할에 대한 예로 다음과 같은 파이썬 코드를 살펴보자.
upperbound = int(input('Upper bound?')) max_prime_factors = 0 for counter in range(upperbound): factors = prime_factors(counter) if factors > max_prime_factors: max_prime_factors = factors
변수 역할 프래임워크를 변수들의 동작에 존재하는 차이점을 포착한다.
- upperbound: 최근값 보유자역할을 가지고 있다(가장 최근에 입력된 상한 값을 보유하기 때문이다.)
- counter: 스테퍼역할로, 루프를 따라 반복한다.
- max_prime_factors: 목적값 보유자역할로, 프로그램이 계산을 통해 찾고자 하는 값을 저장한다.
- factors: 최근값 보유자 역할을 한다.
5.1.2 11가지 역할
- 고정값: 초기화를 통해 값이 할당된 이후 값이 변경되지 않는 변수다.
- 스테퍼: 루프를 반복 실행하며 값이 단계적으로 변하는 변수가 스테퍼 역할을 한다.
- 플래그: 무엇인가 발생했거나 어떤 경우에 해당하는지를 나타내는 변수
- 워커: 워커는 스테퍼와 유사하게 자료구조를 순회한다.
- 최근갑 보유자: 어떤 값이 변해갈 때 가장 최근에 변경된 값을 갖는 변수다.
- 목적값 보유자: 어떤 값에 대해 반복할 때는 그 목적이 어떤 특정한 값을 찾는 것일 수 있다.
- 모집자: 모집자는 데이터를 모으거나 모은 데이터에 대해 어떤 연산을 수행하는 얻은 값을 저장하는 변수다.
- 컨테이너: 값을 새로 추가하거나 삭제할 수 있는 자료구조라면 어떤 것이라도 컨테이너 변수이다.
- 추적자: 어떤 알고리즘에서는 이전 값 혹은 다음 값을 추적해야 할 필요가 있다.
- 조직자: 때론 추가적인 처리를 위해 변수의 값을 변환해야 한다.
- 임시: 임수 변수는 잠시만 사용하기 위한 변수
5.2 역할과 패러다임
역할은 특정한 프로그래밍 패러다임에만 제한되지 않고 모든 패러다임에 나타난다.
public class Dog{ String name; int age; public Dog(String name, int age){ this.name = name; this.age = age; } public void birthday(){ age++; } }
- name: 고정값 (name은 설정한 후 변경되지 않음)
- age: 스테퍼 역할을 수행
5.2.1 역할의 이점
변수 역할 프레임워크는 프로그래머가 코드를 읽고 이해하는 데 도움을 준다.
- 변수 역할 프레임워크 연습
코드를 프린트하거나 PDF로 저장하여 주석을 달면 도움이 된다.
처음에는 거부감이 들 수 있지만 생각 이상으로 깊어지고 코드를 다른 수준으로 파악하는 것이 가능해진다.
5.2.2 헝가리안 표기법
헝가리안 표기법은 변수의 타입을 변수명에 나타내는 방법이다.
ex) string strName = "홍길동"; <- strName은 타입을 변수명에 노출함
오늘날은 잘 사용되지는 않는다.
5.3 프로그램에 대해 깊이 있는 지식을 얻으려면
5.3.1 텍스트 지식 대 계획 지식
텍스트 구조 지식은 키워드가 하는 일이나 변수의 역할 같은 프로그램의 표면적인 이해와 관련되어 있다.
반면 계획 지식은 프로그래머가 프로그램을 작성할 때 계획한 것이 무엇인지 혹은 무엇을 달성하려고 했는지를 나타낸다.
5.3.2 프로그램 이해의 여러 단계
표면적 지식으로부터 좀 더 갚은 이해로의 진행은 다음과 같은 4가지 단계를 거친다.
- 초점을 찾는다. (main)
- 초점으로부터 지식을 확장한다.
- 관련된 개체로부터 개념을 확장한다.
- 여러 개체에 걸쳐 있는 개념을 이해한다.
코드를 읽을 때 초점은 중요한 개념이다.
어디서부터 읽기 시작해야 할지 알아야 한다는 것이다.
하지만 어떤 기술, 스택, 프레임워크 의존성 주입등으로 인해 초점을 찾기 어려울 수 있다.
따라서 어디서 부터 시작하는지 알려면 프레임워크에서 코드가 어떻게 연결되는지 알아야 한다.
깊은 코드 이해 4단계 적용해보기
4장에서 살펴본 인지부화를 줄이기 위한 방법을 적용해보자.
- 모든 변수를 원으로 표시한다.
- 비슷한 변수들을 연결한다.
- 모든 메서드나 함수 호출을 원으로 표시한다.
- 메서드나 함수 호출을 정의와 연결한다.
- 클래스의 모든 인스턴스를 원으로 표시한다.
- 클래스와 그 클래스의 인스턴스를 연결한다.
이러한 방법을 최대로 활용하는 법은 위에서 나온 PDF로 출력하여 손으로 직접 그리며 주석을 달고 코드를 이해하는 과정이다.
5.4 텍스트를 읽는 것과 코드를 읽는 것은 유사하다
프로그래머는 평균적으로 자신읭 업무 시간의 60%를 코드를 읽는데 사용한다.
하지만 많은 양의 코드를 읽어야 함에도 코드 읽는 법을 그다지 많이 연습을 안한다.
5.4.1 코드를 읽을 때 우리 뇌에서는 무슨 일이 일어나는가?
브로드만 영역..? 이거 좀 어렵네요..
요약하자면 변수명을 유추하기 어렵게 해서 실험을 진행했는데 우리가 긁을 읽고 유추하는 영역과 유사한 영역의 활성화가 되었다는것을 알게되었따..라는 것같습니당
5.4.2 프랑스어를 배울 수 있다면 파이썬도 배울 수 있다
코드를 읽을 때 fMRI 스캔을 통해 작업 기억 공간과 언어 처리에 관련 있는 두뇌의 영역이 프로그래밍과 연관된다는 것을 알게 되었다.
이 사실은 과연 기억 공간 용량이 크고 언어 능력이 좋은 사람이 더 뛰어난 프로그래머가 된다는 뜻일까?
컴퓨터 과학은 종종 (대부분) STEM(과학, 기술, 엔지니어링, 수학) 분야의 일부로 간주된다.
하지만 프랫의 연구는 산술 능력이 프로그래밍 능력에 대해 예측력이 별로 없음을 보여준다.
프로그래밍 언어를 얼마나 잘 배울 수 있는지 자연어를 배우는 능력으로 예측 가능하다는 결과를 보여주고있다.
사람들은 어떻게 코드를 읽는가?
텍스트를 어떻게 읽는지 부터 생각을 해본다면 여러가지 방법이 있다.
- 자세히 읽기 전에 훑어보고 전체적인 흐름을 파악한다.
- 의도적으로 테스트에 딸린 이미지만 볼 수 있다.
- 읽고 있는 내용을 요약/강조한다
- 텍스트만 훑는 동시에 그림을 같이 본다.(텍스트 이해 전략)
프로그래머는 코드를 읽을 때 스캔을 먼저 한다
사람들이 시각을 통해 무엇을 보는지 이해하고자 할 때 시각 추적기가 사용된다.
시각 추적기는 스크린이나 페이지에서 주의를 집중하는 위치를 알아내는 데 사용하는 장치임
실제 연구에서는 코드를 검토하는 데 사용한 시간의 처음 30%동안 코드의 70%를 훑어본다는 것을 발견했다.
초급 프로그래머와 숙련된 프로그래머는 코드를 읽는 방식이 다르다
초급 프로그래머의 경우 텍스트를 읽을 때 시야의 움직임의 약 80%는 순차적인 것이었고, 코드를 읽을 때는 75% 정도가 순차적이었다.
5.5 코드 읽기에 적용해볼 수 있는 텍스트 이해 전략
코드를 이해하려고 할 때 사용하는 인지적 능력은 자연언어를 읽을 때 사용하는 것과 비슷하다.
효과적인 읽기 전략과 학습법에 대한 연구가 지금까지 많이 이루어졌다. 텍스트 이해에 대한 전략은 7개의 범주로 나뉜다.
- 활성화: 관련된 것들을 적극적으로 생각해서 이미 가지고 있는 지식을 활성화하는 것
- 모니터링: 텍스트를 읽으면서 자신이 이해한 것(이해하지 못하는 것까지)을 관찰하고 기록하는 것
- 중요도 결정: 텍스트에서 어느 부분이 중요한지 결정하는 것
- 추론: 텍스트에서 명시적으로 주어지지 않는 사실을 유추하는 것
- 시각화: 깊이 있는 이해를 위해 텍스트에 대한 도표를 만드는 것
- 질문: 텍스트에 대해 질문하는 것
- 요약: 텍스트를 짧게 요약하는 것
5.5.1 기존 지식의 활성화
프로그래머는 코드를 읽기 전에 먼저 스캔을 한다.
코드 내에 존재하는 개념과 문법적 요소들에 대한 일차적인 이해가 가능하기 때문이다.
익숙하지 않은 코드를 미리 정한 시간동안 공부하라 그리고 다음과 같은 질문에 답해볼 것
- 가장 먼저 시선을 끈 코드의 구성 요소(변수, 클래스, 프로그래밍 개념 등)는 무엇인가?
- 왜 그런가?
- 두 번째로 주의를 끈 것은 무엇인가?
- 왜 그런가?
- 그 두 가지(변수, 클래스, 프로그래밍 개념 등)는 서로 관련이 있는가?
- 코드에 어떤 개념들이 존재하는가? 그 문법 요소들을 다 알고 있는가?
- 코드에 어떤 도메인 개념들이 존재하는가? 그 도메인 개념들을 다 알고 있는가?
5.5.2 모니터링
코드를 읽을 때 현재 무엇을 읽고 있는지, 이해는 하고 있는지를 계속 추적하는 것이 중요하다
코드를 프린트해서 이해되는 라인과 이해되지 않는 라인을 표시하는 것도 좋은 방법이다. (v & ?)
5.5.3 코드에서 중요한 라인을 결정하기
코드를 읽을 때 어떤 라인이 중요한지 파악하는 것이 유용할 때가 있다.
이것은 의도적인 연습을 통해 가능하다.
익숙하지 않은 코드의 일부를 선택해서 중요한 라인을 찾아보고 답해보자
- 중요한 라인으로 선택한 이유는 무엇인가?
- 그 라인의 역할은 무엇인가? 예를 들면 초기화나 입출력 혹은 데이터를 수행하는 라인인가?
- 그 라인은 프로그램 전체 목적과 어떻게 관련되는가?
5.5.4 변수명의 의미를 추론하기
프로그램의 의미가 코드의 구조 자체에 담겨 있을 때가 많다.
예를 들면 루프나 조건문 사용 같은 것이다.
또한 변수 등 프로그램 구성 요소의 이름으로부터 의미를 유추할 수 있는 경우도 있다.
이미 살펴봤지만 변수 이름은 중요한 표식이다.
코드가 하는 일에 대한 힌트를 제공하는 기능을 한다.
변수 이름에 대한 테이블을 이용해서 다음 질문들에 답할 수 있다.
- 코드의 도메인 혹은 주제는 무엇인가?
- 어떤 프로그래밍 개념들이 사용되었는가?
- 이름으로부터 알 수 있는 사실은 무엇인가?
- 서로 관련되어 있는 이름은 무엇인가?
- 배경을 알지 않으면 의미가 모호한 이름이 있는가?
- 모호한 변수명이 해당 코드에서 가질 만한 의미는 무엇이 있을까?
5.5.5 시각화
매우 복잡한 코드에서 유용한 한 가지 방법은 변수가 연관된 모든 연산을 나열하는 것이다.
5.5.6 질문하기
코드를 읽을 때 스스로에게 질문하는 것이 코드의 목적과 기능에 대해 이해하는 데 도움이 된다.
아래와 같은 질문은 텍스트의 구조 지식 너머로 더 깊이 파고들어 계획 지식에 도달하고 코드를 이해하는 데 도움이 될 수 있다.
- 코드에서 다섯 가지의 중심 개념은 무엇인가? 이 중심 개념이 식별자, 테마, 클래스 혹은 주석문내의 정보로 나타나는가?
- 중심 개념을 찾기 위해 어떤 전략을 사용했는가? 예를 들어 메서드 이름, 문서 혹은 변수몀을 살펴봤다거나 아니면 시스템에 대해 이미 가지고 있는 지식을 활용했는가?
- 코드에서 발견되는 가장 중심적인 컴퓨터 과학의 중심 개념 다섯가지는 무엇인가? 알고리즘, 자료구조, 가정, 사용된 기술 등이 이에 해당할 수 있다.
- 코드 작성자가 내린 결정 사항이 무엇인가? 예를 들면 특정 버전의 알고리즘을 구현하기로 한 결정, 특정 디자인 패턴을 사용하기로 한 결정, 특정 기술을 사용하기로 한 결정 등이 있다.
- 그런 결정을 내리는 데 상정한 가정은 무엇인가?
- 그 결정의 효과는 무엇인가?
- 그 결정의 잠재적 위험 요소는 무엇인가?
- 다른 해결책으로 어떤 것이 있을까?
5.5.7 코드 요약
코드 이해를 위해 적용할 수 있는 텍스트 읽기 전략 가운데 마지막으로 방금 전에 읽은 코드를 요약하는 것이 있다.
- 짧은 코드를 하나 선택하고 테이블을 채우면서 요약해보라.
항목 | 요약 |
코드의 목적: 달성하고자 하는 바? | ㅤ |
가장 중요한 라인 | ㅤ |
가장 관련 있는 도메인 개념 | ㅤ |
가장 관련 있는 프로그래밍 구성 요소 | ㅤ |
코드 작성시 내려진 결정 | ㅤ |
결론
- 생소한 코드를 읽을 때는 스테퍼나 목적값과 같은 변수의 역할을 이해하는 것이 코드를 깊이 이해하는 데 도움이 된다.
- 코드의 이해에 관해서는 텍스트 구조 지식과 계획 지식 사이에 차이가 있다.
- 코드를 읽는 것은 자연언어 텍스트를 읽는 것 사이에는 유사한 점이 많다.
- 시각화, 요약과 같은 자연언어 텍스트를 심도 있게 이해하기 위해 사용하는 전략들을 코드의 이해를 돕기 위해 사용할 수 있다.