Anders Hejlsberg가 C#과 TypeScript에서 개발자 경험을 개선한 방식: 타입, IDE 서비스, 리팩터링, 그리고 코드베이스 확장을 가능하게 하는 피드백 루프.

코드베이스가 느려지는 이유는 엔지니어들이 갑자기 코드를 못 써서가 아닙니다. 파악하는 비용이 올라가기 때문입니다: 낯선 모듈을 이해하고, 안전하게 변경하며, 변경이 다른 것을 깨뜨리지 않았음을 증명하는 비용이 늘어납니다.
프로젝트가 커지면 "그냥 검색해서 편집"은 더 이상 통하지 않습니다. 힌트가 하나씩 빠질 때마다 비용을 지불하기 시작합니다: 불명확한 API, 일관성 없는 패턴, 약한 자동완성, 느린 빌드, 도움이 되지 않는 오류 메시지. 결과는 단순히 배포 속도가 느려지는 것이 아니라 더 조심스러운 배포입니다. 팀은 리팩터링을 피하고, 정리를 미루며, 제품을 진전시키지 못하는 작고 안전한 변경만 내보내게 됩니다.
Anders Hejlsberg는 C#과 TypeScript 두 언어의 핵심 인물입니다—두 언어 모두 개발자 경험(DX)을 일급 기능으로 다룹니다. 언어는 문법과 런타임 동작만이 아닙니다. 그것을 둘러싼 툴링 생태계—에디터, 리팩터링 도구, 네비게이션, 코드 작성 시 얻는 피드백의 질—도 포함됩니다.
이 글은 TypeScript와 C#의 디자인 선택이 어떻게 시스템과 팀이 확장될 때 팀을 더 빠르게 움직이게 하는지 실용적인 관점에서 살펴봅니다.
코드베이스가 "확장된다"고 할 때 보통 여러 가지 압력이 동시에 작동합니다:
강력한 툴링은 이러한 압력이 만드는 비용을 줄여줍니다. 엔지니어가 즉시 답을 얻도록 돕습니다: "이게 어디서 사용되나?", "이 함수가 무엇을 기대하나?", "이 이름을 바꾸면 무엇이 바뀌나?", "이걸 배포해도 안전한가?" 이것이 바로 개발자 경험이며, 대형 코드베이스가 진화하는 것과 굳어지는 것의 차이를 만드는 경우가 많습니다.
Hejlsberg의 영향은 인용구나 개인적 업적의 나열로 보기보다는 일관된 제품 철학으로 보는 것이 더 쉽습니다. 즉, 흔한 작업을 빠르게 만들고, 실수를 초기에 명확히 하며, 대규모 변경을 더 안전하게 만드는 것입니다.
이 섹션은 전기(傳記)가 아닙니다. 언어 설계와 주변 툴링 생태계가 일상적인 엔지니어링 문화에 어떻게 영향을 미치는지 이해하기 위한 실용적 렌즈입니다. 팀이 "좋은 DX"에 대해 말할 때, 그들은 종종 C#이나 TypeScript 같은 시스템에 설계적으로 내장된 것들을 의미합니다: 예측 가능한 자동완성, 합리적인 기본값, 신뢰할 수 있는 리팩터링, 문제 해결을 안내하는 오류 메시지 등입니다.
개발자들이 언어와 에디터에 대해 갖는 기대에서 그 영향을 관찰할 수 있습니다:
이러한 결과는 실무에서 측정 가능합니다: 피할 수 있는 런타임 실수가 줄고, 더 자신 있는 리팩터링이 가능해지며, 팀에 합류했을 때 코드를 "다시 배우는" 데 드는 시간이 줄어듭니다.
C#과 TypeScript는 다른 환경에서 실행되고 다른 사용자층을 대상으로 합니다: C#은 주로 서버사이드와 엔터프라이즈 애플리케이션에, TypeScript는 자바스크립트 생태계에 맞춰져 있습니다. 하지만 둘은 공통된 DX 목표를 가집니다: 개발자가 빠르게 이동하면서 변경의 비용을 줄이는 것.
두 매우 다른 런타임에서 유사한 아이디어가 성공하면—정적 언어 + 매니지드 런타임(C#)과 자바스크립트 위의 타입 레이어(TypeScript)—그 성공이 우연이 아니라 피드백, 명확성, 유지보수성을 우선시하는 명시적 설계 선택의 결과임을 시사합니다.
정적 타이핑은 종종 취향 문제로 다뤄집니다: "나는 타입을 좋아한다" vs "유연함을 선호한다". 대형 코드베이스에서는 이것이 취향의 문제가 아니라 경제학의 문제입니다. 타입은 더 많은 사람이 더 많은 파일을 더 자주 건드릴 때 일상 작업을 예측 가능하게 만드는 방법입니다.
강한 타입 시스템은 프로그램의 약속에 이름과 형태를 부여합니다: 함수가 무엇을 기대하는지, 무엇을 반환하는지, 어떤 상태들이 허용되는지. 이는 암묵적 지식(누군가의 머릿속이나 문서에 묻혀 있는)을 컴파일러와 툴링이 강제할 수 있는 것으로 바꿉니다.
실용적으로, 이는 "이게 null일 수 있나?"라는 대화가 줄어들고, 자동완성이 더 명확해지며, 낯선 모듈 간의 탐색이 안전해지고, 의도가 API에 인코딩되어 코드 리뷰가 빨라지는 것을 의미합니다.
컴파일 타임 검사는 보통 병합 전에 이른 단계에서 실패합니다. 잘못된 인수를 넘기거나 필요한 필드를 잊거나 반환값을 잘못 사용할 경우 컴파일러가 즉시 표시합니다.
런타임 실패는 나중에 드러납니다—QA에서일 수도 있고 프로덕션에서일 수도 있습니다—특정 코드 경로가 실제 데이터로 실행될 때 발생합니다. 그런 버그는 보통 더 비용이 큽니다: 재현이 어렵고 사용자에게 영향을 주며 긴급한 대응 작업을 만들죠.
정적 타입이 모든 런타임 버그를 막지는 못하지만, "컴파일되어선 안 될" 큰 범주의 오류를 제거합니다.
팀이 커지면서 흔히 발생하는 실패 지점:
타입은 공유 지도의 역할을 합니다. 계약을 변경하면 무엇을 업데이트해야 하는지 구체적인 목록을 얻습니다.
타이핑에는 비용이 있습니다: 학습 곡선, 경계에서의 추가 어노테이션, 때때로 타입 시스템이 의도를 깔끔하게 표현하지 못할 때의 마찰. 핵심은 전략적으로 타입을 사용하는 것입니다—공용 API와 공유 데이터 구조에 가장 많이 적용하여 문서 작업으로 변하지 않게 확장 이점을 얻는 것입니다.
피드백 루프는 하루 종일 반복하는 작은 사이클입니다: 수정 → 검사 → 고치기. 한 줄을 바꾸면 도구가 즉시 검증하고, 맥락이 바뀌기 전에 잘못된 점을 고칩니다.
느린 루프에서는 "검사"가 주로 앱을 실행하고 수동 테스트에 의존하거나 CI를 기다리는 것을 의미합니다. 그 지연은 작은 실수를 보물찾기로 만듭니다:
편집과 발견 사이의 간격이 길수록 각 수정의 비용은 커집니다.
현대 언어와 툴링은 루프를 몇 초로 단축합니다. TypeScript와 C#에서는 에디터가 타이핑하면서 문제를 표시하고 종종 제안된 수정을 제공합니다.
일찍 잡히는 구체적 예시:
user.address.zip에 접근했는데 address가 존재함이 보장되지 않음.return 때문에 함수의 나머지가 실행될 수 없음.이것들은 단순한 ‘깜빡함’이 아니라, 빠른 도구가 즉각적인 수정으로 바꾸는 흔한 실수입니다.
빠른 피드백은 조정 비용을 줄입니다. 컴파일러와 언어 서비스가 불일치를 즉시 잡으면 코드 리뷰, QA, 다른 팀의 작업으로 이슈가 새어나가는 일이 줄어듭니다. 그 결과 불필요한 질의응답(“여기서 무슨 뜻이었나요?”), 깨진 빌드, "누군가 타입을 바꿨더니 내 기능이 터졌음" 같은 놀라움이 줄어듭니다.
확장에서는 속도가 단순히 런타임 성능이 아니라 개발자가 변경이 유효하다는 확신을 얼마나 빠르게 가질 수 있는지를 뜻합니다.
"언어 서비스"는 코드를 검색 가능하고 안전하게 다룰 수 있게 하는 에디터 기능들입니다. 생각할 것들: 프로젝트를 이해하는 자동완성, 올바른 파일로 점프하는 "정의로 가기", 모든 사용을 업데이트하는 이름 변경, 실행 전에 문제를 밑줄로 표시하는 진단 등.
TypeScript의 에디터 경험은 TypeScript 컴파일러가 단지 자바스크립트를 생산하기 위한 도구가 아니라 TypeScript 언어 서비스를 구동하는 엔진이기 때문에 작동합니다.
TS 프로젝트를 VS Code(또는 같은 프로토콜을 사용하는 다른 에디터)에서 열면, 언어 서비스는 tsconfig를 읽고 임포트를 따라 프로그램의 모델을 만들며 다음과 같은 질문에 계속 답합니다:
이 때문에 TypeScript는 정확한 자동완성, 안전한 이름 변경, 정의로 이동, 모든 참조 찾기, 빠른 수정, 인라인 오류를 타이핑 중에도 제공할 수 있습니다. 대규모 자바스크립트 중심 리포에서는 이 조밀한 루프가 확장상의 이점입니다: 엔지니어는 낯선 모듈을 편집하면서 무엇이 깨질지 즉시 안내받습니다.
C#도 유사한 원리를 얻지만 특히 Visual Studio(및 VS Code의 언어 서버)를 통한 깊은 IDE 통합에서 강점을 보입니다. 컴파일러 플랫폼은 풍부한 의미 분석을 지원하고 IDE는 리팩터링, 코드 액션, 프로젝트 간 네비게이션, 빌드 시 피드백을 제공합니다.
팀이 커질 때 이것은 중요합니다: 더 이상 코드를 "머릿속으로 컴파일"할 필요가 적어집니다. 대신 도구가 의도를 확인해줍니다—실제로 호출하는 심볼, 널러빌리티 기대치, 영향받는 호출 지점, 변경이 여러 프로젝트에 걸쳐 파급되는지 등을 보여줍니다.
작은 규모에서는 툴링이 있으면 좋습니다. 큰 규모에서는 팀이 두려움 없이 움직일 수 있게 하는 수단입니다. 강력한 언어 서비스는 낯선 코드를 더 쉽게 탐색하고, 안전하게 변경하며, 더 쉽게 리뷰하게 합니다—같은 사실(타입, 참조, 오류)이 모두에게 보이기 때문입니다, 오직 원저자만이 아는 것이 아니고.
리팩터링은 실제 작업 후에 하는 ‘대청소’ 이벤트가 아닙니다. 대형 코드베이스에서는 지속적으로 코드를 재형성하는 것이 진짜 작업입니다: 그래야 새 기능이 매달 느려지거나 위험해지지 않습니다.
언어와 툴링이 리팩터링을 안전하게 만들면, 팀은 모듈을 작게 유지하고 이름을 정확하게 하며 경계를 분명히 할 수 있습니다—위험한 다주간 재작성 작업을 계획하지 않고도.
TypeScript와 C#의 현대 IDE 지원은 보통 몇 가지 고수익 작업에 집중됩니다:
이들은 작은 동작이지만, 규모가 커지면 "우리는 이걸 바꿀 수 있다"와 "아무도 이 파일에 손대지 마"의 차이를 만듭니다.
텍스트 검색은 동일한 단어가 같은 심볼을 가리키는지 판단할 수 없습니다. 실제 리팩터링 도구는 프로그램의 의미 모델—타입, 스코프, 오버로드, 모듈 해상—을 사용해 의미를 업데이트합니다.
이 의미 모델 덕분에 인터페이스 이름을 바꿀 때 문자열 리터럴은 건드리지 않거나, 메서드를 옮기면서 모든 임포트와 참조를 자동으로 고칠 수 있습니다.
의미적 리팩터링이 없으면 팀은 반복적으로 피할 수 있는 파손을 배포합니다:
여기서 개발자 경험은 곧 엔지니어링 처리량입니다: 더 안전한 변경은 더 많은 변경을 더 일찍 가능하게 하고, 코드베이스에 두려움이 적게 깃들게 합니다.
TypeScript가 성공한 이유는 팀에게 "처음부터 새로 시작하라"고 요구하지 않기 때문입니다. 실제 프로젝트의 대부분은 이미 자바스크립트로 시작합니다—엉성하고 빠르게 움직이며 이미 배포되고 있습니다—TypeScript는 모멘텀을 막지 않고 그 위에 안전을 얹게 해줍니다.
TypeScript는 구조적 타이핑을 사용합니다. 즉 호환성은 값의 형태(필드와 메서드)에 따라 결정되며, 선언된 타입의 이름이 아니라 형태로 판단합니다. { id: number } 형태를 가진 객체라면 다른 모듈에서 왔거나 명시적으로 타입으로 선언되지 않았더라도 그 형태를 기대하는 곳에 쓸 수 있습니다.
또한 타입 추론에 크게 의존합니다. 종종 많은 주석 없이도 의미 있는 타입을 얻습니다:
const user = { id: 1, name: "Ava" }; // inferred as { id: number; name: string }
마지막으로 TypeScript는 점진적입니다: 타입이 있는 코드와 없는 코드를 섞을 수 있습니다. 중요한 경계(API 응답, 공유 유틸리티, 핵심 도메인 모듈)부터 먼저 주석을 달고 나머지는 나중으로 미룰 수 있습니다.
이 점진적 경로 때문에 TypeScript는 기존 자바스크립트 코드베이스에 잘 맞습니다. 팀은 파일 단위로 변환하고 초기에는 일부 any를 허용하며 즉각적인 이점을 얻습니다: 더 나은 자동완성, 더 안전한 리팩터링, 더 명확한 함수 계약.
대부분의 조직은 중간 설정으로 시작한 뒤 코드베이스가 안정되면 점차 엄격한 규칙을 적용합니다—예: strict 옵션 켜기, noImplicitAny 제한, strictNullChecks 적용 범위 확대. 핵심은 마비 없이 진행하는 것입니다.
타입은 당신이 기대하는 것을 모델링합니다; 런타임 동작을 증명하지 않습니다. 비즈니스 규칙, 통합 경계, I/O나 신뢰할 수 없는 데이터와 관련된 부분은 여전히 테스트가 필요합니다.
C#은 단순한 아이디어를 중심으로 성장했습니다: "보통의" 코딩 방식이 가장 안전하고 읽기 쉬운 방식이 되게 하자. 이것은 코드베이스가 한 사람이 머릿속에 담을 수 있는 범위를 넘어 많은 사람이 유지하는 공유 시스템이 될 때 중요합니다.
모던 C#은 비즈니스 의도처럼 읽히는 문법을 지향합니다. 작은 기능들이 누적되어 더 나은 가독성을 만듭니다: 더 명확한 객체 초기화, 패턴 매칭으로 데이터 형태 처리, 중첩된 if를 줄이는 표현식 기반의 switch 등.
수십 명의 개발자가 같은 파일을 건드릴 때 이런 편의는 부족한 집단 지식을 줄입니다. 코드 리뷰는 해독하는 과정이 아니라 동작을 검증하는 과정이 됩니다.
가장 실용적인 확장 개선 중 하나는 널러빌리티입니다. null을 언제나 예상되는 깜짝 요소로 다루는 대신, C#은 의도를 표현하도록 돕습니다:
이것은 많은 결함을 컴파일 타임으로 이동시키며, API를 작성한 사람이 아닌 사람이 사용하는 환경에서 특히 유용합니다.
시스템이 커질수록 네트워크 호출, 파일 I/O, 백그라운드 작업이 늘어납니다. C#의 async/await는 비동기 코드를 동기 코드처럼 읽히게 만들어 동시성 인지 부담을 줄입니다.
콜백을 코드 전반에 끌고 다니는 대신, 팀은 간단한 흐름으로 작성할 수 있고 런타임이 기다림을 관리합니다. 결과는 타이밍 관련 버그 감소와 새로운 팀원이 배워야 할 관습 축소입니다.
C#의 생산성 이야기는 언어 서비스와 IDE 통합과 분리할 수 없습니다. 대형 솔루션에서는 강력한 툴링이 일상적으로 가능한 것을 바꿉니다:
이것이 팀이 모멘텀을 유지하게 도와줍니다. IDE가 "이게 어디에서 사용되나?"와 "이걸 바꾸면 무엇이 깨지나?"를 신뢰할 수 있게 답하면 개발자는 개선을 주도적으로 수행합니다.
지속적인 패턴은 일관성입니다: 널 처리, 비동기 워크플로, 리팩터링 같은 일반적인 작업이 언어와 도구에 의해 지원됩니다. 이 조합은 좋은 엔지니어링 습관을 가장 쉬운 경로로 만듭니다—코드베이스와 이를 유지하는 팀을 확장할 때 바로 원하는 것입니다.
코드베이스가 작을 때 모호한 오류 메시지도 ‘충분히 좋음’일 수 있습니다. 확장된 환경에서는 진단이 팀의 커뮤니케이션 시스템의 일부가 됩니다. TypeScript와 C#은 둘 다 Hejlsberg 스타일의 편향을 반영합니다: 메시지는 단순히 멈추게 하는 것이 아니라, 다음 행동을 보여줘야 합니다.
유용한 진단은 보통 세 가지 특성을 가집니다:
압박받을 때 오류를 읽는 경우가 많습니다. 가르치는 메시지는 블록된 시간을 학습 시간으로 바꿉니다.
오류는 지금의 정합성을 강제합니다. 경고는 장기적인 건강을 지키는 영역입니다: 사용 중단 예정 API, 도달 불가능한 코드, 의심스러운 널 사용, 암묵적 any 등 오늘은 동작하지만 나중에 문제를 일으킬 수 있는 항목들.
팀은 점진적으로 엄격해지는 정책으로 경고를 다룰 수 있습니다: 초기에는 관대하게 시작하고, 시간이 지나며 규칙을 강화하세요(그리고 경고 수가 늘어나지 않도록 관리).
일관된 진단은 일관된 코드를 만듭니다. "여기서는 이렇게 하지 않는다"는 집단 지식 대신, 도구가 그 규칙을 바로 설명해줍니다.
이는 확장상의 장점입니다: 새로 온 사람도 컴파일러와 IDE의 오류 목록을 통해 본 적 없는 문제를 스스로 고칠 수 있습니다.
코드베이스가 커지면 느린 피드백은 일상의 세금처럼 작동합니다. 단일한 큰 문제로 드러나기보다는 천 번의 기다림으로 죽음에 이르게 합니다: 빌드가 길어지고, 테스트가 느려지며, CI 파이프라인이 빠른 검사들을 시간 소모적인 것으로 만듭니다.
몇 가지 흔한 증상:
현대 언어 툴체인은 점점 "모두 재빌드"를 최후 수단으로 취급합니다. 핵심 아이디어는 단순합니다: 대부분의 수정은 프로그램의 작은 일부에만 영향을 주므로 도구는 이전 작업을 재사용해야 합니다.
증분 컴파일과 캐싱은 보통 다음에 의존합니다:
이것은 단순히 빌드를 빠르게 하는 것이 아닙니다. 대형 레포에서도 타이핑 중에 ‘라이브’ 언어 서비스가 반응성을 유지하게 해줍니다.
이름 변경, 참조 찾기, 진단이 수초 걸리면 사람들은 그것을 신뢰하지 않게 되고 리팩터링을 중단합니다. 편집기 반응성을 제품 지표로 다루세요.
명시적 예산을 정하세요(예: 로컬 빌드 X분 미만, 핵심 편집기 동작 Y ms 미만, CI Z분 미만). 지속적으로 측정하고 행동으로 옮기세요.
목표는 가장 빠른 경로를 기본 경로로 만드는 것입니다.
대형 코드베이스는 보통 한 함수의 실수로 망가지는 것이 아니라 시간이 지나면서 경계가 흐려져 실패합니다. 변경을 안전하게 유지하는 가장 쉬운 방법은 API(심지어 내부 API도)를 제품처럼 다루는 것입니다: 작고 안정적이며 의도적이어야 합니다.
TypeScript와 C# 모두에서 타입은 "이걸 어떻게 호출하나"를 명시적인 계약으로 바꿉니다. 공유 라이브러리가 잘 고른 타입—좁은 입력, 명확한 반환 형태, 의미 있는 열거형—을 노출하면 암묵적인 규칙이 줄어듭니다.
내부 API에서는 이것이 더 중요합니다: 팀이 이동하고 소유권이 바뀌며 라이브러리가 빠르게 읽을 수 없는 의존성이 될 수 있습니다. 강한 타입은 호출자가 컴파일 타임에 깨지게 만들어 오용을 어렵게 하고 리팩터링을 안전하게 합니다.
유지보수 가능한 시스템은 보통 계층화되어 있습니다:
이것은 건축 순수성의 문제가 아니라 어디를 변경해야 하는지 명확히 하는 문제입니다.
API는 진화합니다. 계획하세요:
자동화를 통해 이러한 습관을 지원하세요: 내부 임포트를 금지하는 린트 규칙, API 변경을 위한 코드 리뷰 체크리스트, semver를 강제하고 실수로 공개 API를 내보내는 것을 막는 CI 검사.
규칙을 실행 가능하게 만들면 유지보수성은 개인의 미덕이 아니라 팀의 보증이 됩니다.
대형 코드베이스는 팀이 "잘못된 언어를 골랐기" 때문에 실패하지 않습니다. 변경이 위험하고 느려지기 때문에 실패합니다. TypeScript와 C#의 실용적 패턴은 단순합니다: 타입 + 툴링 + 빠른 피드백이 일상적 변경을 더 안전하게 만듭니다.
정적 타입은 훌륭한 언어 서비스(자동완성, 네비게이션, 빠른 수정)와 촘촘한 피드백 루프(즉시 오류, 증분 빌드)와 결합될 때 가장 큰 가치를 발휘합니다. 이 조합은 리팩터링을 스트레스가 큰 이벤트가 아니라 일상적인 활동으로 바꿉니다.
모든 확장 성과가 언어에서만 오는 것은 아닙니다—워크플로도 중요합니다. Koder.ai 같은 플랫폼은 "수정 → 검사 → 고치기" 루프를 더 압축하려고 합니다. 채팅 기반 워크플로(웹의 React, 백엔드의 Go + PostgreSQL, 모바일의 Flutter)를 통해 앱을 구축하면서도 실제 내보낼 수 있는 소스 코드를 유지합니다.
실무적으로, 계획 모드(변경 전 의도를 명확히), 스냅샷과 롤백(리팩터링을 안전하게), 그리고 내장된 배포/호스팅 및 커스텀 도메인 같은 기능은 이 글의 주제와 직접 연결됩니다: 변경 비용을 줄이고 시스템이 커질수록 피드백을 촘촘히 하는 것입니다.
다가오는 기능 하나를 골라 파일 범위에서 타입을 강화하고, CI에서 그린 빌드를 요구하며 변경 전후의 리드 타임과 버그율을 측정하세요.
더 많은 아이디어가 필요하면 /blog의 관련 엔지니어링 포스트들을 살펴보세요.
개발자 경험(DX)은 변경을 수행하는 데 드는 일상적 비용을 뜻합니다: 코드를 이해하고, 안전하게 수정하고, 그것이 제대로 동작함을 증명하는 과정입니다. 코드베이스와 팀이 커질수록 ‘파악하는 비용’이 지배적이 되며, 좋은 DX(빠른 탐색, 신뢰할 수 있는 리팩터링, 명확한 오류)가 복잡성 속에서도 배포 속도를 유지하게 합니다.
대형 레포에서는 불확실성에 시간이 낭비됩니다: 불명확한 계약, 일관성 없는 패턴, 느린 피드백 등입니다.
좋은 툴링은 다음과 같은 질문에 빠르게 답해 불확실성을 줄입니다:
이유는 반복 가능한 설계 철학이 두 생태계에 공통으로 나타나기 때문입니다: 빠른 피드백, 강력한 언어 서비스, 안전한 리팩터링을 우선시합니다. 핵심 교훈은 ‘한 사람을 따르라’가 아니라 ‘일상적인 작업을 빠르게 하고 실수를 조기에 드러내는 워크플로를 구축하라’는 점입니다.
정적 타입은 암묵적 가정을 검사 가능한 계약으로 바꿉니다. 많은 사람이 같은 코드를 만질 때 특히 유용합니다:
컴파일 타임 검사(compile-time)는 이른 단계에 실패를 잡습니다—종종 타이핑 중이거나 병합 전에 발생하므로 맥락이 유지된 상태에서 고칠 수 있습니다. 런타임 버그는 나중에(테스트/프로덕션) 드러나며 더 비쌉니다: 재현, 사용자 영향, 긴급 패치가 필요합니다.
실용적 규칙: “절대 컴파일되어선 안 될” 오류는 타입으로 막고, 비즈니스 규칙·통합 경계 등은 테스트로 검증하세요.
TypeScript는 기존 자바스크립트에 점진적으로 도입할 수 있게 설계되었습니다:
일반적인 마이그레이션 전략은 파일 단위 변환과 시간이 지남에 따른 tsconfig 엄격도 증가입니다.
C#은 ‘평범한 방식(the normal way)’으로 코딩하는 것이 읽기 쉽고 안전하도록 진화했습니다. 대형 솔루션에서 유지보수성을 직접적으로 향상시키는 특징은:
null일 수 있는지 명확히 표현 가능async/await로 비동기 흐름을 동기처럼 읽게 만들어 동시성 관련 인지 부담 감소결과적으로 개인 관례에 의존하지 않고 도구가 일관성을 강제합니다.
언어 서비스는 코드의 의미(semantic)를 이해하는 편집기 기능들의 집합을 뜻합니다. 단순한 문법 색칠을 넘어서 다음을 제공합니다:
TypeScript에서는 TypeScript 컴파일러 + 언어 서비스가, C#에서는 컴파일러/분석 인프라와 IDE 통합이 이러한 기능을 뒷받침합니다.
검색-and-교체가 아니라 컴파일러 기반의 의미적(refactoring) 리팩터링을 사용하세요. 좋은 리팩터링은 스코프, 오버로드, 모듈 해상, 심볼 아이덴티티를 이해합니다.
실용적 습관:
속도를 제품 지표로 다루고 피드백 루프를 최적화하세요:
목표는 edit → check → fix 루프를 충분히 조여 사람들이 자신 있게 변경하도록 만드는 것입니다.
다음 단계들을 시도해보세요: