LeadByExample(): Jakub Chodounsky, 실제적 엔지니어링에 관한 내용, YOLO 사고방식, 최선의 실천이 항상 최선은 아닌 이유
.NET 11의 네 번째 프리뷰가 이제 사용 가능하며, 이는 라이브러리 저자와 프로덕션에서 .NET 서비스를 운영하는 팀 모두에 실질적으로 영향을 미치는 여러 변경 사항을 가져옵니다. Iron Software에서, 우리는 .NET 라이브러리 포트폴리오를 유지 보수하고 있으며, 이는 각 프리뷰 릴리스가 이러한 라이브러리를 애플리케이션에 통합하는 것과 관련하여 유지 관리자로서 및 고객에게 어떻게 영향을 미치는지 두 번의 평가를 유발합니다. 다음은 우리가 가장 중요한 것으로 간주하는 프리뷰 4의 업데이트입니다.
프로세스 API: 수년 만에 가장 중요한 업데이트
System.Diagnostics.Process는 여러 릴리스 사이클에서의 첫 번째 실질적인 업데이트를 받으며, 이는 라이브러리 저자들이 수년 동안 우회해온 고통 지점을 정확히 해결합니다. 이는 우리 작업에 직접적으로 관련이 있습니다. IronPDF는 내부적으로 Chromium 렌더링 프로세스를 감싸고 있으며, 이는 Microsoft가 이제 표준화한 영역 전반에 걸쳐 우리 팀이 맞춤형 솔루션을 구축하고 유지해왔음을 의미합니다: 프로세스 생성, 교착 상태가 없는 출력 캡처, 크로스 플랫폼 수명 관리, 및 신뢰할 수 있는 종료 동작.
새 API 표면은 라이브러리 팀이 수년간 우회해온 문제들의 카탈로그처럼 읽힙니다:
// One-line execution with no deadlock risk
string output = await Process.RunAndCaptureTextAsync("git", ["log", "-5"]);
// Cross-platform parent-exit behavior
var psi = new ProcessStartInfo("renderer.exe")
{
KillOnParentExit = true,
};
// One-line execution with no deadlock risk
string output = await Process.RunAndCaptureTextAsync("git", ["log", "-5"]);
// Cross-platform parent-exit behavior
var psi = new ProcessStartInfo("renderer.exe")
{
KillOnParentExit = true,
};
Imports System.Diagnostics
Imports System.Threading.Tasks
' One-line execution with no deadlock risk
Dim output As String = Await Process.RunAndCaptureTextAsync("git", {"log", "-5"})
' Cross-platform parent-exit behavior
Dim psi As New ProcessStartInfo("renderer.exe") With {
.KillOnParentExit = True
}RunAndCaptureTextAsync는 파이프 버퍼 교착 상태를 제거하기 위해 stdout과 stderr를 복합 전송합니다. KillOnParentExit 및 StartDetached는 Windows 및 Linux에서 자식 프로세스 수명에 대한 크로스 플랫폼 제어를 제공합니다. InheritedHandles는 자식 프로세스가 상속하는 핸들을 명시적으로 지정할 수 있게 하여, 넓은 상속의 역사적 기본값을 대체합니다. 경량 SafeProcessHandle 표면은 표준 API보다 최대 20% 작은 NativeAOT 바이너리를 생성합니다.
.NET 소프트웨어를 구축하거나 자식 프로세스를 조정하는 팀에는, 릴리스 노트의 이 섹션은 주의 깊게 검토할 가치가 있습니다.
이 인프라를 내부에서 구축하거나 유지 관리하지 않는 팀의 경우, IronPDF는 이 패턴의 프로덕션 테스트 구현을 제공합니다: 교착 상태 없는 출력 캡처, 수명 제어 및 신뢰할 수 있는 실패 처리. Iron Suite 무료 체험 시작, 신용 카드 필요 없음.
스팬 기반 Deflate, ZLib 및 GZip API
이 변경 사항은 릴리스 노트에서 덜 두드러지지만, 압축된 데이터를 처리하는 모든 워크로드를 실질적으로 개선합니다. PDF 문서는 압축된 콘텐츠 스트림을 포함합니다. XLSX 파일은 압축된 XML의 ZIP 아카이브입니다. DOCX는 동일한 패턴을 따릅니다. 새 스팬 기반 인코더 및 디코더 API는 IronPDF 및 IronXL과 같은 라이브러리가 지속적으로 수행하는 작업에서 할당을 줄입니다.
이는 드물게 릴리스 주요 뉴스에 등장하지만, 프레임워크를 통해 처리되는 모든 바이트의 비용을 줄이는 인프라 수준의 개선입니다.
런타임 비동기, 이제 프레임워크 라이브러리에 컴파일됩니다
프리뷰 3는 런타임 비동기에 대한 프리뷰 기능 게이트를 제거했습니다. 프리뷰 4는 이를 더 확장합니다: 런타임 라이브러리(전체 BCL, System.IO 및 System.Net.Http 포함)를 이제 런타임 비동기로 컴파일합니다. 프레임워크로의 모든 비동기 호출은 이제 소비하는 코드가 기능을 활성화했는지 여부와 상관없이 새로운 연속성 기계를 사용합니다.
상당한 I/O(파일 읽기, 원격 자산 다운로드, 코덱을 통한 바이트 스트리밍)를 수행하는 라이브러리에는 다른 변화 없이 종속성 성능에 의미 있는 개선이 됩니다. 런타임 팀의 Andy Gocke는 정상화된 DecompressAsync가 MemoryStream에 의해 지원될 때 추가 할당을 전혀 생성하지 않는다고 확인했습니다. Microsoft는 아직 공식 벤치마크 수치를 발표하지 않았지만, 구조적 변화는 이루어졌습니다.
MAUI, CoreCLR로 이동
이는 릴리스에서 가장 중요한 아키텍처 변화이지만, 우리 제품 라인에 대한 직접적인 영향은 제한적입니다. 프리뷰 4부터, Android, iOS 및 Mac Catalyst의 MAUI 애플리케이션은 기본적으로 CoreCLR에서 실행되며, .NET의 모바일 런타임으로 Mono가 15년 이상 지속된 것을 종결시킵니다. 이제 동일한 런타임이 ASP.NET Core, 데스크톱 애플리케이션 및 모바일을 지원합니다. dotnet watch는 또한 이제 Android 및 iOS에서 사용할 수 있어, MAUI 개발자 경험에서 처음 출시된 이후 가장 자주 언급된 갭 중 하나를 해결합니다.
MAUI 애플리케이션 내에서 IronBarcode 또는 IronPDF를 사용하는 팀에게는, 기본 런타임이 이제 .NET 스택의 나머지 부분과 통합됩니다.
알려진 제한 및 고려 사항
- Visual Studio 지원은 여전히 Insiders 채널에 제한됩니다. 안정된 Visual Studio 릴리스의 팀은 주 개발 라인에 .NET 11을 통합하지 않습니다.
- 런타임 비동기는 구조적으로 자리 잡았지만, 공식 벤치마크가 없습니다. "10M 대기: 80ms에서 32ms로, 687MB에서 94KB로"라는 광범위하게 유포된 수치는 Microsoft가 아닌 커뮤니티 요약에서 기인합니다.
- MAUI CoreCLR 전환은 기본 런타임 변화로 배송됩니다. 기존 MAUI 애플리케이션은 물리적 장치에서 테스트해야 하며, 투명한 업그레이드로 가정할 수 없습니다.
- 모든 프리뷰와 마찬가지로, 프로덕션 배포는 최소한 첫 번째 릴리스 후보까지 기다려야 합니다.
요약
프리뷰 4는 현재까지 .NET 11 사이클에서 가장 강력한 변경 사항을 대표합니다. 프로세스 API 개편은 .NET 소프트웨어를 빌드하거나 수행하는 팀에게 가장 중요한 업데이트입니다. 압축 및 런타임 비동기 개선은 I/O 집중 작업에 걸쳐 합쳐집니다. MAUI 런타임 이야기는 이제 플랫폼의 나머지 부분과 일관됩니다.
우리 팀은 각 프리뷰를 적극적으로 추적하고 있으며, .NET 11이 11월에 일반 공급에 도달할 때, day-one 호환성을 위해 우리의 라이브러리를 준비합니다.
