본문 바로가기
중간 회고/책

<프로그래머의 뇌> - 펠리너 헤르만스

by Chaedie 2022. 9. 4.
728x90

<프로그래머의 뇌 : 훌륭한 프로그래머가 알아야 할 인지과학의 모든 것>

  • 취미가 독서인 나로썬 [ "프로그래머", "뇌", "인지 과학" ] 이라는 미친듯한 어그로의 제목을 보고 구매하기 버튼을 누르지 않을 수 없었다.
  • 1독 한 결과 내가 평소에 생각하던 프로그래밍 공부법, 또는 프로그래밍에서 주요하다고 생각한 포인트가 솔찍히 거의 90% 이상 겹쳐서 어찌보면 도움이 되지 않은 책이라고 생각할 수도 있었다.
  • 하지만 반대로 생각하면, 내가 뇌피셜로 생각했던 내용들, 경험적으로 "이러이러하게 공부해보니까 도움이 되더라~"라고 생각하고 동기들에게 이야기한 내용들을 인지과학 측면에서 논문등의 근거를 통해 주장을 뒷받침해주는 근거들이 있어서 아주 도움이 되는 책이었다.

아래는 책을 읽으며 밑줄 친 부분이나 스스로 코멘트 한 부분이다.

밑줄, 코멘트 등 클리핑

  • 우리가 무슨 일을 할 때 가장 중요한 것은 마음가짐이나 심리다. 처음 접하는 내용이기에 이해가 어려운 것은 당연하다. 이게 마치 자신의 머리가 나빠서 이해를 하지 못한다고 생각하고 스스로 위축되기 시작하면 프로그래밍을 배우는 과정은 더욱 험난할 것이고 중도에 포기할 가능성도 높다. 이 책은 그런 의미에서 이제 막 프로그래밍을 배우기 시작하는 사람들에게 꼭 필요한 책이다.

  • 이 책을 최대한 활용하려면 개발팀이나 대형 소프트웨어 시스템에서 근무한 경험, 그리고 신규 팀원 적응 지원을 맡아본 경험이 있으면 좋다.

  • ** 실제로 새로운 정보를 기존 지식과 경험에 연결할 수 있을 때 학습은 향상되며, 그것이 이 책이 다루는 내용이기도 하다.**

파트 1. 코드 더 잘 읽기

챕터 1. 코딩 중 겪는 혼란에 대한 이해

  • 코드가 이해하기 어렵고 혼란스러우면 불편하고 꺼림칙하기 마련인데 이러한 혼란을 초래하는 원인을 세 개의 예제 프로그램을 통해 살펴봤다. 첫째, 프로그래밍 언어나 알고리즘 혹은 업무 영역에 대한 지식이 없는 경우 혼란이 생길 수 있다. 둘째, 코드를 이해하기 위해 필요한 정보를 충분히 가지고 있지 못하는 경우에도 그렇다. 요즘은 코드가 다양한 라이브러리, 모듈, 패키지를 사용하기 때문에 코드를 잘 이해하기 위해서는 이들에 대한 정보를 얻기 위해 많이 찾아봐야 하고, 동시에 찾아보는 일을 하기 전에 무엇을 하고 있었는지도 기억해야 한다. 셋째, 코드가 너무 복잡해서 혼란이 생기는 경우인데, 이는 두뇌의 처리 용량이 부족하기 때문이다.

  • 이 책을 읽는 독자 대부분은 자바 언어에 익숙할 텐데, 이 코드가 어떤 일을 하는지 설명해보라고 하면 자바의 키워드 public class와 public static void main은 굳이 설명하지 않을 것이다. 심지어 예제 코드에서 main의 이름을 의도적으로 mian으로 바꿔놨지만 미처 알아채지 못한 독자들도 많을 것이다.

