왜 프로그래밍을 학습해야 하는가

자연어보다 정교한 언어

언어는 커뮤니케이션 수단만이 아니라 생각의 도구이기도 하다. 명료한 생각을 하려면 명료한 언어가 필요하다. 수학자들은 추상의 세계를 탐험하는데 알맞은 언어 체계를 만들어 왔다. 수, 기하, 집합, 논리, 관계, 확률, … 자연 속에 숨은 원리와 규칙을 다룰 때는 그들이 만들어낸 수학이라는 언어 체계를 사용해야 한다.

수학은 일종의 언어 체계다. 여러분은 항상 이 언어 체계를 사용한다. 물건을 살 때 “사과 세 개를 사려고 만원권 한 장을 내면 천원권 몇 장을 되돌려 받지?” 라고 생각하는 사람은 없다. 수식 연산이 머리속을 빠르게 스쳐지나갈 뿐이다. 수학은 자연어(사람들이 일상에서 쓰는 언어)로는 복잡하고 부정확할 수밖에 없는 생각을 더 명료하고 간단하게 표현하게 해 준다. 수학이 없다면 이보다 복잡한 문제는 명료하게 정의하는 것 자체가 힘들 것이다.

프로그래밍 언어도 인간이 발명해 낸 언어 체계다. 이 언어는 컴퓨터를 마음대로 조작하고, 정보를 구조적으로 표현하고, 문제 해결 과정을 서술하기에 가장 좋은 언어다. 프로그래밍 언어는 세계 프로그래머 사이에 통용되는 공용어이며, 실용적인 언어이며, 새로운 사고 방법을 가르쳐주는 언어다.

컴퓨터로 할 수 있는 일이 많아진다

요즘은 누구나 컴퓨터를 쓸 줄 안다. 사람들은 마우스를 조작해 프로그램을 실행시킬 수 있다. 좀 더 관심이 있다면 문서 편집도 할 줄 알고, 그림도 편집할 수 있을 것이다.

컴퓨터를 다양한 용도로 손쉽게 사용할 수 있는 것은 누군가가 만들어 둔 프로그램 덕분이다. 그러나 프로그램은 여러분을 자유롭게 하는 동시에 여러분을 구속한다. 여러분은 프로그램이 제공하는 기능만을 이용할 수 있고, 그렇지 못한 것은 바랄 수조차 없다. 컴퓨터로 할 수 있는 일이 어디까지인지를 모르기 때문이다.

대다수의 인기 있는 프로그램은 흔한 상황에서 보편적인 업무를 수행할 때 유용하다. 하지만 세상을 살다보면 자신만의 필요를 해결해야하는 순간이 있다. 여러분에게만 필요한 그 프로그램은 누가 만들어 줄 것인가?

프로그래밍은 컴퓨터에게 명령을 내리는 가장 확실한 방법이다. 프로그래밍을 할 줄 알면 컴퓨터로 할 수 있는 모든 일을 할 수 있게 된다. 현대 사회의 모든 분야에서 컴퓨터가 사용되고 있다. 프로그래밍은 어떤 분야에서든 일을 수월하게 해 주고, 불가능해 보였던 것도 가능하게 만들어 준다.

명료한 언어 사용 습관을 들인다

생각을 정리하고 분명하게 할 때 우리는 언어를 사용한다. 언어를 두루뭉술하고 거칠게 대충 사용하는 사람은 생각도 흐리멍텅하기 십상이다. 흐리멍텅한 생각은 초점이 맞지 않는 렌즈처럼 인식을 왜곡하고 잘못된 결정을 유발해 삶을 불행하게 이끈다.

하지만 언어의 중요성을 인식하지 못하는 사람이 많다. 그들에게 틀린 표현을 지적하면 표현이 아니라 내용이 중요한 것 아니냐며 발끈한다. 그러나 표현이 곧 내용이다. 내용은 표현을 통해서만 전달된다. 프로그래머는 이 점을 누구보다도 잘 안다.

프로그래밍은 명료한 표현을 습관화하는 과정이다. 컴퓨터는 융통성이 전혀 없다. 컴퓨터에게는 하나부터 열까지 모든 사항을 세세하고 정확하게 지시해 주어야 한다. 평소 두루뭉술하고 거칠게 표현하는 사람이 프로그래밍을 학습하면, 단어 하나, 토씨 하나까지 올바르게 사용하는 습관을 들일 수 있다.

