블로그 이미지
레인레테
연락처 : rainlethe@rainlethe.com 영혼을 잃어버리다.

calendar

      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29      
2012/01/02 19:50 RL.P rogramming
저는 개발자입니다.

본격적으로 개발자로 일을 하기 시작하면서 가장 많이 다루었던 언어는 C#이고, 그 외에 보통 소소한 인하우스 프로그램들은 보통 그때그때 상황에 맞춰서 개발 환경이나 언어를 선택합니다.

이번에는 간단하게 URL을 파싱할 일이 있어서 Python을 이용해 보았는데요. 이때 느꼈던 점을 간략히 서술해 보려고 합니다.


I. 왜 Python 이었을까.
굉장히 단순합니다. 좀 더 Python 을 배워보고 싶었고, 구글에 URL 파싱이라고 쳐보니 가장 흔하게 나오는 자료가 Python의 모듈 중 하나인 BeautifulSoup이었기 때문입니다.

저는 무언가를 개발할 때, '가능하면 남들이 한 삽질 따라하지 말자.' 주의기 때문에 , 다른사람들이 어떤 식으로 문제를 해결했는지 꽤나 오래 살펴보는 편인데요. 
BeautifulSoup 같은 경우에는 '쉽고 편하다'라는 점. 그리고 일관된 메뉴얼이 있어서 좀 삽질을 덜하겠다 싶었습니다.

II. 그럼 왜 C#이 아니었을까.
왜 익숙한 닷넷 플래폼이 아니었을까요?

C#에서는 URL을 파싱하는 방법이 굉장히 많습니다.
System.URI 클래스를 사용할 수도 있고, 
mshtml COM을 이용할 수도 있으며,
심지어는 WebBrowser 컨트롤을 이용해서 읽어올 수도 있습니다.
물론 XML 클래스를 이용하는 방법도 빼놓을 수 없겠죠.
게다가 삽질 가능하다면  String을 파싱해서 HTML 트리를 만든 다음 하나씩 분해할 수도 있습니다.

... 이 많은 방법 중에 어떤게 저에게 맞는 방법인지 찾는 것도 사실은 일입니다. 다 작동한다는건 알겠는데, A 방법은 ㄱ작업시 불편하고 , B 방법은 ㄴ 작업이 아예 불가능하거나 리플렉션까지 이용해야 한다면, 이건 만드는 시간보다 어떤 도구를 선택할 지 고르는 시간이 더 오래 걸릴 것 같았습니다.

인하우스 프로그램이 아니라 외부에 납품하거나 공개하는 거였다면, 저는 좀 삽질을 해서도 c#을 사용했을지도 모르겠지만, 어차피 나만 쓰는데 굳이 돌아갈 필요는 없겠다 판단했습니다.

III. 그래서 뭘 느꼈을까.

1. 테스트가 엄청 많이 필요하다.
Python은 동적 언어이기 때문에, 말 그대로 '실행시켜' 보지 않고서는 어떤 결과가 나올 지 예측하기가 좀 어렵습니다.
정확히 말하면 어떤 '타입'이 튀어나올 지 알기 힘들죠.
정적 언어는 그 특성상 (대부분의) 변수나 함수가 타입이 정해져 있는 데 반해, 동적 언어는 단순히 '튜플을 반환한다' 정도입니다.
이 튜플이 어떤 특성을 가지는지는 그냥 '컨벤션' 에 따르는 경우가 많고, 그렇기 때문에 실제 데이터를 넣고 실행시켜 보지 않는 한 내가 원하는 정확한 결과가 나올 지 알 수가 없더군요. 
그래서 실제로 코드를 만들어내는 시간보다 코드를 일일이 쪼개서 테스트하는 시간이 더 오래 걸렸습니다. 
물론 정적 언어로 개발할 때도 테스트는 신물이 날 정도로 합니다만, 이건 그런 수준이 아닙니다. 코드몇글자 바꿔놓고 테스트해보고, 또 테스트해보고, .. 를 반복합니다. 


2. 코드 길이는 압도적으로 짧다.
실제로 코드 길이는 압도적으로 짧습니다.
Python의 모듈들이  동적으로 이루어지고, 언어 문법 자체가 훨씬 다이나믹하기 때문에, 굳이 필요없는 부분은 잘 들어가지 않습니다.
저도 사용하기 전까지는 크게 못느꼈었던 부분인데, 막상 사용해보니 그렇더군요.
한 눈에 전체 구조가 보일 정도로 코드가 짧아집니다.
즉, 환경이 짧은 코드를 장려하기에 더욱 코드가 짧아지는듯 합니다. 

