커피스크립트 소개

등록일: 2014. 11. 04

시작하세요! 커피스크립트 프로그래밍: 우아하고 간결한 자바스크립트 코딩

  • E. 호이가르드 지음
  • 유윤선 옮김
  • 268쪽
  • 22,000원
  • 2012년 12월 6일

개인용 컴퓨터가 처음 나왔을 때는 대다수 컴퓨터에 베이직과 유사한 간단한 프로그래밍 언어가 들어 있었다. 당시에는 컴퓨터를 사용하는 게 이 언어와 밀접한 연관이 있었던 만큼 원하든 원치 않든 모든 컴퓨터 사용자가 프로그래밍 언어를 접할 수밖에 없었다. 저렴한 개인용 컴퓨터가 폭넓게 보급된 오늘날에는 대부분의 사용자가 마우스로 클릭하는 수준 이상의 작업을 하지 않는다. 보통 사람들로서는 이제 마우스 클릭만으로도 원하는 작업을 충분히 할 수 있게 됐다. 하지만 기술에 대한 호기심이 많은 사람들에게는 일상적인 컴퓨터 활용에서 프로그래밍 요소가 제거됨에 따라 배움의 장벽이 생겼다.

다행히 월드 와이드 웹이 발전하면서 모든 컴퓨터에 설치된 현대 웹 브라우저를 통해 자바스크립트를 프로그래밍할 수 있는 환경이 갖춰졌다. 이 환경은 커피스크립트 환경으로도 손쉽게 전환할 수 있다. 기술적인 세부 사항으로 사용자를 번거롭게 하지 말아야 한다는 정신에 입각해 이런 개발 환경은 꼭꼭 숨어 있지만 웹 페이지는 이런 환경에 접근할 수 있고, 이를 프로그래밍을 배우는 플랫폼으로 사용할 수 있다. 이 개발 환경은 coffeescript.org에서 ‘Try CoffeeScript’를 선택하거나 예제 아래에 있는 ‘load’ 버튼을 사용해 메뉴에서 찾을 수 있다.


배우려는 열의가 없으면 이끌어 주지 않고,표현하려고 애쓰지 않으면 일깨워 주지 않으며, 한모퉁이를 들어보였을 때 나머지 세 모퉁이를 알지 못하면 반복해서 가르쳐 주지 않는다.

-- 공자

커피스크립트를 설명하는 것 외에 이 책에서는 프로그래밍의 기본 원칙도 소개한다. 곧 보겠지만 프로그래밍은 어렵다. 기본적인 규칙은 대부분 간결하고 명료하다. 하지만 프로그램은 이런 기본 규칙 기반 위에서 자체적인 규칙과 복잡도를 더해서 개발되는 만큼 복잡해지는 경향이 있다. 이러한 이유로 프로그래밍은 단순하거나 예측 가능한 경우가 거의 없다. 그래서 이 분야의 설립자라 할 수 있는 도날드 크누스는 프로그래밍을 예술이라고 말한다.

이 책을 제대로 활용하려면 수동적으로 읽는 습관을 버려야 한다. 대신 내용에 집중하고, 예제를 풀려고 노력하고, 앞에서 나온 내용을 이해한 후에만 계속 진행해야 한다.


컴퓨터 프로그래머는 스스로 모든 책임을 지는 우주의 창조자다. 사실상 무한히 복잡한 우주를 컴퓨터 프로그램의 형태로 창조할 수 있다.

-- 조세프 웨이젠바움 ‘컴퓨터의 위력과 인간의 이성’

프로그램에는 여러 측면이 있다. 프로그램은 프로그래머가 입력한 텍스트이며, 컴퓨터가 뭔가를 하게 만드는 힘이고, 컴퓨터 메모리 내의 데이터이면서 이 데이터에 대해 수행하는 행동을 제어한다. 컴퓨터 프로그램을 사물에 빗대 설명하는 비유는 딱 들어맞지 않아 대부분 적합하지 않지만 기계에 대한 비유는 비교적 정확한 편이다. 기계식 손목 시계의 장치는 서로 정확히 들어맞으며, 시계를 만든 기술자의 솜씨가 훌륭하다면 수년 동안 시간을 정확히 보여준다. 프로그램의 각 요소도 이와 비슷한 방식으로 서로 들어맞으며, 프로그래머가 자신이 하는 일을 제대로 알고 있다면 프로그램은 충돌하지 않고 계속 실행된다.

