Languages/Python2014.01.01 11:42

1. 다양한 기능을 갖춘 언어가 필요하다면 


"실용주의 프로그래머(Pragmatic Programmer)"라는 책을 보면 일년에 하나 정도의 새 언어를 배우라는 조언이 있어요. Peter Norvig라는 사람이 쓴 "Teach Yourself Programming in Ten Years"라는 에세이를 봐도, 적어도 여섯 개의 "종류가 서로 다른" 언어를 10년간 배우라는 조언이 있지요. 뒤집어 이야기하면, 세상에는 여섯 가지 부류의 언어가 있다는 이야긴데요. 대충 정리해보면 다음과 같습니다. 


http://www.smallanimaltalk.com/2013/04/worlds-cutest-python.html


(1) 클래스 추상화(class abstraction)를 제공하는 언어

(2) 함수형 추상화(functional abstraction)를 제공하는 언어 

(3) 문법 추상화(syntactic abstraction)을 지원하는 언어 

(4) 선언적 명세(declarative specification)를 지원하는 언어

(5) 코루틴(coroutine)을 지원하는 언어 

(6) 병렬수행(Parallelism)을 지원하는 언어 


다른건 잘 모르겠고 (1), (2), (5)는 지원되면 좋겠다고 생각하는데요. 객체지향 언어는 이미 업계 대세니까 당연한거고, 함수형 추상화는 요즘 유행인데다 거의 모든 언어가 함수형 추상화를 지원하기 위해 삽질중이라 더더욱 그렇죠. Python은 (1), (2), (5)를 지원합니다. 객체지향 언어이자, 함수형 프로그래밍 언어이기도 하죠. 파이썬의 함수와 함수형 프로그래밍에 대해서는 http://docs.python.org/2/howto/functional.html 이 문서를 참고하면 좋겠습니다. 


사실 위의 여섯가지 속성을 거의 전부 만족시키는 언어도 있긴 한데요. Python의 미래라고 보는 사람도 있는 Julia입니다. http://julialang.org/ 


SEE ALSO: Java를 배워야 할 다섯가지 이유

SEE ALSO: 새로운 언어를 더 빨리 배우려면?


2. 생산성이 중요하다면


Python과 다른 언어의 성능을 비교하는 논쟁은 다양하게 있어 왔습니다. 한 가지 얻을 수 있는 결론은, Python의 성능이 나쁘지 않다는 겁니다. http://stackoverflow.com/questions/672857/is-python-slower-than-java-c 하지만 우리가 언어를 선택하는 기준이 꼭 성능 뿐만인 것은 아니죠. Python의 가장 큰 장점은 생산성입니다. https://pythonconquerstheuniverse.wordpress.com/2009/10/03/python-java-a-side-by-side-comparison/ 물론 어떤 언어의 생산성을 단순히 언어의 문법적인 측면만으로 논하는 것은 좀 위험한 일이긴 합니다만, Python의 문법이 보다 간결한 프로그래밍을 가능케 하는 것은 사실입니다. 


3. 프로그래밍 습관을 고치고 싶다면


파이썬은 들여쓰기(indentation)로 프로그래밍을 하는 드문 언어 가운데 하나입니다. C/C++/Java 등의 일반적인 프로그래밍 언어들은 보통 {와 }를 사용해서 구문의 범위를 구별하죠. 들여쓰기로 프로그래밍을 하면 {와 }를 쳐 넣지 않아도 되니까 프로그래밍 하기가 좀 편해지긴 하겠습니다만 코드가 길어지면 가독성이 점차로 떨어지게 되는 문제도 있습니다. 대체 어디서부터 어디까지가 함수인지를 명확하게 알기 어렵다는 문제도 있죠. 


