저는 PHP를 싫어하는 편에 속하는 개발자입니다.
보통 PHP를 싫어하는 개발자
라고 하면 PHP를 옹호하는 개발자
분들은 “PHP를 비난함으로써 자신이 좀 더 우월한 존재라고 어필”하려고 한다던가, “자신이 쓰는 언어의 우월함을 과시”하려고 한다고 생각하죠.
심지어는 “니까짓게 PHP를 알아?”라고 생각하는 사람도 있겠죠.
저는 2011년 정도까지 PHP를 주력 언어로 썼던 개발자입니다.
첫 입문 언어도 PHP 였습니다.
한국 PHP 문화에 큰 영향을 끼친 Zeroboard 4에도 몇 차례 보안 패치를 내놓은 적이 있습니다.
갈아타고 나서도 PHP 7의 신기능을 미리 접해보기도 했었고 PHP를 보다 잘 써보고자 하는 사람들의 페이스북 그룹에서도 활동하고 있습니다.
그래도 전 PHP를 싫어한다고 자신있게 말합니다.
저는 이 글을 통해서 제가 왜 PHP를 싫어하는지 말해보고자 합니다.
이미 PHP 안티들의 성서쯤의 위치에 자리잡혀버린 PHP: 잘못된 디자인의 프랙탈(원문)에서 이미 잘 설명하고 있습니다.
제가 더 길게 쓰지 않아도 저 글이 이미 PHP 자체의 문제점은 많이 지적하고 있습니다.
그런데, PHP는 왜 이렇게 이상해졌을까요?
저는 PHP가 첫 단추를 잘못 끼웠다고 생각합니다.
PHP의 창시자는 Rasmus Lerdorf라는 사람입니다.
이 사람이 이제까지 해왔던 어록을 짚어보면 PHP의 이상함의 근원을 알 수 있습니다.
I actually hate programming, but I love solving problems.1
저는 정말로 프로그래밍을 싫어해요. 하지만 문제를 처리하는 것은 좋아하죠.
이 사람은 처음부터 프로그래밍에 관심이 없었습니다.
프로그램을 만든다기보다는 문제 해결을 위한 코드 뭉치가 필요했다는 말이 정확할 것 같습니다.
그 결과 이렇게 됩니다.
I really don’t like programming.
I built this tool to program less so that I could just reuse code.2저는 정말로 프로그래밍을 싫어해요.
저는 코드를 다시 써서 프로그래밍을 덜 하게 만들기 위해 이 툴을 만들었어요.
코드를 다시 쓰는 것, 즉 코드의 재활용이 뭐가 나쁘냐고 말할 수 있을거라 봅니다.
하지만 그 결과가 PHP에 전역적으로 배치된 수천여개의 내장 함수입니다.
정말 다 필요한가요?
이 사람에게 필요했던 것은 자신의 문제를 처리해줄 프로그램이지, 프로그래밍을 할 도구를 만드는 것이 아니었습니다.
프로그래밍을 할 도구, 언어 개발자로써의 그는 어떨까요?
I was really, really bad at writing parsers.
I still am really bad at writing parsers.3저는 예전에 정말 파서를 잘 못만들었어요.
그리고 지금도 저는 파서를 잘 못만들어요.
그는 PHP 파서를 잘 못만든다고 합니다.
다행히도 지금은 그의 말대로4 PHP를 그가 혼자서 만들진 않습니다.
PHP 7에선 AST도 도입되었죠.
하지만 그는 PHP라는 문제 해결에 있어서 파서를 막 만들었습니다.
I’m not a real programmer.
I throw together things until it works then I move on.
The real programmers will say “Yeah it works but you’re leaking memory everywhere. Perhaps we should fix that.”
I’ll just restart Apache every 10 requests.5저는 진짜 프로그래머가 아니에요.
다 던져두고 돌아가게 되면 그때 행동해요.
진짜 프로그래머들은 말하죠. “그래, 돌아는 가, 하지만 당신 코드는 산지사방에서 메모리가 새고 있어. 어쩌면 우리가 그걸 고칠 수 있을지도 몰라”
저는 그냥 Apache를 요청 10회마다 재시작할 뿐이에요.
그리고 그 결과물이 PHP입니다.
I’ve never thought of PHP as more than a simple tool to solve problems.6
저는 PHP보다 문제 해결에 있어 심플한 툴을 상상할 수 없어요.
이 외에도 Rasmus Lerdorf의 이상한 발언은 수도 없이 많지만7 더 파해칠 필요는 없다고 생각합니다.
이미 이만큼 봤으면 충분히 PHP의 시작이 잘못 되었음을 알 수 있으니까요.
더 심각한 문제는 PHP가 갈수록 더욱 더 괴악해졌다는 점입니다.
대표적인 예로 register_globals이 있습니다.
간단히 말하자면 외부에서 오는 입력을 모두 전역변수로 풀어놔버리는 것인데, 초기화 되지 않은 변수여도 모두 덮어씁니다.
현재까지도 PHP 소스의 보안을 날려버리는 최악의 선택 중 하나로 꼽힙니다.
하지만 이 기능으로 인해 SQL Injection 위험성이 있자 PHP 진영은 Magic Quote라는 더 이상한 솔루션을 붙여놨습니다.
외부에서 들어오는 모든 값에서 SQL과 연관이 있어보이는 "
, '
, 를 escape하는 것이죠.
하지만 이것만으로 모든 이슈가 해결되지도 않거니와, 모든 외부 변수가 escape가 되어있는 관계로 순수하게 변수값이 필요한 상태라면 다시 escape를 풀어야 하는 상황에 놓입니다.
저는 이 기능들이 왜 PHP 5.4까지 살아남았는지 이해할 수 없습니다.
문제는 여기서 끝나지 않습니다.
PHP로 프로그래밍을 하는 개발자들은 PHP로 개발을 하면 이렇게 하는거구나라고 생각을 하고 그 당시의 PHP를 익혔습니다.
그리고 그것을 그대로 이어오고 있습니다.
가령, 위에서 언급한 register_globals
는 PHP 5.4에서 사라졌습니다.
그러자 개발자들이 취한 선택은 두 가지로 나뉩니다.
5.3 이상으로 올리지 않거나, register_globals
와 똑같은 동작을 재현한 겁니다.
<?php
extract($_GET);
extract($_POST);
extract($_COOKIE);
보안상 안좋아서 막아버린 기능을 구태여 다시 재현하여 개발을 합니다.
그 결과 보안적으로 전혀 나아지지 않습니다.
정상적인 해법을 배우지 않고 이런 식으로 우회적인 꼼수만 늘려갑니다.
PHP 문화권은 이미 저 분위기가 지배적입니다.
저는 원인이 두 가지 있다고 생각합니다.
하나는 PHP로 작성된 코드를 (위험성을 알건 모르건) 다시 바꿀 생각이 없는 생산품의 주인들입니다.
이미 잘 돌아가는 것처럼 보이므로 딱히 서버의 PHP 버전을 올린다던가 해서 문제를 더 만들고 싶지 않습니다.
따라서 그냥 방치합니다.
또 하나는 PHP로 작성된 코드를 (위험성을 알건 모르건) 다시 바꿀 생각이 없는 생산품의 생산자들입니다.
문제가 있다는 것을 알지도 못할 정도로 소식통이 막힌 개발자도 실존하리라 봅니다.
문제가 있다는 것을 알고도 그냥 방치하는 개발자도 많습니다.
왜냐, 학습은 비용이 들고(굳이 돈이 아니더라도 시간, 정신력 등), 자신은 그것보단 다른 것(상품을 더 만들어서 파는 것 등)에 몰두하고 싶기 때문이죠.
그래서 더 이상의 개선의 여지가 없어져버립니다.
이게 싫은 개발자들은 크게 두 가지 행동을 취했습니다.
첫째. PHP를 잘 써보기로 합니다.
PHP: The Right Way와 Modern PHP로 대표되는 움직임입니다.
PHP가 과거에 이상했던 부분이 워낙 많았지만 그래도 조금씩이라도 더 나은 부분을 만들고자 하므로, 나쁜 버릇은 버리고 깔끔하게 새로 시작하자는 것입니다.
하지만 이미 과거의 유산들이 너무 비대하고, 그 문화가 팽배하기 때문에 새 문화를 위한 투자를 이해하지 못하는 사람들이 많아서 확산은 더딘 편입니다.
둘째. PHP를 버리기로 합니다.
언어 커뮤니티의 문제를 인지하고는 그냥 그 언어로부터 탈출을 감행합니다.
웹 개발에 쓸 수 있는 언어는 이미 PHP 외에도 Python, Ruby, Node.js, ASP.NET 등 선택지가 다양합니다.
이미 탈출이 불가능한게 아니라는 것이죠.
이 사람들은 이미 PHP에 데여봤으므로 PHP를 혐오하는 발언을 하기도 합니다.
그리고 이 사람들이 PHP를 싫어하는 모습을 보고 PHP를 실제로 해보지는 않았지만 PHP를 싫어하는 사람이 생기는 것 또한 사실입니다.
현재 PHP는 무서울 정도로 널리 보급되어 있습니다.
PHP가 세팅 안 된 서버를 찾기 힘들고, PHP와 궁합이 잘 맞는 MySQL이 없는 서버 또한 찾기 힘들기 때문에 PHP의 범용성은 극히 최강이라고 할 수 있습니다.
또한, 파일단위로 구성되기 때문에 매 배포마다 서버를 재실행해야한다던가 하는 부담이 없기 때문에 호스팅 사업을 하기에도 용이하죠.
하지만 그 이면에는 사용자의 레거시 코드로 인해 서버들이 PHP 버전을 올리지 못하고, 그로 인해 보안 문제가 발생되는 시궁창 같은 상황도 연출되고 있죠.
이미 인프라가 준비되어있는 PHP를 그냥 버리라고는 말하기 힘듭니다.
하지만 기존처럼 쓰면 한계가 올 것입니다.
당장에 PHP 7에서 mysql_
로 시작하는 모든 함수가 삭제되었습니다.
이런 옛 버릇을 버리고 새로운 문화를 배우던가, 아니면 PHP를 과감히 버리고 다른 곳으로 옮겨야 한다고 생각합니다.
저는 PHP를 버리는 쪽을 택했고, Python을 택했습니다.
Rasmus Lerdorf가 좋아한다던 문제 해결을 Python으로도 많이 해봤고, PHP만 하던 시절보다 더 많은 것을 배웠습니다.
웹 개발자로 먹고 살다보면 PHP를 아예 버리는 것은 불가능한게 현실이지만, 적어도 저 자신을 위한 개발에서는 PHP는 쓰지 않을 것 같습니다.
PHP 옹호론자분들이 말씀하시는 “장점”이라는 부분 중에서 공감할 수 있는 것이 이젠 쉬운 배포 말곤 단 하나도 남지 않았습니다.
나머지는 모두 다른 언어를 쓰는것이 보다 명확하고 깔끔한 솔루션이라고 생각하니까요.
어느 쪽이 되었건 공부는 해야합니다.
개발자에게 있어서 공부는 숙명이나 다름 없다고 생각합니다.
공부를 안하고, 문화권의 상태와 공존을 고려하지 않는 개발자라면 PHP가 아니라 다른 언어를 쓰더라도 나쁜 코드를 만들고 있을 것입니다.
PHP를 옹호하는 발언을 하려는 분에게 감히 여쭙겠습니다.
PHP를 옹호하는 이유가 정말 합리적이고, 그것이 PHP만의 강점이 맞나요?