컴퓨터는 이런 비물질적 장치의 주인 역할을 하도록 개발된 장비다. 컴퓨터 자체는 바보스러울 정도로 간단한 작업만 할 수 있다. 컴퓨터가 유용한 이유는 컴퓨터가 매우 빠른 속도로 작업을 수행하기 때문이다. 프로그램은 이와 같은 단순한 행동을 여러 개 조합해 매우 복잡한 작업을 수행한다.

어떤 사람에게는 컴퓨터 프로그램을 개발하는 게 재미있는 게임과 같다. 프로그램은 생각으로 쌓아 올린 건물이다. 이 건물은 건축하는 데 비용이 들지 않으며, 무게가 없고, 손으로 코드를 입력함으로써 쉽게 증축할 수 있다. 우리가 제대로 관리하지 않으면 이 건물의 크기와 복잡도는 제어할 수 없게 되고, 이 건물을 만든 우리조차 혼란스럽게 한다.

이 점이 바로 프로그래밍을 하면서 겪는 주된 문제다. 또 오늘날 충돌하고 오작동하는 소프트웨어가 많은 이유도 이 때문이다. 제대로 동작할 때 프로그램은 아름답다. 프로그래밍의 예술은 복잡도를 제어하는 기술과 같다. 위대한 프로그램은 부드러우며 복잡하지 않다.


오늘날 많은 프로그래머들은 프로그램에 자신들이 잘 이해하는 일부 기법만 사용할 때 프로그램의 복잡성을 가장 잘 관리할 수 있다고 믿는다. 이런 프로그래머들은 프로그램이 갖춰야 할 형태에 엄격한 규칙을 적용하고, 이 중 어떤 이들은 이런 규칙을 깨는 프로그래머를 나쁜 프로그래머라고 비난하기도 한다.

이는 프로그래밍의 풍부함을 저해하는 태도다. 즉, 프로그램을 단순하고 예측 가능한 대상으로 제한하고, 이상한 프로그램과 아름다운 프로그램을 모두 금기시 하려는 태도다. 프로그래밍에는 수많은 기법이 있으며, 그 다양성은 놀라울 정도이고, 아직 제대로 접하지 못한 영역이 대부분이다.

물론 프로그래밍 세계에는 많은 함정과 올무가 있으며, 숙련되지 않은 프로그래머는 온갖 끔찍한 실수를 저지를 수 있지만, 이는 프로그래머가 주의해서 이성적으로 진행해야 한다는 경고의 의미밖에는 없다. 앞으로 배우겠지만 프로그래밍을 하다 보면 항상 새로운 도전과 새로운 영역을 접한다. 계속해서 도전하기를 거부하는 사람은 정체될 수밖에 없으며 프로그래밍의 즐거움을 잃어버리고 프로그래밍 하려는 의지도 잃게 될 것이다(그리고 관리자가 된다).

필자가 생각하기에 프로그램에 대한 명확한 기준은 정확성 여부다. 효율성, 명료성, 크기도 중요하지만 이들 요소의 균형을 맞추는 일은 항상 각 프로그래머가 스스로 내려야 하는 판단의 문제다. 경험 법칙이 도움이 되기는 하지만 이를 깨뜨리기를 두려워해서는 안 된다.


컴퓨터의 초창기 시절에는 프로그래밍 언어가 없었다. 당시에는 프로그램의 형태가 다음과 같았다.

00110001 00000000 00000000 00110001 00000001 00000001
00110011 00000001 00000010 01010001 00001011 00000010
00100010 00000010 00001000 01000011 00000001 00000000
01000001 00000001 00000001 00010000 00000010 00000000
01100010 00000000 00000000

이 프로그램은 1부터 10까지 숫자를 더하고 결과를 출력(1 + 2 + … + 10 = 55)하는 프로그램이다. 이 프로그램은 아주 단순한 컴퓨터에서 실행할 수 있었다. 초창기 컴퓨터에서 프로그래밍을 하려면 올바른 위치에 스위치 여러 개를 설정하거나 널판지에 구멍을 뚫어 컴퓨터에 집어넣어야 했다. 이런 작업이 얼마나 지루하고 오류가 나기 쉬운지는 충분히 상상할 수 있을 것이다. 간단한 프로그램을 작성하는 데도 빈틈 없는 준비와 엄격한 절차가 필요했던 만큼 복잡한 프로그램은 거의 상상할 수조차 없었다.

물론 이런 이상한 비트 패턴(앞의 1과 0을 일반적으로 부르는 방식)을 직접 입력함으로써 프로그래머는 강력한 마법사가 되는 듯한 느낌을 받게 됐다. 더불어 이는 직업 만족도 측면에서 의미 있는 일이었다.