문제 해결 방법을 배운다

프로그래밍은 컴퓨터를 통해 문제를 해결하는 과정이다. 사물의 개념과 관계를 정의하고, 복잡한 문제를 간단한 문제로 나누고, 다양한 풀이법을 검토하고, 오류의 원인을 추론하는 활동이 포함된다. 삶은 끊임없이 문제를 해결하는 과정의 반복이다. 프로그래밍을 익히면 컴퓨터를 사용하는 일을 하지 않더라도 일상의 문제와 업무를 해결하는 데 두고두고 도움이 된다.

이와 비슷한 기능을 하는 대표적인 학문이 바로 수학이다. 수학은 현실의 문제를 추상화하여 해결하는 데 쓰이고, 학습자의 사고 능력을 향상시킨다. 하지만 입시 중심의 교육 때문에 많은 학생들이 수학에 넌더리를 내고 수학을 쓸모없는 것으로 단정해 버린다. 프로그래밍은 수학보다 쉽고 재미있다. 여러분이 수학을 포기했더라도 프로그래밍을 통해 수학 못지않게 사고 능력을 증진시킬 수 있고, 어쩌면 수학에도 다시 관심을 가질 수도 있다.

왜 파이썬은 프로그래밍 입문에 적합한가

읽고 쓰기 쉬운 언어

파이썬(Python)은 배우기 쉽고, 사용하기 쉽다. 여러 대학의 전산 전공 과정에서 1학년 필수 과목으로 자리잡을 만큼 프로그래밍 교육용 언어로 인정받고 있다.

프로그래밍 언어에는 표현할 내용 외에도 다양한 구두점과 기호를 덧붙여야 하는 규칙이 있다. 이들은 빠트리거나 잘못 쓰기 쉬워 프로그래밍 입문자를 난처하게 만든다. 파이썬은 다른 언어에 비해 이런 규칙이 적다.

프로그래밍 언어는 기계적 특성을 많이 반영할수록 저수준(low level)이고, 사람의 사고 과정을 많이 반영할수록 고수준(high level)이다. 고수준 언어는 프로그래머가 기계 자체를 조작하는 것보다 문제에 집중하게 해 주어 시간과 노력을 절약해 준다. 파이썬은 고수준 언어 중에서도 추상 수준이 높은 편이다. 파이썬을 사용하면 쉽고 빠르게 프로그램을 만들 수 있다.

문법 규칙이 까다롭고 추상 수준도 비교적 낮은 C++을 예로 들어 파이썬과 비교해 보자. 다음의 두 코드는 11 부터 20까지의 자연수의 합계를 계산하여 출력하는 프로그램을 각각 C++과 파이썬으로 작성한 것이다.

#include <iostream>
int main(int argc, char** argv) {
    int sum = 0;
    for (int i = 11; i < 21; ++i) {
         sum += i;
    }
    std::cout << sum << std::endl;
    return 0;
}

11부터 20까지 자연수의 합을 출력하는 프로그램 (C++)

print(sum(range(11, 21)))

11부터 20까지 자연수의 합을 출력하는 프로그램 (파이썬)

코드의 의미는 모르더라도 파이썬이 더 간결하고 군더더기가 없다는 것을 느낄 수 있다. 더 복잡하고 큰 문제를 해결하는 프로그램을 만들 때 이런 차이는 더욱 더 커진다.

실무에 사용되는 언어

베이식(Basic), 파스칼(Pascal), 스킴(Scheme), 스크래치(Scratch) 등 파이썬 외에도 다양한 교육용 언어가 있었다. 기존 교육용 언어는 프로그래밍 학습에만 쓰이고 실무에는 많이 쓰이지 않는 것이 단점이다.

파이썬은 사용하기 쉬울 뿐 아니라 이식성이 높고 강력해서 실제 업무에 활용하기에도 손색이 없다. 파이썬은 프로그래밍이 활용되는 다양한 분야에서 지분을 차지하고 있다. 구글(Google), 유투브(YouTube), 인스타그램(Instagram), 드랍박스(Dropbox) 같은 거대 웹 서비스와 미국 항공우주국(NASA) 같은 기관도 파이썬을 활용한다.

학습자는 프로그래밍의 기초를 배운 뒤 다른 원하는 분야로 나아갈 때에도 계속 파이썬을 활용할 수 있다.

이 책은 누구를 위한 책인가

그림을 그릴 때는 스케치부터

사람은 새로운 지식을 배울 때 이전에 배운 지식을 활용한다. 지식과 지식 사이의 연결고리가 많고 가까울수록 학습이 수월하다. 그러므로 여러분의 지식 수준에 맞는 책을 고르는 것은 학습을 잘 하는 첫 번째 비결이다.

프로그래밍을 배우는 과정을 그림 한 폭을 그리는 과정에 빗대면, 이 책을 학습하는 것은 빈 캔버스에 스케치하는 단계다. 여러분이 프로그래밍을 처음 공부한다면 이 책을 따라 스케치하면 된다. 이전에 파이썬을 너무 얕게 배워서 좀 더 윤곽선을 뚜렷이 하고 싶은 사람에게도 이 책이 도움이 될 수 있다.

필요한 사전 지식

이 책은 프로그래밍 지식이 전혀 없는 사람을 대상으로 한다. 그러므로 여러분이 프로그래밍을 처음 배우는 사람이라도 이 책을 학습하는 데 문제가 없을 것이다. 하지만 프로그래밍 학습을 위해서는 수학과 컴퓨터를 조금은 알아야 한다.

  • 프로그래밍 지식: 없어도 괜찮다.
  • 수학: 사칙연산, 식, 집합, 함수 같은 중학교 교과 수준의 기초 수학 지식을 알아야 한다. 수학 점수가 높을 필요는 없다. 나도 학교 다닐 때 수학 성적은 “가가가가가” 였다.
  • 컴퓨터: 프로그램을 설치하고 실행하는 방법과 파일을 관리하는 방법을 알아야 한다.

다른 책을 봐야 하는 경우

이미 다른 프로그래밍 언어를 익힌 적이 있는가? 그렇다면 어떤 교재를 이용하더라도 파이썬을 금방 배울 수 있을 것이다. 이 책을 보는 것도 좋지만, 세부사항까지 자세히 배우고 싶다면 파이썬 공식 문서나 『파이썬 3 바이블』(이강성, 프리렉)이 더 도움이 될 것이다.

이미 파이썬을 잘 사용하고 있고, 더 깊이 있는 지식을 얻고자 하는가? 이 책보다는 『전문가를 위한 파이썬』(루시아누 하말류, 한빛미디어)을 권하고 싶다.

특정한 파이썬 버전을 배워야 하는가? 이 책은 파이썬 3 버전을 기준으로 한다. 과거 버전인 파이썬 2를 배워야만 한다면 좀 더 옛날에 나온 책을 보는 것이 좋다.

이 책의 학습 방법과 목표

프로그래밍 학습은 하룻밤에 끝나지 않는다

프로그래밍 입문자는 대개 실력과 목표의 차이가 큰 편이다. 프로그래밍의 세계는 생각보다 넓고, 각 분야의 깊이는 끝이 없다. 간단해 보이는 프로그램조차도 제대로 만들기 위해서는 생각보다 많은 지식과 경험이 필요하다.

조바심은 좌절과 포기의 씨앗이다. 100일만에, 50일만에, 심지어 눈 딱 감고 단 10일만에 프로그래머가 되는 방법은 없다. 교육 상품의 광고 문구를 믿지 마라.

프로그래밍 언어를 배운 뒤에는 자신이 원하는 분야를 더 공부해야 한다. 이에 관해서는 이 책을 학습한 뒤 앞으로의 공부에서 좀더 설명한다.

실습이 중요하다

여러분은 언어를 배우는 중이다. 언어 학습은 문법 규칙과 어휘를 배우는 것만으로 완성되지 않는다. 언어는 계속 사용해야만 체득된다.

프로그래밍 실력은 직접 공부한 만큼, 직접 프로그램을 짜 본 만큼 성장한다. 이 책에는 다양한 실습 과정과 연습문제가 실려 있다. 귀찮더라도 생략하지 말고 실습과정을 따라하며 결과를 확인해보는 것이 좋다. 연습문제도 풀 수 있는 데까지 직접 풀어봐야 한다.

실습 과정을 무시하면 코드를 읽어보지 않고 넘겨버리는 나쁜 습관이 들 수도 있다. 남이 작성한 코드를 읽는 것도 프로그래밍의 중요한 과정이다.

이 책이 다루는 내용

1장 파이썬 프로그래밍의 기초 지식과 실습 준비: 파이썬이 무엇인지 살펴보고, 파이썬 프로그래밍 학습을 위한 환경을 준비한다. 준비를 마치면 첫 번째 파이썬 프로그램도 만들어 볼 것이다.

2장 수식을 계산하고 정보를 기억하기: 컴퓨터는 계산을 빠르게 수행하고, 정보도 정확하게 기억한다. 파이썬을 이용해 수식을 계산하고 정보를 기억하는 방법을 배운다. 이를 응용해 현실의 문제도 해결해 본다.

3장 함수로 문제를 나누어 풀기: 크고 복잡한 문제를 해결하려면 문제를 작고 간단한 문제 여러 개로 나누는 것이 좋다. 함수를 이용해 큰 프로그램을 작은 프로그램으로 나누어 작성하는 방법을 알아 본다.

4장 여러 가지 유형의 데이터 다루기: 오직 수만을 계산하는 컴퓨터를 이용해 여러 가지 데이터를 취급하는 원리를 알아 보고, 정수·실수·문자열·참과 거짓 등 파이썬이 제공하는 기본 데이터 유형들의 특징과 사용법을 배운다.

5장 컬렉션으로 데이터를 모으고 정돈하기: 프로그램이 다루는 데이터가 크고 복잡할수록 데이터를 정돈하여 관리할 필요가 커진다. 데이터를 묶어 다루는 이유를 알아보고, 파이썬이 제공하는 여러 가지 컬렉션의 종류와 사용법을 알아 본다.

6장 선택과 반복으로 실행 흐름 조정하기: 프로그램을 여러 갈래로 나눠 컴퓨터가 상황에 알맞는 해결책을 선택하게 하거나, 일정한 범위의 코드를 여러 번 반복하도록 지시할 수도 있다. 프로그램의 실행 흐름을 조정하여 좀 더 똑똑하고 쓸모 있는 프로그램을 만드는 법을 배운다.

7장 컬렉션을 중첩·순회·가공하기: 현실의 복잡한 사물을 데이터로 나타낼 수 있고, 데이터를 자유자재로 조작할 수 있다면 프로그래밍을 통해 다채로운 작업을 수행할 수 있다. 컬렉션을 중첩하여 복잡한 데이터를 나타내는 방법과 그 속을 자유롭게 순회하며 새로운 데이터를 이끌어내는 방법을 알아 본다.

8장 클래스로 데이터 분류하기: 프로그래밍에서는 데이터를 여러 유형으로 분류하고, 각 데이터 유형의 속성·취급법·다른 유형과의 관계 등을 정의하는 것이 필요하다. 클래스를 이용해 데이터 유형을 직접 정의하고 데이터 유형에 알맞는 연산을 제공하는 방법을 알아 본다.

9장 오류를 방지하고 해결하기: 프로그래밍에는 오류를 예방하고, 발견하고, 고치는 활동도 포함된다. 프로그래머와 사용자를 괴롭히는 오류의 정체와 대처 방법을 배워 안정적인 프로그램을 만드는 능력을 얻자.

10장 모듈과 패키지로 소스 코드 관리하기: 프로그래밍 실력을 쌓다보면 규모가 큰 프로젝트에 도전할 날이 온다. 모듈과 패키지를 활용해 프로그램을 여러 파일로 나누고 구조화하는 법을 알아 두자.

11장 다양한 작업을 돕는 라이브러리: 현실의 여러 가지 작업에 필요한 기능을 미리 만들어 모듈이나 패키지로 묶어 둔 것을 라이브러리라고 한다. 파이썬의 표준 라이브러리 가운데 시간 다루기, 운영체제와 파일 다루기, 인터넷에서 데이터 가져오기 등 중요한 기능 몇 가지를 살펴본다.

12장 실전 프로그래밍: 학습한 내용을 종합해 좀 더 큰 규모의 프로그램을 만들어보는 훈련을 한다.