원문은 Good thing in PHP nobody talks about이다. [ ] 안의 말은 이해에 도움이 되라고 내가 넣은 것이다.


PHP에서 내가 좋아하는 점이 뭘까?

PHP는 실행후 죽도록 디자인됐다.

우리는 코드 중복, 혹은 나쁜 코드 정렬(formmating), 나쁜 변수명 등을 두려워해선 안 된다. 앞서 언급한 것들은 나쁜 코드 냄새를 풍기는 것들이다. 하지만 코드를 오염시킨다는 측면에서 상태있음(statefulness)에 필적한 만한 것은 없다.

PHP의 가장 큰 제약중 하나고, 많은 사람들이 싫어하는 점이고, 동시에 신입 개발자가 작성한 관리하기 쉬운 형편없는 PHP 코드를 만드는 유일하고 중대한 요인이 바로 이것[, 상태가 없다는 점]이다. 대개 상태(state)는 PHP 프로세스와 완전히 분리돼 있다. 상태는 (서버측) 데이터베이스에 저장되고, 졸라 최악의 코드 샘플에선 데이터베이스만이 뭔가 우리가 의존할 수 있는 유일한 진리의 소스(source of truth)다. 그래서 버그 재연이 (대개) 쉽고, 점진적인 코드 재작성(같은 데이터베이스 — 즉, 상태 — 를 사용하는 옛 코드와 새 코드[가 공존하는 것])이 가능하다. 그리고 배포가 아주 쉽다. 그냥 스크립트를 업로드하면 된다! 따라서 개발하고, 와우, 그냥 해당 줄을 수정하고, 파일을 저장하고… 그러면 작동한다! 생각해 보자.

  • 상태없음(Stateless) (이게 지금 유행이다. 맞나?)
  • 배포하기 쉽다
  • 개발하기 쉽다
  • 디버깅하기 쉽다
  • 이 모든게 그냥 주어져 있다. PHP는 매번 [실행 후 프로세스가] 죽기 때문이다.

언어 설계에서 이 선택에 대해 말하자면, 난 심지어 이게 의도한 건지도 모르겠다(업데이트: OK, 라스무스 러도프[PHP 창시자]가 이 글에 대한 해커뉴스 토론에서 이건 의도한 거라고 확인해 줬다). 아마 부작용 아닐까 싶다. 하지만 이 제약은, 내가 생각하기에, PHP가 역사적으로 나쁜 코드로 가득하고, 이상한 아키텍쳐 결정이 있고, 인기를 얻고, 그리고 여전히 살아있는 기술인 이유중 하나다.

엄격하게 상태를 분리하는 이 단순한 개념은 JS 세계에선 이상한 것이다. JS 설계에는 그런 것이 없기 때문이다. 이것이 대부분의 (앵귤러1 같은) 1세대 프론트엔드 프레임워크가 (물론, 복잡한 jQuery 코드도) 그렇게 졸라 짜증났던 이유다. 인터페이스에서 상태를 분리하고 결국 상태를 관리할 수 있도록 해 주는 Redux와 다른 해결책들이 만들어지기 전까지 말이다. JS에서 우리는 상태를 분리할 수 있다. PHP에서 우리는 상태를 분리해야만 한다.

‘오랫동안 살아있는(long-living)’ 프로세스를 이용하는 Node.js의 웹소켓 채팅 코드를 볼 때마다 나는 공포에 떨 수밖에 없다. 모든 웹소켓 커넥션을 담는 글로벌 “subscriber” 변수 때문이다. 이 비동기적이고 ‘오랫동안 살아있는’ 복잡한 코드가 경험 없는 개발자의 손에서 순식간에 튀어나오는 장면이 눈에 선하다.

이것이 아작스가 처음 소개됐을 때, 최종사용자에게 엄청난 장점을 제공했음에도, PHP 개발자의 삶이 그렇게 복잡해진 이유다. 상태(state)가 갑자기 프론트엔드에 나타났고, 우리는 이것이 우리를 어디로 이끌지 상상조차 할 수 없었다. jQuery, 그리고 백본, 그리고 앵귤러, 그리고 리액트, 그리고 등등등. 이제 우리는 프론트엔드 개발 전문가 — 프론트엔드에서 상태와 상태가 있는 인터페이스를 다루는 사람들을 따로 둔다.

이것이 우리가 큐(Que)와 데몬(Daemon)을 사용할 때 조심해야 하는 이유다. (그리고 특정 중간 규모 PHP 프로젝트에서 여전히 큐와 데몬이 필요하다.) 나쁜 코드가 제품에 들어가면, 그들[큐와 데몬]은 무자비하다 — 디버그하기 힘들고, 메모리 누수가 발생하며, OS는 가끔 프로그램을 죽인다. 보통 PHP 스크립트는 우리에게 자비를 베푼다. 다음번에 오래된 PHP 프레임워크가 비동기 코드와 ‘오랫동안 살아있는’ 스레드를 더 잘 지원하게 됐을 때, 혹은 도커에 상태가 없다는 것을 찬양할 때, 이 점을 기억하고 정당하게 평가하자. PHP 역시 상태가 없다 :)

업데이트:
HackerNews 토론: https://news.ycombinator.com/item?id=17853755