[독서] 프로그래머의 뇌

ClassBinu·2024년 4월 13일

F-lab

목록 보기
5/65

멘토님께 추천 받은 책

Part1 코드 더 잘 읽기

코드 읽기가 어려운 이유

  1. 지식이 없음(처음 보는 언어): LTM 문제
  2. 정보가 없음(메서드 내부 로직 추상화): STM 문제
  3. 처리 능력 부족(코드가 복잡): 작업 기억 공간 문제

코드 이해하기

프로그래머의 시간 중 60%는 코드 작성이 아닌 코드 이해에 사용됨.
"프로그램은 사람이 읽을 수 있도록 작성해야 한다. 기계가 실행하는 것은 부차적인 일이다."

디자인 패턴을 활용하면 코드를 더 잘 묶을 수 있다.
이건 코드를 이해하는데 도움이 준다.
즉, 디자인 패턴을 이해하면 코드를 청킹하는 능력이 올라가고,
이건 코드 기억과 이해에 도움이 된다!

주석이 도움이 될까?

주석이 있으면 코드 읽는 시간이 더 늘어남.
주석문이 있으면 새로운 팀원이 코드를 이해하는데 도움이 됨.
저수준 주석은 청킹에 오히려 방해가 된다.
예) i의 값을 1씩 증가 시킨다. ❌
고수준 주석은 청킹에 도움이 된다.
예) 이 함수는 주어진 이진 트리를 중위 순회하며 프린트한다. ✅

문법 빠르게 배우기

문법에 대한 지식이 많을 수록 청킹이 쉽다.
즉, 코드를 이해하는 게 빨라진다.

플래시카드 사용해서 문법 익히기
프롬프트가 있는 면을 읽고 나서 해당 문법 기억하는 방식
프롬프트를 읽고 정답을 적고, 카드를 뒤집어서 확인

# 1. 기본 문법
numbers = [x for x in numbers]

# 2. 필터
odd_numbers = [x for x in numbers if x % 2 = 1]

# 3. 계산
[x*x for x in numbers]

# 4. 필터와 계산
squares = [x*x for x in numbers if x > 25]

복잡한 코드 읽기

코드 읽기 어려운 이유는 작업 공간 부족으로 인한 인지 부하가 원인

리팩토링은 이런 인지 부하를 줄이기 위한 기법이다!

람다, 리스트 컴프리헨션은 향상된 기법이지만 이로 인해 인지 부하가 발생한다면(팀 내, 혹은 본인이)
오히려 for, while로 바꿔서 인지 부하를 줄이는 게 유용할 수 있음.
삼항 연산자도 마찬가지.

오호, 무조건 최신 기법이나 축약 문법이 좋은 게 아니라 이게 만약 인지 부하를 유발한다면 오히려 풀어 쓰는 게 좋은 코드일 수 있다!

https://pythontutor.com/

Part2 코드에 대해 생각하기

변수의 11가지 역할

  • 고정값: 상수
  • 스테퍼: 루프 마다 값이 변하는 변수
  • 플래그
  • 워커(walker): 스테퍼와 비슷하지만 비정형적인 값(i처럼 순차적으로 증가하는 게 아님)
  • 최근값 보유자: 최근에 변경된 값
  • 목적값 보유자: 현재 까지 값 중 특정 조건에 부합하는 값
  • 모집자: 데이터 수합, 또는 그 값에 연산을 수행해서 얻은 값(e.g. sum)
  • 컨테이너: 값을 추가/삭제 할 수 있는 자료 구조(리스트, 배열, 스택, 트리)
  • 추적자: 이전/다음 값 추적(e.g. 연결 리스트에서 이전 값에 대한 포인터)
  • 조직자: 임시 변수. 문자열 내 개별 문자 접근을 위해 이걸 문자 배열로 변환하는 경우
  • 임시: temp, t 등 임시

프로그래밍 언어 학습

프로그래밍은 산술 능력이 아닌 언어 능력의 예측력이 더 크다.

정신 모델(Mental Model)

풀어야 할 문제에 대해 추론하기 위해 사용할 수 있는 작업 기억 공간 내의 추상화

e.g. 컴파일 언어임에도 코드가 한 줄 씩 실행되고 있다고 생각
e.g. 변수라는 상자에 숫자가 들어가 있다고 생각하는 것(진짜 숫자가 들어가 있지 않지만)

나만의 방식대로 문제를 추상화하는 것

개념적 기계

프로그래밍 언어에서 정신 모델과 비슷한 역할을 하는 것

진짜 물리적인 작동 매커니즘이 아닌 추상화해서 이해하는 것
개념적 기계는 컴퓨터가 작동하는 방식을 설명한다.

정신 모델이 나만의 방식대로 이해하기 쉽게 추상화 하는 것이라면,
개념적 기계는 실제 컴퓨터의 동작은 비유나 예시 등으로 실제 동작 원리에 맞게 추상화 하는 것.

프로그래밍 언어에 대해서 배울수록 정신 모델이 점점 더 개념적 기계에 가까워 짐

생각의 버그

새 정보 -> 감각 기억 -> STM -> 작업 기억 <- LTM

두 번째 프로그래밍 언어 학습이 쉬운 이유: 긍정적 전이
오개념이 발생하는 이유: 부정적 전이

Part3 좋은 코드 작성하기

이름 짓기

일반적으로 snake보다 camel이 식별자로서 더 높은 정확도를 보임.
근데 둘 다 훈련하는 것이 좋음.

코드 스멜(by 파울러)

p.161

  • 긴 메서드
  • 많은 인수
  • 스위치 문
  • 다른 것처럼 보이나 같은 클래스
  • 원시 타입 집착
  • 미완성 라이브러리 클래스
  • 너무 큰 클래스
  • 게으른 클래스
  • 데이터 클래스
  • 임시 필드
  • 데이터 그룹
  • 산재한 수정
  • 기능 이전- 부적절한 연관
  • 중복 코드 또는 코드 클론
  • 주석문
  • 메시지 체인
  • 미들맨
  • 평행 상속
  • 상속 거절
  • 샷건 수술
  • 추측에 근거한 일반성

Part4 협업

인간은 멀티태스킹을 못 함.
멀티태스킹을 할 수 있다고 착각하는 사람들은 자신이 생산적이라고 느끼지만, 업무 효율은 떨어짐.

코드 줄 수가 중요한 게 아니라 청크가 중요하다.

타입을 모두 명시하는 게 좋은 것만은 아님.
이 경우 점도(코드 변경 가능성)가 올라가서 끈적한 코드가 된다.

요약

코드는 인지 부하를 일으키지 않도록 작성해야 한다.

  • 리팩토링(반복문/컴프리헨션, if/switch)
  • 주석
  • 변수/함수명
  • GPT

0개의 댓글