지난 번에 썼던 PHP의 이상한 문화에 대한 글은 몇몇 사람들에 의해 상당히 널리 퍼졌는데, 그에 따라 저에 대한 비난도 쏟아졌습니다. 그 중 정말 기분 나빴던 평가가 있어서 그것에 대한 이야기를 해보고자 합니다.

PHP를 나쁘게 만든 사람

제가 PHP를 나쁘게 만든 사람이라고 합니다. 제가 뭘 했길래 PHP가 나빠졌을까요?

좋아짐과 나빠짐.

PHP 이야기에 앞서, 무언가가 좋아지거나 나빠진다는게 무엇일지 생각해봅시다. 현재 상태를 before라고 하고 나중에 측정한 상태를 after라고 할 때, 좋아졌다는 것은 이렇게 표현할 수 있을 것입니다.

delta = after - before
if delta > 0:
    print('좋아졌다')

하지만 delta가 0인 경우도 있을 것이므로 실제로는 이러합니다.

delta = after - before
if delta > 0:
    print('좋아졌다')
elif delta == 0:
    print('바뀐게 없다')
else:
    print('나빠졌다')

즉, 무언가를 나쁘게 만들었다는 것은 무언가의 과거보다 현재가 나쁜 상태가 되는 것에 기여한 것을 말하는 것이겠죠.

프로그래밍 언어에게 있어서의 좋아짐, 나빠짐, 변화 없음.

그럼, 프로그래밍 언어에게 있어서 좋아지거나 나빠지는 것은 무엇일까요? 가령 프로그래밍 언어의 속도가 빨라지는 경우는 좋아지는 예에 속할 것입니다. 이러한 변화는 언어의 Core 개발에 참여해야 일으킬 수 있습니다. 즉, 대부분의 개발자는 이러한 변화를 일으키지 못합니다.

하지만 프로그래밍 언어는 언어입니다. 언어로써의 가치는 Core한 부분 뿐만 아니라 언어가 어떻게 쓰이느냐도 반영된다 생각합니다. 즉, 언어를 써서 개발하는 사용자들의 문화가 반영되는 것이죠.

현실 세계의 언어를 예로 들어봅시다. 한국어는 일본어에 비해 표기 가능한 발음이 풍성합니다. 이것은 언어 Core레벨의 장점입니다. 하지만 한국어는 일본어에 비해 욕설의 표현이 더 많이 가능합니다. 욕설의 표현법이 많은 것이 나쁜 것이라고 가정하면1 한국어를 사용하는 한국인들이 한국어를 나쁘게 만들고 있는 것이라고 할 수 있겠죠.

프로그래밍 언어도 마찬가지입니다. 프로그래밍 언어를 사용하여 좋은 프로그램이 많이 나오면 프로그래밍 언어도 좋아지고, 나쁜 프로그램이 많이 나오면 프로그래밍 언어도 나빠지겠죠. 좋은 프로그램이란 사용할 곳이 많은 프로그램일 수도 있으나, 프로그래머가 쓰기 좋은 프로그램일 수도 있습니다. 아무리 사용할 곳이 많은 라이브러리 프로그램이라도 indentation으로 tab키와 space bar가 섞여있고, 변수명과 함수, class의 이름이 규칙이 없다면 개발자가 연동해서 쓰기 괴로울 것입니다. 프로그램이 개발자들간의 상호작용을 필요로 함을 생각해보면 잘 정리된 소스 코드가 필요하고, 이러한 소스 코드는 해당 언어 커뮤니티에서 출발하는 경우가 많습니다. 즉, 프로그래밍 언어의 좋고 나쁨은 사용자들의 문화에 영향을 받게 됩니다.

제가 PHP를 나쁘게 만들었다구요?.

자, 위에서 설명한 관점에서 제가 PHP에 한 일을 생각해봅시다.

제가 PHP에 대해서 활동적으로 한 일은 대부분 제로보드 4의 보안 결함에 대한 대응책 발표였습니다. 보안 결함이라는 것은 대표적인 나쁜 프로그래밍의 결과물입니다. 저는 그 부분의 나쁨을 상대적으로 좋은 상태로 전환하는 작업을 한 것입니다.

제가 PHP를 나쁘게 만든건가요?

제가 잘 못 짜인 PHP 프로그램을 배포했다면 인정할 만 할지도 모릅니다. 하지만 제가 한 것은 보안 개선을 위한 작업이었고, 이것은 엄연히 개선이라고 생각합니다.

제 발표가 영향력이 없다는 의견도 있을 수 있습니다. 하지만 영향력이 없다고 해서 제가 PHP를 나쁘게 만들었다고 할 순 없다고 생각합니다. 실제로 제로보드 4 사용자들이 아직도 보안 패치를 적용 안하고 있다는 것은 잘 압니다. 하지만 개발자가 없거나 전환비용이 없어서 제로보드 4라는 나쁜 상태의 프로그램에서 벗어날 수 없는 사람들이 많습니다. 그 상태가 나쁨을 더 키움을 알기에 저는 제로보드 4의 패치 권한 양도도 XE팀에 요청했었습니다. 하지만 XE팀에서는 제 요청을 거절했습니다. 제로보드 4는 더 이상 패치하지 않겠다는 결정 때문입니다. 제로보드 4라는 나쁨을 더 이상 퍼지지 않는 것이 좋다는 생각때문이란 것은 알지만, 제 생각에 그들은 위에서 언급한 제로보드 4에서 벗어날 수 없는 인원이 너무나도 많음을 무시하고 있다고 생각합니다. 만약 제가 제로보드 4의 수정 권한을 받았더라면 제로보드 4라는 프로그램으로 인한 PHP의 나쁨은 조금이라도 덜해졌겠죠.

정말 제가 PHP를 나쁘게 만든 사람인가요?

그럼 누가 PHP를 나쁘게 만들었나?.

제 지난 번 글에서, Rasmus의 의사결정들이 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.

저는 진짜 프로그래머가 아니에요. 다 던져두고 돌아가게 되면 그때 행동해요. 진짜 프로그래머들은 말하죠. “그래, 돌아는 가, 하지만 당신 코드는 산지사방에서 메모리가 새고 있어. 어쩌면 우리가 그걸 고칠 수 있을지도 몰라” 저는 그냥 Apache를 요청 10회마다 재시작할 뿐이에요.

이 부분은 Core 레벨의 나쁨입니다. 다행히도 이 부분은 이제 개발자들의 세대교체로 인해 더 이상 Apache를 재실행해야한다는 수준의 이상한 의사결정은 하지 않습니다.

그리고 extract 함수를 써서 register_global과 같은 상황을 연출하는 경우도 언급했습니다. 이 부분이 사용자들이 잘 못 쓰는 부분으로 인한 나쁨입니다. 저는 여러 사이트의 유지보수를 해 보았는데, 아직도 상당수의 사이트가 저런 식의 나쁜 방법을 고수하고 있습니다. 심지어 신규개발된 사이트임에도 PHP 5.2 이하에서 개발되는 경우를 왕왕 보았습니다.

PHP를 나쁘게 만들고 있는 건 PHP를 잘못 사용하고 있는 그들 아닌가요?

그들의 이유.

물론 그들도 그들만의 이유가 있습니다. 새로 무언가를 배우는 것은 시간이라는 자원이 듭니다. 배포환경 등을 바꾸기 위해서는 실제 서버 등을 교체 혹은 분리해야 하여 시간 뿐만 아니라 돈이 들게 됩니다. 기존에 개발된 내용을 바꾸려면 더 심각한 상황이 찾아오게 됩니다. 그들은 비용때문에 바꾸지 않습니다.

이미 기존의 소스들로도 충분히 고객이 원하는 수준의 작동품을 내놓을 수 있기 때문에 굳이 바꿀 필요가 없다고 생각합니다. 결과적으로 그들은 비용때문에 나아짐을 거부하는 것이죠.

그들은 어디에나 있습니다.

잘 생각해보면 기존의 소스들로도 충분히 고객이 원하는 수준의 작동품을 내놓을 수 있는 상태의 개발품은 PHP에만 존재하는 것이 아닐 것입니다. 대표적으로 Java의 patch 버전 1자리만 바뀌어도 먹통이 된다는 전설마저 도는 Java계의 레거시 코드가 있겠죠. 당연하지만 이런 의사결정은 언어랑 무관하게 벌어집니다.

PHP를 쓰는 사람이 PHP를 나쁘게 만드는 것이 아닙니다. 사용하는 언어를 나쁘게 만드는 사람들은 어디에나 존재하며, 사용하는 언어로 나쁜 버릇이 담긴 코드와 프로그램을 퍼트려서 점차적으로 상황을 악화시킵니다. 다만 PHP의 문화를 특이할 정도로 나쁘게 만드는 사람이 많은 것은 PHP가 진입을 위한 학습비용이 매우 저렴하기 때문에 PHP만 배우고 다른 언어로 가지 않고 누적되고 있기 때문일 뿐입니다.

좋은 사람 되기.

그럼, 언어를 좋게 만드는 사람이 되려면 어떻게 해야할까요? 언어의 Core에 기여하거나 라이브러리/프레임워크에 기여할 수 있다면 최고겠지만 보통 그렇게까지 할 여력은 없습니다.

그렇다면 어떻게 해야할까요? 제 생각에는 해당 언어의 좋은 문화권을 지속적으로 학습하고, 사용하는 언어, 라이브러리, 프레임워크의 안티패턴을 의도적으로 피해버릇해야 한다고 생각합니다. 가령 PHP 사용자라면 PHP: The Right Way를 주기적으로 모니터링하고, PSR-1, 2, 4를 준수하는 등 Modern PHP 문화를 따라가는 것이 될 것이고, Python 사용자라면 PEP-8을 지키는 것 같은 것입니다.

개발자로써 좋은 사람이 되려면 결국 계속 배워야 합니다. 배우라는 말 자체가 거북하지 않은지 자기 성찰을 해봐야 하지 않을까요?

각주.

  1. 실제로는 현실세계의 언어에게 표현법이 많은 것이 나쁜 것은 아니라고 생각합니다. 원래 위치로