امروز داشتم بوکمارکتکونی میکردم، یهو پست وبلاگ Julio Merino که ماهها پیش ذخیره کرده بودم تا در موردش بنویسم و فراموش کرده بودم رو دیدم.
آقای Julio Merino پیشتر در گوگل و مایکروسافت و الان هم در snowflake مشغول به کاره و روی سیستمهای یونیکسبیس خیلی مسلطه (معماری و لایههای پایینتر سیستم عامل) و جز دولوپرهای FreeBSD و NetBSD بوده. توی این پست توضیح میده که آیا تعریف و تمجیدهایی که از پیشرفته بودن سیستمعامل Windows NT در سال ۱۹۹۳ میشده در مقابل یونیکسسانان مثل BSD درست بوده یا نه؟!
شاید ما هرگز سیستم عامل توسعه ندیم یا تا لایههای خیلی پایین کرنل عمیق نشیم؛ ولی خوبه بدونیم مقایسه صحیح دو تا سیستم ولو اینکه به ۳۰ سال پیش برگردن، آداب و روشی داره که توی این مقاله به خوبی یاد میده...
مقاله مفصلیه، و از حوصله پست تلگرامی خارج. ولی مثلا از hybrid microkernel یا Async I/O میگه که NT جلوتر از زمان خودش و پیشرفته از Unix بوده و بعد نظرش رو توضیح میده که چطور linux و یونیکسسانان این سالها گپها رو پر کردن و چالشهای اصلی توسعه ویندوز چیاست از نظرش.
هدفم از اشتراک این مطلب اینه چقدر در بین مقایسههایی که در مورد زبانها، تکنولوژیها، معماریها و... میبینیم، روش و معیارهای فنی میبینیم، و چقدر بر اساس رسانه و هیجان و تصورات ذهنیمون قضاوت میکنیم...
Please open Telegram to view this post
VIEW IN TELEGRAM
Substack
Windows NT vs. Unix: A design comparison
NT is often touted as a "very advanced" operating system. Why is that? What made NT better than Unix, if anything? And is that still the case?
This media is not supported in your browser
VIEW IN TELEGRAM
🎞 فیلم مستند پایتون!
شرکت Cult-Repo که کارش روایت داستان محصولات کدباز در مدیوم فیلمه، حالا فیلم جدیدی در راه داره... پایتون!
من فیلمهاشون رو دوست دارم و نوع متفاوتی از یادگیری داره. اگر شما هم به این موضوعات علاقه دارید، دنبالشون کنید
دوستانی که از قدیمیتر هستن توی کانال، اگر یادشون باشه یکی دوبار فیلمهای نرمافزاری برای آخر هفته معرفی کردم که اگر دوست داشتید یه نگاه بندازید.
شرکت Cult-Repo که کارش روایت داستان محصولات کدباز در مدیوم فیلمه، حالا فیلم جدیدی در راه داره... پایتون!
من فیلمهاشون رو دوست دارم و نوع متفاوتی از یادگیری داره. اگر شما هم به این موضوعات علاقه دارید، دنبالشون کنید
دوستانی که از قدیمیتر هستن توی کانال، اگر یادشون باشه یکی دوبار فیلمهای نرمافزاری برای آخر هفته معرفی کردم که اگر دوست داشتید یه نگاه بندازید.
🔥6👀1 1
اگر رئوس مطالب براتون جالب بود، حضورتون باعث خوشحالیه 😊🌱
- ریشهها و نیروهای محرک معماریهای مدرن
- شناسایی مسئله، پیش از انتخاب راه حل
- همگرایی بستر فنی و ساختار سازمانی
- الگوهای تطبیق معماری و سازمان
- تجربههای میدانی
- توصیههای عملی برای فردا صبح
لینک گوگل فرم برای اعلام حضور
لینک افزودن به تقویم گوگل
لینک پیوستن در گوگلمیت
کانال تلگرامی انجمن DDD ایران
@DDD_IRAN
Please open Telegram to view this post
VIEW IN TELEGRAM
Google Docs
وبینار فراتر از کُد: درباره تناسب و سازگاری معماری سیستمها با ساختار سازمانی ۴ خرداد، ۲۵ مِی
وبینار انجمن DDD ایران
❤9👏2
📊 برای ۳ تا ۵ پست بعدی کانال، کدوم موضوع برای شما جذابتره برای دنبال کردن؟
Anonymous Poll
25%
تازههای SQL Server 2025
23%
تازههای PostgreSQL 18
36%
تازههای داتنت ۱۰
4%
مرور و مثال Arazzo Spec
9%
مرور Bring your own cloud (BYOC)
4%
توی کامنت میگم
🤓 مقدمهای بر تازههای «هر چیزی»...
نظرسنجی اخیر کانال شامل ۵ گزینه اصلی بود که هر کدوم حول یک تکنولوژی، ابزار، یا روش جدید بود. فارغ از اینکه برآیند تمایل جمع، به سمت کدوم گزینه بوده؛ خوبه تا یه مرور کنیم ببینیم «چیز جدید» چیه؟ و از چه زوایایی میشه بهش نگاه کرد!
۱: نگاه فردی: مسئله یا کنجکاوی ما چیه؟
نسخه جدید فلان زبون، فریمورک یا دیتابیس یا ... از راه رسید. خب که چی؟ چه دردی از من قراره دوا کنه؟ قراره این نسخه جدید مسئلهای ازم حل کنه؟ قراره فردا توی زمان استراحت باهاش پُز بهروز بودن به همکارهام بدم؟ قراره باهاش ویدیو/اینفوگرافی یا پُست تلگرامی یا توییتری بگذاریم و خودم رو در لبهی تکنولوژیهای نو نشون بدم؟ قراره با به خاطر سپردن چند کلمه، عنوان، یا حتی چند خط کد، حس عذاب وجدان کمدانشی و کمتلاشیام رو تسکین بدم؟ قراره یه جوری توی فضای مجازی یا بین دوستان صحبت کنم که خشم و حس ناکافی بودنی که از شرکت و محصولی که روش کار میکنم و با ابزارهای قدیمی و کیفیت پایین عرضه میشن رو پنهان کنم یا جلو بقیه کم نیارم؟؟
دهها دست از این سوالات وجود داره که هر کدومشون طیفی از ما رو پوشش میده. اتفاقا شاید در نگاه اول از قرارگیری ذیل خیلی از این سوالات ناخشنود بشیم یا از پذیرشش فراری باشیم، ولی فارغ از احساس بیرونی، برخی با خیلی از این موارد خوشحالن! اتفاقا از اینکه توی لینکدین یا توییتر یه جوری بنویسن که مخاطب فکر کنه این بابا تمام عمرش منتظر اومدن فلان قابلیت جدید در فلان زبون یا بهمان دیتابیس بوده!! و از لایکها و کامنتها حس رضایت فردی میگیره، دوپامین دریافت میکنه... و البته امان از روزی که یه سوتی کوچیک باعث قطع جریان این دوپامین بشه، سوال و لایک و بازنشرها کم بشن و معضلات بعدی...
پس بیایم فکر کنیم و مهمتر اینکه، حداقل با خودمون صادق باشیم، که برای چی دنبال دونستن چیزهای جدیدیم...
۲: اگر مسئلهای باید حل شه، آیا پاسخش اینه؟
نسخه جدید فلان دیتابیس، بهمان درصد سریعتره، ولی آیا کندیای که ما باهاش درگیریم، دلیلش نداشتن این نسخه جدید و راهحلش استفاده از این نسخه جدیده؟ یا جایی توی طراحی و توسعه و زیرساختمون مشکل داریم؟ هیجان چیزهای جدید زیاده! سر و صداش هم زیاده! ولی عمرش کوتاه! «زمان حل مسئله» رو صرف پرداختن به هیجانات نکنیم...
فلان نسخه از دیتابیس بهمان، AI رو به نیکویی! پیاده کرده، ولی آیا محصول ما در کوتاه یا میانمدت ازش استفاده میکنه؟ همونطور که میز و اتاق کار شلوغ باعث عدم تمرکز و حواسپرتی میشه، پرداختن به چیزهایی که نیازمون نیست، مثل قراردادن وسایل بیربط روی میز و دور و برمونه...
۳: عمق واقعی!
بعضی از ما با یه خطکش ۱۰ سانتیمتری میریم وسط اقیانوس، خطکش رو تا ته میکنیم توی آب، و به هیجان فریاد میزنیم: «حاجی عجب عمقی داره، کل خطکشم رو گرفت...»
این مثال خیلی بیربط به عمق یادگیری خیلی از ما از یه نسخه جدید نیست. خیلی از ما فقط نسخه جدید رو نصب میکنیم و به سبک ۱۰ نسخه قبل ازش استفاده میکنیم و از عدد ورژنش کیف میکنیم. یا ته تهش یه شیوه جدید نوشتن متد رو استفاده میکنیم. مثلا چراییِ استفاده از فروشنده دورهگرد به طور asymmetric در JIT داتنت ۱۰ برامون جذابه؟ کمک میکنه درک بهتری از فرایند کامپایل کدمون داشته باشیم؟ در خدمت رشد فردی یا محصولی یا تیمیمون هست؟ یا فقط دلمون خوش خواهد بود که توی سیشارپ ۱۴ میشه
🌱 این پست مفصله، اگر دوست داشتید تا بیشتر با هم بلند بلند فکر کنیم که اطلاع از چیز جدید، چه فرصتها و چه تلههایی داره، چه خطاهای ادراکی میتونه داشته باشه:⚙️
بخشهای بعدی (در صورت تمایل جمع)
۴: تمرین تداوم
۵: آثار مثبت و منفی تیمی/سازمانی
۶: توازن بین پیشرفت ساختار و ابزار
۷: استراتژی پیشنهادی برای مهاجرت/استخدام ابزار جدید در محصول
۸: وزندهی بین توسعه، بهبود، ارتقاء
۹: ارتقاء محصول یا تغییر گزینهها؟
۱۰: روشهای مدلسازی و تصمیم برای تغییر/ارتقاء محصول
۱۱: انترپرایز (technology radar, green book, و...)
💬 نظر؟ تجربه؟ اگر این بحث حدنصاب ادامه رو نیاره، علیالحساب با احترام به آراء داتنت ۱۰ در اولویت مطالب بعدیه 😊
نظرسنجی اخیر کانال شامل ۵ گزینه اصلی بود که هر کدوم حول یک تکنولوژی، ابزار، یا روش جدید بود. فارغ از اینکه برآیند تمایل جمع، به سمت کدوم گزینه بوده؛ خوبه تا یه مرور کنیم ببینیم «چیز جدید» چیه؟ و از چه زوایایی میشه بهش نگاه کرد!
۱: نگاه فردی: مسئله یا کنجکاوی ما چیه؟
نسخه جدید فلان زبون، فریمورک یا دیتابیس یا ... از راه رسید. خب که چی؟ چه دردی از من قراره دوا کنه؟ قراره این نسخه جدید مسئلهای ازم حل کنه؟ قراره فردا توی زمان استراحت باهاش پُز بهروز بودن به همکارهام بدم؟ قراره باهاش ویدیو/اینفوگرافی یا پُست تلگرامی یا توییتری بگذاریم و خودم رو در لبهی تکنولوژیهای نو نشون بدم؟ قراره با به خاطر سپردن چند کلمه، عنوان، یا حتی چند خط کد، حس عذاب وجدان کمدانشی و کمتلاشیام رو تسکین بدم؟ قراره یه جوری توی فضای مجازی یا بین دوستان صحبت کنم که خشم و حس ناکافی بودنی که از شرکت و محصولی که روش کار میکنم و با ابزارهای قدیمی و کیفیت پایین عرضه میشن رو پنهان کنم یا جلو بقیه کم نیارم؟؟
دهها دست از این سوالات وجود داره که هر کدومشون طیفی از ما رو پوشش میده. اتفاقا شاید در نگاه اول از قرارگیری ذیل خیلی از این سوالات ناخشنود بشیم یا از پذیرشش فراری باشیم، ولی فارغ از احساس بیرونی، برخی با خیلی از این موارد خوشحالن! اتفاقا از اینکه توی لینکدین یا توییتر یه جوری بنویسن که مخاطب فکر کنه این بابا تمام عمرش منتظر اومدن فلان قابلیت جدید در فلان زبون یا بهمان دیتابیس بوده!! و از لایکها و کامنتها حس رضایت فردی میگیره، دوپامین دریافت میکنه... و البته امان از روزی که یه سوتی کوچیک باعث قطع جریان این دوپامین بشه، سوال و لایک و بازنشرها کم بشن و معضلات بعدی...
پس بیایم فکر کنیم و مهمتر اینکه، حداقل با خودمون صادق باشیم، که برای چی دنبال دونستن چیزهای جدیدیم...
۲: اگر مسئلهای باید حل شه، آیا پاسخش اینه؟
نسخه جدید فلان دیتابیس، بهمان درصد سریعتره، ولی آیا کندیای که ما باهاش درگیریم، دلیلش نداشتن این نسخه جدید و راهحلش استفاده از این نسخه جدیده؟ یا جایی توی طراحی و توسعه و زیرساختمون مشکل داریم؟ هیجان چیزهای جدید زیاده! سر و صداش هم زیاده! ولی عمرش کوتاه! «زمان حل مسئله» رو صرف پرداختن به هیجانات نکنیم...
فلان نسخه از دیتابیس بهمان، AI رو به نیکویی! پیاده کرده، ولی آیا محصول ما در کوتاه یا میانمدت ازش استفاده میکنه؟ همونطور که میز و اتاق کار شلوغ باعث عدم تمرکز و حواسپرتی میشه، پرداختن به چیزهایی که نیازمون نیست، مثل قراردادن وسایل بیربط روی میز و دور و برمونه...
۳: عمق واقعی!
بعضی از ما با یه خطکش ۱۰ سانتیمتری میریم وسط اقیانوس، خطکش رو تا ته میکنیم توی آب، و به هیجان فریاد میزنیم: «حاجی عجب عمقی داره، کل خطکشم رو گرفت...»
این مثال خیلی بیربط به عمق یادگیری خیلی از ما از یه نسخه جدید نیست. خیلی از ما فقط نسخه جدید رو نصب میکنیم و به سبک ۱۰ نسخه قبل ازش استفاده میکنیم و از عدد ورژنش کیف میکنیم. یا ته تهش یه شیوه جدید نوشتن متد رو استفاده میکنیم. مثلا چراییِ استفاده از فروشنده دورهگرد به طور asymmetric در JIT داتنت ۱۰ برامون جذابه؟ کمک میکنه درک بهتری از فرایند کامپایل کدمون داشته باشیم؟ در خدمت رشد فردی یا محصولی یا تیمیمون هست؟ یا فقط دلمون خوش خواهد بود که توی سیشارپ ۱۴ میشه
?. نوشت؟ نمیگم بریم ۴۰۰ صفحه مستندات AVX10.2 رو بخونیم، ولی حداقل در حد ۲ پاراگراف بدونیم که چیه و کجا کاربرد داره...🌱 این پست مفصله، اگر دوست داشتید تا بیشتر با هم بلند بلند فکر کنیم که اطلاع از چیز جدید، چه فرصتها و چه تلههایی داره، چه خطاهای ادراکی میتونه داشته باشه:
بخشهای بعدی (در صورت تمایل جمع)
۴: تمرین تداوم
۵: آثار مثبت و منفی تیمی/سازمانی
۶: توازن بین پیشرفت ساختار و ابزار
۷: استراتژی پیشنهادی برای مهاجرت/استخدام ابزار جدید در محصول
۸: وزندهی بین توسعه، بهبود، ارتقاء
۹: ارتقاء محصول یا تغییر گزینهها؟
۱۰: روشهای مدلسازی و تصمیم برای تغییر/ارتقاء محصول
۱۱: انترپرایز (technology radar, green book, و...)
Please open Telegram to view this post
VIEW IN TELEGRAM
tech-afternoon
Please open Telegram to view this post
VIEW IN TELEGRAM
Google
Real-time meetings by Google. Using your browser, share your video, desktop, and presentations with teammates and customers.
❤6
یکی از بهبودهای داتنت C# 14، رو میشه Extension membersr دونست که فقط محدود به متد نیستند؛ حالا میشه پراپرتی، ایندکسر، و حتی event رو هم بهصورت اکستنشن برای یک کلاس یا اینترفیس اضافه کرد. این قابلیتها یک جهش بزرگ برای توسعهپذیری و Clean Code در نرمافزارهای بزرگ به حساب میاد.
فرض کنین چند تا تیم روی قابلیتهای مختلف پلتفرم کار میکنن. حالا به راحتی میشه Map کردن آبجکت به DTO و اعتبارسنجی و... با کدهای تمیزتر و بهتری پیادهکرد
csharp
public class Order
{
public int Id { get; set; }
public decimal Amount { get; set; }
public string Status { get; set; } = "pending";
public string? Customer { get; set; }
}
public class OrderDto
{
public int Id { get; set; }
public decimal Amount { get; set; }
public string Status { get; set; }
public bool IsPaid { get; set; }
}
و حالا اینجوری با بلاک اکستنشن:
public static class OrderApiExtensions
{
extension(Order order)
{
// متد اکستنشن: تبدیل Domain Model به DTO
public OrderDto ToDto()
=> new OrderDto
{
Id = order.Id,
Amount = order.Amount,
Status = order.Status,
IsPaid = order.IsPaid() // اکستنشن متد دیگه
};
// متد اکستنشن: بررسی پرداختشده بودن سفارش
public bool IsPaid() => order.Status == "paid";
// پراپرتی اکستنشن: نمایش عنوان مشتری
public string? CustomerDisplay =>
string.IsNullOrWhiteSpace(order.Customer) ? "(نامشخص)" : order.Customer;
}
}
و همین تمیزسازی پیادهسازیهای قبلی رو با قابلیت جدید دیگهای که اجازه میده تا instance constructors و events رو هم به صورت partial members تعریف کرد...
Please open Telegram to view this post
VIEW IN TELEGRAM
نسخه پیشنمایش ۴ داتنت ۱۰ امکانی رو فراهم کرده تا بودن فایل پراجکت و سولوشن هم به راحتی بشه کد سیشارپ نوشت. قبلا با استفاده از فایلهای اسکریپت csx. هم میشد این کار رو کرد، ولی امکان جدید، جامعتر و سادهتره.
کابردش: آموزش، اسکریپتهای مورد استفاده برای DevOps و...
ابتدای فایل به ذکر :# و بعدش skd یا package چیزهایی رو که قبلا توی فایل csproj مشخص میکردیم، اینجا میتونیم توی یک فایل قرار بدیم.
مثلا: کد زیر فقط با یه فایل cs کار میکنه و چک میکنه اگر rabbitmq و postgresql اوکی بودن، ورژن نرمافزار رو توی دیتابیس بهروز میکنه و یه وبپیچ هم محیا میکنه برای مشاهده وضعیت.
#! /usr/bin/dotnet run
#:sdk Microsoft.NET.Sdk.Web
#:package markdig@0.41.*
#:package Npgsql@9.0.*
#:package RabbitMQ.Client@7.1.*
using Markdig;
using Npgsql;
using RabbitMQ.Client;
using System.Reflection;
var rabbitMqHost = Environment.GetEnvironmentVariable("RABBITMQ_CONNECTION_STRING")
?? "amqp://guest:guest@localhost:5672/";
var pgConnStr = Environment.GetEnvironmentVariable("POSTGRES_CONNECTION_STRING")
?? "Host=localhost;Username=postgres;Password=yourpassword;Database=yourdb";
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/", async () =>
{
bool rabbitOk = false;
try
{
var factory = new ConnectionFactory() { Uri = new Uri(rabbitMqHost) };
using var connection = factory.CreateConnection();
using var channel = connection.CreateModel();
rabbitOk = connection.IsOpen && channel.IsOpen;
}
catch { rabbitOk = false; }
bool pgOk = false;
string errorMsg = "";
try
{
using var conn = new NpgsqlConnection(pgConnStr);
await conn.OpenAsync();
pgOk = conn.State == System.Data.ConnectionState.Open;
var version = Assembly.GetEntryAssembly()?.GetName().Version?.ToString() ?? "unknown";
var now = DateTime.Now;
using var cmd = new NpgsqlCommand(
"INSERT INTO application (checked_at, version, rabbitmq_ok, postgres_ok) VALUES (@date, @ver, @rmq, @pg)", conn);
cmd.Parameters.AddWithValue("date", now);
cmd.Parameters.AddWithValue("ver", version);
cmd.Parameters.AddWithValue("rmq", rabbitOk);
cmd.Parameters.AddWithValue("pg", pgOk);
await cmd.ExecuteNonQueryAsync();
}
catch (Exception ex)
{
errorMsg = ex.Message;
}
var content = $"""
# System Health Check
- **RabbitMQ:** {(rabbitOk ? "OK" : "FAILED")}
- **PostgreSQL:** {(pgOk ? "OK" : "FAILED")}
{(string.IsNullOrWhiteSpace(errorMsg) ? "" : $"\n- **Error:** {errorMsg}")}
""";
return Results.Content($"""
<html>
<body style="font-family: sans-serif;">
{Markdown.ToHtml(content)}
</body>
</html>
""", "text/html");
});
app.Run();
Please open Telegram to view this post
VIEW IN TELEGRAM
مقدمه: دو مدل اصلی برای مدیریت تراکنشها وجود داره: ACID و BASE. هر کدوم از این مدلها رویکرد متفاوتی نسبت به «تضمین صحت» و «در دسترسپذیری» دادهها دارن و انتخاب مناسب بستگی به نیازهای خاص سیستم داره.
💎 مدل ACID: تضمین صحت و یکپارچگی دادهها
مدل ACID که مخفف چهار ویژگی Atomicity (اتمی بودن)، Consistency (سازگاری)، Isolation (انزوا) و Durability (دوام) است، از بدیهیترین و ابتداییترین مفاهیم RDBMSهاست و توی تقریبا همهشون دیده میشه.
این مدل برای سیستمهایی که به صحت و یکپارچگی دادهها اهمیت میدن، مناسبه.
⚡️ مدل BASE: تمرکزش روی دسترسپذیری و مقیاسپذیریه.
مدل BASE که مخفف Basically Available، Soft state و Eventually consistent است، توی پایگاههای داده NoSQL مثل Cassandra و DynamoDB استفاده میشه.
این مدل برای سیستمهایی که به دسترسپذیری بالا و مقیاسپذیری نیاز دارن، مثل شبکههای اجتماعی مناسبه.
🧠 نتیجهگیری
انتخاب بین ACID و BASE به نیازهای خاص هر سیستم بستگی داره؛ در برخی شرایط، ترکیبی از این دو مدل گزینه مطلوب رو شکل میده، به ویژه توی معماریهای میکروسرویس که نیاز به انعطافپذیری بیشتری وجود داره و نیاز هر سرویس الزاما با بقیه سرویسها یکی نیست. یعنی مثلا شاید شما دیتای master مالی توی مایکروسرویس مالی رو ACID نیاز داشته باشین، ولی بخشی از داده مالی که توی مایکروسرویس دیگهای جهت ریپورتینگ نگهداری میشه رو BASE.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤25👍6
یه نکته مهم توی کنفرانس اخیر بیلد این بود که مایکروسافت اعلام کرد که Blazor رو بهعنوان بستر اصلی و آیندهدار برای توسعه رابط کاربری وب توی داتنت انتخاب کرده. این تصمیم، تاثیر زیادی روی اکوسیستم NET. خواهد داشت و نشوندهندهی تغییراتی توی استراتژیهای توسعهی وب مایکروسافته. چرا تغییر؟ چون React و React Native همهجای مایکروسافت حضور دارن؛ از Teams تا منو استارت ویندوز تا آفیس... کماکان Razor Pages و MVC و... هم توسعه خواهند داشت ولی Blazor فعلا سوگولی است و هم روی پرفرمنسش هم اکوسیستمش داره با تمرکز کار میشه.
وبسرور اصلی و پیشفرض داتنت Kestrel (هم توی ویندوز و هم لینوکس) یکی از مشکلات وبسرورها توی سرویسهای بزرگ رو یعنی مدیریت و بهینهسازی مصرف رم در بازههای زمانی طولانی رو سعی کرده برطرف کنه. تا الان Kestrel امکان مموریتریم نداره؛ یعنی وقتی در طول زمان رم مضرفیاش زیاد میشه، دیگه حافظه آزاد شده رو پس نمیده. اگر حافظهی تخصیصیافته بهموقع آزاد نشه، برنامه دچار "memory bloat" یا حتی OutOfMemory میشه.
حالا Memory Trim چیه؟
نسخههای جدید Kestrel (همزمان با Net 10)، ویژگی جدید Memory Trim رو خواهد داشت که به شکل دورهای (یا هنگام کاهش بار سرور) حافظهی بلااستفادهاش رو به سیستمعامل بگردونه. این باعث بهینگی بیشتر پرفرمنس و کاهش هزینه ابری میشه.
توضیح تکمیلی:
وقتی NET 9. منتشر شد، Nick Chapsas، از Roth که عنوان شغلیش Principal Product Manager, ASP.NET است، درباره Blazor و استفاده داخلی مایکروسافت ازش پرسید. دو دلیل اصلی برای استفاده کم از Blazor در مایکروسافت، به ویژه برای برنامههای عمومی مثل آفیس، ارائه میده که مهمه! یکی از این دلایل تاریخیه، یعنی زمانی که آفیس برای اولین بار React رو پذیرفت، Blazor در دسترس نبود. با این حال، دلیل دیگه روشنتره؛ میگه Blazor برای حل مشکل توسعهدهندههای NET. که به دانش عمیق جاوا اسکریپت نیز نیاز دارن، طراحی شده، که "هزینه و بار ناشی از استفاده از چند تکنولوژی (تایپاسکریپت، ریاکت، داتنت و...) رو کم کنه". پلتفرم NET. برای استفاده روی سرور بهینه شده و Blazor تیمها رو توانمند میکنه تا از همون توی مرورگر استفاده کنن. Blazor ارزش افزوده ایجاد میکنه، "وقتی نیاز داریم بدون یک تیم جداگانه جاوا اسکریپت front-end، کارهای بیشتری انجام بدیم."
نکته مهم اینه که Roth صریح اعتراف میکنه که شرکتهایی به اندازه مایکروسافت، در حال حاضر تیمهای front-end متخصص توی جاوا اسکریپت یا TypeScript دارن که Blazor رو کمتر جذاب میکنه.
پینوشت: بیلد امسال و داتنت ۱۰ روی بهینگیهای minimal API هم زیاد پرداخته شد، که به نظر میاد برای پروژههای بیشتری میتونه جذاب باشه. خصوصا که کامپایل AOT رو پشتیبانی میکنه کنه که توی controller-based ها نداریمش.
Please open Telegram to view this post
VIEW IN TELEGRAM
YouTube
Microsoft Build 2025 | Satya Nadella Opening Keynote
Join the Microsoft Build 2025 opening keynote, streamed live from Seattle. Follow along as Satya Nadella and other top Microsoft leaders explore new opportunities in the age of AI and set the stage for what’s ahead.
Chapters:
0:00 - Keynote opening
2:50…
Chapters:
0:00 - Keynote opening
2:50…
👍15 5
⛳️ نکاتی در مورد تصمیمگیری تکنولوژی
اینکه برای پروژه جدید از چه تکنولوژی استفاده کنیم، یا مثلا فلان ابزار ارزش افزودهای برای تیم، محصول و خودمون بههمراه داره یا نه؛ و سوالهای زیادی از این دست، عموما با دشواری و شک توأم با هم به پاسخ میرسن. برای همین چند روش و نکته رو خوبه تا با هم مرور کنیم. من خیلی خلاصه بهشون اشاره میکنم تا اگر کنجکاوی ایجاد کرد بیشتر در موردشون بخونید یا حتی همینجا مفصلتر صحبت کنیم...
1️⃣ چارچوبهای تصمیمگیری معماری یا Architectural Decision-Making Frameworks
۱-۱ چارچوب ATAM (Architecture Tradeoff Analysis Method)
این چارچوب توسط SEI (Software Engineering Institute) در دانشگاه کارنگی ملون توسعه دادهشده و در مراحل اولیه چرخه حیات توسعه نرمافزار وارد میشه. فازهای مشخص برای تحلیل نیازمندیها، شناسایی گزینهها و مقایسه trade-offها رو بررسی میکنه. و اینکه هر تکنولوژی چطور بر شاخصهای کیفیت سیستمی، مثل پایداری، مقیاسپذیری، امنیت و غیره اثر میگذاره.
مراحل ATAM:
- شناسایی اهداف کسبوکار و نیازمندیهای کیفیتی (Quality Attributes)
- لیستکردن گزینههای تکنولوژیک
- تحلیل سناریوهای کاربردی
- شناسایی trade-offها و ریسکها
- انتخاب گزینهای که بیشترین تطابق را با اهداف و کمترین ریسک را دارد.
توضیح مقدماتی در مورد ATAM
توضیح بیشتر؟ ریاکشن:⚙️
۱-۲ چارچوب ADR (Architecture Decision Records)
یک روش برای مستندسازی تصمیمات تکنولوژیک به شمار میاد و هر تصمیم شامل: زمینه، گزینهها، دلایل انتخاب، تاثیرات مثبت/منفی، و رد گزینههای دیگه رو مینویسم و افراد تیم میخونن یا برای آیندگان به یادگار میگذاریم. به تجربه عرض میکنم که نوشتن دقیق (و نه سَمبَلنویسی، خیلی خیلی به درک و تصمیم بهتر کمک میکنه، به شفاف شدن مسئله و نیاز کمک میکنه. درست برعکس حرف زدن که جمله سوم نرسیده، نکات جمله اول فراموش میشه!) برای تیم کوچک تا خیلی بزرگ میتونه کاربرد داشته باشه. مثالهایی از اسناد ADR
————————-
⚙️ در مورد ۲ و ۳ در صورت استقبال از بخش اول، در پستهای بعدی خواهم نوشت.
2️⃣ مدلهای مقایسهای (Decision Matrix/Weighted Scoring Model)
3️⃣ چارچوبهای شرکتهای بزرگ (مثلاً ThoughtWorks Technology Radar، Gartner Magic Quadrant)
—————————
4️⃣ پرسشهای کلیدی که خوبه پاسخ بدیم و حداکثر تلاشمون رو برای پاسخ دقیق دادن بهشون به کار ببندیم:
🔤 آیا تکنولوژی با نیازمندیهای پروژه و بودجه همخونی داره؟
🔤 آیا لیستی از معیارهای مهم (کارایی، هزینه، امنیت، پشتیبانی، یادگیری، بازار کار) داریم؟
🔤 تیم چقدر تجربه یا علاقه بهش داره؟ (بر اساس معیار استاندارد و نه حس شخصی)
🔤 کامیونیتی و ساپورتش چطور است؟ (کامیونیتی در دسترس و مشابه، از نظر سایز و عمق دانش)
🔤 توسعه، نگهداری و مقیاسپذیری در بلندمدت چطور خواهد بود؟
🔤 امنیت، ریسک vendor lock-in یا پشتیبانی تجاری داره یا نه؟
🔤 در صورت اشتباه، راه بازگشت داریم؟
🔤 چقدر تحت تاثیر trend و هیجان و علاقه شخصی خواهد بود، چقدر تابع بررسی و تحلیل؟
💬 تجربه و روش مورد استفاده شما چیه؟
اینکه برای پروژه جدید از چه تکنولوژی استفاده کنیم، یا مثلا فلان ابزار ارزش افزودهای برای تیم، محصول و خودمون بههمراه داره یا نه؛ و سوالهای زیادی از این دست، عموما با دشواری و شک توأم با هم به پاسخ میرسن. برای همین چند روش و نکته رو خوبه تا با هم مرور کنیم. من خیلی خلاصه بهشون اشاره میکنم تا اگر کنجکاوی ایجاد کرد بیشتر در موردشون بخونید یا حتی همینجا مفصلتر صحبت کنیم...
۱-۱ چارچوب ATAM (Architecture Tradeoff Analysis Method)
این چارچوب توسط SEI (Software Engineering Institute) در دانشگاه کارنگی ملون توسعه دادهشده و در مراحل اولیه چرخه حیات توسعه نرمافزار وارد میشه. فازهای مشخص برای تحلیل نیازمندیها، شناسایی گزینهها و مقایسه trade-offها رو بررسی میکنه. و اینکه هر تکنولوژی چطور بر شاخصهای کیفیت سیستمی، مثل پایداری، مقیاسپذیری، امنیت و غیره اثر میگذاره.
مراحل ATAM:
- شناسایی اهداف کسبوکار و نیازمندیهای کیفیتی (Quality Attributes)
- لیستکردن گزینههای تکنولوژیک
- تحلیل سناریوهای کاربردی
- شناسایی trade-offها و ریسکها
- انتخاب گزینهای که بیشترین تطابق را با اهداف و کمترین ریسک را دارد.
توضیح مقدماتی در مورد ATAM
توضیح بیشتر؟ ریاکشن:
۱-۲ چارچوب ADR (Architecture Decision Records)
یک روش برای مستندسازی تصمیمات تکنولوژیک به شمار میاد و هر تصمیم شامل: زمینه، گزینهها، دلایل انتخاب، تاثیرات مثبت/منفی، و رد گزینههای دیگه رو مینویسم و افراد تیم میخونن یا برای آیندگان به یادگار میگذاریم. به تجربه عرض میکنم که نوشتن دقیق (و نه سَمبَلنویسی، خیلی خیلی به درک و تصمیم بهتر کمک میکنه، به شفاف شدن مسئله و نیاز کمک میکنه. درست برعکس حرف زدن که جمله سوم نرسیده، نکات جمله اول فراموش میشه!) برای تیم کوچک تا خیلی بزرگ میتونه کاربرد داشته باشه. مثالهایی از اسناد ADR
————————-
—————————
Please open Telegram to view this post
VIEW IN TELEGRAM
🔌 توسعه محصول و اهمیت استفاده از Feature Toggle
(یا Feature Flag یا Release Toggle)
تا حالا شده یه امکان جدید توی نرمافزار رو بخواهید فقط برای عده مشخصی از مخاطبین فعال کنید؟ یکی دو تاش رو شاید بشه با if ولو کثیف پیاده کرد، ولی اگر زیاد شد چی؟ اگر خواستید مثلا از یه جا مدیریت کنید که مثلا ۱۰ درصد از کاربرهای خارج از ایران به جای متد الف، از متد ب استفاده کنند. این قابلیت رو که نرمافزارها قابلیتهایی رو توی خودشون دارن که فقط برای برخی افراد یا در صورت تمایل اونها فعال میشه، این روزها خیلی جاها میشه دید، از پلتفرمهای وب، تا سوییچهای گوگل کروم تا تلگرام... (یک نسخه ولی قابلیتها یا رفتارهای متفاوت بسته به شرایط دلخواه ما)
ارائهی تدریجی ویژگیهای جدید (features) یکی از پایههای Continuous Delivery و توسعه چابک محصوله. بهجای انتشار تغییرات بزرگ و پرریسک، تیمها ترجیح میدهن قابلیتهای جدید رو مرحلهبهمرحله منتشر کنن، و یا در محیط واقعی آزمایش کنن، ولی نه برای همه! نهایتا بر اساس بازخورد کاربران بهبود بدن تا آماده عرضه عمومی بشه یا شایدم از چرخه خارج شه. اینجا جاییه که مفهوم Feature Flags یا Feature Toggles وارد میشه.
❓ مفهوم Feature Toggle چیه؟
ما Feature Toggle یا Feature Flag رو مکانیزمی میدونیم که روشن یا خاموش کردن قابلیتهای خاص در نرمافزار، بدون نیاز به انتشار نسخهی جدید رو فراهم میکنه (شبیه سوییچهای گوگل کروم که میشه قابلیتهای آینده رو تست کرد). این یعنی یک قطعه کد در نرمافزار وجود داره ولی فعالسازی یا غیرفعالسازی اون به یک تنظیم یا یه سوییچ ساده بستگی داره.
❓ چرا خوبه که از Feature Toggle استفاده کنیم؟
✅ تحویل تدریجی (Progressive Delivery): امکان rollout تدریجی به درصدی از کاربران.
✅ آزمایش A/B: مقایسهی اثربخشی نسخههای مختلف از یک قابلیت.
✅ رفع سریع خطا: در صورت وجود خطا، میتونیم قابلیت رو بدون rollback نسخه غیرفعال کنیم (حتی از راه دور، یا بدون دخالت).
✅ فعالسازی مبتنی بر کاربر یا نقش: قابلیت خاص فقط برای کاربران خاصی فعال باشه (مثلاً کارمندان، beta testerها یا مشتریان ویژه).
✅ آزمایش در محیط production: بدون درگیر کردن همه کاربرها.
✅ کاربردهای دیگه مثل نسخه Canary یا قیمتگذاری پلکانی محصول و... هم از جمله کاربردهاشه...
✨ پلتفرمهای تخصصی برای مدیریت Feature Toggle
خیلی از سازمانها بهجای نوشتن سیستم داخلی، از ابزارهای آماده استفاده میکنن که قابلیتهای پیشرفته مثل UI مدیریتی، rollout تدریجی، آنالیتیکس، logging و SDKهای آماده ارائه میدهند:
➖ پلتفرم LaunchDarkly: ابزار محبوب تجاری
➖ پلتفرم Unleash: پروژهی متنباز با رابط کاربری قابل قبول.
➖ پلتفرم Flagsmith: پلتفرم متنباز و SaaS.
➖ پلتفرم Microsoft Feature Management: در پلتفرم Azure App Configuration.
➖ پلتفرم Split.io: با قابلیتهای تحلیلی قوی.
برای گو لایبری خیلی خوبی هست و داتنت از نسخه ۹ این امکان رو بهصورت بومی داره که اگر کنجکاو بودید بخونید یا بگید تا بیشتر در موردشون گپ بزنیم.
💬 نظر؟ تجربه؟ سوال؟
(یا Feature Flag یا Release Toggle)
تا حالا شده یه امکان جدید توی نرمافزار رو بخواهید فقط برای عده مشخصی از مخاطبین فعال کنید؟ یکی دو تاش رو شاید بشه با if ولو کثیف پیاده کرد، ولی اگر زیاد شد چی؟ اگر خواستید مثلا از یه جا مدیریت کنید که مثلا ۱۰ درصد از کاربرهای خارج از ایران به جای متد الف، از متد ب استفاده کنند. این قابلیت رو که نرمافزارها قابلیتهایی رو توی خودشون دارن که فقط برای برخی افراد یا در صورت تمایل اونها فعال میشه، این روزها خیلی جاها میشه دید، از پلتفرمهای وب، تا سوییچهای گوگل کروم تا تلگرام... (یک نسخه ولی قابلیتها یا رفتارهای متفاوت بسته به شرایط دلخواه ما)
ارائهی تدریجی ویژگیهای جدید (features) یکی از پایههای Continuous Delivery و توسعه چابک محصوله. بهجای انتشار تغییرات بزرگ و پرریسک، تیمها ترجیح میدهن قابلیتهای جدید رو مرحلهبهمرحله منتشر کنن، و یا در محیط واقعی آزمایش کنن، ولی نه برای همه! نهایتا بر اساس بازخورد کاربران بهبود بدن تا آماده عرضه عمومی بشه یا شایدم از چرخه خارج شه. اینجا جاییه که مفهوم Feature Flags یا Feature Toggles وارد میشه.
ما Feature Toggle یا Feature Flag رو مکانیزمی میدونیم که روشن یا خاموش کردن قابلیتهای خاص در نرمافزار، بدون نیاز به انتشار نسخهی جدید رو فراهم میکنه (شبیه سوییچهای گوگل کروم که میشه قابلیتهای آینده رو تست کرد). این یعنی یک قطعه کد در نرمافزار وجود داره ولی فعالسازی یا غیرفعالسازی اون به یک تنظیم یا یه سوییچ ساده بستگی داره.
✨ پلتفرمهای تخصصی برای مدیریت Feature Toggle
خیلی از سازمانها بهجای نوشتن سیستم داخلی، از ابزارهای آماده استفاده میکنن که قابلیتهای پیشرفته مثل UI مدیریتی، rollout تدریجی، آنالیتیکس، logging و SDKهای آماده ارائه میدهند:
برای گو لایبری خیلی خوبی هست و داتنت از نسخه ۹ این امکان رو بهصورت بومی داره که اگر کنجکاو بودید بخونید یا بگید تا بیشتر در موردشون گپ بزنیم.
پینوشت:
دلیل اینکه برخی پُستها ادامه پیدا نمیکنه، استنباط من بر اساس بازخوردها است (برآیندی از view، کامنت، ریاکشن، اشتراکگذاری). این سادهترین بازخورد از میزان مفید یا مورد کنجکاوی قرار گرفتن مطلب برای مخاطبه. لذا امیدوارم حمل بر کمتوجهی یا فراموشی نشه.
Please open Telegram to view this post
VIEW IN TELEGRAM
LaunchDarkly
LaunchDarkly: Feature Flags, Feature Management, and Experimentation
Maximize the value of every software feature through automation and feature management.
👍23 6🙏1
📌 تفاوت Strong Consistency و Eventual Consistency در یک نگاه
فرض کنین یه سیستم توزیعشده داریم با چندین node در مکانهای مختلف (چیزی که مثلا این روزها با شرایط کمبرقی لازمه). حالا وقتی یه داده تغییر میکنه، سوال اینه: کی و کجا اون تغییر رو ببینیم؟
🧱 Strong Consistency (سازگاری قوی)
هر تغییری که انجام بشه، همه باید فوراً ببینن. یعنی وقتی یه کاربر دادهای رو آپدیت کرد، تمام کاربران دقیقاً همون مقدار جدید رو ببینن — هیچ تأخیری در دیدن دادهی بهروز وجود نداره.
✅ مناسب برای:
- سیستمهای مالی یا رزرو که "دوگانگی" براشون قابل قبول نیست
- تراکنشهای حیاتی مثل خرید سهام، پرداخت آنلاین
مثال ساده:
اگه از ATM پول برداریم، باید فوراً موجودیمون در همه جا بروز بشه. وگرنه ممکنه دوباره از یه دستگاه دیگه پول بکشیم!
🌊 Eventual Consistency (سازگاری نهایی)
داده ممکنه در لحظه همه جا یکی نباشه، ولی در نهایت (مثلاً چند ثانیه بعد) همسان میشه. این مدل performance بالاتری داره و مقیاسپذیرتره.
✅ مناسب برای:
- شبکههای اجتماعی
- سیستمهای کش (Cache)
- فروشگاههای بزرگ آنلاین
- توزیع محتوا (CDN)
مثال ساده:
تو اینستاگرام یه پست رو لایک میکنی، ولی ممکنه چند ثانیه طول بکشه تا تعداد لایک برای بقیه آپدیت بشه — ولی در نهایت همه یه عدد میبینن.
فرض کنین یه سیستم توزیعشده داریم با چندین node در مکانهای مختلف (چیزی که مثلا این روزها با شرایط کمبرقی لازمه). حالا وقتی یه داده تغییر میکنه، سوال اینه: کی و کجا اون تغییر رو ببینیم؟
🧱 Strong Consistency (سازگاری قوی)
هر تغییری که انجام بشه، همه باید فوراً ببینن. یعنی وقتی یه کاربر دادهای رو آپدیت کرد، تمام کاربران دقیقاً همون مقدار جدید رو ببینن — هیچ تأخیری در دیدن دادهی بهروز وجود نداره.
✅ مناسب برای:
- سیستمهای مالی یا رزرو که "دوگانگی" براشون قابل قبول نیست
- تراکنشهای حیاتی مثل خرید سهام، پرداخت آنلاین
مثال ساده:
اگه از ATM پول برداریم، باید فوراً موجودیمون در همه جا بروز بشه. وگرنه ممکنه دوباره از یه دستگاه دیگه پول بکشیم!
🌊 Eventual Consistency (سازگاری نهایی)
داده ممکنه در لحظه همه جا یکی نباشه، ولی در نهایت (مثلاً چند ثانیه بعد) همسان میشه. این مدل performance بالاتری داره و مقیاسپذیرتره.
✅ مناسب برای:
- شبکههای اجتماعی
- سیستمهای کش (Cache)
- فروشگاههای بزرگ آنلاین
- توزیع محتوا (CDN)
مثال ساده:
تو اینستاگرام یه پست رو لایک میکنی، ولی ممکنه چند ثانیه طول بکشه تا تعداد لایک برای بقیه آپدیت بشه — ولی در نهایت همه یه عدد میبینن.
💡 باید واقعبین بود، برخی موارد، تیم فنی این موضوع رو از یه آدم غیر فنی میپرسه که «قربان» دستور میفرمایید کدام گونهی consistency را به خدمت گیریم؟! قربان هم پاسخ میده: ببین مهندس «سامانه» ما خیلی مهمه، قراره میلیانها بلکه میلیاردها کاربر در لحظه داشته باشه. فلذا دادهها باید در همه جا یکسان باشه، بلادرنگ، در لحظه! این میشه که آخرش نه توزیعیافتگی محقق میشه، وقتی هم محقق میشه با کندی و بدبختی و فلاکت برقرار میشه، اگر هم درست برقرار بشه، هزینهی تمامشده معقولی نداره!
مثال تجربی و واقعی: سالها پیش (۱۳۸۷) همین چالش دشوار قانع کردن یک سازمان بزرگ برای غیرالزامی بودن strong consistency داشتم، از یک طرف مشکلات عدیده مقیاسپذیری و دسترسپذیری داشتن، از یه طرف اصرار مکرر بر اینکه ما کارمون حیاتیه و باید راهکار تضمین کنه که دادهها همهجا در لحظه یکسانه. با هزار اما و اگر، نهایتا راضی به تست شدند که ترکیبی از این دو رو پیاده کنم تا بخشی از سیستم، دادهها رو به لحظه داشته باشه، و بخش دیگهای از سیستم بین ۴ تا ۱۰ ثانیه بعد توی ۳۷ نقطه در کشور دادهی بهروز دریافت کنه. بعد از تست و دوره پایلوت، اون ساختار و معماری سالها کار کرد (میکنه) و ثابت شد که «بهروز» یک مفهوم مطلق و جهانشمول نیست. در حالیکه اگر قرار بود همهجا strong consistency بدم، تفریبا محال ممکن بود که کار انجام شه، یا اگر انجام میشد هزینه پیادهسازی و نگهداریش شاید بارها بیشتر بود، در حالیکه ۴ تا ۱۰ ثانیه برای اون نیاز، کاملا قابل قبول بود.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍19 7
🧬 در مورد Arazzo Specification و کاربردهاش!
کمتر اپلیکیشنی رو میشه پیدا کردن که مستقیم یا غیرمستقیم با APIها خصوصا REST مرتبط نباشن. حالا Arazzo Specification یه استاندارد جدید و البته «باز»، از OpenAPI Initiative است که بهعنوان مکمل OpenAPI Specification برای توصیف جریان کار (workflow) APIها طراحی شده. توسعهدهنده/معمار میتونه دنبالهای از فراخونیهای API و وابستگیهاش رو بهصورت ساختاریافته و قابل فهم برای انسان (فنی و کسبوکاری) و ماشین تعریف کنه.
📜 سابقه و هدف
قبلن، OpenAPI با تمرکز روی توصیف endpointها توسعه داده شده بود. با swagger یا ابزارهای دیگه به راحتی endpointها رو میشه بررسی کرد، ولی خیلی از فرایندها، چندین endpoint رو درگیر میکنن اما در عمل، حالا چرخهی فراخونی این endpointها به نحوی باید مستند و قابل رویت باشه. چه تیم فنی و چه تیم کسبوکاری باید بتونن فرایند فراخونی APIها رو بررسی کنن، که کدوم API اول باید کال بشه و بعد دومی و سومی و الی آخر. برای پاسخ به این نیاز، Arazzo Specification سال ۲۰۲۴ معرفی شد تا بشه جریانهای کاری، خصوصا پیچیدهها رو توصیف و تشریح کرد.
🎯 اهمیت و کاربرد
- مستندسازی API call workflow: توصیف دقیق دنبالهی فراخونی APIها برای سناریو خاص.
- تولید خودکار مستندات و SDK: ایجاد مستندات اینتراکتیو و تولید کدهای کلاینت بر اساس جریانهای کاری تعریفشده.
- تسهیل تستهای end-to-end: تعریف سناریوهای تست پیچیده با استفاده از جریانهای کاری.
- ادغام با هوش مصنوعی: ارائه ساختار قابل فهم برای مدلهای زبانی بزرگ (LLMs) برای تعامل با APIها.
- بهبود تجربه توسعهدهنده (DX): کاهش نیاز به مستندسازی دستی و افزایش وضوح استفاده از APIها.
🧩 ساختار Arazzo
یک سند Arazzo معمولاً شامل بخشهای زیره:
بخش arazzo: نسخه مشخصه Arazzo (مثلاً 1.0.1).
بخش info: اطلاعات متادیتا درباره سند.
بخش sourceDenoscriptions: فهرستی از منابع (مثل فایلهای OpenAPI) که جریانهای کاری بهشون ارجاع میدن.
بخش workflows: تعریف یک یا چند جریان کاری، شامل مراحل، ورودیها، خروجیها و معیارهای موفقیت یا شکست.
بخش components: تعریف مؤلفههای قابل استفاده مجدد برای جلوگیری از تکرار.
مثال توی کامنت
لینک مستند رسمی Arazzo Specification
مخزن GitHub Arazzo
مقاله در Swagger Blog
💬 نظر شما چیه؟!
کمتر اپلیکیشنی رو میشه پیدا کردن که مستقیم یا غیرمستقیم با APIها خصوصا REST مرتبط نباشن. حالا Arazzo Specification یه استاندارد جدید و البته «باز»، از OpenAPI Initiative است که بهعنوان مکمل OpenAPI Specification برای توصیف جریان کار (workflow) APIها طراحی شده. توسعهدهنده/معمار میتونه دنبالهای از فراخونیهای API و وابستگیهاش رو بهصورت ساختاریافته و قابل فهم برای انسان (فنی و کسبوکاری) و ماشین تعریف کنه.
📜 سابقه و هدف
قبلن، OpenAPI با تمرکز روی توصیف endpointها توسعه داده شده بود. با swagger یا ابزارهای دیگه به راحتی endpointها رو میشه بررسی کرد، ولی خیلی از فرایندها، چندین endpoint رو درگیر میکنن اما در عمل، حالا چرخهی فراخونی این endpointها به نحوی باید مستند و قابل رویت باشه. چه تیم فنی و چه تیم کسبوکاری باید بتونن فرایند فراخونی APIها رو بررسی کنن، که کدوم API اول باید کال بشه و بعد دومی و سومی و الی آخر. برای پاسخ به این نیاز، Arazzo Specification سال ۲۰۲۴ معرفی شد تا بشه جریانهای کاری، خصوصا پیچیدهها رو توصیف و تشریح کرد.
🎯 اهمیت و کاربرد
- مستندسازی API call workflow: توصیف دقیق دنبالهی فراخونی APIها برای سناریو خاص.
- تولید خودکار مستندات و SDK: ایجاد مستندات اینتراکتیو و تولید کدهای کلاینت بر اساس جریانهای کاری تعریفشده.
- تسهیل تستهای end-to-end: تعریف سناریوهای تست پیچیده با استفاده از جریانهای کاری.
- ادغام با هوش مصنوعی: ارائه ساختار قابل فهم برای مدلهای زبانی بزرگ (LLMs) برای تعامل با APIها.
- بهبود تجربه توسعهدهنده (DX): کاهش نیاز به مستندسازی دستی و افزایش وضوح استفاده از APIها.
🧩 ساختار Arazzo
یک سند Arazzo معمولاً شامل بخشهای زیره:
بخش arazzo: نسخه مشخصه Arazzo (مثلاً 1.0.1).
بخش info: اطلاعات متادیتا درباره سند.
بخش sourceDenoscriptions: فهرستی از منابع (مثل فایلهای OpenAPI) که جریانهای کاری بهشون ارجاع میدن.
بخش workflows: تعریف یک یا چند جریان کاری، شامل مراحل، ورودیها، خروجیها و معیارهای موفقیت یا شکست.
بخش components: تعریف مؤلفههای قابل استفاده مجدد برای جلوگیری از تکرار.
مثال توی کامنت
لینک مستند رسمی Arazzo Specification
مخزن GitHub Arazzo
مقاله در Swagger Blog
جدی گرفتن رویکرد API First نه تنها کمک بزرگی به توسعه اصولیتره، بلکه به تیم/سازمانسازی بهتر کمک میکنه، همونطور که تست نوشتن بخشی از مسیر بلوغ تیم و سازمانه؛ مستندسازی درست و ساختارمند هم بخشی از مسیر بلوغ توسعهدهنده، تیم و سازمانه. فایل ورد یا کانفولئنس یا ... ابزار مدیریت مستندات API نیستن!
Please open Telegram to view this post
VIEW IN TELEGRAM
spec.openapis.org
The Arazzo Specification v1.0.1
The Arazzo Specification provides a mechanism that can define sequences of calls and their dependencies to be woven together and expressed in the context of delivering a particular outcome or set of outcomes when dealing with API denoscriptions (such as OpenAPI…
(رأیگیری ناشناس است)
Anonymous Poll
54%
۲۰ تا ۳۰ سال
32%
۳۰ تا ۴۰ سال
2%
کمتر از ۲۰ سال
7%
بیشتر از ۴۰ سال
4%
سن فقط یه عدده و تاثیری نداره
0%
موضوع جذابی نیست
استقبال از پلتفرمهای ارتباط منتورها و منتورجوها یا تنوع مطالب حول راهنمایی و نقشهراه، یا کوچینگ فردی، نشون میده حداقل بخشی از جامعه (در سطح بینالمللی) علاقهمند به دریافت مشاوره یا حداقل شنیدن داستان دیگرانی هستند که بهنظرشون مسیر قابل قبولی رو طی کردن...بخش ۱: فرصت طلایی ۲۰ تا ۳۰ سالگی
من ۳ بار رو به خاطر دارم که چنین مشورتی رو گرفته باشم (۱۶، ۱۹ و ۲۱ سالگی) و چیزی که مینویسم آمیزهای از تجربه و یادگیری خودمه، لذا ذیل درس و پند و پیشنهاد بیانش نمیکنم؛ بلکه یک روایته، فارغ از اینکه چقدر مفیده یا گسترهی دامنهاش چقدر میتونه باشه!
مخاطب این متن دوستانی هستند که علاقهمند به کار توی حوزه نرمافزار هستن؛ هرچند برخی بخشها مخاطب عام هم میتونه داشته باشه، ولی مخاطب اصلی نرمافزاریها هستند...
درسته که ماهی رو هر وقت از آب بگیری تازه است! ولی یه زمانهایی اون ماهی خوشطعمتر یا مستعدتر برای پخت است! دهه ۲۰ سالگی خیلی مهمه، سالهای طلاییه! (البته سالهای پلاتینیوم هم داریم که برمیگرده با کودکی و نوجوانی که شاید بعدتر در موردش نوشتم) ولی فعلا از دلایل اهمیت این دهه میشه به چند تایی اشاره کرد:
🧠 مهارتهای فکری پایه
اینکه یاد بگیریم چجوری یاد بگیریم، چجوری مطالب رو بهصورت منفرد و منفک یاد نگیریم و مقدمه و موخره و کاربردشون رو یاد بگیریم؛ منبع اصیل رو از غیراصیل تشخیص بدیم و کلی نکته در مورد یادگیری مستمر رو در خودمون نهادینه و تبدیل به رویه کنیم چیزی که توی این دهه آخرین شانسهاش رو داریم و بعدش سخت و سختتر میشه.
⚙️ مهارتهای فنی
تمایل دارید این بحث ادامه پیدا کنه؟ (ادامه ۲۰ تا ۳۰ سالگی، و بعدتر دهههای قبل و بعدش)، ریاکشن
Please open Telegram to view this post
VIEW IN TELEGRAM
(مطالعه بخش اول)
🏛 ساختن نمونهکار
🔋مدیریت زمان و انرژی
😵💫 اشتباهات رایج
دههٔ ۲۰ سکوی پرش مهمیه، نه خط پایان. این دهه، سن کاشت است، و نه برداشت! تا میتونید بکارید، تا میتونید به جای فکر کردن به تصویر زیبای روی خاک، به فکر شخم خوب و بذر خوب کاشتن و خلاصه زیر خاک باشید، چیزی که دیده نمیشه فعلا، ولی فصل برداشت زیبایی خودش رو نشون میده، به فکر گلهایی که عمرشون و زیباییشون چند صبا بیشتر نیست نباشید... تلهها و فریبها این سنین زیاد هستن، مراقبشون باشین 😉
در صورت تمایل جمع و فیدبک مثبت (
Please open Telegram to view this post
VIEW IN TELEGRAM
tech-afternoon
✨ طی ۲۴ ساعت گذشته، و احتمالا چند روز آینده، خیلیهامون ذهنمون درگیر شرایط و اخبار ایرانه (چه ایران باشیم؛ چه از دور دنبالکننده اخبار و نگران وضعیت عزیزانمون) در شرایطی که اخبار نگرانکنندهای در جامعه وجود داره، حفظ تمرکز و آرامش برای ما اهمیت زیادی داره.…
۸ ماه پیش، وقتی شرایطی مشابه امروز (البته با گستردگی و شدت خیلی کمتر) برای کشور پیش اومده بود، چند خطی رو به عنوان پیشنهاد یا بلند بلند فکر کردن نوشتم، که اگر دوست داشتید مطالعه کنید.
تصور میکنم با در نظر گرفتن ابعاد گستردهتر این نوبت، اضافه کردن چند مورد دیگه بد نباشه:
۱: مهمتر از غرق شدن توی سیل تحلیلها و اخباری که شاید آمیخته با شایعه و اغراق و جانبداری (به هر سو) باشن، بهتره «آماده» باشیم برای مواجهه با «خطرات معقول و محتمل»؛ پس اگر در شهر یا منطقهای زندگی میکنیم که احتمال شمول خطر داره، مکانهای امن، مراکز درمانی و... نزدیک محل سکونتمون رو شناسایی کنیم و این کار رو برای عزیزان و نزدیکانمون رو هم انجام بدیم.
۲: خیلی سخته، ولی به جای درگیر شدن با انبوه نظرات و شایعات و اخبار غیردقیق، «مهندسی» فکر کنیم، یادتونه در مورد Left shift صحبت کردیم؟، شاید بد نباشه اینجا هم این متد رو به کار بگیریم، فرض کنید همین الان مخاطرهای در نزدیکی شما اتفاق افتاده، آیا سفر به فلان شهر در اون لحظه ممکنه یا بهتره به مکان امن نزدیک، خودمون رو برسونیم؟ اگر امکان قطع دسترسی به اینترنت و یا موبایل محتمله، آیا رادیو در دسترس داریم و باطری داره؟ و سوالاتی از این دست رو از خودمون بپرسیم.
۳: یادمون نره ما در این لحظه نه تحلیلگر سیاسی هستیم، نه متخصص نظامی، نه پیشگو! مقدم بر هر چیز عضو یک خانواده و شهروند ایرانیم. وظیفه ما کمک به حفظ «حس حمایت» به عزیزان و اطرافیانمون؛ و هوشیاریه، تا اینکه سرگرم لایک و توییت و تحلیل و... باشیم.
فارغ از هر تفکر و باوری، امیدوارم این جریان تلخ زودتر و با کمترین آسیب و اضطراب هرچه سریعتر تمام بشه، و امنیت، سلامتی و زندگی عادی تبدیل به جریان اصلی ایران باشه...
تصور میکنم با در نظر گرفتن ابعاد گستردهتر این نوبت، اضافه کردن چند مورد دیگه بد نباشه:
۱: مهمتر از غرق شدن توی سیل تحلیلها و اخباری که شاید آمیخته با شایعه و اغراق و جانبداری (به هر سو) باشن، بهتره «آماده» باشیم برای مواجهه با «خطرات معقول و محتمل»؛ پس اگر در شهر یا منطقهای زندگی میکنیم که احتمال شمول خطر داره، مکانهای امن، مراکز درمانی و... نزدیک محل سکونتمون رو شناسایی کنیم و این کار رو برای عزیزان و نزدیکانمون رو هم انجام بدیم.
۲: خیلی سخته، ولی به جای درگیر شدن با انبوه نظرات و شایعات و اخبار غیردقیق، «مهندسی» فکر کنیم، یادتونه در مورد Left shift صحبت کردیم؟، شاید بد نباشه اینجا هم این متد رو به کار بگیریم، فرض کنید همین الان مخاطرهای در نزدیکی شما اتفاق افتاده، آیا سفر به فلان شهر در اون لحظه ممکنه یا بهتره به مکان امن نزدیک، خودمون رو برسونیم؟ اگر امکان قطع دسترسی به اینترنت و یا موبایل محتمله، آیا رادیو در دسترس داریم و باطری داره؟ و سوالاتی از این دست رو از خودمون بپرسیم.
۳: یادمون نره ما در این لحظه نه تحلیلگر سیاسی هستیم، نه متخصص نظامی، نه پیشگو! مقدم بر هر چیز عضو یک خانواده و شهروند ایرانیم. وظیفه ما کمک به حفظ «حس حمایت» به عزیزان و اطرافیانمون؛ و هوشیاریه، تا اینکه سرگرم لایک و توییت و تحلیل و... باشیم.
فارغ از هر تفکر و باوری، امیدوارم این جریان تلخ زودتر و با کمترین آسیب و اضطراب هرچه سریعتر تمام بشه، و امنیت، سلامتی و زندگی عادی تبدیل به جریان اصلی ایران باشه...
❤24👍6
سلام به همگی
قبل از هر چیز آرزو میکنم همگی سلامت و از هر خطری دور باشید و سریعتر سایهی نحس جنگ از کشورمون برچیده بشه.
کوتاه عرض میکنم: من سالها روی زیرساختهای تابآور اعم از دیتابیسهای بزرگ یا نرمافزارهای مقیاسپذیر کار کردهام و تجربیاتم شاید امروز بتونه مفید باشه. اگر هر یک از شما دوستان احساس کردید همفکری من میتونه کمکی هر چند کوچک به:
۱: کاهش ریسک از دست دادن دادهها
۲: افزایش تابآوری سرویسها و کوتاهکردن زمان بازگشت به سرویس
برای سازمان یا کسبوکارتون کمکی کنه، حتمن روی کمک من حساب کنید.
شرمندهام که بخش اعظم آموختههام توی ایران بوده ولی در این لحظه کمکی بیش از این از دستم ساخته نیست.
* نکته: پیشنهاد میکنم چه با من یا هر فرد مشاوری که شناخت و اطمینان کامل ازش ندارید، «هیچ» دیتایی در مورد نام سازمان یا کسبوکارتون به اشتراک نگذارید.
تخریب زیرساختها و توقف کار و زندگی چیزیه که هر کدوممون باید به سهممون کمک کنیم تا کمینه بشه.
قبل از هر چیز آرزو میکنم همگی سلامت و از هر خطری دور باشید و سریعتر سایهی نحس جنگ از کشورمون برچیده بشه.
کوتاه عرض میکنم: من سالها روی زیرساختهای تابآور اعم از دیتابیسهای بزرگ یا نرمافزارهای مقیاسپذیر کار کردهام و تجربیاتم شاید امروز بتونه مفید باشه. اگر هر یک از شما دوستان احساس کردید همفکری من میتونه کمکی هر چند کوچک به:
۱: کاهش ریسک از دست دادن دادهها
۲: افزایش تابآوری سرویسها و کوتاهکردن زمان بازگشت به سرویس
برای سازمان یا کسبوکارتون کمکی کنه، حتمن روی کمک من حساب کنید.
شرمندهام که بخش اعظم آموختههام توی ایران بوده ولی در این لحظه کمکی بیش از این از دستم ساخته نیست.
* نکته: پیشنهاد میکنم چه با من یا هر فرد مشاوری که شناخت و اطمینان کامل ازش ندارید، «هیچ» دیتایی در مورد نام سازمان یا کسبوکارتون به اشتراک نگذارید.
تخریب زیرساختها و توقف کار و زندگی چیزیه که هر کدوممون باید به سهممون کمک کنیم تا کمینه بشه.
👌12❤7👏5
شرایط این روزهای کشور، و به تَبعش ما و دوستان و عزیزانمون تحت تاثیر شرایط جنگی و دشواریه که شاید دل و دماغی برای مطالب فنی خوندن نباشه. اگر دوست داشتید چند دقیقهای از حال و هوای اخبار نگرانکننده فاصله بگیرید، فارغ از هر جهتگیری سیاسی و اجتماعی که دارید، شاید بد نباشه یک سری فکت رو آسیبشناسی کنیم:
نشت اطلاعات فوقمحرمانه و حتی سری، هکهای متعدد و... نشون داد ضعف عمیق دانش، و اجرای مفاهیمی مثل security | compliance | trust and control | information classification ابتدا در سطح فرایند، دوم در سطح معماری و توسعه سیستمهای کشور، یکی از دلایلی بود که محرمانگی اطلاعات طبقهبندیشده اینطور شکننده باشه. نوشتم «یکی از دلایل» چون امنیت نرمافزاری، و نرمافزار امنیتی؛ عملا ذیل امنیت اطلاعات (از شفاهی تا کاغذی و...) معنی داره. و این یعنی «فرهنگ»، یعنی جایی که آدمها باید یاد بگیرن، اعتماد کردن، یا اعتبار خریدن با بیان موضوعات طبقهبندی شده تا چهاندازه میتونه پیامدهای جدی داشته باشه. فقدان آموزش مناسب (منظورم جزوه چاپ کردن نیست، مشکل اینه که هرچقدر سطح سازمانی فرد بالاتر بره لزوم و احساس نیاز به یادگیری کمتر حس میشه، و این تنها بخشی از آسیبها بوده).
فرایندها و سیستمها باید به گونهای طراحی و تولید بشن که شما به محض نشت اطلاعات بتونی لیستی از نقاط مستعد نشت (افرادی که به اون اطلاعات دسترسی داشتن) رو پیدا کنید. و سیستمهای مدرن، بعد از چند مورد نشت قادرن با روشهای ماشینلرنینگ، و شناسایی الگوهای نشت اطلاعات، لیست افراد مورد ظن رو محدود کنن. این یعنی سیستمهای متمرکز، یا توزیعشدهی متصل. نه «سامانه»های احمقانه و محدود به CRUD که از فقط مسئولدفترها و کارمندها بهشون دسترسی دارن.
شاهد بودیم که نه تنها «معماری اطلاعات» شکننده بود، بلکه در سطح نرمافزار و زیرساخت هم بدتر! این به معنی انگشت اتهام گرفتن به سمت فقط نظامیها نیست، در سطح دولت، بانکها و هر جایی میشد دید که تفاوتی بین مدیریت بحران در سال ۱۴۰۴ با دوران پیش از عصر نرمافزار و ارتباطات نیست!
در نتیجه: «ما» جامعه نرمافزاریهای ایرانی هم بخشی از این افتضاح هستیم! امیدوارم این صحبت من ذیل اینکه دولت فلان بود، حکومت بهمان بود، دشمن بیسار بود، نره! فردای ایران، چه به شکل گذشته باشه، چه تفاوت کوچک یا بزرگی در ساختار سیاسی کشور اتفاق بیوفته، دوباره «همین ما» هستیم که باید تحلیل کنیم، توسعه بدیم...
من این چند روز خیلی فکر کردم که چطور نرمافزار میتونست به پیشگیری از بحران فعلی؛ تا مدیریت بهتر بحران کمک کنه. در دولتها و سیستمهای امنیتی برای پیشبینی وقایع، سالهاست نرمافزارهایی وجود داره که کاری که ذهن اغلب انسانها ازش عاجزه، یعنی کنار هم چیدن انبوه اخبار و صحبتها و تصمیمها و تغییرات در رویکردها و... و پیشبینیهایی مبتنی بر هوشمصنوعی از وقایع پیش رو (مثلا وزیر a از کشور b در مورد c با لحن d حرف رو زد و آقای e از کشور f با لحن g پاسخ داد و ... => یعنی گرافهای بسیار بزرگ از وقایع، اخبار، تصمیمات و...). که ما از چنین سیستمهایی برخوردار نیستیم، یا بهتر بگم چون بضاعتمون CRUD است!
یا در مورد بحران، تقریبا هیچ سیستمی برای اطلاعرسانی متمرکز و مرجعیت تصمیم و هشدار و... نبود!
یا عملا هیچنوع مدلسازی از پیش انجام شدهای در مورد مناطق مستعد خطر، تخصیص منابع درمانی، اسکان و تغذیه نبود...
ببخشید که طولانی شد، این بخش کوچیکی از افکاری بود که این چند روز ذهنم در درگیر کرده و آرزوها و افسوسهای عمیق... با خودم بارها جلسات ارزیابی ریسک نرمافزاری رو در جاهایی که به نحوی تابآوری نرمافزار مهم بودند رو مرور کردم، و هر بار تاسف خوردم از سطح دغدغههای «ما» نرمافزاریها... و امروز هم باور دارم که گفتن «فلان مدیر سطحش این بود، یا فلان سازمان سطحش اون بود، یعنی فرافکنی، چون فردای توسعه، باز همین «ما» هستیم که باید دور میز بشینیم...
امیدوارم شما و عزیزانتون سلامت و از خطر به دور باشید، اگر دوست داشتید گپ بزنیم، نظرتون رو بگید، یا حتی در این موارد بیشتر گپ بزنیم...
نشت اطلاعات فوقمحرمانه و حتی سری، هکهای متعدد و... نشون داد ضعف عمیق دانش، و اجرای مفاهیمی مثل security | compliance | trust and control | information classification ابتدا در سطح فرایند، دوم در سطح معماری و توسعه سیستمهای کشور، یکی از دلایلی بود که محرمانگی اطلاعات طبقهبندیشده اینطور شکننده باشه. نوشتم «یکی از دلایل» چون امنیت نرمافزاری، و نرمافزار امنیتی؛ عملا ذیل امنیت اطلاعات (از شفاهی تا کاغذی و...) معنی داره. و این یعنی «فرهنگ»، یعنی جایی که آدمها باید یاد بگیرن، اعتماد کردن، یا اعتبار خریدن با بیان موضوعات طبقهبندی شده تا چهاندازه میتونه پیامدهای جدی داشته باشه. فقدان آموزش مناسب (منظورم جزوه چاپ کردن نیست، مشکل اینه که هرچقدر سطح سازمانی فرد بالاتر بره لزوم و احساس نیاز به یادگیری کمتر حس میشه، و این تنها بخشی از آسیبها بوده).
فرایندها و سیستمها باید به گونهای طراحی و تولید بشن که شما به محض نشت اطلاعات بتونی لیستی از نقاط مستعد نشت (افرادی که به اون اطلاعات دسترسی داشتن) رو پیدا کنید. و سیستمهای مدرن، بعد از چند مورد نشت قادرن با روشهای ماشینلرنینگ، و شناسایی الگوهای نشت اطلاعات، لیست افراد مورد ظن رو محدود کنن. این یعنی سیستمهای متمرکز، یا توزیعشدهی متصل. نه «سامانه»های احمقانه و محدود به CRUD که از فقط مسئولدفترها و کارمندها بهشون دسترسی دارن.
شاهد بودیم که نه تنها «معماری اطلاعات» شکننده بود، بلکه در سطح نرمافزار و زیرساخت هم بدتر! این به معنی انگشت اتهام گرفتن به سمت فقط نظامیها نیست، در سطح دولت، بانکها و هر جایی میشد دید که تفاوتی بین مدیریت بحران در سال ۱۴۰۴ با دوران پیش از عصر نرمافزار و ارتباطات نیست!
در نتیجه: «ما» جامعه نرمافزاریهای ایرانی هم بخشی از این افتضاح هستیم! امیدوارم این صحبت من ذیل اینکه دولت فلان بود، حکومت بهمان بود، دشمن بیسار بود، نره! فردای ایران، چه به شکل گذشته باشه، چه تفاوت کوچک یا بزرگی در ساختار سیاسی کشور اتفاق بیوفته، دوباره «همین ما» هستیم که باید تحلیل کنیم، توسعه بدیم...
من این چند روز خیلی فکر کردم که چطور نرمافزار میتونست به پیشگیری از بحران فعلی؛ تا مدیریت بهتر بحران کمک کنه. در دولتها و سیستمهای امنیتی برای پیشبینی وقایع، سالهاست نرمافزارهایی وجود داره که کاری که ذهن اغلب انسانها ازش عاجزه، یعنی کنار هم چیدن انبوه اخبار و صحبتها و تصمیمها و تغییرات در رویکردها و... و پیشبینیهایی مبتنی بر هوشمصنوعی از وقایع پیش رو (مثلا وزیر a از کشور b در مورد c با لحن d حرف رو زد و آقای e از کشور f با لحن g پاسخ داد و ... => یعنی گرافهای بسیار بزرگ از وقایع، اخبار، تصمیمات و...). که ما از چنین سیستمهایی برخوردار نیستیم، یا بهتر بگم چون بضاعتمون CRUD است!
یا در مورد بحران، تقریبا هیچ سیستمی برای اطلاعرسانی متمرکز و مرجعیت تصمیم و هشدار و... نبود!
یا عملا هیچنوع مدلسازی از پیش انجام شدهای در مورد مناطق مستعد خطر، تخصیص منابع درمانی، اسکان و تغذیه نبود...
ببخشید که طولانی شد، این بخش کوچیکی از افکاری بود که این چند روز ذهنم در درگیر کرده و آرزوها و افسوسهای عمیق... با خودم بارها جلسات ارزیابی ریسک نرمافزاری رو در جاهایی که به نحوی تابآوری نرمافزار مهم بودند رو مرور کردم، و هر بار تاسف خوردم از سطح دغدغههای «ما» نرمافزاریها... و امروز هم باور دارم که گفتن «فلان مدیر سطحش این بود، یا فلان سازمان سطحش اون بود، یعنی فرافکنی، چون فردای توسعه، باز همین «ما» هستیم که باید دور میز بشینیم...
امیدوارم شما و عزیزانتون سلامت و از خطر به دور باشید، اگر دوست داشتید گپ بزنیم، نظرتون رو بگید، یا حتی در این موارد بیشتر گپ بزنیم...
❤20👍7 1