Hack에서 Skip까지: 모든 것을 증분 처리하기

23 hours ago 3

Facebook의 수천만 줄 PHP 코드에 타입 검사를 도입하면서, 코드를 조금 고칠 때마다 전체를 다시 검사하지 않는 방식이 필요해짐 Hack에서 변경된 부분과 영향을 받는 코드만 다시 검사했지만, 의존성과 캐시를 직접 관리하는 구현은 복잡하고 오류가 나기 쉬웠음 Skip은 변경된 입력에 영향을 받는 계산만 다시 실행하며, 개발자가 계산을 작성하면 의존성 추적과 결과 재사용을 프레임워크가 처리함 TypeScript에서도 데이터 처리 파이프라인을 작성할 수 있어, 데이터가 바뀔 때 관련 결과만 갱신하는 서비스를 기존 시스템에 연결할 수 있음 이 방식을 Skipper 코딩 에이전트의 타입 검사와 테스트에도 적용하며, 코드 변경부터 실행 결과 확인까지 증분 처리하는 개발 흐름을 구축하고 있음 Facebook의 보안 분석에서 시작된 Hack Julien Verlaguet는 2011년 Facebook에 합류해 PHP 코드의 보안 취약점을 찾는 정적 분석 도구를 개발하기 시작함 적절히 처리하지 않은 문자열이 SQL 쿼리, 셸 실행, 웹페이지 출력으로 흘러가 취약점을 만드는지 추적하는 작업이었음 코드 구조가 복잡해질수록 타입 정보 없이 데이터의 흐름을 분석하기 어려워짐 처음에는 보안과 암호화처럼 정확성이 중요한 코드에 엄격한 검사를 적용하려 했음 그러나 검사한 코드가 검사하지 않은 함수에 의존하면, 선언된 타입도 신뢰하기 어려웠음 일부 코드만 엄격하게 만드는 시도는 결국 전체 코드베이스에서 작동하는 Hack으로 확대됨 당시 Facebook 코드의 70% 이상이 PHP였으며, 개발자는 코드를 수정하고 브라우저를 새로고침하며 결과를 확인했음 분석 도구가 느리면 개발자가 꺼버리므로, 타입 검사도 기존의 빠른 피드백 흐름을 유지해야 했음 수천만 줄을 매번 검사할 수는 없음 PHP의 자동 로딩은 필요한 코드를 이름으로 찾아 불러오므로, 개발자가 의존성을 명시하지 않고도 작업할 수 있었음 그 결과 의존 관계가 복잡하게 얽혀, 단 10줄의 코드가 수백만 줄의 의존성을 끌어올 수도 있었음 수천만 줄을 다른 언어로 다시 작성하거나 먼저 작은 라이브러리로 분리하기는 어려웠음 해결책은 전체 코드베이스의 상태를 유지하면서 변경된 부분과 영향을 받는 코드만 다시 검사하는 증분 언어 서버였음 처음에는 코드를 파싱하고 타입 정보를 구축하며 전체를 검사함 이후 파일이 바뀌면 기존 결과를 재사용하고 필요한 계산만 다시 수행함 타입을 조회할 때 의존 관...

Read Entire Article