삼촌 좀 적당히좀 했으면 좋겠다 - 프로그래밍 갤러리 (dcinside.com)


위에 TS 개발자 디스했다고, 뜬금 인성 드립치면서

지멋대로 짜집기 + 소설 써놓아서 반론 들어간다


글의 전제는 MS TS 개발자를 디스하는 것이 잘못되었다이고,

이후로는 그에 기반하여 지멋대로 뇌피셜이랑 소설 스깠는데

때문에 TS 개발자를 디스할 수 밖에 없던 상황에 대해 중점적으로 설명하고자 함


미리 네 줄 요약)

1. PR 제안 기반으로 직접 다 구현해서 완성해 봄
2. 위 글에서 말한거처럼 그냥 코드 바꾸기 싫어요 징징~ 디스가 아님 ㅋㅋ

3. TS 코어 개발자가 절대선도 아니고, 노선 불합리하다 생각되면 반대할 수 있는거
4. 본인은 private API는 서드파티 라이브러리 개발자가 쓸만한 물건이 아니라 생각함


--------------------------------------------------------------------------------------------------------


먼저 TypeScript 컴파일러 API는 두 종류가 있음


1. Public API -> 서드파티 라이브러리 개발자들을 위해 깔끔하게(?) 정리된 것

2. Private API -> TS 내부 구현 코드에서만 사용되던 것


그리고 여지껏 모든 종류의 transform 기반 서드파티 라이브러리들은

Public API로 만들어와짐. 왜냐하면 Private API 자체가 외부에서 사용할 수 있게

오픈된 게 이번 PR에서 처음이거든


그런데 이미 public API 시절에도,

TS의 마이너 버전 업데이트 때마다 break change가 생기면서

(4.6.0 -> 4.7.0, 이게 마이너 업데이트)

서드파티 라이브러리 개발하던 사람들이 전부 탈주해버림


특히 TS 4.6 -> 4.7 때가 치명적이라, 이 때 서드파티 라이브러리 중

가장 유용했 typescript-is 가 런함 (typia 이전의 runtime validator)



(본인도 typia & nestia 개발하다보니,

TS의 매 마이너 업데이트 때마다

any 타입 캐스팅이 계속 추가되는 중)


typescript-is 개발자는 어느 순간부터 ts version 에 대하여 if 조건문을 작성,

any 타입 캐스팅과 함께 if (ts.version <= 4.x) (ts as any).createParameterDeclaration(...)

하드코딩으로 어떻게든 TS compiler public API의 break change에 대응해오다가

결국 탈주해버림 ㅠㅠ


그리고 이어진 4.8 때는, 무려 transform이라는 장르를 열었던

ttypescript 개발자마저 런하면서, transform 기반 서드파티 라이브러리들이

TS 최신 버전을 아예 지원 못하는 암흑기가 열림


현재 nonara 라는 사람이 대체 라이브러리 ts-patch 를 통해서

transform 생태계애 산소호흡기 하나 붙여놓은게 현실임

(다만 여전히 TS 5 지원은 못하고 있음)


--------------------------------------------------------------------------------------------------------


이 와중에 TS 5.2에서 transform을 공식 지원하겠다길래,

그나마 좀 숨통이 트이는 줄 알았음


근데 제안 내역을 보니 왠걸? public API가 아닌 private API를 기반으로 해버림

그리고 이 private API는, 무려 패치 업데이트 (4.7.3 -> 4.7.4) 단위로

break change가 생기는 무서운 놈임


그래도 저 제안이 공식화되어 TS 5.2에

private API 기반 transform 생태계가 구축될 수 있으니까

바로 당일부터 typia로 이에 대응하는 개발을 해 봄


본디 public API는 private API를 나름의 패턴으로 랩핑,

private API의 break change를 해소해주고 서드파티 라이브러리들에게

나름의 편의성을 제공해오던 wrapper 객체들의 집합


그런데 private API 기반으로 개발을 해 보니,

내가 위에서는 public API break change 너무 잦다고 디스했지만

그조차도 엄청 선녀였다는 걸 깨닫게 됨


--------------------------------------------------------------------------------------------------------


일단 private API라고는 하지만, AST의 기본 자료구조와

일부 유틸리티 함수들만 export 되어있고

대부분의 기능들이 export 되지 아니함


그래서 private API를 통해 서드파티 라이브러리들을 개발하다보니