3. 자료구조. 그리고 함수. 
C#을 쓸 때는 '자료구조'와 '함수'를 서로 맞춰야 합니다.
일관되게 Object형이나 String 형으로 써 버린 다음 사용시에 캐스팅을 한다면 할 말이 없지만, 언어단에서 장려하는 문화가 아니기에 사용이 꺼려집니다. 
그리고 이러한 구조를 잡는 것이 훨씬 '단단한' 느낌이 들기도 하죠.
반면 Python을 사용할 때는 자료구조는 거의 생각하지 않습니다. 
선언부에 타입을 적지 않기 떄문에, 그냥 내가 뭘 할지만 생각하면 됩니다.
함수가 완성되고 나면 어쩐지 저절로 반환 타입이 정해진 느낌이 들 정도로, 논리 흐름에 집중할 수 있습니다.
보통 정적 언어에서는 Scalar Type 과 Collection Type은 완전히 다르게 처리해야 합니다만, 동적 언어는 그런 부담이 적습니다.
하나가 변경되었을 때 나머지 코드가 변경되는 양이 압도적으로 작기도 하죠. 
대신 사용할 때 조심해서 사용해야 하는 단점은 있습니다.


4. IDE 의 부재
개인의 편차는 있을 것입니다만 Eclipse, Visual Studio 등을 비롯한 IDE는 개발하기에 정말 좋습니다.
특히 저는 닷넷 개발자니까 당연히 Visual Studio 제품군을 사용하는데, 이건 단순히 IDE 라고 부르기에 미안할 정도로 훌륭합니다. 
반면 동적 언어 진영은 여전히 IDE가 부실합니다. 
인텔리센스, 자동 리팩토링, 빌드 자동화, 버전 관리 시스템과의 일체성, 거의 완벽에 가까운 디버깅 환경 등 정적 언어에서는 IDE 가 굉장히 잘 발달해 있습니다.

반면 동적 언어들은 IDE가 그리 좋지 않습니다. Eclipse에 붙어있는 PyDev도 그닥 훌륭한 수준은 못되는것 같고, Scite는 개발환경이라기 보다는 그냥 텍스트 편집기 수준 정도입니다.

이게 그럴수밖에 없는게, 동적 언어는 말 그대로 '동적'이기 때문에, 실제로 프로그램이 돌아가기 전까지는 이 메서드가 실제로 있기는 한 건지, 혹은 잘못된 부분이 발견되었을때는 어떻게 해야 할 것인지에 대한 메타 정보가 거의 전무합니다. 그렇기 때문에  모든게 결정되어 있는 정적 언어와는 전혀 다른 환경이 나올 수 밖에 없죠.

... 사정은 이해합니다만, 굉장히 편리한 환경에서 개발하다가 이런 환경에서 개발하라고 하면, 도대체 이건 왜 안돼지? 이건 왜? 심지어는 조사식도 이렇게 불편한가? 등등 불만만 막 터져 나옵니다. 


게다가 이건 디버깅도 사실상 어렵습니다.
중단점을 찍는것 까진 좋은데, 변수가 실제로는 그냥 포인터일 뿐 값을 들고 있는게 아니라서 조사식을 일일이 계산합니다. 
거기까지도 좋은데, 그럼 연산을 못하는 함수 프로퍼티는 그냥 무시하면 될 텐데, 그걸 어떻게든 계산을 해 보겠다고 애를 쓰더니 ... IDE가 죽어버리는 황당함도 생깁니다.

대체 뭔지.
 
5. One Way.
사족으로 이건 Python의 특징일지도 모르지만, 한가지 일을 해치우는데는 한가지 방법밖에 없다.. 라는 원칙은 의외로 굉장한 도움이 됩니다. 어떤 Reference를 찾아봐도 거의 동일한 답이 나온다는 것이고, 그 Reference가 내 상황에 맞는지만 판단하면 되니까요.


IV. 결론.

 동적언어는 생산성이 좋다. 하지만 그 짧은 코드를 만들어내는 시간이나 노력은 정적 언어와 큰 차이 없더라. 그냥 가장 알맞는 라이브러리가 있는 언어를 골라 쓰자.. 정도 되겠습니다.



읽어주셔서 감사합니다.  

