🛠 نجات توسعهدهندهها در شرایط «نت ملی»؛ تجربیات عملی ما برای زنده نگه داشتن چرخه تولید
توی این چند وقت که دسترسیها محدود شد و اینترنت به حالت داخلی (Intranet) رفت، ما هم مثل خیلی از تیمهای دیگه با چالشهای جدی روبرو شدیم. اما به جای متوقف شدن، سعی کردیم با ابزارهای جایگزین و تغییر استراتژی، جریان کار رو حفظ کنیم.
خواستم تجربیات واقعی و سولوشنهایی که تو این مدت پیادهسازی کردیم رو باهاتون به اشتراک بذارم تا شاید گرهای از کار شما هم باز کنه:
1️⃣ عبور از تحریم و محدودیت پکیجها (Frontend & Backend)
برای پروژههایی مثل Next.js که وابستگی زیادی به پکیجها دارن، اولین حرکت ما استفاده از Mirror Serverهای داخلی بود.
🔹 پیشنهاد: سرویس Runflare تقریباً اکثر ابزارها رو Mirror کرده، سرورهاش داخلیه و سرعتش عالیه.
🔗 https://runflare.com/mirrors/
🔥 خبر ویژه: همون روز اول با تیم فنی رانفلر صحبت کردم و دمشون گرم، خیلی سریع درخواست رو پیگیری کردن و Nuget رو هم به لیست سرویسهاشون اضافه کردن. الان دیگه داتنتیها هم میتونن راحت پکیجها رو دریافت کنن.
2️⃣ مدیریت داکر ایمیجها (Docker Images)
برای پول (Pull) کردن ایمیجها، پلتفرم docker.ir گزینه کارراهاندازی هست.
⚠️ نکته حیاتی برای داتنتیها:
از اونجایی که ایمیجهای داتنت روی Docker Hub نیستن و روی رجیستری مایکروسافت (MCR) قرار دارن، حتماً ایمیجهای SDK و ASP Core رو:
۱. یا روی سیستم لوکال داشته باشید.
۲. یا (روش اصولیتر) روی رجیستری داخلی خودتون Push کنید تا در صورت قطعی، بیلدها فیل نشن.
3️⃣ خداحافظی با وابستگی به کش لوکال (The Nexus Solution)
اوایل کار متکی به کشِ لوکال سیستمها (فولدر .nuget) بودیم، اما این روش ریسک بالایی داشت.
✅ راهکار پایدار: ما Nexus رو بالا آوردیم. با این کار تمام پکیجهای فرانت و بکاند یکبار در نکسوس کش میشن و اگه اینترنت کلاً قطع بشه، تیم فنی بدون هیچ توقفی به کارش ادامه میده.
4️⃣ ابزارهای مدیریت سورس، CI/CD و ارتباطات
برای اینکه تیم ریموت و پایپلاینها از کار نیفتن، از سرویسهای داخلی و Self-Hosted استفاده کردیم:
* گیت و رانر: سرویس Hamgit (محصول همروش) هم مخازن رو میزبانی میکنه و هم Runner برای پایپلاینها میده.
* جلسات آنلاین: جایگزین Google Meet، از Jitsi استفاده کردیم (هم توی بازارچه همروش هست، هم میتونید روی سرور خودتون بالا بیارید).
* چت سازمانی: ما خودمون Mattermost رو روی سرور شخصی بالا آوردیم که عالیه. اگر دنبال سرویس آمادهاید، Rocket.Chat در بازارچه ابری همروش موجوده.
🔗 یک گزینه کمکی دیگر:
سرویس چابکان هم Mirrorهای خوبی ارائه میده که داشتن لینککش به عنوان پلن B ضرری نداره:
🔗 https://iran.chabokan.net/#services
💡 هدفم از این پست فقط انتقال تجربه و کمک به کامیونیتی بود. امیدوارم به کارتون بیاد. هر جا سوالی بود یا کمکی از دستم برمیومد، حتماً بگید.
🎺 برای یادگیری بیشتر و دریافت مطالب مفید در زمینه .NET و برنامهنویسی، به کانال ما بپیوندید!
📚💻 @dotnetcode🖥 👨💻
#DevOps #DotNet #Network #Programming #Intranet #ExperienceSharing #SoftwareEngineering
توی این چند وقت که دسترسیها محدود شد و اینترنت به حالت داخلی (Intranet) رفت، ما هم مثل خیلی از تیمهای دیگه با چالشهای جدی روبرو شدیم. اما به جای متوقف شدن، سعی کردیم با ابزارهای جایگزین و تغییر استراتژی، جریان کار رو حفظ کنیم.
خواستم تجربیات واقعی و سولوشنهایی که تو این مدت پیادهسازی کردیم رو باهاتون به اشتراک بذارم تا شاید گرهای از کار شما هم باز کنه:
1️⃣ عبور از تحریم و محدودیت پکیجها (Frontend & Backend)
برای پروژههایی مثل Next.js که وابستگی زیادی به پکیجها دارن، اولین حرکت ما استفاده از Mirror Serverهای داخلی بود.
🔹 پیشنهاد: سرویس Runflare تقریباً اکثر ابزارها رو Mirror کرده، سرورهاش داخلیه و سرعتش عالیه.
🔗 https://runflare.com/mirrors/
🔥 خبر ویژه: همون روز اول با تیم فنی رانفلر صحبت کردم و دمشون گرم، خیلی سریع درخواست رو پیگیری کردن و Nuget رو هم به لیست سرویسهاشون اضافه کردن. الان دیگه داتنتیها هم میتونن راحت پکیجها رو دریافت کنن.
2️⃣ مدیریت داکر ایمیجها (Docker Images)
برای پول (Pull) کردن ایمیجها، پلتفرم docker.ir گزینه کارراهاندازی هست.
⚠️ نکته حیاتی برای داتنتیها:
از اونجایی که ایمیجهای داتنت روی Docker Hub نیستن و روی رجیستری مایکروسافت (MCR) قرار دارن، حتماً ایمیجهای SDK و ASP Core رو:
۱. یا روی سیستم لوکال داشته باشید.
۲. یا (روش اصولیتر) روی رجیستری داخلی خودتون Push کنید تا در صورت قطعی، بیلدها فیل نشن.
3️⃣ خداحافظی با وابستگی به کش لوکال (The Nexus Solution)
اوایل کار متکی به کشِ لوکال سیستمها (فولدر .nuget) بودیم، اما این روش ریسک بالایی داشت.
✅ راهکار پایدار: ما Nexus رو بالا آوردیم. با این کار تمام پکیجهای فرانت و بکاند یکبار در نکسوس کش میشن و اگه اینترنت کلاً قطع بشه، تیم فنی بدون هیچ توقفی به کارش ادامه میده.
4️⃣ ابزارهای مدیریت سورس، CI/CD و ارتباطات
برای اینکه تیم ریموت و پایپلاینها از کار نیفتن، از سرویسهای داخلی و Self-Hosted استفاده کردیم:
* گیت و رانر: سرویس Hamgit (محصول همروش) هم مخازن رو میزبانی میکنه و هم Runner برای پایپلاینها میده.
* جلسات آنلاین: جایگزین Google Meet، از Jitsi استفاده کردیم (هم توی بازارچه همروش هست، هم میتونید روی سرور خودتون بالا بیارید).
* چت سازمانی: ما خودمون Mattermost رو روی سرور شخصی بالا آوردیم که عالیه. اگر دنبال سرویس آمادهاید، Rocket.Chat در بازارچه ابری همروش موجوده.
🔗 یک گزینه کمکی دیگر:
سرویس چابکان هم Mirrorهای خوبی ارائه میده که داشتن لینککش به عنوان پلن B ضرری نداره:
🔗 https://iran.chabokan.net/#services
💡 هدفم از این پست فقط انتقال تجربه و کمک به کامیونیتی بود. امیدوارم به کارتون بیاد. هر جا سوالی بود یا کمکی از دستم برمیومد، حتماً بگید.
📚💻 @dotnetcode
#DevOps #DotNet #Network #Programming #Intranet #ExperienceSharing #SoftwareEngineering
Please open Telegram to view this post
VIEW IN TELEGRAM
رانفلر | سکوی ابری - سرویس ابری - هاست ابری
Runflare Mirror - رانفلر | سکوی ابری - سرویس ابری - هاست ابری
Runflare Mirror در رانفلر برخی از مخزن ها و کتابخانه های مورد نیاز برنامه نویسان را به صورت mirror آماده ساخته ایم تا مشکل اختلال های اینترنت و محدودیت های زیر ساخت کشور در ارتباط با اینترنت بین الملل برای کاربران ما برطرف شود. از این لحظه شما می توانید با…
❤9👍4👏4
🚨 تغییر مهم در MassTransit: لایسنس تجاری از نسخه ۹.۰.۰
اگر در پروژههای داتنتی از کتابخانه MassTransit استفاده میکنید، مراقب آپدیتهای جدید باشید. از نسخه 9.0.0 به بعد، این کتابخانه مدل لایسنس خود را به Commercial تغییر داده است.
خلاصه وضعیت جدید:
🔹 نسخههای ۸ و قدیمیتر: همچنان رایگان و Open Source (Apache 2.0) باقی میمانند.
🔹 نسخه ۹ و بالاتر: برای شرکتهایی با درآمد بالای ۱ میلیون دلار در سال پولی است.
🔹 استارتاپها و توسعهدهندگان مستقل: اگر درآمد سالانه زیر ۱ میلیون دلار باشد، همچنان میتوانید با تخفیف ۱۰۰ درصدی (رایگان) استفاده کنید.
---
🛠 راهکار فنی: جلوگیری از آپدیت خودکار به نسخه پولی
برای اینکه ابزارهایی مثل NuGet یا Dependabot به صورت خودکار پروژه شما را به نسخه ۹ (پولی) ارتقا ندهند، باید ورژن را در فایل
چرا این کار مهم است؟
* نوشتن
* اما
اگر پروژهی بزرگی دارید که فعلاً بودجه خرید لایسنس ندارد، حتماً این تغییر را در پکیجهای خود اعمال کنید.
🎺 برای یادگیری بیشتر و دریافت مطالب مفید در زمینه .NET و برنامهنویسی، به کانال ما بپیوندید!
📚💻 @dotnetcode🖥 👨💻
#DotNet #MassTransit #CSharp #Programming_Tips #Microservices
اگر در پروژههای داتنتی از کتابخانه MassTransit استفاده میکنید، مراقب آپدیتهای جدید باشید. از نسخه 9.0.0 به بعد، این کتابخانه مدل لایسنس خود را به Commercial تغییر داده است.
خلاصه وضعیت جدید:
🔹 نسخههای ۸ و قدیمیتر: همچنان رایگان و Open Source (Apache 2.0) باقی میمانند.
🔹 نسخه ۹ و بالاتر: برای شرکتهایی با درآمد بالای ۱ میلیون دلار در سال پولی است.
🔹 استارتاپها و توسعهدهندگان مستقل: اگر درآمد سالانه زیر ۱ میلیون دلار باشد، همچنان میتوانید با تخفیف ۱۰۰ درصدی (رایگان) استفاده کنید.
---
🛠 راهکار فنی: جلوگیری از آپدیت خودکار به نسخه پولی
برای اینکه ابزارهایی مثل NuGet یا Dependabot به صورت خودکار پروژه شما را به نسخه ۹ (پولی) ارتقا ندهند، باید ورژن را در فایل
.csproj قفل کنید. استفاده از براکت `[]` به معنای اجبار روی یک نسخه دقیق است:<PackageReference Include="MassTransit" Version="[8.5.7]" />
چرا این کار مهم است؟
* نوشتن
Version="8.5.7" به NuGet اجازه میدهد نسخههای بالاتر (مثل 9.0.1) را هم نصب کند.* اما
Version="[8.5.7]" یعنی فقط و فقط همین نسخه نصب شود و جلوی ارتقای ناخواسته به نسخه پولی را میگیرد.اگر پروژهی بزرگی دارید که فعلاً بودجه خرید لایسنس ندارد، حتماً این تغییر را در پکیجهای خود اعمال کنید.
📚💻 @dotnetcode
#DotNet #MassTransit #CSharp #Programming_Tips #Microservices
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4👏3👍2🔥1
🔥 نکته حیاتی در Hangfire: جنگ با ساعت و تایمزونها! ⏰🌍
اگر تا حالا براتون پیش اومده که جابی رو برای ساعت ۸ صبح تنظیم کردید ولی ساعت ۱۱:۳۰ اجرا شده، این پست برای شماست!
⚠️ ماجرا چیه؟
هنگفایر (Hangfire) به صورت پیشفرض (Default) همه جابهای تکرارشونده (Recurring Jobs) رو بر مبنای ساعت UTC اجرا میکنه. یعنی اگر تنظیمات تایمزون رو بهش ندید، باید اختلاف ساعت ایران با گرینویچ رو دستی حساب کنید که اصلا جالب نیست.
حالا اگر بخوایم بگیم "به وقت ایران اجرا شو"، با یه چالش جدید روبرو میشیم:
🔸 ویندوز میگه: "Iran Standard Time"
🔸 لینوکس/داکر میگه: "Asia/Tehran"
اگر این تفاوت هندل نشه، روی سرور لینوکسی یا کانتینر داکر به خطای TimeZoneNotFoundException میخورید! 🤯
✅ راه حل نهایی (Cross-Platform):
با این تیکه کد، هم مشکل UTC رو حل کنید و هم کدی بنویسید که روی ویندوز، لینوکس و مک بدون تغییر کار کنه:
💡 با این روش، دیگه نگران جلو/عقب کشیدن ساعتها یا تفاوت محیط لوکال و سرور نباشید.
🔗 بحث مرتبط در کامیونیتی هنگفایر:
https://discuss.hangfire.io/t/need-local-time-instead-of-utc/279/7
🎺 برای یادگیری بیشتر و دریافت مطالب مفید در زمینه .NET و برنامهنویسی، به کانال ما بپیوندید!
📚💻 @dotnetcode🖥
#CSharp #DotNet #Hangfire #Docker #Backend #TimeZone #Tips
اگر تا حالا براتون پیش اومده که جابی رو برای ساعت ۸ صبح تنظیم کردید ولی ساعت ۱۱:۳۰ اجرا شده، این پست برای شماست!
⚠️ ماجرا چیه؟
هنگفایر (Hangfire) به صورت پیشفرض (Default) همه جابهای تکرارشونده (Recurring Jobs) رو بر مبنای ساعت UTC اجرا میکنه. یعنی اگر تنظیمات تایمزون رو بهش ندید، باید اختلاف ساعت ایران با گرینویچ رو دستی حساب کنید که اصلا جالب نیست.
حالا اگر بخوایم بگیم "به وقت ایران اجرا شو"، با یه چالش جدید روبرو میشیم:
🔸 ویندوز میگه: "Iran Standard Time"
🔸 لینوکس/داکر میگه: "Asia/Tehran"
اگر این تفاوت هندل نشه، روی سرور لینوکسی یا کانتینر داکر به خطای TimeZoneNotFoundException میخورید! 🤯
✅ راه حل نهایی (Cross-Platform):
با این تیکه کد، هم مشکل UTC رو حل کنید و هم کدی بنویسید که روی ویندوز، لینوکس و مک بدون تغییر کار کنه:
using System.Runtime.InteropServices;
// 1. تشخیص خودکار شناسه تایمزون بر اساس سیستمعامل
// Windows -> "Iran Standard Time"
// Linux/Docker -> "Asia/Tehran"
var tehranId = RuntimeInformation.IsOSPlatform(OSPlatform.Windows)
? "Iran Standard Time"
: "Asia/Tehran";
// 2. تنظیم ساعت به وقت ایران
RecurringJob.AddOrUpdate(
type.FullName,
() => job.ExecuteAsync(),
attribute.CronExpression,
new RecurringJobOptions
{
// خداحافظ UTC، سلام تهران! 👋
TimeZone = TimeZoneInfo.FindSystemTimeZoneById(tehranId)
}
);
💡 با این روش، دیگه نگران جلو/عقب کشیدن ساعتها یا تفاوت محیط لوکال و سرور نباشید.
🔗 بحث مرتبط در کامیونیتی هنگفایر:
https://discuss.hangfire.io/t/need-local-time-instead-of-utc/279/7
📚💻 @dotnetcode
#CSharp #DotNet #Hangfire #Docker #Backend #TimeZone #Tips
Please open Telegram to view this post
VIEW IN TELEGRAM
Hangfire Discussion
Need local time instead of UTC
I need to schedule recurring jobs based on local time, for example 02:00 CET (which is UTC+1 normally and UTC+2 during daylight savings time aka “summer time”). I know this introduces some problems when switching to/from summer to winter time (there is an…
❤12👍7🔥3
گیتهاب (GitHub) در یک حرکت بزرگ برای رقابت با ابزارهایی مثل Cursor، رسماً اعلام کرد که ایجنتهای هوش مصنوعی Claude (از شرکت Anthropic) و Codex را مستقیماً به پلتفرم خود اضافه کرده است.
تا پیش از این، کوپایلت (Copilot) بیشتر متکی به مدلهای GPT بود، اما حالا توسعهدهندگان میتوانند از قدرت مدلهای Claude 3.7 Sonnet و OpenAI Codex به عنوان «ایجنت» استفاده کنند.
این یعنی هوش مصنوعی دیگر فقط "پیشنهاد" نمیدهد، بلکه میتواند:
🔹 فایلها را ویرایش کند
🔹 دستورات ترمینال را اجرا کند
🔹 باگها را به صورت خودکار رفع نماید
این تغییر نشان میدهد که گیتهاب نمیخواهد میدان را به IDEهای مبتنی بر هوش مصنوعی (مثل Cursor یا Windsurf) ببازد و قصد دارد همه چیز را در خانه خود نگه دارد.
https://youtu.be/GuTQDXKwdJQ?si=znwN0dljFmrEF615
#GitHub #AI #Claude #Copilot #Programming #TechNews
#گیت_هاب #هوش_مصنوعی #برنامه_نویسی #تکنولوژی #خبر
📚💻 @dotnetcode
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5👏2❤1🔥1
گیتهاب با معرفی GitHub Copilot SDK، بازی رو کلاً عوض کرد. حالا دیگه کوپایلت فقط یک افزونه تکمیل کد نیست؛ بلکه میتونید مغز متفکر اون رو بردارید و مستقیم توی اپلیکیشنهای خودتون بذارید!
این یعنی چی؟ یعنی شما میتونید ابزارها و Agentهایی بسازید که دقیقاً با نیازهای شما و تیمتون هماهنگ باشن.
چرا این SDK یه انقلابه؟ 👇
✅ هوش مصنوعی اختصاصی: اپلیکیشنهایی بسازید که به دیتای شما (مثل ریپوزیتوریها یا لاگها) دسترسی دارن و بر اساس اونها تصمیم میگیرن.
✅ جریانهای کاری ایجنتیک (Agentic Workflows): امکان ساخت ایجنتهایی که میتونن چندین مرحله رو طی کنن، ابزارهای مختلف رو صدا بزنن (Tool Calling) و کار رو تموم کنن.
✅ یک مثال واقعی: توی دمو، اپلیکیشنی به اسم "Flight School" ساخته شده که پروفایل گیتهاب شما رو تحلیل میکنه و دقیقاً بر اساس مهارتها و پروژههاتون، بهتون تمرین کدنویسی میده و حتی جوابهاتون رو صحیح میکنه!
✅ فراتر از چت: دیگه فقط با متن سر و کار ندارید؛ میتونید با دسکتاپ تعامل کنید، فایل بسازید یا کارهای پیچیده رو خودکار انجام بدید.
همین الان ویدیو رو ببین و اولین ایده ساخت ایجنتت رو استارت بزن! 👨💻👩💻
https://youtu.be/ct_Ymw9RexM?si=SQgan8rBElWHns-g
#GitHubCopilot #AI #DevTools #Programming #ArtificialIntelligence
📚💻 @dotnetcode
Please open Telegram to view this post
VIEW IN TELEGRAM
YouTube
GitHub Copilot SDK demo: Creating "Flight School"
Chris Reddington demonstrates "Flight School," a custom Next.js application built to personalize his learning journey using the GitHub Copilot SDK. See how he leverages agentic workflows to generate daily coding challenges based on his GitHub profile, evaluate…
❤8🔥3👍1👏1
وقتی صحبت از پرفورمنس در PostgreSQL میشه، خیلیها سریع میرن سراغ ایندکسگذاری. اما گاهی مشکل ایندکس نیست؛ مشکل اینه که داری یه محاسبات سنگین رو بارها و بارها تکرار میکنی!
اینجاست که Materialized View (MatView) وارد بازی میشه. برخلاف View معمولی که فقط یه "پنجره" به دیتاست، MatView نتیجه رو واقعاً روی دیسک ذخیره (Cache) میکنه.
اما سوال اصلی اینه: کی باید ازش استفاده کنیم و کی فرار کنیم؟
* داشبوردهای مدیریتی: مدیرها معمولاً آمار لحظهای نمیخوان؛ آمار ۵ دقیقه پیش هم راضیشون میکنه.
* کوئریهای تحلیلی سنگین: وقتی چند تا Join و Aggregation وحشتناک داری که هر بار اجراش چند ثانیه طول میکشه.
* آرشیو دیتا: وقتی دیتای قدیمی تغییر نمیکنه و فقط برای گزارشگیری لازمش داری.
* دیتای ۱۰۰٪ ریلتایم: اگه کاربر باید تغییر رو در میلیثانیه ببینه، MatView گزینه غلطیه (چون تا Refresh نشه، دیتا قدیمیه).
* نرخ تغییرات بالا: اگه دیتای اصلی مدام در حال آپدیته، هزینه Refresh کردن MatView ممکنه بیشتر از سودش بشه.
موقع آپدیت کردن ویو، دیتابیس ممکنه قفل بشه! برای اینکه سرویس نخوابه، حتماً از دستور زیر استفاده کن تا همزمان با خوندن، بتونی آپدیتش کنی:
REFRESH MATERIALIZED VIEW CONCURRENTLY
👇 همین الان چک کن:
یه نگاه به لیست Slow Queryهای پروژهت بنداز. اگه کوئری تکراری و سنگین داری، شاید وقتشه "متریالایزش" کنی!
#PostgreSQL #Database #Performance #Backend #SQL
📚💻 @dotnetcode
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4👍1🔥1👏1
تصور کن مغز متفکر دیتابیست (Parser) رو بدی دست هوش مصنوعی و خروجی بگیری که از نسخه اصلی هم سریعتر و بهینهتر باشه. دقیقاً همین اتفاق افتاده!
تیم Multigres با یک حرکت مهندسی جذاب و کمک گرفتن از Claude Code، تونستن پارسر PostgreSQL رو بازنویسی کنن و به نتایج شگفتانگیزی برسن. این فقط یک آپدیت ساده نیست؛ قدرتنمایی ترکیب مهندسی نرمافزار با AI در لایههای عمیق زیرساختیه.
نکات کلیدی این شاهکار فنی:
✅ افزایش سرعت چشمگیر: دستیابی به سرعت ۲.۵ برابری در پردازش کوئریها نسبت به پارسر استاندارد.
✅ مهندسی با طعم AI: استفاده از هوش مصنوعی برای درک و بهینهسازی پیچیدگیهای سطح پایین (Low-level).
✅ کارایی بالاتر: کاهش سربار سیستم و مدیریت بهتر منابع هنگام اجرای کوئریهای سنگین.
این یعنی هوش مصنوعی دیگه فقط برای تولید متن و عکس نیست؛ داره وارد قلب تپنده سیستمها میشه!
https://multigres.com/blog/ai-parser-engineering
#PostgreSQL #Database #AI #TechNews #برنامه_نویسی
📚💻 @dotnetcode
Please open Telegram to view this post
VIEW IN TELEGRAM
Multigres
A 2.5x faster Postgres parser with Claude Code | Blog | Multigres
Same engineer. Same complexity. A year last time, eight weeks this time. This isn't a story about AI writing code. It's a story about the system, expertise, and discipline that made AI actually useful.
❤4👍3
تحولی بزرگ در دنیای سیشارپ: ویژگی هیجانانگیز Union Types در C# 15!
بالاخره یکی از جذابترین، مدرنترین و پردرخواستترین قابلیتهای دنیای برنامهنویسی داره به سیشارپ میآد. در رویداد اخیر مایکروسافت، مدس تورگرسن (Mads Torgersen) و داستین کمپبل (Dustin Campbell) رسماً از ویژگی بینظیر Union Types رونمایی کردند؛ قابلیتی که قرار است حدود ماه نوامبر همراه با C# 15 به طور رسمی منتشر بشه (البته نسخههای پیشنمایش اون همین الان در وبویژوال استودیو و داتنت ۱۰ در دسترسه!).
اما این ویژگی چیه، چطور کار میکنه و چرا باید به عنوان یک داتنت دولوپر براش هیجانزده باشیم؟ بیایید خیلی ساده و تخصصی بررسیش کنیم:
💡 Union Types دقیقاً چیه؟
به زبان ساده، این ویژگی به شما اجازه میده مجموعهای محدود، بسته و مشخص از تایپهای مختلف رو زیر چتر یک نام واحد تعریف کنید. مدس و داستین توی دمو دو تا مثال فوقالعاده زدن که کاربرد واقعی اون رو کاملاً روشن میکنه:
🐾 مثال اول؛ حیوانات خانگی (Pets):
تصور کنید چند کلاس یا رکورد کاملاً مستقل به اسمهای
حالا کامپایلر با قدرت از کد شما محافظت میکنه؛ اگر بخواهید
🌐 مثال دوم؛ ساختار Result برای مدیریت خطا در شبکه:
یکی از کاربردیترین الگوها در فریمورکهای مدرن (مثل Result Pattern)، مدیریت پاسخهای شبکه است. یک متد خروجیاش یا موفقیتآمیز است و داده برمیگرداند (
🛠 زیر پوست کامپایلر چه خبره؟ (استفاده از Struct و کنترل Boxing)
شاید بپرسید تیم توسعه سیشارپ چطور این کار رو بدون افت عملکرد و پرفورمنس انجام داده؟
زیر پوست کامپایلر، برای هر Union Type یک Struct داخلی (Value Type) ساخته میشه. این استراکت شامل یک سیستم نشانهگذاری (Tag) برای تشخیص تایپ فعلی و فضایی بهینهسازیشده برای نگهداری خودِ مقدار هست.
نکته طلایی اینجاست که کامپایلر به طور هوشمندانهای فرآیند Boxing (انتقال از استک به هیپ) رو کنترل و تا حد امکان از اون جلوگیری میکنه. این یعنی مدیریت حافظه فوقالعاده بهینه و بدون راندمان منفی، که در متدهای پر ترافیک و مسیرهای داغ (Hot Paths) بکاند برنامهتون معجزه میکنه!
👩💻 تفاوت بزرگ با تایپاسکریپت چیست؟
اگر فرانتاند کار کرده باشید یا با TypeScript آشنا باشید، قطعاً با Unionها برخورد داشتید؛ اما پیادهسازی سیشارپ یک تفاوت بنیادین دارد:
در تایپاسکریپت: این ویژگی کاملاً ساختاری (Structural) است و در زمان اجرای برنامه (Runtime) کلاً پاک میشه (Type Erasure) و وجود خارجی نداره.
در سیشارپ: این ویژگی اسمی (Nominal) است؛ یعنی تایپها کاملاً در محیط رانتایم زنده و معتبر هستن. به خاطر ساختار اکوسیستم .NET، شما میتونید در زمان اجرا هم دربارهی این تایپها پرسوجو کنید و مستقیماً روشون پترن مچینگ بزنید، بدون اینکه هویت تایپها از بین بره.
🔗 لینک ویدیو :
https://youtu.be/7qW92AwlrjM?is=2QRght0DTz11t5_P
#csharp #dotnet #programming #csharp15 #backend #union_types #developer #architecture #microservices
🎺 برای یادگیری بیشتر و دریافت مطالب مفید در زمینه .NET و برنامهنویسی، به کانال ما بپیوندید!
📚💻 @dotnetcode🖥
بالاخره یکی از جذابترین، مدرنترین و پردرخواستترین قابلیتهای دنیای برنامهنویسی داره به سیشارپ میآد. در رویداد اخیر مایکروسافت، مدس تورگرسن (Mads Torgersen) و داستین کمپبل (Dustin Campbell) رسماً از ویژگی بینظیر Union Types رونمایی کردند؛ قابلیتی که قرار است حدود ماه نوامبر همراه با C# 15 به طور رسمی منتشر بشه (البته نسخههای پیشنمایش اون همین الان در وبویژوال استودیو و داتنت ۱۰ در دسترسه!).
اما این ویژگی چیه، چطور کار میکنه و چرا باید به عنوان یک داتنت دولوپر براش هیجانزده باشیم؟ بیایید خیلی ساده و تخصصی بررسیش کنیم:
به زبان ساده، این ویژگی به شما اجازه میده مجموعهای محدود، بسته و مشخص از تایپهای مختلف رو زیر چتر یک نام واحد تعریف کنید. مدس و داستین توی دمو دو تا مثال فوقالعاده زدن که کاربرد واقعی اون رو کاملاً روشن میکنه:
تصور کنید چند کلاس یا رکورد کاملاً مستقل به اسمهای
Dog، Cat و Bird دارید که از پکیجها یا کتابخانههای مختلف میآیند و هیچ ارثبری مشترکی ندارند. تا قبل از این، برای داشتن لیستی از آنها مجبور بودید از یک لیست از جنس object استفاده کنید که اصلاً ایمن نبود و ممکن بود ناخواسته یک Shark (کوسه!) هم وارد لیست بشه. اما با قابلیت جدید مینویسید:union Pet { Dog, Cat, Bird }حالا کامپایلر با قدرت از کد شما محافظت میکنه؛ اگر بخواهید
Shark رو به این لیست پاس بدید، خطای کامپایل میگیرید. علاوه بر این، موقع نوشتن عبارت switch برای پردازش آنها، کامپایلر بررسی میکنه که حتماً تمام حالتها (سگ، گربه، پرنده) رو پوشش داده باشید (Exhaustive Pattern Matching) و اگر موردی جا بمونه بهتون وارنینگ میده.یکی از کاربردیترین الگوها در فریمورکهای مدرن (مثل Result Pattern)، مدیریت پاسخهای شبکه است. یک متد خروجیاش یا موفقیتآمیز است و داده برمیگرداند (
Success<T>) یا با خطا مواجه میشود (Error). با تعریف یک Union ساده مثل union Result<T> { Success<T>, Error } بدون نیاز به چک کردن مقادیر Null یا ساختارهای پیچیده جنریک، خروجیها رو با بالاترین امنیتِ تایپ (Type Safety) مدیریت میکنید.🛠 زیر پوست کامپایلر چه خبره؟ (استفاده از Struct و کنترل Boxing)
شاید بپرسید تیم توسعه سیشارپ چطور این کار رو بدون افت عملکرد و پرفورمنس انجام داده؟
زیر پوست کامپایلر، برای هر Union Type یک Struct داخلی (Value Type) ساخته میشه. این استراکت شامل یک سیستم نشانهگذاری (Tag) برای تشخیص تایپ فعلی و فضایی بهینهسازیشده برای نگهداری خودِ مقدار هست.
نکته طلایی اینجاست که کامپایلر به طور هوشمندانهای فرآیند Boxing (انتقال از استک به هیپ) رو کنترل و تا حد امکان از اون جلوگیری میکنه. این یعنی مدیریت حافظه فوقالعاده بهینه و بدون راندمان منفی، که در متدهای پر ترافیک و مسیرهای داغ (Hot Paths) بکاند برنامهتون معجزه میکنه!
اگر فرانتاند کار کرده باشید یا با TypeScript آشنا باشید، قطعاً با Unionها برخورد داشتید؛ اما پیادهسازی سیشارپ یک تفاوت بنیادین دارد:
در تایپاسکریپت: این ویژگی کاملاً ساختاری (Structural) است و در زمان اجرای برنامه (Runtime) کلاً پاک میشه (Type Erasure) و وجود خارجی نداره.
در سیشارپ: این ویژگی اسمی (Nominal) است؛ یعنی تایپها کاملاً در محیط رانتایم زنده و معتبر هستن. به خاطر ساختار اکوسیستم .NET، شما میتونید در زمان اجرا هم دربارهی این تایپها پرسوجو کنید و مستقیماً روشون پترن مچینگ بزنید، بدون اینکه هویت تایپها از بین بره.
https://youtu.be/7qW92AwlrjM?is=2QRght0DTz11t5_P
#csharp #dotnet #programming #csharp15 #backend #union_types #developer #architecture #microservices
📚💻 @dotnetcode
Please open Telegram to view this post
VIEW IN TELEGRAM
YouTube
Union types in C# | DEM304
Union types are coming to C#! Unions model closed sets of data shapes, as commonly seen in e.g. wire protocols. Mads and Dustin explore the clean expression of intent and the confidence and elegance that unions lend to consuming code.
Seating for this session…
Seating for this session…
❤12👍4🔥2👏1
Forwarded from Software Philosophy
آینده هوش مصنوعی و مهندسی کامپیوتر
هوش مصنوعی مهندسی را نابود نمیکند، اما در سکوت در حال از بین بردن چیزی بسیار مهمتر است: مسیر رشد نیروهای جونیور!
اخیرا که ویدئوی کنفرانس BUILD و صحبتهای اسکات هنسلمن و مارک روسینوویچ را دیدم یکی از مهمترین واقعیتها دربارهی هوش مصنوعی در مهندسی را مطرح کردند؛ حقیقتی که باید بلندتر گفته شود، واقعیتی که بیشتر شرکتها الان دیگر فهمیدهاند:
هوش مصنوعی بهترین نتایجش را زمانی ارائه میدهد که مهندسان ارشد با آن کار میکنند.
اما در عین حال، هوش مصنوعی تقریبا تمام وظایف سطح جونیور را جایگزین کرده است: ایجاد ساختار اولیه، دیباگ، نوشتن کدهای تکراری (boilerplate)، تست کردن و غیره.
در نتیجه امروز بسیاری از تیمها عملاً استخدام جونیورها را متوقف کردهاند. و این همان خطر واقعی است.
🔥 اگر امروز جونیورها حذف شوند، فردا سنیوری وجود نخواهد داشت.
بدون جونیور ⬅️ بدون نیروهای میانی ⬅️ بدون سنیور ⬅️ بدون آرشیتکت ⬅️ و در نهایت کسی نمیماند که بتواند هوش مصنوعی را به درستی هدایت کند.
ما هم این موضوع را از نزدیک دیدهایم. به همین دلیل در CrystaCode بهطور جدی روز برنامهی #cs_internship سرمایهگذاری میکنیم تا جریان پایداری از استعدادهای جونیور حفظ شود و مسیر واقعی رشد آنها به نسل بعدی مهندسان ارشد فراهم گردد.
چون آیندهی مهندسی به کسانی بستگی دارد که هنوز سنیور نشدهاند.
🔗 صحبتهای اسکات هنسلمن و مارک روسینوویچ را در یوتیوب ببینید.
#مهران_داودی (لینکدین - بلاگ)
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
کانال تلگرام:
@SoftwarePhilosophy
______
هوش مصنوعی مهندسی را نابود نمیکند، اما در سکوت در حال از بین بردن چیزی بسیار مهمتر است: مسیر رشد نیروهای جونیور!
اخیرا که ویدئوی کنفرانس BUILD و صحبتهای اسکات هنسلمن و مارک روسینوویچ را دیدم یکی از مهمترین واقعیتها دربارهی هوش مصنوعی در مهندسی را مطرح کردند؛ حقیقتی که باید بلندتر گفته شود، واقعیتی که بیشتر شرکتها الان دیگر فهمیدهاند:
هوش مصنوعی بهترین نتایجش را زمانی ارائه میدهد که مهندسان ارشد با آن کار میکنند.
اما در عین حال، هوش مصنوعی تقریبا تمام وظایف سطح جونیور را جایگزین کرده است: ایجاد ساختار اولیه، دیباگ، نوشتن کدهای تکراری (boilerplate)، تست کردن و غیره.
در نتیجه امروز بسیاری از تیمها عملاً استخدام جونیورها را متوقف کردهاند. و این همان خطر واقعی است.
بدون جونیور ⬅️ بدون نیروهای میانی ⬅️ بدون سنیور ⬅️ بدون آرشیتکت ⬅️ و در نهایت کسی نمیماند که بتواند هوش مصنوعی را به درستی هدایت کند.
ما هم این موضوع را از نزدیک دیدهایم. به همین دلیل در CrystaCode بهطور جدی روز برنامهی #cs_internship سرمایهگذاری میکنیم تا جریان پایداری از استعدادهای جونیور حفظ شود و مسیر واقعی رشد آنها به نسل بعدی مهندسان ارشد فراهم گردد.
چون آیندهی مهندسی به کسانی بستگی دارد که هنوز سنیور نشدهاند.
🔗 صحبتهای اسکات هنسلمن و مارک روسینوویچ را در یوتیوب ببینید.
#مهران_داودی (لینکدین - بلاگ)
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
کانال تلگرام:
@SoftwarePhilosophy
______
Please open Telegram to view this post
VIEW IN TELEGRAM
YouTube
Scott and Mark learn...how agents reshape software engineering | BRK247
AI is changing how software is created—and what it means to be a software engineer. We’ll explore how AI agents are reshaping development: where they accelerate progress, where they fall short, and what’s changing for the profession. Along the way, we’ll…
❤1👍1
Forwarded from thisisnabi.dev [Farsi]
1. Indexes
منابع پیشنهادی این چالش که برای من اینها جذاب بوده و هست.
A. Designing Data-Intensive Applications 2nd Edition [book]
- Chapter 4 - required
B. Database Internals [book]
- Chapters 1, 2 - required
- Chapter 3, 4 - optional
C. Pro SQL Server Internals [book]
- Chapters 1, 2, 4, 6 - required
- Chapters 3, 5 - optionals
قرار نیست زردآلو بیاد تو گلو باشه
رشد همیشه با کمی سختی، فشار و کش اومدن همراهه. هر وقت دیدی همهچی زیادی راحته، احتمالاً داری همون چیزهایی رو تکرار میکنی که بلدی.
گرم دم اونایی که با ما بودن و ادامه میدن ❤️
Update 1 :
من امروز که می خواستم کتاب اولی رو مجددا بخونم فهمیدم که ادیشن 2 هم اومده و این عنوان توی فصل چهارم هست برای همین آپدیت کردم تکست رو، در جریان باشید.
Update 2:
یکی از گلوگاه های بیزینس هایی مثل ما که همیشه انگار توی بلک فرایدی هستیم دیتابیس و محدودیت هاشه، برای همین خواستم با بزرگوار شروع کنید، پس اگر وقت داشتین حتما ۲ تا منبع اول رو بخونید :)
@thisisnabi_dev
منابع پیشنهادی این چالش که برای من اینها جذاب بوده و هست.
A. Designing Data-Intensive Applications 2nd Edition [book]
- Chapter 4 - required
B. Database Internals [book]
- Chapters 1, 2 - required
- Chapter 3, 4 - optional
C. Pro SQL Server Internals [book]
- Chapters 1, 2, 4, 6 - required
- Chapters 3, 5 - optionals
قرار نیست زردآلو بیاد تو گلو باشه
رشد همیشه با کمی سختی، فشار و کش اومدن همراهه. هر وقت دیدی همهچی زیادی راحته، احتمالاً داری همون چیزهایی رو تکرار میکنی که بلدی.
گرم دم اونایی که با ما بودن و ادامه میدن ❤️
Update 1 :
من امروز که می خواستم کتاب اولی رو مجددا بخونم فهمیدم که ادیشن 2 هم اومده و این عنوان توی فصل چهارم هست برای همین آپدیت کردم تکست رو، در جریان باشید.
Update 2:
یکی از گلوگاه های بیزینس هایی مثل ما که همیشه انگار توی بلک فرایدی هستیم دیتابیس و محدودیت هاشه، برای همین خواستم با بزرگوار شروع کنید، پس اگر وقت داشتین حتما ۲ تا منبع اول رو بخونید :)
@thisisnabi_dev
❤3
Forwarded from C# Geeks (.NET)
#مهندس_فکر_کن
قسمت:4️⃣
🎯مصاحبهکننده:
ءCache Stampede چیست؟
فرض کن یک کلید در Cache داری:
و TTL آن 5 دقیقه است.
در لحظهای که این کلید منقضی میشود، همزمان 5000 درخواست برای همان محصول میآید.
اتفاقی که میافتد:
همه همزمان Cache Miss میخورند.
سپس همه به Database میروند.
در نتیجه Database Overload، افزایش شدید Latency ،احتمال Down شدن سرویس.
به این حالت Cache Stampede میگویند.
حالا بگو ببینم برای حل این مشکل چه راهکار هایی میدی؟🤔
قسمت:4️⃣
🎯مصاحبهکننده:
ءCache Stampede چیست؟
فرض کن یک کلید در Cache داری:
Product:123
و TTL آن 5 دقیقه است.
در لحظهای که این کلید منقضی میشود، همزمان 5000 درخواست برای همان محصول میآید.
اتفاقی که میافتد:
Client 1 ----\
Client 2 -----\
Client 3 -------> Cache Miss
Client 4 -----/
Client 5 ----/
...
5000 Requests
همه همزمان Cache Miss میخورند.
سپس همه به Database میروند.
5000 Query
↓
Database
در نتیجه Database Overload، افزایش شدید Latency ،احتمال Down شدن سرویس.
به این حالت Cache Stampede میگویند.
حالا بگو ببینم برای حل این مشکل چه راهکار هایی میدی؟🤔
❤6👏3🔥1