A curated collection of my backend engineering articles, notes, and hands-on learnings. This repository serves as a living index of my writing and technical growth.
- From Junior to Senior: Understanding Challenges in Large Projects
- Getting Started with CI/CD and Azure DevOps Pipelines
- RESTful API Design and HTTP Status Codes
- String Formatting in C#
- Exception Handling in ASP.NET Core
- When Validation Fails Quietly
- What Is .NET? A Modern, Real-World Guide for 2026
- Understanding DbContext in EF Core: A Complete Guide
- Modernizing Software Architecture
- Strategic Communication Framework
- Why Your Code is a "Control Freak"
- Engineering Standards Are Not About Rules
- Stop Building Features Nobody Actually Needs
- Cognitive Foundations Primer: Dismantling the Spiral
- Why Some Developers Stay Stuck While Others Become Leaders
- The Skill Nobody Told Me Would Matter This Much
- Should We Use using or Not
- Demystifying .NET Garbage Collection
- Why the Strategy Pattern Is the Secret Sauce of Clean Code
- .NET Engineering Glossary
- Building Software Without Glue
- The Evolution of Object Mapping in .NET
- Sparse Mapping
- مسیریابی در Razor Pages: از مفاهیم پایه تا پیادهسازی
- الگوی Repository در لایهٔ Infrastructure
- تفاوت API و REST API
- قوانین Clean Code: چرا کد تمیز اهمیت دارد
- مسیردهی در API
- تفاوت فایروالهای Stateful و Stateless
- چرا تغییرات کوچک در پروژههای بزرگ فاجعه میسازند؟ تجربه مهندسان تازهکار
Context
Junior engineers entering a large software team or a project with an extensive legacy codebase often face overwhelming complexity. They encounter confusion and uncertainty, and key skills are underdeveloped. Small changes can ripple across the system unexpectedly. This stage highlights the gap between hands-on experience and understanding the system as a whole, emphasizing learning and system-awareness.
Website
Substack
Link
🔗 https://rezatajari.substack.com/p/from-junior-to-senior
Context
Writing code alone is no longer sufficient in modern software development. CI/CD pipelines automate build, test, and deployment processes, improving reliability, visibility, and team coordination. This article explains how Azure DevOps Pipelines enable teams to deliver code with confidence, replacing error-prone manual workflows.
Website
Substack
Link
🔗 https://rezatajari.substack.com/p/getting-started-with-cicd-and-pipelines
Context
REST (Representational State Transfer) is an architectural style for networked applications defined by Roy Fielding in 2000.
It has become the dominant approach for web APIs because it provides a set of design constraints that encourage clarity and consistency.
Website
Substack
Link
🔗 https://rezatajari.substack.com/p/restful-api-design-and-http-status
Context
This article is about why string formatting exists, how the core mechanisms work, and when to choose each approach in modern C#.
Website
Substack
Link
🔗 https://rezatajari.substack.com/p/string-formatting-in-c
Context
How structured error management, middleware, and intelligent logging transform your .NET applications into reliable, resilient systems
Website
Substack
Link
🔗 https://rezatajari.substack.com/p/exception-handling-in-aspnet-core
Context
In theory, validation is simple.
In practice, it’s where systems quietly decay.
In an energy monitoring platform, incoming data isn’t just “input.”
It represents physical reality: voltage levels, timestamps, device identities, consumption thresholds.
Website
Substack
Link
🔗 https://rezatajari.substack.com/p/when-validation-fails-quietly
Context
What Is .NET?
.NET is not just a framework.
It is a unified development platform for building applications that run on desktops, cloud, web, mobile, IoT, and beyond.
Website
Substack
Link
🔗 https://rezatajari.substack.com/p/what-is-net-a-modern-real-world-guide
Context
If you’re entering the world of .NET, you’ve probably wondered: what is DbContext? In EF Core, DbContext acts as the primary bridge between your application and the database. It simplifies data access, manages entity sets, tracks changes, and handles database connections, enabling cleaner, maintainable code and efficient querying.
Website
Substack
Link
🔗 https://rezatajari.substack.com/p/understanding-dbcontext-in-ef-core
Context
Modernizing software architecture is like preparing for a journey: you need to anticipate challenges and be ready for unexpected hurdles. Just as you would prepare for sudden rain on a picnic or for a toddler’s unpredictable mood at a family gathering, modernizing architecture demands foresight, planning, and adaptability.
Website
Substack
Link
🔗 https://rezatajari.substack.com/p/modernizing-software-architecture
Context
Technical skills may get engineers into the room, but communication determines how much impact they can create. This article explores the Strategic Communication Framework, focusing on Humility, Respect, and Trust (HRT) as the foundation of effective collaboration. It explains how strong communication reduces friction, builds stakeholder alignment, prevents micromanagement, and helps engineers navigate organizational dynamics while delivering better outcomes.
Website
Substack
Link
🔗 https://rezatajari.substack.com/p/strategic-communication-framework
Context
Many software systems become difficult to change not because of business complexity, but because components tightly control their own dependencies. This article explains the "Control Freak" anti-pattern, how excessive use of direct object creation increases coupling, and why Dependency Injection and Inversion of Control lead to more flexible, testable, and maintainable architectures.
Website
Substack
Link
🔗 https://rezatajari.substack.com/p/why-your-code-is-a-control-freak
Context
Software systems rarely fail because of a single major mistake. More often, they degrade through small compromises that gradually become accepted as normal. This article explores pragmatic engineering principles such as personal responsibility, the Broken Windows theory, designing for change, defensive engineering, and testing as an architectural feedback mechanism. It emphasizes that engineering standards exist not to enforce rules, but to help teams build adaptable systems that can evolve reliably over time.
Website
Substack
Link
🔗 https://rezatajari.substack.com/p/engineering-standards-are-not-about
Context
Teams often build features based on assumptions, positive feedback, or surface-level requests rather than verified user needs. This article explores how product-minded engineers validate problems before designing solutions, distinguish real pain points from proposed fixes, and use evidence-driven conversations to reduce uncertainty. It highlights the importance of learning from actual user behavior, workflows, and commitments instead of relying on hypothetical feedback.
Website
Substack
Link
🔗 https://rezatajari.substack.com/p/stop-building-features-nobody-actually
Context
Overthinking often feels like problem-solving, but in reality it can become a self-reinforcing cycle of anxiety, distorted thinking, and inaction. This article explores the cognitive patterns behind overthinking, the relationship between thoughts, emotions, and behavior, and practical strategies for breaking the cycle. Through concepts such as cognitive distortions, grounding techniques, acceptance, and action-oriented thinking, it presents a framework for developing greater psychological awareness and resilience.
Website
Substack
Link
🔗 https://rezatajari.substack.com/p/cognitive-foundations-primer
Context
Many developers assume career growth is primarily driven by technical expertise. While technical skills are essential, long-term progression often depends on a broader shift in perspective. This article explores the transition from simply writing code to creating business impact, navigating career paths, developing leadership capabilities, and taking ownership of outcomes. It examines the differences between technical and people leadership, the traits that define senior engineers, and the mindset required to grow from an individual contributor into a trusted organizational leader.
Website
Substack
Link
🔗 https://rezatajari.substack.com/p/why-some-developers-stay-stuck
Context Technical expertise is only part of what makes an effective software engineer. This article explores how communication, humility, accountability, and emotional intelligence shape long-term influence within engineering teams. It explains why trust often matters more than being right, how asking thoughtful questions can be more persuasive than giving direct answers, why taking ownership of mistakes strengthens credibility, and how recognizing the contributions of others improves collaboration. Ultimately, it argues that while technical skills open opportunities, human skills determine the impact engineers have on projects and organizations.
Website Substack
Link 🔗 https://rezatajari.substack.com/p/the-skill-nobody-told-me-would-matter
Context
This article explains the real purpose of IDisposable and when the using statement is actually necessary in modern .NET applications. It distinguishes between managed memory, which is handled by the Garbage Collector, and unmanaged resources, which require explicit disposal. It also clarifies how Dependency Injection in ASP.NET Core automatically manages the lifetime of services like DbContext, eliminating the need for manual disposal in most cases. Ultimately, it emphasizes that effective resource management is not about using using everywhere, but about understanding object ownership and trusting the framework when it owns the lifecycle.
Website Substack
Link 🔗 https://rezatajari.substack.com/p/should-we-use-using-or-not
Context Demystifying .NET Garbage Collection explores what really happens after you create an object with new in a .NET application. Rather than treating the Garbage Collector as "magic," the article explains how the CLR manages memory, how the GC identifies and reclaims unused objects, and why generations make memory cleanup highly efficient. It also clarifies the difference between managed memory and unmanaged resources, showing when Dispose() is necessary and when the framework handles cleanup automatically. By understanding concepts like GC Roots, object lifetimes, finalizers, and dependency injection, developers can write applications that are not only correct but also more scalable and performant.
Website Substack
Link 🔗 https://rezatajari.substack.com/p/demystifying-net-garbage-collection
Context The Strategy Pattern helps keep software maintainable by separating changing business logic into independent strategy classes instead of large, condition-heavy classes. It supports SOLID principles, especially SRP, OCP, ISP, and DIP, making systems easier to extend without modifying existing code. By favoring composition over inheritance, it reduces coupling and improves flexibility. A growing if-else or switch block is often a sign that the Strategy Pattern should be applied. As applications evolve, Strategy also works naturally with Factory patterns to build scalable and adaptable architectures.
Website Substack
Link 🔗 https://rezatajari.substack.com/p/why-the-strategy-pattern-is-the-secret
Context This article is a practical glossary of essential .NET and software engineering concepts that developers frequently encounter in real projects. It explains key topics across REST APIs, testing, software architecture, and modern .NET development in clear, beginner-friendly language. Rather than focusing on implementation, it builds the vocabulary needed to understand documentation, code reviews, and technical discussions. The guide covers concepts such as DTOs, Idempotency, TDD, SOLID principles, Technical Debt, Refactoring, and Record types. It also introduces modern .NET tools and features like the CLI, TFMs, and Hot Reload. Overall, it serves as a quick reference to strengthen both technical communication and architectural understanding.
Website Substack
Link 🔗 https://rezatajari.substack.com/p/net-engineering-glossary
Context
This article explains the core ideas behind Dependency Injection (DI), Inversion of Control (IoC), and IoC Containers using a simple LEGO analogy. It shows why creating dependencies with new inside classes leads to tight coupling and makes software harder to test and maintain. The article clarifies the difference between IoC as a design principle and DI as its implementation, while explaining how IoC containers resolve dependencies and manage object lifetimes. It also highlights the role of interfaces, the Composition Root, and service registration in ASP.NET Core. Finally, it outlines practical guidelines for writing flexible, loosely coupled applications that are easier to extend, test, and maintain.
Website Substack
Link 🔗 https://rezatajari.substack.com/p/building-software-without-glue
Context his article explores the evolution of object mapping in .NET, tracing its path from manual assignments to advanced tools like AutoMapper and Mapperly. It explains that object mapping is an architectural decision rather than a simple technical utility, serving to cleanly separate external Request DTOs from internal domain entities. The piece shows how manual mapping works well for small apps but eventually violates the Single Responsibility Principle as service classes grow bogged down with transformation logic. It details the transition toward generic mappers and centralized mapping services, noting how runtime libraries like AutoMapper reduce boilerplate while introducing performance trade-offs. Modern .NET approaches are highlighted through Mapperly, which uses compile-time source generators to eliminate reflection overhead, ensure type safety, and allow full code inspection. Ultimately, the article emphasizes that the right mapping strategy depends on project requirements, reminding developers that proper separation of concerns is what keeps software maintainable.
Website Substack
Link 🔗 https://rezatajari.substack.com/p/the-evolution-of-object-mapping-in
Context This article explores a practical approach to object mapping called Sparse Mapping, where mapping is treated as default coverage + sparse exceptions rather than rewriting an entire DTO whenever a few fields require special handling. It explains how traditional load-and-map approaches can lead to deep entity graphs, unnecessary data loading, duplicated translation logic, and handlers that become a second source of truth for DTO structure. The article proposes three clear responsibilities: the mapper handles default fields, sparse SQL projections handle fields requiring joins, translations, or computed values, and post-query enrichment handles service calls or other non-SQL logic. It introduces a decision tree for choosing between these approaches and emphasizes that custom mapping should override only the exceptional fields while leaving the default mapping intact. The article also covers nested collections, migration strategies, common pitfalls such as relying on OnMap with projection, and the importance of comparing response parity during migration. Ultimately, the core message is that mapping exceptions should remain small and explicit: custom mapping should identify what is special, not become a second implementation of the entire DTO.
Website Substack
Link 🔗 https://rezatajari.substack.com/p/sparse-mapping
For regular insights on backend development, system thinking, and software engineering, you can subscribe to my newsletter:
🔗 https://rezatajari.substack.com/
توضیح کوتاه
در این مقاله به مفهوم مسیریابی در Razor Pages پرداختهام و توضیح دادهام که چگونه یک URL
از لحظهی ورود توسط کاربر، به صفحهی درست و منطق مناسب در سمت سرور هدایت میشود.
تمرکز مقاله بر درک ذهنی مسیریابی، ارتباط آن با ساختار پوشهها، و نقش آن در طراحی
قابلنگهداری برنامههای وب است.
وبسایت
نیکآموز
لینک مقاله
🔗 https://nikamooz.com/url-routing-to-razor-pages/
توضیح کوتاه
این مقاله به بررسی کاربرد Repository و Unit of Work در لایهٔ Infrastructure میپردازد.
در برنامههای مقیاس کوچک، دسترسی به دیتابیس معمولاً مستقیم در سرویسها انجام میشود، که مشکلاتی مانند تستپذیری سخت و پیچیدگی نگهداری ایجاد میکند. مقاله توضیح میدهد چگونه الگوهای Repository و Unit of Work این مشکلات را حل میکنند.
وبسایت
نیکآموز
لینک مقاله
🔗 https://nikamooz.com/repository-unit-of-work-infrastructure-layer/
توضیح کوتاه
این مقاله به زبان ساده تفاوت میان API و REST API را توضیح میدهد. API نقش مترجم بین نرمافزارها را دارد و REST API نوع خاصی از آن با قوانین مشخص است. مقاله با مثالهای کاربردی نشان میدهد چگونه درخواستها بین کلاینت و سرور منتقل و پردازش میشوند.
وبسایت
نیکآموز
لینک مقاله
🔗 https://nikamooz.com/difference-between-api-and-rest-api/
توضیح کوتاه
این مقاله بررسی میکند چرا برخی پروژهها با گذشت زمان پرهزینه و پرخطر میشوند. تمرکز بر طرز فکر و هنجارهای رفتاری کدنویسی است و چارچوبی بر اساس اصول 5S ژاپنی ارائه میدهد که نشان میدهد کیفیت کد محصول یک سیستم ساختاریافته و منظم است.
وبسایت
نیکآموز
لینک مقاله
🔗 https://nikamooz.com/clean-code/
توضیح کوتاه مسیردهی (Routing) در طراحی API یکی از مهمترین بخشهاست که تأثیر مستقیمی بر خوانایی، استفادهپذیری و نگهداری سیستم دارد. در این مقاله توضیح دادهام چرا استفاده از مسیرهایی مانند /api/getAllProducts یا /api/deleteProductById در نگاه اول ساده اما در عمل مشکلساز است. تمرکز مقاله بر طراحی مسیرهای معنادار، سازگار با اصول REST، و قابلدرک برای تیمهای فرانتاند و موبایل است تا توسعه و نگهداری API در بلندمدت سادهتر شود.
وبسایت نیکآموز
لینک مقاله 🔗 https://nikamooz.com/routing-in-api/
توضیح کوتاه در طراحی امنیت شبکه، انتخاب بین فایروالهای Stateful و Stateless تصمیمی صرفاً فنی نیست، بلکه مستقیماً بر مقیاسپذیری، مصرف منابع و سطح امنیت سیستم اثر میگذارد. در این مقاله با استفاده از یک مثال ملموس (کافیشاپ)، توضیح دادهام که چگونه فایروالهای Stateful با نگهداشتن وضعیت ارتباطها میتوانند تصمیمهای هوشمندتری بگیرند، اما در مقابل هزینهی پردازشی و پیچیدگی بیشتری دارند. در مقابل، فایروالهای Stateless هر درخواست را بهصورت مستقل بررسی میکنند؛ رویکردی سادهتر و سبکتر که با ذات پروتکل HTTP نیز همراستاست. تمرکز مقاله بر درک مفهومی این تفاوتها و کاربرد آنها در معماری سیستمهای مدرن است.
وبسایت نیکآموز
لینک مقاله 🔗 https://nikamooz.com/stateful-vs-stateless/
توضیح کوتاه مهندسان تازهکار هنگام ورود به یک تیم نرمافزاری بزرگ یا پروژهای با کدهای قدیمی، با حجم عظیمی از کد و پیچیدگیهای پنهان مواجه میشوند. در این مرحله، سردرگمی و حس بیاطلاعی طبیعی است و بسیاری از مهارتهای کلیدی هنوز شکل نگرفتهاند. بسیاری از تغییرات یا اصلاحات کوچک، اگر از دید کل سیستم بررسی نشوند، ممکن است اثرات گستردهای بر بخشهای دیگر داشته باشند که در نگاه اولیه دیده نمیشوند. این مرحله نشاندهنده فاصله بین تجربه عملی محدود و درک کلان سیستم است.
وبسایت نیکآموز
لینک مقاله 🔗 https://nikamooz.com/junior-or-senior/