2012.01.02. By RL.P 
저작자 표시 비영리 동일 조건 변경 허락
posted by 레인레테
2011/02/23 17:23 RL.T hink.
[RL.Application] - DE File Numberer. v0.1. 파일명을 일괄로 바꿔주는 프로그램.
을 만들면서 느꼈던 것들입니다.











제작기간 : 자그마치 15일!

뭐가 이리 오래걸린걸까요?



1. 프로토타입.


완전 초 단순한 프로그램이라서 만드는데 별로 안걸릴 줄 알았습니다.

Visual Studio 2008 개발환경.


그리고 제가 가장 익숙하게 다루는 언어가 c#이라서 이걸로 뚝딱뚝딱 만들었죠.
프로토타입이 만들어질때까지 약 1-2시간정도 걸렸습니다.


2. 알파버전을 보여줬다.

그랬더니 바로 두가지 문제를 지적당했습니다.

2.1. 저 선택취소 버튼이 뭘 의미하는가?
선택취소 버튼을 누르면 어떻게 되냐고 묻더군요.
그 래서 선택취소 버튼은 말 그대로 이미 리스트에 올라가있는 파일들을 다 지워버린다고 말해줬습니다. 그랬더니 파일들을 체크박스로 선택하고 그 선택된것만 지워버리는게 어떻냐고 피드백을 줘서, 그렇게 고쳤습니다. 이렇게 뜯어고치는데 한시간 정도 더 소요됐고요.

2.2. 이 간단한 프로그램을 돌리는데 왜 1G 남짓이나 되는 프로그램을 설치해야 하는데?

 닷넷 프레임워크는 인터넷에서 다운받아보면 약 1G 조금 안되는 용량을 가지고 있습니다.
그런데 제가 생각해도 막막한 겁니다. 도대체 왜 이걸 돌리는데 닷넷 프레임워크를 깔아야 한다고 설명할 수 있을까. 프레임워크 레이어라서 사실상 필요한 라이브러리가 다 그안에 들어있다..라고 말해줘야 하는데, 깊이 들어가다보면 설명이 너무 복잡해지더군요.


3. 다른 언어로 짜야겠다

그래서 다른 언어로 다시 짜야겠다고 생각했습니다. 최소한 복잡한 닷넷 프레임워크 필요없이 간단하게 동적 DLL링크시키는 방식으로요.
뭘로 짤까 고민좀 해봤습니다. 그리고 목록이 쭉 나왔죠.



4. Python은 어떨까.

Python IDE.

Python으로 실제로 파일을 불러오고 변경시키는 논리 자체는 어렵지 않습니다. 오히려 C#에서 사용하는 제네릭 형식을 훨씬 편하게 쓸 수 있고, 제가 즐겨 사용하는 리스트 형식이 내장되어 있어서 프로그램을 개발하는데 편리하죠. 동적 언어의 특성때문에 조금 느리기는 하지만, 이 간단한 프로그램에는 별 상관없을꺼라 생각했습니다.

그런데 문제가 하나 생깁니다. 바로 괜찮은 IDE가 없다는 거죠. 저는 4GL 형식의 아주 심플한 화면 구성이 필요했습니다. 일일이 Tkinter 를 코드로 치고싶지는 않았어요. 간단하게 만들 수 있는거면 간단한게 최고다..라는 주의라서,  괜찮은 IDE가 있나 찾아봤습니다.

4.1. Boa-Constructor

이거야 됐어! 라고 생각했지만.. 왠지 모르게 작동하지 않았습니다(...)
BOA는 설치파일 형식으로 배포는 되지만, 실제 실행은 Lib 폴더 안에 들어가서 boa.pyw 을 실행해야 하는 형태입니다. 그런데 왠지 모르게 IDE만 뜨고 보아 자체는 전혀 실행되지 않았습니다. 그리고 Reference 를 영어로 봐야하는 압박 귀찮음도 있었고요.
물론 공식 그래픽 라이브러리인 Tkinter가 아니라 WxPython을 사용하는 거라서 바게님의 포스트를 참고하여 PyWin을 설치했습니다. wxPython은 python 3.1용 버전이 릴리즈된게 없어서 일단은 py27버전을 설치했고요. (이게 문제인지도..)
여하튼 되지 않습니다. 봵!

4.2 PythonCard
출처 : PythonCard 공식 홈페이지.

 PythonCard는 제가 원하는 모양이 아니라서 포기.

4.3. KomoDo