챕터 2. 신속한 코드 분석

  • 프로그래머가 일하는 시간 중 코드를 읽고 분석하는 일은 생각보다 많다. 연구에 의하면 프로그래머의 시간 중 거의 60%를 코드를 '작성'하는 게 아니라 '이해'하는 데 사용한다고 한다. 따라서 정확도를 유지하면서 코드를 빨리 이해하도록 향상한다면 프로그래밍 기술이 크게 개선되는 셈이다.

  • "프로그램은 사람이 읽을 수 있도록 작성해야만 한다. 기계가 실행하는 것은 부차적인 일이다."

  • 코드를 읽는 기술의 수준이 높아지면 추가 정보를 찾기 위해 코드 여기저기를 살피는 횟수 역시 줄어들게 된다. 좀 더 효과적인 프로그래머가 되면 코드를 찾는 데 허비할 시간에 버그를 고치거나 새로운 기능을 추가할 수 있다.

  • 2.2 기억의 크기 제한을 극복하기

  • 2.2.1 단위로 묶는 것의 위력 : 청크

    • ... 반면 전문가 그룹은 첫 번째 실험에서 다른 전략을 보였다. 이 그룹의 전문 체스 선수들은 LTM에 저장되어 있는 지식을 많이 활용했다. 예를 들면 "시실리언 오프니이고, 저기서 나이트하나는 2칸 왼쪽" 같은 식이었다.
    • 어떤 전문 플레이어는 말의 초기 위치를 자신의 과거 경험과 연결시키거나 자신이 보거나 읽었던 내용과 연결시키기도 했다. ... 이런 기억은 LTM에 저장된다. 이전의 기억을 살려 말의 위치를 기억하면 STM은 더 적게 필요하다.
    • 평범한 그룹은 전문가 그룹처럼 정보를 논리적인 방식으로 묶을 수가 없었다.
    • 더호르트는 몇 개의 그룹으로 묶은 정보를 청크라고 불렀다. 예를 들어 '시실리언 오프닝'은 하나의 청크이므로 STM의 기억 공간 하나만을 차지한다.
  • 코드에서의 청킹

    • 새로운 팀원을 교육할 때나 새로운 프로그래밍 언어를 배울 때 이점을 기억해야 한다. 심지어 다른 프로그래밍 언어를 잘 아는 뛰어난 프로그래머조차, LTM에 아직 저장되지 않은 익숙하지 않은 키워드, 구조, 도메인 개념을 기억하는 데 어려움을 겪는다.
  • STM에 도달하기 전에 감각 기억 공간이라는 영역을 통과한다. ... 이들 감각이 다 프로그래밍과 관련 있는 것은 아니기에 이 장에서는 영상 기억 공간이라는 시각관련 기억 공간에 대해서만 다룬다.

  • 청크로 묶을 수 있는 코드를 작성하는 방법

    • 그룹으로 나누기 쉬운 (따라서 두뇌에서 처리하기 쉬운) 코드를 작성하는 방법에 대한 연구가 있었다.
  • 디자인 패턴의 사용

    • 그룹으로 묶기 쉬운 코드를 작성하려면 디자인 패턴을 사용하면 된다.

    • 연구 결과에 의하면 코드가 주석문을 포함하고 있으면 개발자들이 코드를 읽는 시간이 더 많이 들어간다고 한다. 주석문은 코드를 읽는 시간을 늘리기 때문에 바람직하지 않은 것이라고 생각할지도 모르겠지만, 사실 이는 개발자들이 코드를 읽을 때 주석문 역시 읽는다는 것을 시사한다.

    • 취인 판의 2010년 메릴랜드 대학교 박사 학위 논문에 의하면, 개발자들은 코드를 읽을 때 주석문에 굉장히 많이 의존한다. 특히 '이 함수는 주어진 이진 트리를 중위 순회 하며 프린트 한다.' 같은 고수준 주석문은 코드를 청크 단위로 쪼개는 데 도움이 된다. 반면 i++; 다음에 'i를 1만큼 증가' 같은 저수준 주석문을 넣는 것은 오히려 청킹 작업에 부담이 된다.

  • 표식 남기기

    • 코드를 청크로 쉽게 쪼개는 데 도움이 되는 마지막 사항은 코드에 어떤 표식을 남기는 것이다.
    • 숙련된 개발자는 코드를 읽고 이해할 때 표식을 많이 이용하지만 초급 개발자는 그렇지 않다는 것을 발견했다.

챕터 3. 프로그래밍 문법 빠르게 배우기

  • 프로그래밍 문법에 대한 지식을 갖는 것에 대해 대수롭지 않게 생각할 수도 있다. 모르면 결국 온라인에서 찾아보면 되니 말이다. 하지만 이전 장에서 살펴봤듯이, 코드를 효율적으로 이해하는 정도는 이미 알고 있는 지식에 의해 영향을 받는다. 따라서 프로그래밍 언어의 문법, 개념과 자료구조를 위우면 코드를 더 빨리 파악하는 데 도움이 된다.

  • 개념, 자료구조, 문법을 더 많이 알수록 두뇌는 더 많은 코드를 쉽게 분리하고 기억하고 처리할 수 있다.

  • 3.1.1 업무 중단이 미치는 나쁜 영향

    • 두 번째 이유는 두뇌가 작업을 하다 업무 중단을 받게 되면, 우리가 생각한 것보다 훨씬 더 좋지 못한 결과를 초래하기 때문이다.
  • 3.2 플래시 카드 사용해 문법 배우기

  • 3.3.2 간격을 두고 반복하기

    • 첫 번째 날에 68회 반복하고 그 다음 날은 7회 반복함으로 총 75회 반복했을 때 단어를 모두 잘 외울 수 있었다. 그리고 같은 단어를 3일에 걸쳐 총 38회 반복했을 때 역시 모두 잘 외웠다.
    • 학습 기간이 끝난 후 1년이 지나서 바릭 가족은 가장 긴 간격인 8주의 간격을 두고 26회 반복한 경우 가장 많은 단어를 기억한다는 것을 알게 됐다.
    • 2주 간격으로 외웠던 그룹은 1년 후 기억한 단어의 비율이 56%였다.
    • 가장 긴 간격을 두고 반복했던 그룹의 단어가 기억하는 비율이 여전히 더 높았다.
    • 요약하자면, 오랫동안 학습한 만큼 더 오래 기억한다. 이것은 많은 시간을 학습해야 한다는 것을 의미하는 게 아니라 더 오랜 간격을 두고 학습해야 한다는 것을 의미한다.
  • 3.4 문법을 더 오랫동안 기억하기

    • 적극적으로 무언가를 일부러 기억해보려고 애쓰는 인출 연습과 기존 기억에 새로운 지식을 적극적으로 연결시키는 정교화다.
    • 앞에서 플래시카드를 설명할 때, 단순히 플래시카드의 양면을 읽기만 하는 것이 아니라고 했다. 프롬프트, 즉 문법을 기억해낼 수 있도록 요청하는 질문이나 단어 혹은 문법 같은 것이 있는 면을 본 다음에 답을 생각해내야 한다.
    • 답을 완전히 알지 못해도 그것을 기억하기 위해 더 많은 노력을 기울이면 쉽게 기억할 수 있다.
  • 3.4.3 정보를 외우는 것은 기억을 강화한다.

    • 학습을 추가로 하지 않고 정보를 기억하려고 능동적으로 노력하는 것만으로도 배운 것을 많이 기억할 수 있다는 것을 이 실험을 통해 알 수 있다.
    • 매번 필요할 때마다 문법을 찾아보기만 하는 것이 왜 좋은 방법이 아닌지 분명해졌을 것이다. 너무 쉽게 정보를 찾고 또 그것이 너무 일상적으로 이뤄지다 보니 우리 두뇌는 문법을 기억할 필요가 없다고 느낀다. 따라서 프로그래밍 문법에 대한 인출 강도가 강화되지 않고 계속 약한 상태로 남아 있게 된다.
    • 문법을 기억하지 않는다는 사실은 악순환을 만들어낸다. 기억하지 않기 때문에 그것을 찾아보는 것이다. 기억하려고 애쓰기보다는 찾아보는 것만 계속하기 때문에 이러한 프로그래밍 개념에 대한 인출 강도가 발전하지 않는 것이고 이 인출 강도가 약하기 때문에 외우는 대신 찾아보는 악순환이 이어진다.
    • 따라서 다음번에 구글에서 프로그래밍 문법에 대해 검색하려고 할 떄, 검색 이전에 먼저 그것을 능동적이고 의도적으로 기억하려고 시도해보기 바란다. 당장 기억이 나지 않더라도 이런 기억하려는 노력은 기억을 강화하고 다음번에 기억해내는 데 도움이 될 것이다. 이렇게 해도 기억이 나질 않는다면 플래시카드를 사용해서 적극적으로 연습해보기 바란다.
  • 3.4.4 능동적 사고를 통한 기억력 강화

    • 기억을 강화하는 두 번째 방법이 있는데 그것은 정보에 대해 능동적으로 생각하고 그것을 반추해보는 것이다. 정보에 대해 생각하는 과정을 정교화라고 부른다. 정교화 작업은 복잡한 프로그래밍 개념을 학습할 때 특별히 효과가 좋다.
    • 기억이 처음 저장될 때 기억의 부호화를 강화할 수 있는 한 가지 방법이 바로 정교화다. 정교화는 기억하고자 하는 내용을 기존 기억과 연관 지으면서 생각하는 것을 뜻하고, 이렇게 한 결과 LTM에 이미 저장되어 있는 스키마타에 맞춰서 새로운 기억이 저장된다.
    • 새로운 정보를 더 잘 기억하고 싶다면 그 정보를 정교화하는 것이 도움이 된다.

챕터 4. 복잡한 코드 읽는 방법

  • 코드를 읽을 때 외재적 인지 부하.
    • 외재적 부하는 프로그래밍의 우발적 복잡성과 유사하다.
    • 코드를 읽을 때 잘 이해가 안 되고 뭔가 적어놓거나 단게별로 실행 순서를 따라가고 싶은 마음이 들면 인지 부하가 높은 것이다.

마치며...

  • 오늘은 <프로그래머의 뇌>라는 훌륭한 책의 내용을 포스팅으로 남겨 보았다. 주 3회라는 포스팅을 채우기 위해 살짝 어거지로 밀어 넣은 감이 있지만, 어쨌든 이 책이 개발 공부를 시작하는 나같은 쥬니어 개발자들에게 아주아주 도움이 되는 책인것은 자명하다.
  • 포스팅에서 스포일러를 막기 위해 파트1만 간략하게 소개했는데, 꼭 도서를 구입해서 1독하는 것을 권한다. 이 정도의 책은 도서관에서 빌려보는것 보다 소장하는것이 좋지 않을까 생각한다.
  • 끝!

댓글