그래서 파이썬으로 프로그래밍을 하다 보면 의식적으로 함수 하나의 길이를 줄이게 되는데요. (너무 길어지면 정말 정신 사나워지거든요.) 그러다보면 코드는 좀 더 테스트하기 쉬운 단위로 분할되죠. 이런 종류의 리팩터링(refactoring)을 의식적으로 하게 된다는 것은, 프로그래밍을 처음 배우는 사람 뿐 아니라 프로그래밍을 굉장히 오랫동안 해 온 사람에게도 유익한 것이죠. (Python 프로그램의 가독성이 다른 프로그램보다 높다는 사람이 있는데요. 아마 이런 종류의 반강제적 리팩터링과 간결한 문법 덕분에 그런 주장이 가능한 것이 아닐까 생각합니다.)


4. 초대형 프로젝트에 사용되는 dynamic 언어를 배우고 싶다면 


Python은 초대형 프로젝트에서 널리 사용되고 있는 동적 프로그래밍 언어이기도 합니다. http://www.ozytive.com/2012/10/13/10-reasons-why-you-should-learn-python/ 그러니, 초대형 프로젝트를 진행할만한 여력이 있는 회사에 취직하고 싶다면, Python을 알아두는 것이 좋겠어요. 이런 것은 단순히 프로그래밍 언어 유행을 따라가느냐 마느냐의 문제는 아니죠. 


5. 배우기 쉬운 dynamic language가 필요하다면


Python은 분명 배우기 쉬운 dynamic language입니다. 거기다 거대한 개발자 커뮤니티를 갖고 있죠. (Python의 역사는 꽤 오래 되었습니다.) 거기다 문서화도 충실하게 잘 되어 있어서, 아주 쉽게 배울 수 있는 언어이기도 합니다. (아마 기본적인 문법서 한권 정도를 본 다음 doc.python.org의 HOWTO 문서를 읽으면 바로 프로그래밍을 시작하실 수 있을 겁니다. 저는 일주일 걸렸습니다.) 


이것은 Python의 기본적인 문법이 기존 프로그래밍 언어와 크게 다르지 않기 때문이기도 하고, 가능한 자연어에 가깝게 느껴지는 문법적 구조를 채택하고 있기 때문이기도 합니다. Julia는 이점에서 Python과는 좀 다릅니다. 코드를 보면, 뭘 하는 코드인지 한 눈에 확 들어오질 않아요. (물론 다르게 생각하시는 분들도 있긴 하겠습니다만. :-P)



저작자 표시 비영리 변경 금지
신고
Posted by 이병준

소중한 의견, 감사합니다. ^^

  1. 블로그 내용 잘 보고 갑니다.

    2014.01.01 15:14 신고 [ ADDR : EDIT/ DEL : REPLY ]
  2. 파이썬에 대해 다시금 바라보게 되는 좋은 글이네요. 특히나 6가지 항목이 가장 눈길을 끄는군요. 파이썬 책을 하나 사봐야겠는데요.

    2014.11.18 09:14 신고 [ ADDR : EDIT/ DEL : REPLY ]

Thoughts2013.12.16 09:55

세상이 단순했던 시절이 있었습니다. C/C++ 말고는 언어가 없다고 생각해도 괜찮았던 (응?) 그런 시절이 있었죠. 그러나 지금은... 아마 그렇게 얘기하면 많은 분들이 고개를 흔들 겁니다. 지금이야말로 프로그래밍 언어의 춘추전국시대라고 말해도 과언이 아닐 지경이죠. 그러니 프로그래머라면 알아야 할 언어의 가짓수도 보통 2개 이상인 형편인데요. 새로운 언어를 빨리 받아들이려면 어떻게 해야 하는 걸까요?


1. 한 가지 언어에 무불통달하라 


새로운 언어를 빨리 배우는 가장 좋은 방법 중 하나는, (좀 이상하게 들리겠지만) 지금 아는 언어를 막힘없이 쓸 줄 알게 되는 것입니다. 요즘 널리 사용되는 많은 언어들이 객체지향적이기 때문에 (C++, Java, Python, Objective-C 등등) 한 가지 언어를 능숙하게 사용할 줄 알면, 다른 언어도 쉽게 배울 수 있습니다. 일례로, 저는 대학시절부터 C++을 사용해 왔는데, Java로 프로그램을 작성하기까지 일주일이 걸리지 않았습니다. 