ActiveState사의 KomoDo는 유료라서 포기 ($382 = 2011.02.23일 오후 4시 기준 428,604 원..)


5. Small Basic

Small Basic IDE.

Small Basic은 예전 GW-Basic의 추억을 생각하며 그냥 막코딩해볼까 하고 찾아봤습니다만, 그래픽 라이브러리는 있는데 너무 제한이 많고.. GOTO 문이 난무하는걸 보면서 포기...
게다가 재미있는 게, Small Basic은 퍼블리싱을 할 경우 Visual Basic .net 으로 자동으로 코드를 바꿔줍니다. 결국은 스몰 베이직도 닷넷 프레임워크가 실행시에 필요하단 얘기죠.


6. FBEdit

FBEditFreeBasic 이라는 Quick-Basic의 추억을 되살리면서 만든 베이직 컴파일러의 IDE입니다. 현재 FreeBasic 프로젝트 자체는 정체 상태입니다만, 이미 완성도가 높아질만큼 높아졌으므로 그냥 써보기로 했습니다. 언어에 최소한 프로시져랑 함수 정도는 있더라구요.
FBEdit 외에 FBIDE 프로젝트도 있습니다만... 만들다 만건지.. 사이트가 엉망이길래 포기.

FBEdit 소스코드

그런데.. 이게 ... 너무 MFC 방식입니다.
윈폼 개발시에 C++ 로 하는것처럼..  보라 윈폼이 시작할때 파라미터의 포인터 난무를....
처음부터 C++ 로 만들 생각을 안했던게, 너무 귀찮고 복잡하거든요. 논리를 세우는데 집중할 수 있는게 아니라, 컴퓨터가 어떤식으로 동작하는지를 먼저 머리속에 그리고, 그다음에 논리를 세워야 하는데.. 이걸 가능하면 피하고 싶었습니다.


7. Lazarus.


LazarusDelphi오픈소스 구현입니다. 정확히 말하면, 위에서 말한 FreeBasic과 FBEdit의 관계처럼 FreePascal이라는 Object Pascal의 오픈소스 구현이 있고, 그 위에 Lazarus라는 IDE가 올라가는 형태입니다.

한때는 시대를 풍미했던 터보 파스칼의 기억을 되살려가며 한번 해보려고 했습니다만..
이게 IDE 기능 자체는 놀랍도록 좋습니다. 구현체 자체는 Delphi 2005랑 상당히 비슷하게 되어 있고, 기능도 훌륭해요. 인텔리센스도 잘 먹습니다. 그리고 4GL시대에 (한때는 Visual Basic과 어깨를 겨루었던) 맞춘 기능을 모조리 구현해놨습니다.
조금 특이한 것이, 각각의 창이 둥실둥실 떠다닙니다. 그러니까, 소스코드창은 소스코드창대로, Object Inspector 는 Object Inspector 대로, 디버거는 디버거대로 떠다닙니다. 위치를 잘 맞춰주지 않으면 어느순간 소스코드창에 가려져서 디버그 트레이스가 사라져 버립니다 (...)

이걸 포기한 이유는 두가지인데요.
하나는 디버깅 트레이스에서 조사식을 찍어보면, Object의 Property 와 Method 목록이 펼쳐지지 않아요. 저는 개체 하나의 값이 전체적으로 어떻게 변하나를 조사식으로 일일이 찍어보는 버릇이 있는데, 이게 힘들더군요.
다른 하나는 파스칼 언어 자체의 한계입니다. 이걸 한계라고 해야 할 지는 모르겠는데, C언어 계열에서는 각 변수가 컨텍스트 안에서만 존재한다는 규칙이 있습니다.
예를들면
int BeginNumber = 20;
 For (int i=0;i<10;i++) { int innerVar = i + 2; BeginNumber += innerVar ;}

여기서 BeginNumber는 For 문 밖에, innerVar 변수는 For문 안에서만 존재하는 변수죠.
그런데 파스칼은 이게 안됩니다. 모든 변수는 프로시져(혹은 메서드) 시작점에서 정의되어야 합니다. 즉, 각 변수는 필요한 컨텍스트가 있는데, 이걸 지정하는게 안되더군요.

그래서 또 포기.



8. Visual Basic.




