파이썬의 심플함은 배우는 사람들과 가르치는 사람들이 모두 파이썬을 쉽게 이해할 수 있도록 해준다.
나는 매우 간단한 질문에 답변을 하려고 한다: 파이썬 언어 자체의 어떤 특징이 파이썬을 교육에 적합하게 만드는 것일까? 이 내용은 파이썬을 조금 배우면서 약간의 코드를 읽는 것이 포함된다. 그러나 코딩 경험이 없더라도 걱정하지 마라! 이번 챕터는 희망적으로 파이썬을 배우는 것이 얼마나 쉬운지 눈을 뜨게 해줄 것이다. (따라서, 파이썬이 교육적인 언어로써 인기가 있는 이유이다.)
코드 가독성
메모지에 To-Do 리스트를 적는다면, 다음과 같을 것이다:
Shopping (쇼핑하기)
Fix broken gutter (망가진 지붕 물받이 수리하기)
Mow the lawn (잔디 깎기)
이것은 명료한 리스트다. 만약에 이 리스트를 좀 더 세분화 시킨다면 다음과 같이 쓸 것이다:
Shopping (쇼핑하기):
Eggs (달걀)
Bacon (베이컨)
Tomatoes (토마토)
Fix broken gutter (망가진 지붕 물받이 수리하기):
Borrow ladder from next door (이웃집에서 사다리 빌리기)
Find hammer and nails (망치와 못 찾기)
Return ladder! (사다리 돌려주기!)
Mow the lawn: (잔디 깎기)
Check lawn around pond for frog(연못 주위의 잔디에 개구리가 있는지 확인하기)
Check mower fuel level (잔디 깎는 기계의 연료량 확인하기)
하위 항목들이 관련된 주제 아래로 들여쓰기 되어 우리는 직관적으로 주제가 하위 항목들로 세분화된 것을 이해할 수 있다. 이것은 그 항목들이 서로 어떤 관련이 있는 지 한 눈에 보기가 쉽다.
이것을 스코핑(scoping)이라고 한다.
또한, 이런 식으로 들여쓰기 하는 것은 파이썬이 파이썬 프로그램에 정의된 다양한 작업들을 조직화하는 방법이다. 예를 들어, 다음의 코드는 사용자에게 이름 입력을 요청하는 say_hello?라는 함수를 간단히 보여준다. 그리고, 예상한 대로 다정한 인사를 출력한다:
def say_hello():
name = input('What is your name? ')
print('Hello, ' + name)
이 코드의 실행 결과는 다음과 같다. (사용자 입력 포함):
What is your name? Nicholas
Hello, Nicholas
say_hello 함수를 구현하고 있는 코드 라인들이 앞의 To-Do 리스트와 같이 들여쓰기 된 것을 주목해라. 뿐만 아니라 코드에 있는 각각의 지시가 그 라인 내에 들어있다. 그 코드는 읽기 쉽고 이해하기 쉽다: 그 코드가 들여쓰기 된 방식을 보는 것만으로 어떤 코드 라인들이 서로 관련이 있는지 명료하다.
대부분의 다른 컴퓨터 언어들은 범위를 나타내기 위해 들여쓰기 보다는 구문론적 기호를 사용한다. 예를 들면, 자바, 자바스크립트, 그리고 C와 같은 많은 언어들이 이런 목적으로 중괄호와 세미콜론을 사용한다.
이것이 왜 중요한가?
만약에 나처럼 영어가 모국어가 아닌 학생들을 가르치거나 난독 장애와 같이 특별한 교육이 필요한 학생들을 가르친 적이 있다면 파이썬의 직관적인 들여쓰기는 (그들의 언어 배경과 상관 없이) 전세계 모든 사람들이 이해한다는 것을 알게 될 것이다. 또한 코드 주위에 산재되어 있는 ‘{’, ‘}’ 그리고 ‘;’ 와 같은 혼란스러운 기호들이 적은 것은 파이썬 코드를 훨씬 더 읽기 쉽게 해준다. 게다가 그런 들여쓰기 규칙은 코드를 작성할 때 그 코드가 어떻게 보여지도록 작성해야 하는 지를 가이드 한다. 학생들은 직관적으로 그들의 작업을 보여주는 방법을 이해한다.
대부분의 다른 언어들과 비교하여 파이썬의 문법(코드를 작성하는 방법)은 간단하고 이해하기 쉽다. 예를 들어, 펄 프로그래밍 언어를 사용하여 작성된 다음의 코드는 텍스트 문서에서 동일한 단어를 찾을 것이다:
print "$.: doubled $_" while /(w+)s+1/gi
펄이 이것을 어떻게 실행하는지 이해할 수 있는가?
(펄의 변론으로, 펄은 파이썬과는 다른 목표와 목적을 가진 놀랄 만큼 파워풀한 프로그래밍 언어이다. 그것이 바로 포인트다. 제임스 조이스의 율리시스가 20세기 최고의 영어 소설 중 하나로 널리 평가 받고 있다고 해도 율리시스를 가지고 책 읽는 방법을 가르치려고 하지는 않을 것이다.)
간단히 말해서, 파이썬 코드를 읽고 쓰는 방법에 많은 시간을 할애할 필요가 없기 때문에 그것을 실제로 이해하는 일에 더 많은 노력을 들일 수 있다. 교육적인 맥락에서는 프로그래밍하기 위해 요구되는 수고를 줄이는 것이 좋은 것이다. (실제로, 어떤 사람들은 모든 맥락에서 그렇다고 주장하기도 한다.)
간단 명료함
파이썬 코드를 작성하기 위해 요구되는 간단한 핵심 개념과 지식은 많은 이점을 준다. 배우기 쉽고, 사용하기 쉽고, 기억하기 쉬운 것은 파이썬의 또 하나의 장점이다. 더욱이, 파이썬은 명료한 프로그래밍 언어이다. 그것은 예상한 대로 동작하고 프로그래머가 명백히 잘못된 것을 실행하려고 하면 불평할 것이다. 파이썬은 다른 의미로도 명료하다. 그것은 일반적으로 이해할 수 있는 영어 단어를 사용하여 다양한 개념들을 명명한다.
다음의 두 예시를 살펴보자:
어떤 언어들에서는 리스트를 만들려면 배열, 배열리스트, 벡터와 콜렉션 등과 같이 다양하게 이름 붙여진 구조를 사용해야 한다. 파이썬에서는 리스트라고 불리는 구조를 사용한다. 여기에 파이썬으로 작성한 앞에서 나온 To-Do 리스트가 있다:
todo_list = ['Shopping', 'Fix broken gutter', 'Mow the lawn']
이 코드는 (나의 To-Do 리스트에 있는 할 일들을 서술하는 단어들로 구성된 문자열) 값들을 가진 리스트를?(이 특정한 리스트를 참조하여 나중에 재사용할 수 있는) todo_list라는 이름의 객체에 할당한다.
어떤 언어들에서는 지정된 값들(기본 키/값 저장소)을 저장하고 검색할 수 있는 데이터 딕셔너리를 만들려면, 해쉬테이블, 연관 배열, 맵 혹은 테이블이라고 불리는 구조를 사용할 것이다. 파이썬에서는 딕셔너리라고 불리는 구조를 사용한다. 여기에 임의의 수도들을 모아놓은 데이터 딕셔너리가 있다:
capital_cities = {
'China': 'Beijing'
'Germany': 'Berlin',
'Greece': 'Athens',
'Russia': 'Moscow',
'United Kingdom': 'London',
}
나는 단순히 capital_cities 객체에 딕셔너리를 할당했다. 내가 어떤 나라의 수도를 찾고 싶으면 capital_cities 라는 이름의 객체 다음에 오는 대괄호 안에 그 나라의 이름을 참조하면 된다:
capital_cities['China']
'Beijing'
많은 프로그래밍 언어들이 파이썬의 리스트나 딕셔너리와 같이 동작하는 자료구조를 갖고 있다. 그들 중 일부는 명료하게 동작하며 그런 구조체들을 리스트와 딕셔너리라고 부른다. 다른 일부 언어들은 그런 구조체들을 (많은 언어들이 그렇지 않음에도 불구하고) 파이썬만큼 쉽고 명료하게 사용할 수 있도록 한다. 파이썬의 이점은 이 세가지를 모두 지원한다는 것이다. 파이썬은 그 언어의 핵심부에 유용한 자료 구조들을 갖고 있다. 그것들은 이름도 명료하고 사용하기도 매우 쉽다. 그런 유용함, 간단함, 그리고 명료함이 프로그래밍에 대한 진입장벽을 없애는 또 하나의 근거이다.
앞에서 언급했듯이, 파이썬은 예상한 대로 동작한다. 예를 들어, 비어 있는 딕셔너리와 비어 있는 리스트를 합하려고 하면 (내가 하려고 하는 것을 내가 이해하지 못했다는 것을 증거로 그것은 명백히 잘못된 것이다.) 파이썬은 다음과 같이 불평할 것이다:
>>> {} + []
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'dict' and 'list'
이것은 간단히 딕셔너리와 리스트를 합하려면 “+” 연산자를 사용할 수 없다는 것을 알려준다. 이것은 예상했던 것이고 훨씬 명료하고 훨씬 도움이 된다.
그럼에도 불구하고, 다른 언어들은 덜 엄격하고 프로그래머에게 더 관대하다. 이것이 좋은 아이디어와 같이 보이지만, 위에서 시도했던 것과 같은 잘못된 코드가 어떤 에러도 없이 실행되고 예측할 수 없는 결과를 야기할 것이라는 것을 의미한다. (어째든, 딕셔너리와 리스트를 합한 답은 무엇일까?) 여기에 그에 대응되는 자료 구조를 합하려고 할 때 흔히 볼 수 있는 자바스크립트의 실행 결과가 있다. (자바스크립트 문법에서, 객체 ‘{}’ 와 배열 ‘[]’):
> {} + []
0
그 답이 명백하게 0인가!?!
이번에는 자바스크립트에서 비어 있는 배열에 객체를 더하면 어떻게 될 지 추측해보라. (합의 항을 서로 바꾸어 보자.)
> [] + {}
"[object Object]"
동일한 결과를 기대했을 것이 틀림없다!
(다시 한번, 파이썬과는 다른 목표와 목적을 가진 자바스크립트의 조건 상황이 여기에 적용될 것이다.)
배움은 본질적으로 실수를 만들고 만든 실수를 깨닫는 것을 포함한다. 그런 다음에야 비로소 행동이 적응되고 실력이 향상되는 것이다. 만약에 (명백한 에러에 대해 불평하는 것보다는 의도한 것을 최대한 추측해서 실행하는) 자바스크립트와 같은 언어를 사용하여 프로그래밍을 배우고 있다면, 모든 종류의 실수를 알아채지 못하고 그냥 지나칠 것이다. 대신에, 프로그래밍 세계의 잘못된 견해를 계속 갖고 있게 되거나 아니면 차라리{} + []은 0과 같고 [] + {}은 "[object Object]" 와 같다는 자바스크립트의 복잡한 규칙들을 이해해야 할 것이다. (그것 자체가, 어려운 교육적인 성과를 이루는 것이다.)
파이썬의 심플함과 명료함은 파이썬을 배우고 있는 사람들과 전문 개발자들이 모두 이해하기 쉬운 코드를 작성하도록 이끈다. 이해하기 쉬운 코드는 유지관리하기 더 쉽고 버그를 포함할 가능성이 더 적다. (왜냐하면 많은 버그들이 생각했던 동작과 비교하여 실제 동작을 잘못 이해해서 발생하기 때문이다.) 자신의 생각을 쉽게 코드로 작성할 수 있는 것은 매우 파워풀하고 힘이 되는 능력이다.
예를 들면, 오래된 텍스트 어드벤처 게임을 생각해보라. 플레이어는 그 장소가 상세히 묘사되어 있으며 다른 장소로 이동할 수 있는 출구가 있는 세계를 돌아다닌다. 아래의 프로그램은 매우 명료하고 간단하게 그것을 정확히 구현한다.
프로그램의 대부분은 그것이 어떻게 동작하는지 설명하는 코멘트들과 게임 세상을 묘사하는 데이터 딕셔너리로 구성되어 있다. 실제 게임의 동작이 정의된 부분은 오직 코드의 마지막 블록이다. 프로그래머가 아닐지라도 게임이 어떻게 동작하는지 요지는 알 수 있을 것이다.
"""
A very simple adventure game written in Python 3.
The "world" is a data structure that describes the game
world we want to explore. It's made up of key/value fields
that describe locations. Each location has a description
and one or more exits to other locations. Such records are
implemented as dictionaries.
The code at the very end creates a game "loop" that causes
multiple turns to take place in the game. Each turn displays
the user's location, available exits, asks the user where
to go next and then responds appropriately to the user's
input.
"""
world = {
'cave': {
'description': 'You are in a mysterious cave.',
'exits': {
'up': 'courtyard',
},
},
'tower': {
'description': 'You are at the top of a tall tower.',
'exits': {
'down': 'gatehouse',
},
},
'courtyard': {
'description': 'You are in the castle courtyard.',
'exits': {
'south': 'gatehouse',
'down': 'cave'
},
},
'gatehouse': {
'description': 'You are at the gates of a castle.',
'exits': {
'south': 'forest',
'up': 'tower',
'north': 'courtyard',
},
},
'forest': {
'description': 'You are in a forest glade.',
'exits': {
'north': 'gatehouse',
},
},
}
# Set a default starting point.
place = 'cave'
# Start the game "loop" that will keep making new turns.
while True:
# Get the current location from the world.
location = world[place]
# Print the location's description and exits.
print(location['description'])
print('Exits:')
print(', '.join(location['exits'].keys()))
# Get user input.
direction = input('Where now? ').strip().lower()
# Parse the user input...
if direction == 'quit':
print('Bye!')
break # Break out of the game loop and end.
elif direction in location['exits']:
# Set new place in world.
place = location['exits'][direction]
else:
# That exit doesn't exist!
print("I don't understand!")
보통 “게임”은 다음과 같을 것이다. (사용자 입력 포함):
$ python adventure.py
You are in a mysterious cave.
Exits:
up
Where now? up
You are in the castle courtyard.
Exits:
south, down
Where now? south
You are at the gates of a castle.
Exits:
south, north, up
Where now? hello
I don't understand!
You are at the gates of a castle.
Exits:
south, north, up
Where now? quit
Bye!
더욱이, 교육적인 관점에서, 이 간단한 어드벤처 게임은 파이썬을 배우는 사람들에 의해 많은 흥미롭고 명료한 방법으로 변경될 수 있다: world에 객체들을 추가하고, 퍼즐을 만들고, 더 고급 명령들을 추가하고, 기타 여러 가지를 할 수 있다. 사실, 다른 과목과 접목된 교육 과정의 기회도 있다. 이와 같은 게임을 플레이 하는 것은 양방향 대화식 소설의 한 형태이다. 아마도 영어학과에서는 학생들이 원문에서 빈약하게 서술된 내용보다 더 많은 내용을 추가하도록 할 수도 있을 것이다.
공개적 확장성
프로그래밍 언어 핵심부의 파워풀한 심플함에도 불구하고, 프로그래머들은 일반적인 작업을 하기 위해 기존에 있는 라이브러리 모듈들을 종종 재사용할 필요가 있다. 라이브러리 모듈은 어떤 관련된 작업들을 수행하기 위한 설명이 있는 레시피 북과 같다. 그것은 프로그래머가 일반적인 문제에 부딪힐 때마다 처음부터 새로 시작하거나 이미 존재하는 것을 다시 만드느라 쓸데없이 시간을 낭비할 필요가 없다는 것을 의미한다.
대부분의 프로그래밍 언어가 라이브러리를 만들고 재사용하는 메커니즘을 갖고 있는 반면에, 파이썬은 번성한 써드 파티 모듈의 생태계를 갖고 있을 뿐만 아니라 (핵심부에 내장된) 많은 양의 광범위한 표준 라이브러리를 갖고 있는 특별한 축복을 받았다.
예를 들어, 웹사이트로부터 데이터를 검색하는 것은 흔한 작업이다. 우리는 파이썬을 사용하여 웹 페이지를 다운로드하기 위해 requests 써드 파티 모듈을 사용할 수 있다:
>>> import requests
>>> response = requests.get('http://python.org/')
>>> response.ok
True
>>> response.text[:42]
'<!doctype html><!--[if lt IE 7]> <html '
(이 코드는 우리가 requests 라이브러리를 사용하여 파이썬 홈페이지에서 HTML 문서를 가져오고, 성공했는지 응답을 확인하고, HTML 문서를 앞에서부터 42개의 문자까지 보여주기를 파이썬에 요청한다.)
requests와 같은 일부 모듈들은 하나의 일을 하며 그 일을 특별히 잘해낸다. 다른 모듈들은 일반적인 애플리케이션을 만들 때 필요한 많은 반복적인 작업들을 처리해주는 애플리케이션 프레임워크를 만들기 위해 큰 라이브러리 안에 구성되어 있다.
예를 들면, Django는 (모질라, 가디언, 내셔널 지오그래픽, NASA, 그리고 인스타그램과 그 외 다른 곳들에서 사용되는) 웹 애플리케이션을 만들기 위한 애플리케이션 프레임워크이다. Django는 데이터 모델링, 데이터베이스 연동, 웹 페이지, 보안, 확장성을 위한 템플릿 작성, 비즈니스 로직 결정, 그리고 기타 등등의 일반적인 작업들을 관리한다. 이런 작업들은 이미 Django에 의해 관리되고 있기 때문에 개발자들은 웹사이트를 디자인하고 비즈니스 로직을 구현하는 중요한 작업에 집중할 수 있다.
많은 프로그래밍 언어들이 많은 양의 라이브러리와 애플리케이션 프레임워크를 갖고 있다. 그러나 파이썬의 강점은 그것의 폭넓은 범위이다. SciPy와 NumPy는 과학자들과 수학자들에 의해 사용되고, NLTK (the Natural Language Tool Kit)는 텍스트를 분석하는 언어학자들에 의해 사용되고, Pandas는 통계학자들에 의해 광범위하게 사용되고, 그리고 OpenStack은 클라우드 기반의 컴퓨팅 리소스를 조직적으로 관리하고 제어하기 위해 사용된다. 이 리스트는 계속 늘어나고 있다.
이런 폭넓은 실용성을 가진 프로그래밍 언어를 가르치는 것은 분명한 이점이 있다: 배우는 사람들이 실제 경제적인 가치를 가진 프로그래밍 언어로 기술을 배우는 것이다.
파이썬이 공개적으로 확장될 수 있는 또 하나의 측면은 파이썬이 오픈 소스 프로젝트라는 것이다. (귀도 반 로섬이 직접 이끌고 있는) 핵심 개발자들에게 버그 리포트나 패치를 보내는 것으로 누구나 파이썬 개발에 참여할 수 있다. 또한 파이썬의 어떤 새로운 기능이 제안되고 구현되었는지 이해하기 쉬운 간단한 과정이 있다: Python Enhancement Proposals (PEPs). 이런 방식으로, 커뮤니티가 앞으로의 개발을 알리고 이끌어 갈 수 있는 기회를 갖고 있으며 파이썬을 사용하는 커뮤니티 모두가 보는 앞에서 개발되고 있다. 이런 과정은 PEP 1에 아주 자세히 설명되어 있다.
플랫폼 비종속성
파이썬은 플랫폼에 비종속적인 언어이다: Microsoft 윈도우, Mac OS X, 리눅스, 그리고 다른 많은 운영체제와 기기에서 실행된다. 심지어?Python Anywhere와 같은 웹사이트들을 통하여 파이썬을 서비스할 수도 있다.
이것은 교육적인 맥락에서 중요하다. 왜냐하면 파이썬이 학교에 있는 컴퓨터에서도 실행된다는 것이기 때문이다. 또한 학생들은 제품과 모델에 관계없이 그들의 집에 있는 컴퓨터에서도 파이썬을 사용할 수 있다. 더욱이, 웹사이트를 통하여 제공되는 파이썬 서비스는 선생님들에게 학교 PC에 Microsoft 오피스 이외에는 다른 어떤 것도 설치하지 못하게 하는 악명 높은 트롤 같은 학교 시스템 관리자들의 문제에 대한 훌륭한 해결책이다. 사용자들은 간단히 웹사이트에 접속한다. 그러면 어떠한 추가적인 소프트웨어 설치 없이도 완전한 기능을 갖춘 파이썬 개발 환경이 나타난다.
이상과 같이, 파이썬은 라즈베리 파이와 같은 소형기기에서도 실행된다. 심지어 임베디드 기기, 가정용 기기, 원격 조종기, 그리고 (무엇보다도) 장난감 등의 내부에 들어있는 소형 저전력 칩인 마이크로 컨트롤러에서도 실행된다.
MicroPython project는 그런 기기들을 위해 최적화된 파이썬 3의 축소 버전을 개발했다. 그리고 파이썬의 그런 축소 버전이 실행되는 소형 전자 회로 보드를 제공한다:
마이크로파이썬 보드 (대략 우표와 비슷한 크기)
이 매우 간단한 파이썬 기반의 운영체제는 모든 종류의 흥미롭고 재미있는 전자 프로젝트의 기반으로 사용될 수 있다. 보드의 부가품으로 LCD 디스플레이 스크린, 스피커와 마이크, 그리고 모터가 포함되어 있다. 그런 기기로 간단한 로봇을 만드는 것은 비교적 쉬운 작업이다.
더 최근에는, BBC가 아이들을 위해 배터리로 동작하는 프로그램 가능한 소형 기기를 개발하는 MicroBit project를 발표했다. 2015년 9월 새 학년이 시작할 때 영국에 있는 11살 아이들에게 100만개의 기기를 나눠줄 것이다. 그것은 또한 일반에게도 판매될 것이다.
마이크로비트는 옷에 고정시킬 수 있으며 2개의 버튼을 갖고 있고 스크롤 되는 텍스트와 이미지를 표시할 수 있는 LED 매트릭스가 있다. 라즈베리 파이와 마이크로파이썬 보드처럼 I/O 커넥션을 통하여 다른 기기들과 통신할 수도 있다.
파이썬은 마이크로비트에서 지원되는 세 가지 프로그래밍 언어 중에 하나이다.
아이들을 위한 프로그램 가능한 기기인 BBC 마이크로비트의 프로토타입
교육적인 중요한 이점은 지속성이다.
파이썬을 배움으로써, 학생들은 그들에게 익숙한 툴과 코드를 사용하여 탐구할 수 있는 모든 종류의 재미있고 흥미로운 플랫폼을 접한다. 파이썬은 많은 플랫폼에서 실행되기 때문에 하나의 디바이스에서 작성한 코드는 그것이 디바이스에 종속적인 코드를 사용하지 않고 하드웨어 제약적이지 않다고 가정하면 다른 많은 플랫폼에서도 실행된다.
인간미
프로그래밍 언어의 엄격한 특성이 아니긴 하지만 파이썬의 커뮤니티, 역사, 그리고 철학은 종종 파이썬으로 작성된 코드를 통하여 빛난다.
이상한 몬티 파이썬 레퍼런스 (써드 파티 파이썬 모듈을 제공하는 웹사이트는 치즈 없는 치즈 가게에 관한 콩트에서 따와 Cheese Shop이라고 불린다.), 장난스런 유머감각 (예를 들어, “PyPy 프로젝트”는 파이썬으로 작성된 파이썬의 고성능 버전이기 때문에 그렇게 이름 붙여졌다.), 그리고 다른 분명히 별난 점들은 파이썬이 접근성 높고 흥미 있는 프로그래밍 언어라는 것을 보여준다. 그것은 신비철학의 추상적인 툴보다는 훨씬 더 명백히 인간에 의해 인간을 위해서 사용되는 것이다.
파이썬 커뮤니티는 친근하고 다양하다. 다음 챕터에서는 개발자들, 교사들, 그리고 학생들의 커뮤니티에 대해 다루려고 한다.
간단히 말하면, 파이썬 커뮤니티는 파이썬 성공의 비밀무기이다.
***
원문 : http://radar.oreilly.com/2015/04/five-reasons-why-python-is-a-popular-teaching-language.html
역자 : 한일 / corone@naver.com
이전 글 : 페인트칠을 도와주는 10가지 팁
다음 글 : CNC 라우터 파트와 함께 만드는 우클레레
최신 콘텐츠