2. 최소 2년마다 하나씩 새로운 언어를 배우라 


새로운 언어를 배운 경험은, 다른 새로운 언어를 배우는 데도 긍정적으로 작용합니다. C++과 Java로 프로그래밍을 할 줄 알게 된 사람이라면, Python을 배우는 것이 그렇게 어렵지 않을 겁니다. ({과 }가 없는 프로그래밍 언어에 대한 두려움만 극복한다면 말이죠.) 물론 실제로 어렵지 않아서 어렵지 않다고 느끼는 것은 아니고, 보통은 자신감이 커졌기 때문에 '쉽다'고 느끼는 것이긴 하지만 말이죠. (JavaScript는 처음에는 쉬울지 몰라도, 배우면 배울 수록 어려운 언어 가운데 하나죠.) 


3. 다양한 자원을 활용하라 


이 글을 읽으시는 분들 가운데 http://www.codecademy.com/ 를 알고 계시는 분들이 아마 계실 텐데요. 저는 Python을 이 웹사이트를 통해서 배웠습니다. 요즘에는 온라인에 이런 도구들이 정말 많습니다. 이런 도구들을 소개한 기사도 있는데요. http://thenextweb.com/dd/2012/10/21/so-you-want-to-be-a-programmer-huh-heres-25-ways-to-learn-online/#!pYqX7 여기를 방문해 보시기 바랍니다. 



실제 Python 강의가 진행되는 화면



이런 도구들의 장점은 (1) 시간 제약 없이 배울 수 있고 (2) 컴퓨터가 있으면 어디서든 배울 수 있으며 (3) 잘못된 점을 확인하기도 쉽다는 겁니다. 게다가, 온라인 강의를 제공하는 사이트들을 활용하면 전 세계의 수많은 개발자들과 함께 공부하는 드문 경험을 할 수 있게 되기도 하죠. 가령 여러분이 새로 Android 개발을 공부하는 사람이라면, 분명 Google의 Code University에 깊은 인상을 받게 될 겁니다. https://developers.google.com/university/ (그러나 이런 사이트들을 손쉽게 이용하려면 영어 능력이 반드시 갖춰져야 한다는 것은 안습) 


4. 프로그래밍 언어와 관계 없는 지식에 깊이를 더하라


그러나 이런 저런 프로그래밍 언어를 배운다고 해서 Guru가 될 수 있는 것은 아닌 법. '좋은 프로그래머'와 '나쁜 프로그래머'를 나누는 가장 결정적인 기준은 오히려 프로그래밍 언어가 아닙니다. 그것은 코딩 스타일의 문제이며, 알고리즘의 문제이고, 수학의 문제입니다. 팀웍의 문제이고, 시간관리의 기술이며, 가치를 전달하는 방법입니다. 


이런 부분에 대한 지식을 갖추는 것은 대체적으로 '프로그래밍 언어'를 습득하는 것 보다 어렵습니다. 하지만 일단 틀이 잡히면, 프로그래밍 언어를 더 빨리 습득할 수 있도록 해 줄 뿐 아니라, 그렇게 배운 언어들로 더 빨리 생산적인 작업을 진행할 수 있도록 만듭니다. (아는 알고리즘이 bubble sort밖에 없는 상황에서 이 언어 저 언어 배운다고 상황이 나아지지는 않으니까 말이죠. :-P) 이런 지식들을 갖출 수 있기를 간절히 원한다면, MIT Open Courseware나 iTunes U를 활용하세요. 다양한 강의들이 (영어로) 제공됩니다. 


그리고 대체로, 프로그래밍 언어는 그야말로 '선택'과 '효율성'의 문제만 해결해 줄 수 있을 뿐입니다. 실제로 풀어야 하는 대부분의 문제는, 해당 문제가 위치한 Domain에 관계된 Domain Knowledge가 있어야만 풀 수 있는 경우가 대부분이죠. 


저작자 표시 비영리 변경 금지
신고
Posted by 이병준

소중한 의견, 감사합니다. ^^