드디어 대망의 Visual Basic입니다.
4GL 시대를 주름잡았던 툴이죠. 그리고 많은 초보자들을 프로그래밍의 세계로 이끌었던 툴이기도 합니다.
사실 Visual Basic 언어 자체가 그리 잘된 언어는 아닙니다만.. 언어에 비해서 IDE 수준은 높은 편이고, 필요한 기능을 COM 을 통해 아주 쉽게 확장할 수 있다는 면에서 너무 좋더군요. 여하튼 저는 원하는것만 할 수 있으면 되니까.. 라고 생각하고 대충 다 만들어 놨었습니다.
리스트 구현체가 동적 배열을 끊임없이 Allocation해야 하니까 불편하긴 한데, 이건 뭐 그냥 그럭저럭 쓸만하니까 무시했습니다.

그런데 이게 결정적으로  파일을 읽어들이는 CommonDialog 와 File Rename 하는 부분에서 버그가 있는 겁니다. (...)
처음에 파일 목록을 CommonDialog로 읽어들일때는 아무 문제가 없지만, FILE A as B로 파일 이름을 한번 바꾸고 나면 문제가 생깁니다. CommonDialog에서는 파일이름이 변경되었다고 나오는데, 실제로 탐색기에서 체크해보면 전혀 안바뀌는겁니다. (-_-)
제가 잘 몰라서 그러는건지, 아니면 NTFS 시스템상에서 제대로 작동을 안하는건지, 아니면 제가 패치를 안받아서 그런건지는 모르겠는데... 어쨌든 안됩니다.

게다가 이미 버림받은 언어기 때문에 (더이상 제품군 출시가 안돼죠..) VBA로만 살아남은듯하고요.


결국엔 ..


그래서 개발 툴을 약 열개를 깔아보고 테스트해보고 만들어보고 하다가 위에 언급했던 한계들로 인해 결국 포기하고 c#으로 만들수밖에 없었습니다. -_-
이과정이 약 13일 걸렸군요.
나머지 하루 정도는 테스트하고 간단한 설명글 넣고 하는데 투자했습니다. 뭐 프로그램 자체를 만드는 시간은 약 3시간 정도였고, 테스트하는데 그것보다 오랜 시간이 걸렸으니 TDD 가 되는건가요 (...)




그런데 그 많던 델파이, 비주얼 베이직 개발자들은 다 어디에 갔을까?


그런데 다 만들어놓고 릴리즈해놓고 나니 이런 생각이 문득 듭니다.

지금은 사장되어 버린 툴을 쓰던 사람들은 다 어디로 갔을까.. 새로운 길을 찾아 VB.NET으로, 혹은 다른 언어를 선택했을까. 관리자로 변신했을까. 아니면 이바닥을 은퇴했을까..

IT는 정말 무섭도록 빨리 변화합니다. 하루밤만 지나고나면 신기술이 나와있고, 무슨 방법론이 이리 쏟아져 나오는지 이제는 이름도 못외우겠습니다. 과거에는 네트워크 컴퓨팅이라고 불리던게 뜬금없이 클라우드라는 이름표를 달고 나와서는 신기술이 되어버리고, 미묘한 부분만 바뀐  프로토콜은 이게 최고라고 선전합니다.

프로그래밍 언어는 (요새는 좀 덜합니다만 ) 여전히 마이너리그에서 미친듯이 쏟아져나오고 있죠. Rails가 유행할때는 모두가 루비를 할 줄 알아야 했고, 와우에 Lua가 쓰였다고 하니까 게임기획자들의 필수언어가 되어버렸던 기억이 있네요. (지금도 그런가요?)

ORM이 유행할때 자바 개발자들은 Hibernate 정도는 할 줄 아는게 기본이어야 했고 .net 쪽은 ado.net에 덧대어 Linq를 쓸 수 있어야 했죠. (공부할 시간은 대체 언제...)


게다가 웃긴게 이제는 다시는 사용하지 않을꺼라던 언어를 유지보수 과정에서 써야 할 일도 생깁니다. 멀리 볼 것도 없이 Y2K 사태 기억하시나요? 갑자기 Cobol 프로그래머 단가가 상상을 초월하게 올라갔었죠.


문득 생각합니다.
신기술이 나오는 건 좋고, 우리 (개발자)들의 삶을 편안하게 해주려는 목적은 잘 알겠지만, 이게 정말 나를 편안하게 해주는 길일까..하고요.


긴글 읽어주셔서 고맙습니다.

2011.02.23. By RL.T
저작자 표시 비영리 동일 조건 변경 허락
posted by 레인레테
prev 1 next