1. 자바스크립트의 태생적 특징
자바스크립트는 과도하다고 느껴질 만큼 친절한 프로그래밍 언어입니다. 웬만해서는 에러없이 실행되며, 작은 실수는 알아서 대응해 주는 등, 되도록 손이 덜 가게끔 설계되어 있습니다. 이를 위해 자바스크립트 엔진 내부에서 암묵적으로 처리해 주는 기능(magic)도 많습니다. 이러한 자바스크립트의 특징은 편리한 경우도 있지만 내부 동작을 이해하기 어렵게 만들기도 합니다.
이는 자바스크립트의 탄생 목적이 일반적인 프로그래밍 언어와 다르기 때문입니다. 대부분의 프로그래밍 언어는 애플리케이션을 개발하기 위한 범용적인 용도로 설계되었습니다. 하지만 자바스크립트는 웹페이지의 단순한 보조 기능을 처리하기 위한 제한적인 용도를 목적으로 태어났습니다.
하지만 자바스크립트는 더 이상 제한적인 용도의 프로그래밍 언어가 아닙니다. 자바스크립트는 프런트엔드와 백엔드 영역의 프로그래밍 언어로 사용할 수 있는 명실상부한 범용 애플리케이션 개발 언어로 성장했습니다. 따라서 자바스크립트를 학습하는 방식도 이에 걸맞게 변화해야 한다고 믿습니다. 이 책은 자바스크립트의 기본 개념과 동작 원리를 깊이 있게 학습하고자 하는 독자를 위해 기획되었습니다.
2. 기본 개념과 동작 원리 이해의 중요성
프로그래머의 역할은 요구사항을 기반으로 문제를 해결하기 위한 방안을 고안하고, 이를 코드로 구현하는 것입니다. 구현된 코드는 의도한 대로 정확히 동작해서 문제를 해결해야 합니다. 이때 자신이 구현한 코드가 컴퓨터 내부에서 어떻게 동작할 것인지 예측 가능해야 하며, 이를 명확히 설명할 수 있어야 합니다.
그러자면 프로그래밍 언어의 기본 개념과 동작 원리를 정확히 이해하는 것이 중요합니다. 기본 개념과 동작 원리를 이해하지 못한 상태에서 복사해서 붙여넣기(copy & paste)로 단순히 동작만 하는 코드를 만들고 거기에 만족한다면 여러분이 구현한 코드는 언제 무너져도 이상할 것이 없는 사상누각일 뿐입니다. 신뢰할 수 없고 유지하고 보수하기 까다로운 코드가 될 것입니다. 그리고 여러분의 문제 해결 능력은 어느 선에서 성장을 멈추고 말 것입니다.
기본 개념은 문맥에 맞는 정확한 용어를 구사할 수 있는 원동력입니다. 문맥에 맞는 정확한 용어를 사용하면 오해를 불러일으키지 않는 명확한 의사소통(communication)이 가능해집니다. 이는 협업의 기본이며 필수 요소입니다. 또한 기본 개념은 특정 프로그래밍 언어에 국한되지 않는 경우가 대부분이므로 프레임워크나 다른 언어를 학습하는 데도 도움이 됩니다.
동작 원리의 이해는 코드의 동작을 예측 가능하게 하며 코드 독해의 원천입니다. 코드를 구현하려면 당연히 자신이 작성하는 코드의 동작을 예측할 수 있어야 합니다. 코드의 동작을 예측하지 못하는 상태에서 코드를 작성한다는 것은 말이 되지 않습니다. 또한 에러를 발생시키는 코드를 만나면 에러가 발생하는 원인을 이해해야 디버깅이 가능합니다. 이를 위해 코드의 동작을 예측할 수 있는 능력은 필수불가결한 요소입니다.
기본 개념과 동작 원리의 이해는 어렵고 생소한 용어로 이뤄진 기술적 의사소통을 가능케 하고, 자신의 머릿속에서 코드를 실행해 볼 수 있는 능력을 갖게 합니다. 이를 통해 다른 사람이 작성한 코드를 읽고 이해하는 것은 물론 의도 또한 파악할 수 있습니다. 즉, 기본 개념과 동작 원리의 이해는 안정적이고 효율적인 코드를 생산할 수 있는 기본기입니다. 기본기는 아무리 강조해도 지나치지 않습니다.
3. 학습 방법
기본 개념과 동작 원리를 이해해야 하는 이유는 결국 코드를 구현하기 위해서입니다. 즉, 기본 개념과 동작 원리를 이해하는 것은 목표가 아니라 과정입니다. 따라서 코드 구현 능력(코딩 스킬)을 갖추기 위한 과정 또한 필요합니다. 이를 위해 제안하는 학습 방법은 다음과 같습니다.
기본 개념과 동작 원리를 기반으로 한 학습
먼저 기본 개념과 동작 원리를 이해하려고 노력해야 합니다. 다만 모든 것을 한번에 학습하려 하지 말고 중요한 키워드를 중심으로 나누어 학습하는 것이 좋습니다. 또한 완벽하게 이해하려 하지 말고 여러 번 반복해서 학습하는 것이 효율적입니다. 이때 학습 중인 키워드 외에 아직 학습하지 않은 개념에 대해서는 일단 기술 부채로 쌓아두고 진행합니다. 언제나 앨리스의 토끼굴(Rabbit hole)에 빠지지 않도록 주의해야 합니다.
- 앨리스의 토끼굴(Rabbit hole)
- 어떤 개념을 이해하기 위해 파고들수록 또다른 개념을 이해할 필요가 생겨서 처음 의도한 학습 방향과 점점 멀어지는 현상을 《이상한 나라의 앨리스》에 등장하는 토끼굴에 비유한 말. 비슷한 표현으로 ‘야크 털 깎기‘가 있다.
어느 정도 기본 개념과 동작 원리를 이해했다면 이를 활용해 코드 구현 능력을 갖추기 위한 연습이 필요합니다. 앞서 언급했듯이 기본 개념과 동작 원리를 이해해야 하는 이유는 결국 코드를 구현하기 위해서입니다. 코딩 연습은 머릿속에 머물고 있는 문제 해결 방안을 문법을 통해 구체화화는 과정입니다.
이때 연습은 의도적인 연습이어야 합니다. 라이브 코딩을 감상하거나 예제를 단순히 타이핑하는 것은 연습이 아닙니다. 현재 자신의 능력으로 쉽게 해결 가능한 것을 반복하는 것도 연습이 아닙니다. 자신의 능력을 살짝 넘어서는 도전을 지속적으로 시도하는 것이 의도적인 연습입니다. 너무 쉬운 도전은 지루하고, 무모한 도전은 불안감만 줍니다. 시행착오(a.k.a. 삽질)는 “무엇을 알고 무엇을 모르는지”를 알게 하는 개발자의 벗이자 선생님입니다. 무엇을 모르는지 알았다면 몰랐던 것을 알기 위해 시도하고 실패하는 의도적인 연습을 반복합시다.
프로젝트를 통해 쌓은 경험은 성장에 좋은 밑거름이 됩니다. 프로젝트를 통해 더욱 깊이 이해하고 협업을 경험할 수 있습니다. 또한 추가로 학습이 필요한 사항을 파악할 수 있습니다. 모르는 것과 아는 것이 구분되는 때가 바로 이때입니다. 추가로 학습이 필요한 사항에 대해서는 첫 사이클, 즉 기본 개념과 동작 원리 이해로 돌아가 학습을 시작합니다.
이처럼 기본 개념과 동작 원리, 코딩 스킬, 프로젝트라는 3개의 사이클을 순환적으로 반복하면서 이해의 반경을 점진적으로 넓혀가는 것, 즉 지속적 개선(continuous improvement)을 통한 성장이 바로 학습이라고 생각합니다.
빨리 가는 유일한 방법은 제대로 가는 것이다.
- 로버트 C. 마틴(Robert C. Martin), “클린 코드”의 저자