Practical Software Development
Practical C#, .NET, Architecture & Modern Software Development
Latest Articles by Category
C#
C# Required Members: Construction Contracts, Inheritance, and API Evolution
Use C# required members to express caller-owned initialization without confusing compile-time enforcement with validation or non-null guarantees.
C# Collection Expressions: Target Typing, Spreads, and Performance
Use C# collection expressions deliberately by understanding target typing, spread evaluation, overload ambiguity, and allocation behavior.
.NET
.NET TimeProvider: Deterministic Clocks, Delays, and Timeout Tests
Use TimeProvider to make time-dependent .NET code explicit and test clocks, delays, timers, and expiry rules without waiting for wall-clock time.
.NET Keyed Services: Multiple Implementations Without Service Locator Sprawl
Use keyed dependency injection in .NET while keeping keys centralized, lifetimes valid, selection logic testable, and missing registrations visible.
Architecture
Architecture Decision Records: Capture Context, Trade-Offs, and Consequences
Use architecture decision records to preserve why significant choices were made without turning design documentation into an approval bottleneck.
Backend for Frontend Pattern: Client-Specific APIs Without a Shared Bottleneck
Use the Backend for Frontend pattern to tailor APIs for web and mobile clients while controlling duplication, authorization, latency, and operational overhead.
Angular
Angular Route Lazy Loading: Code Splitting, Preloading, and Failure Boundaries
Use Angular route-level lazy loading and deliberate preloading to reduce initial JavaScript without turning first navigation into an unobserved failure.
Angular Built-In Control Flow: @if, @for, and Stable Tracking
Use Angular built-in template control flow with deliberate list identity, empty states, aliases, and tests that catch incorrect DOM reuse.
React
React Effects: Synchronization, Cleanup, and Async Race Conditions
Use React Effects only for external synchronization, clean them up symmetrically, and prevent stale asynchronous work from updating current UI.
TypeScript Boundaries in React: Props, Events, and API Data
Use TypeScript to make React component contracts, UI states, events, and external data boundaries explicit without hiding uncertainty.
Cloud
Amazon ECS Deployment Circuit Breakers: Failure Detection and Safe Rollback
Configure ECS deployment circuit breakers and rollback while understanding health checks, last-known-good requirements, events, and database limits.
Amazon EventBridge vs SQS: Event Routing or Durable Work Queue?
Choose Amazon EventBridge or SQS by separating event routing from durable work ownership, then design retries, ordering, backpressure, and dead-letter recovery.
AI
Hybrid RAG Retrieval: Fuse Keyword and Vector Search Before Reranking
Combine lexical and dense retrieval with rank fusion, metadata enforcement, and measured reranking instead of trusting one search signal.
RAG Chunking Strategies: Preserve Meaning, Metadata, and Retrieval Quality
Design RAG chunks around document structure and retrieval tasks, preserve authorization metadata, and evaluate boundary changes against a labeled query set.