필연적으로 TS 소스 코드 내부를 뒤져가며, Ctrl C + V 를 남발하게 됨


게다가 타입 체킹에 관련된 메서드들이 죄 탈거당하는 바람에

간단한 기능들조차도 TS 소스 코드 뒤져가면서 그 용례를 찾아봐야하는데

문제는 각 요소들이 죄다 @internal 태그 박혀있어서, any 타입 캐스팅이 또 들어감


게다가 private API는 타입 체킹을 전적으로 비트 연산에 의존하는데,

문제가 enum 코드조차도 다시 @inernal 태그 처리되어있어서

ts.TypeFlags.X 이런식이 아니라 2116634 이런 식으로 내가 직접 쳐줘야 함 ㅋㅋㅋ


결국 private API 기반으로 typia 만들면서 내가 주로 했던 짓은 결국,

public API 래퍼 코드 참고해서 복붙해오는 것이었음

근데 다시 그 복붙 코드에는 무수한 any 타입 캐스팅 내지 하드코딩이 들어감

타입 선언이 @internal 처리되었거나, export 되지 않았으니까


예를 들어 클래스 멤버 변수에 선언된 주석을 읽어들이려면

Private API 기반에서 TS 코드를 참조하여 복붙, Public API 기능을 복원하려니

족히 수 천 줄을 복붙해와야하더만


결국 다 때려치고 걍 String.substring 하드코딩으로 떼워버림




Public API에서 private API로 전환하는동안

any 타입 캐스팅이 오만군데 박혀버림

특히 첫째 짤 구현하는데 뭔가 빡치더라


----------------------------------------------------


본인은 private API 기반으로 서드파티 라이브러리 개발해보면서

도저히 이것은 서드파티 개발자들이 쓸 수 없는 물건이라 판단내리고

이슈에서 public API 기반으로 transform 열어달라고 했던거


근데 TS 코어 개발자(jake)는 그렇게 할 경우,

성능에 악영향이 있기에 본인은 private API를 고수한다고 답변해줬고

내가 프갤에 올라왔던 짤처럼 드립을 친거임


"안전벨트를 제거하면, 연비가 상승해요"


이외에도 jake가 private API로도

얼마든지 transform 서드파티 라이브러리 개발할 수 있다 하길래


"그건 님이 TS 코어 개발자라서 가능한거 아닌가요?

내가 해보니까 죄 @internal이거나 unexported이던데?"


----------------------------------------------------


이래저래 본인은 TS 공식 지원 transform API 스펙이 맛탱이 갔다고 봄
Public API 시절에도 서드파티 라이브러리 개발자들 다 런쳐서 두 명만 남았는데

Private API 들어오면 이게 생태계가 남아날까 하는 생각도 있음


삼촌 좀 적당히좀 했으면 좋겠다 - 프로그래밍 갤러리 (dcinside.com)


윗놈은 TS 개발자를 디스했다는 거 자체를 잘못된 것인냥 몰아가면서

이후로는 오만 소설과 뇌피셜을 기반으로 아무말이나 지껄여놨음

게다가 내가 라이러리 업뎃하기 싫어요 징징~ 마인드로 무지성 디스한거마냥 써놨는데


보다시피 제안 PR 기반으로 변경 개발해서, 완성까지 다 시켜본 다음에 디스하는 거임

그리고 MS 개발자가 절대 선이나 디스 불가능의 신성한 존재도 아니고

서드파티 개발하다가 메인 노선이 불합리하다 판단되면 반대할 수도 있는거임


본인이 현재 TS 5.2 transform API에 대해서

가장 먼저 적용해 본 사람으로써 이거 쉬이 예측할 수 있음

이후로도 TS 5.2 transform API 시도하는 사람들마다, 좋은 얘기 안 나올거라는거


1. 모든 것을 TS 코어 소스 코드를 보며 복붙해오고

2. 수백 수천 곳에 any 타입 캐스팅을 박아야하는데,

3. 그게 과연 정상적인 API일까?


-


----------------------------------------------------

p.s) 


Jake 개발자의 입장은 

"필요한 기능이 있으면 얘기해서 추가할테니, 하나씩 알려달라".

하지만, 본인은 이 부분에 대하여 대단히 막막함


본인은 이미 private API 적용 싹 다 성공해서 

다른 서드파티 개발 사정 따위 그냥 못본척 넘겨도 그만인데

그래도 뭔가 저 제안 PR 볼 때마다 찜찜하고 답답한 상황임