해결책
페이스북의 규모에서는 PHP의 한계가 뼈저리게 드러났다. 수천 명의 엔지니어가 하루에 두 번 새 코드를 배포했지만, null 객체에서 메서드를 호출하거나 복잡한 API의 메서드 이름을 추측하는 일은 런타임에야 오류를 낳았고, 이 언어는 도구가 내부를 들여다볼 수 있는 구조를 거의 제공하지 않았다. 동적 언어는 편집 후 새로고침하는 반복 주기를 빠르게 유지해 주었지만 조기 안전망은 없었고, 전통적인 정적 타입 언어였다면 반복 속도를 대가로 검사를 얻었을 것이며, 재작성은 페이스북이 PHP와 그 라이브러리에 쏟은 투자를 버리는 일이었을 것이다.
2014년 3월 20일 HHVM 런타임의 일부로 발표된 Hack은 PHP의 상위 집합으로 남음으로써 이 딜레마를 해결했다. 대부분의 PHP 파일은 이미 유효한 Hack이므로, 엔지니어는 한 함수에 타입 애너테이션을 추가하고 다음 함수는 동적으로 남겨둘 수 있었으며, 정적 타입 코드와 동적 타입 코드는 단일 파일 안에서조차 매끄럽게 상호 운용되었다. Hack은 제네릭, 널러블 타입, 타입 별칭, 컬렉션, 람다 표현식을 추가했고, HHVM은 애너테이션이 붙은 반환 타입과 매개변수 타입을 런타임에 강제했으며, 이 덕분에 JIT가 최적화를 위해 애너테이션을 안전하게 신뢰할 수 있었다.
빠른 PHP 작업 흐름을 그대로 유지하기 위해 팀은 타입 검사기를 파일 시스템을 감시하고 전체 코드 그래프를 메모리에 유지하는 로컬 서버로 설계했다. 일반적인 검사는 200밀리초 미만으로 실행되었고 1초를 넘는 경우는 드물었다. 변환이 세분화되고 선택 사항이었기 때문에 엔지니어들은 자발적으로 자신의 코드 대부분을 변환했고, 자체 개발한 코드 수정 도구가 나머지를 자동화했으며, 지난 1년 동안 페이스북의 PHP 코드베이스 거의 전체가 Hack으로 마이그레이션되었다.
같은 발표에서 Hack과 변환 도구는 HHVM 산하에 오픈소스로 공개되었고, HHVM은 Hack 옆에서 수정되지 않은 PHP를 계속 실행하게 되었으며, 개발자들은 다음 달 멘로 파크 캠퍼스에서 열리는 Hack Developer Day에 초대되었다. 이 발표는 공개된 당일 Hacker News에서 576점과 415개의 댓글을 받았다.
이룬 것
PHP 자체에 점진적 정적 타이핑을 덧붙여 안전성이 함수 단위로 퍼지게 하고, 결코 한 번에 전체로 퍼지지 않게 한다
통한 이유
상위 집합 호환성 덕분에 재작성도, 대규모 일괄 마이그레이션도 필요 없었다. 기존 PHP 파일은 계속 실행되었고, HHVM은 PHP 런타임으로 남았으며, 서드파티 PHP 라이브러리는 전 과정에서 계속 사용할 수 있었다.
함수 단위의 세분성 덕분에 안전성이 각 팀의 속도에 맞춰 퍼질 수 있었다. 애너테이션이 없는 코드는 동적으로 남아 파일이나 모듈 전체의 변환을 막지 않았기 때문이다.
파일 시스템을 감시하는 검사기 서버가 피드백을 200밀리초 미만으로 유지했기에, 정적 타이핑은 PHP 반복을 빠르게 만든 편집 후 새로고침 주기에 부담을 주지 않았다.
엔지니어들이 자신의 코드에 애너테이션을 붙이기로 선택했고 코드모드가 반복적인 나머지를 처리했기에, 수백만 줄 규모의 코드베이스가 전담 마이그레이션 팀을 기다리지 않고 1년 안에 변환되었다.
안전성을 얻기 위해 재작성하지 말라. 언어가 기존 코드를 받아들이게 하고, 새로운 규율이 한 함수씩 퍼지게 하며, 검사를 작업 흐름을 결코 방해하지 않을 만큼 빠르게 유지하라.
그 후
Hack과 그 코드 수정 도구는 HHVM의 일부로 hacklang.org에 오픈소스로 공개되었고, 페이스북은 HHVM이 PHP-5 동등성을 향해 나아가는 PHP 런타임으로 남아 서드파티 PHP 코드가 Hack과 나란히 계속 실행되게 하겠다고 밝혔다. 이 발표는 2014년 3월 20일 Hacker News에서 576점과 415개의 댓글을 받았고, 페이스북은 다음 달 멘로 파크 캠퍼스에서 Hack Developer Day를 계획했다. 페이스북 내부에서는 마이그레이션이 이미 사실상 완료되어 있었다. 약 1년간의 자발적 도입과 자동화된 리팩터링 도구를 거쳐 PHP 코드베이스 거의 전체가 Hack으로 실행되었다.
근거 확인하기
출처
- Hack: a new programming language for HHVM Engineering at Meta · engineering.fb.com ·
- Hacker News discussion: Hack: a new programming language for HHVM Hacker News · news.ycombinator.com ·