프로그램의 각 줄에는 한 개의 명령이 담겨 있다. 이를 한국어로 작성하면 다음과 같다.

1 메모리 위치 0에 숫자 0을 저장
2 메모리 위치 1에 숫자 1을 저장
3 위치 2에 메모리 위치 1의 값을 저장
4 위치 2의 값에서 숫자 11을 뺌
5 메모리 위치 2의 값이 숫자 0이면 명령 9를 실행
6 메모리 위치 1의 값을 위치 0에 더함
7 메모리 위치 1의 값에 숫자 1을 더함
8 명령 3을 수행
9 메모리 위치 0의 값을 출력

이 명령은 바이너리보다는 읽기 쉽지만 여전히 읽는 게 불편하다. 명령과 메모리 위치에 숫자 대신 이름을 사용한다면 더 읽기가 쉬울 것이다.

'total'을 0으로 설정
'count'를 1로 설정
[반복]
'compare'를 'count'로 설정
'compare'에서 11을 뺌
'compare'가 0이면 [종료]로 이동
'total'에 'count'를 더함
'count'에 1을 더함
[반복]으로 이동
[종료]
'total'을 출력

이제 프로그램이 하는 일을 보는 게 그리 어렵지 않다. 처음 두 줄은 두 메모리 위치에 시작값을 지정한다. total은 프로그램의 결과를 계산하는 데 사용하고 count는 현재 살펴보고 있는 숫자를 추적하는 데 사용한다. 이 중 compare를 사용하는 줄이 제일 이해하기 어려울 것이다. 이 프로그램은 count와 11이 같은지 비교해 실행을 멈출 시점을 결정한다. 컴퓨터 장비는 매우 원시적이므로 숫자가 0인지 여부만 검사할 수 있고 이런 검사를 기반으로 결정(이동)을 내릴 수 있다. 여기서는 compare라는 라벨이 적힌 메모리 주소를 사용해 count - 11을 계산하고 이 값을 근거로 결정을 내린다. 이어지는 두 줄은 count를 result에 더함으로써 프로그램이 count가 11이 아니라고 판단할 때마다 count만큼 result를 더하게 한다. 다음은 같은 프로그램을 커피스크립트로 작성한 것이다.

total = 0
count = 1
while count <= 10
total += count
count += 1
show total

이제 내용이 훨씬 더 개선됐다. 이 코드에서 가장 중요한 점은 프로그램이 앞뒤로 이동하게 하는 방식을 더는 지정하지 않아도 된다는 점이다. while이란 마법과도 같은 단어가 이를 처리해준다. while은 아래 있는 들여쓰기된 코드 줄을 count <= 10 조건이 유효할 때까지 계속해서 실행한다. 이 조건은 ‘count가 10보다 작거나 같을 때’를 가리킨다. 여기서는 더 이상 임시 값을 만들 필요도 없고 임시 값을 0과 비교할 필요도 없다. 이런 임시 정보는 바보 같은 상세 정보에 해당하는데, 프로그래밍 언어의 강력한 힘은 이런 바보 같은 상세 정보를 알아서 처리해준다는 점이다.

이 코드는 커피스크립트로 좀 더 짧게 표현할 수도 있다.

total = 0
total += count for count in [1..10]
show total

for와 in은 1부터 10까지 범위[1..10]의 숫자를 순회하며, 차례로 count에 각 숫자를 대입한다. count에 있는 각 값은 total에 더해진다.

끝으로 다음은 편리한 sum 연산을 사용할 때의 프로그램 형태다. sum 연산은 n이라는 수학적 표기와 유사한 숫자의 합을 계산하는 연산이다.

show sum [1..10]

또 데이터 타입에 함수를 결합할 수도 있다. 다음은 배열에 sum 함수를 결합해 배열 내 요소의 합을 구하는 코드다.

show [1..10].sum()

이런 이야기를 하는 이유는 같은 프로그램을 짧고 길게, 읽기 어렵거나 읽기 쉽게 다양하게 표현할 수 있다는 점을 강조하기 위해서다. 이 프로그램의 첫 번째 버전은 매우 이해하기 어려웠지만 마지막에 본 프로그램은 거의 영어와 유사한 형태였다(즉 1부터 10까지 숫자의 sum을 show). sum 같은 기능을 개발하는 법은 이후 장을 통해 살펴본다.

좋은 프로그래밍 언어는 프로그래머가 좀 더 추상적으로 자신을 표현할 수 있는 방식을 제공한다. 프로그래밍 언어는 관련 없는 세부사항은 숨겨주고 사용하기 편리한 구성 요소(while 구문 등)를 제공하며, 대부분의 경우 프로그래머가 직접 구성 요소(sum 연산 등)를 추가할 수 있게 해준다.


자바스크립트는 현재 월드 와이드 웹상의 페이지에서 주로 온갖 똑똑한 작업과 엄청난 작업을 처리하는 데 사용되는 언어다. 자바스크립트는 여러 애플리케이션과 운영체제에서 스크립트 언어로도 사용된다. 이 중 특별히 여겨볼 내용은 서버사이드 자바스크립트(SSJS, server-side JavaScript)로, 웹 애플리케이션의 서버 영역을 자바스크립트로 작성해 전체 애플리케이션을 하나의 프로그래밍 언어로 표현한 경우다. 커피스크립트는 표준 자바스크립트 코드를 생성하며, 따라서 표준 자바스크립트를 사용하는 곳에서는 어디서든 사용할 수 있다. 이 말은 브라우저 영역뿐 아니라 서버 영역도 커피스크립트로 작성할 수 있다는 뜻이다. 커피스크립트는 새로운 언어이므로 일반 애플리케이션 개발 분야에서 얼마나 인기를 끌지 아직 두고 봐야 하지만 프로그래밍에 관심이 있다면 커피스크립트를 배워두면 분명 유용한 언어가 될 것이다. 설령 웹 프로그래밍을 많이 하지 않더라도 이 책에 나와 있는 프로그램은 여러분과 항상 함께하고, 여러분의 뇌리에 깊게 남아 다른 언어로 작성하는 프로그램에도 영향을 줄 것이다.

자바스크립트에 대해 안 좋게 말하는 사람들도 있다. 이 사람들이 말하는 내용은 대부분 사실이다. 필자가 처음 자바스크립트로 프로그램을 개발해야 했을 때는 이내 언어 자체를 혐오하게 됐다. 당시 필자는 입력한 내용 대부분을 의도와는 전혀 다르게 해석했다. 이는 필자가 뭘 하고 있는지 전혀 알지 못했다는 사실과 밀접한 관련이 있다. 자바스크립트는 사용 방식이 심각할 정도로 자유롭다. 이런 설계의 배경에는 초보자가 자바스크립트를 배우기 쉽게 하려는 의도가 있다. 하지만 현실적으로는 시스템에서 문제를 알려주지 않으므로 프로그램에서 발생한 문제를 찾기 어렵게 만든다.

하지만 자바스크립트의 유연성은 장점도 된다. 자바스크립트에서는 더 엄격한 언어에서는 불가능한 각종 기법을 사용할 수 있는 여지가 있고, 이를 활용하면 자바스크립트의 단점을 극복할 수도 있다. 자바스크립트를 제대로 배우고 한동안 사용해본 후 필자는 진심으로 자바스크립트를 좋아하게 됐다. 커피스크립트는 자바스크립트에서 헷갈리고 번거로운 성격을 상당 부분 수정하는 동시에 내부의 유연성과 아름다움은 그대로 지켜준다. 그래서 커피스크립트는 매우 훌륭한 언어다.


이 책의 대부분의 장에는 많은 코드1가 담겨 있다. 경험상 코드를 읽고 쓰는 일은 프로그래밍을 배울 때 중요한 부분이다. 예제를 그냥 훑어보지 말고 자세히 읽어보고 이해하자. 처음에는 이 과정이 느리고 혼란스러울 수 있지만 금세 익숙해질 것이다. 예제도 마찬가지다. 실제 풀이를 작성하기 전까지는 예제를 이해한다고 가정하지 말자.

웹의 동작 방식으로 인해 사람들이 웹 페이지에 집어넣은 자바스크립트 프로그램은 항상 확인할 수 있다. 이는 뭔가가 어떤 식으로 처리되는지 배우는 데 도움이 된다. 대부분의 웹 프로그래머는 ‘전문’ 프로그래머가 아니거나 자바스크립트 프로그래밍을 하찮게 생각해 제대로 배운 적이 없으므로 이런 코드는 대부분 품질이 매우 낮다. 잘못된 코드를 보고 배우면 내 코드도 잘못될 수 있는 만큼 누구에게서 배울지 주의하자. 또 다른 프로그램 소스로는 github 같은 오픈소스 프로젝트에서 호스팅하는 커피스크립트 프로젝트가 있다.


  1. ‘코드’는 프로그램을 구성하는 재료다. 프로그램을 구성하는 모든 요소는 한 줄이든 전체 프로그램이든 ‘코드’라고 부른다.