🎯 تحلیل پویای برنامه یا Dynamic Program Analysis (DPA) چیه و چه کمکی میکنه؟
روال معمول اینه که ما قبل از اجرای برنامه، کدمون رو بررسی میکنیم؛ خطاهای کامپایل رو برطرف میکنیم و اگر دقیقتر باشیم هشدارهای IDE نتایج ابزارهایی مثل sonar که به static code analyzer میشناسیم رو هم چک میکنیم. برخی شرکتها هم قوانین static analysis خودشون رو دارن تا کدهاشون یکدست باشه. برخی هم architecture validation رو هم اضافه میکنن که به صورت خودکار کنترل بشه که از چارچوبهای معماری کسی تخطی نکرده باشه.
اما خیلی از مشکلات فقط وقتی معلوم میشن که برنامه «واقعاً» اجرا بشه. مثلاً با دادههای واقعی کاربر یا بار سنگین.
برای چنین مواردیه که تحلیل پویا (Dynamic Program Analysis) وارد میشه.
📌 تحلیل پویای برنامه یعنی چی؟ یعنی بررسی و تحلیل رفتار واقعی برنامه در زمان اجرا.
این ابزارها به ما کمک میکنن تا بدونیم:
✅ آیا حافظه درست آزاد میشه؟
✅ چه توابعی بیشتر از بقیه CPU مصرف میکنن؟
✅ کجا گلوگاه عملکرد داریم؟
✅ چه مسیرهایی از کد اصلاً اجرا نشدن؟ (برای تستنویسی مهمه!)
✅ آیا در حالت مالتیترد، مشکل Race داریم؟
✅ و حتی مموریلیک یا مصرف غیرعادی منابع داریم یا نه؟
فرض کنیم نرمافزار کند شده، اما نمیدونیم چرا. با چشم هم نمیتونیم بفهمیم چون کد به ظاهر درست کار میکنه.
یا مثلاً متوجه میشیم با هر بار اجرای یه اکشن ساده، حافظه مصرفی داره زیاد و زیادتر میشه!
یا نمیدونیم واقعاْ چه میزان از کدهایی که نوشتیم با تست پوشش داده شده
برای دونستن پاسخ این پرسشها ابزارهای تحلیل پویا کمک میکنن.
💡 مثال:
فرض کنین یه برنامه ساده داریم برای گرفتن اطلاعات کارکنان از API و ذخیره در دیتابیس:
همه چی در ظاهر درسته. ولی با ابزارهای تحلیل پویا مثل dotTrace یا Visual Studio Profiler میشه فهمید:
🕵🏻♂️متد AddAsync در هر حلقه باعث افزایش latency شده (باید به جای AddAsync از AddRange استفاده کنیم)
🕵🏻♀️زمان زیادی صرف Map کردن شده، که نشون میده AutoMapper بهینه نیست برای حجم بالا
🕵️♀️حافظه بعد از اجرای متد خالی نمیشه => مموریلیک محتمله
🛠 ابزارهای معروف داتنتی
🔨 Visual Studio Diagnostic
Profiler و Memory analyzer داخلی
🔨 JetBrains dotTrace / dotMemory
Memory and Performance Analysis دقیق و با جزيیات
🔨 Coverlet
Code coverage analysis
🔨 BenchmarkDotNet
Detailed performance analysis
تحلیل پویای برنامه یه ابزار لوکس نیست، یه ضرورته وقتی:
🔤 با کدهای حساس به performance سر و کار داریم
🔤 دنبال مشکلات حافظه، CPU، async و... میگردیم
🔤 میخوایم مطمئن شیم تستهامون واقعاً کد رو پوشش دادن
🔤 برنامهمون قراره تو محیط واقعی و سنگین اجرا شه
حالا ابزارهایی مثل خانواده محصولات JetBrains و ابزارهای درونی Visual Studio مرتبا تلاش میکنن تا به سمت تحلیل «زنده»تر برن، و تحلیلهای عمیقتری بدن.
نداشتن ضابطهی تحلیل پویا توی تیم، خیلی جاها ضعف محسوب میشه؛ مثل نداشتن یونیتتست، یا e2e تست و... یکی از نشونههای بلوغ محصول و تیم، داشتن DPA به عنوان بخشی از مراحل CI/CD است که اجازه نده کدی که قوانین رو معیارهای کیفی رو پاس نکرده وارد برنچ پروداکشن یا استیج بشه.
شاید از دید برخی تیمها و شرکتها فانتزی باشه، ولی هرچقدر که به فانتزی بودنش فکر کنن همونقدر از پاسخ اینکه «چرا اینقدر محصولاتمون بیکیفیت و غیراستاندارد است» دور میشن...
💬 نظر و تجربه شما چیه؟ فانتزیه؟ مانع استفاده ازش (یا هر مفهوم کیفی مشابه) چیه؟
روال معمول اینه که ما قبل از اجرای برنامه، کدمون رو بررسی میکنیم؛ خطاهای کامپایل رو برطرف میکنیم و اگر دقیقتر باشیم هشدارهای IDE نتایج ابزارهایی مثل sonar که به static code analyzer میشناسیم رو هم چک میکنیم. برخی شرکتها هم قوانین static analysis خودشون رو دارن تا کدهاشون یکدست باشه. برخی هم architecture validation رو هم اضافه میکنن که به صورت خودکار کنترل بشه که از چارچوبهای معماری کسی تخطی نکرده باشه.
اما خیلی از مشکلات فقط وقتی معلوم میشن که برنامه «واقعاً» اجرا بشه. مثلاً با دادههای واقعی کاربر یا بار سنگین.
برای چنین مواردیه که تحلیل پویا (Dynamic Program Analysis) وارد میشه.
📌 تحلیل پویای برنامه یعنی چی؟ یعنی بررسی و تحلیل رفتار واقعی برنامه در زمان اجرا.
این ابزارها به ما کمک میکنن تا بدونیم:
فرض کنیم نرمافزار کند شده، اما نمیدونیم چرا. با چشم هم نمیتونیم بفهمیم چون کد به ظاهر درست کار میکنه.
یا مثلاً متوجه میشیم با هر بار اجرای یه اکشن ساده، حافظه مصرفی داره زیاد و زیادتر میشه!
یا نمیدونیم واقعاْ چه میزان از کدهایی که نوشتیم با تست پوشش داده شده
برای دونستن پاسخ این پرسشها ابزارهای تحلیل پویا کمک میکنن.
💡 مثال:
فرض کنین یه برنامه ساده داریم برای گرفتن اطلاعات کارکنان از API و ذخیره در دیتابیس:
public async Task ProcessEmployeesAsync()
{
var employees = await _employeeApi.GetAllAsync();
foreach (var emp in employees)
{
var dbEmp = _mapper.Map<EmployeeEntity>(emp);
await _dbContext.Employees.AddAsync(dbEmp);
}
await _dbContext.SaveChangesAsync();
}
همه چی در ظاهر درسته. ولی با ابزارهای تحلیل پویا مثل dotTrace یا Visual Studio Profiler میشه فهمید:
🕵🏻♂️متد AddAsync در هر حلقه باعث افزایش latency شده (باید به جای AddAsync از AddRange استفاده کنیم)
🕵🏻♀️زمان زیادی صرف Map کردن شده، که نشون میده AutoMapper بهینه نیست برای حجم بالا
🕵️♀️حافظه بعد از اجرای متد خالی نمیشه => مموریلیک محتمله
🛠 ابزارهای معروف داتنتی
🔨 Visual Studio Diagnostic
Profiler و Memory analyzer داخلی
🔨 JetBrains dotTrace / dotMemory
Memory and Performance Analysis دقیق و با جزيیات
🔨 Coverlet
Code coverage analysis
🔨 BenchmarkDotNet
Detailed performance analysis
تحلیل پویای برنامه یه ابزار لوکس نیست، یه ضرورته وقتی:
حالا ابزارهایی مثل خانواده محصولات JetBrains و ابزارهای درونی Visual Studio مرتبا تلاش میکنن تا به سمت تحلیل «زنده»تر برن، و تحلیلهای عمیقتری بدن.
نداشتن ضابطهی تحلیل پویا توی تیم، خیلی جاها ضعف محسوب میشه؛ مثل نداشتن یونیتتست، یا e2e تست و... یکی از نشونههای بلوغ محصول و تیم، داشتن DPA به عنوان بخشی از مراحل CI/CD است که اجازه نده کدی که قوانین رو معیارهای کیفی رو پاس نکرده وارد برنچ پروداکشن یا استیج بشه.
شاید از دید برخی تیمها و شرکتها فانتزی باشه، ولی هرچقدر که به فانتزی بودنش فکر کنن همونقدر از پاسخ اینکه «چرا اینقدر محصولاتمون بیکیفیت و غیراستاندارد است» دور میشن...
Please open Telegram to view this post
VIEW IN TELEGRAM
جلسه یکبهیک (1:1) با مدیر یا تیملید دارید؟
(بیش از یک پاسخ میشه ثبت کرد)
(بیش از یک پاسخ میشه ثبت کرد)
Final Results
34%
بله، و در مسیر کاری مفیده
12%
بله، ولی ادایی و بیفایده است
15%
نه، آرزو میکنم که داشتم
3%
نه، به نظرم بیخود و اداییه
32%
دوست دارم بدونم جلسه یکبهیک خوب چجوری باید باشه (به عنوان لیدر)
43%
دوست دارم بدونم جلسه یکبهیک خوب چجوری باید باشه (به عنوان عضو تیم توسعه)
tech-afternoon
جلسه یکبهیک (1:1) با مدیر یا تیملید دارید؟
(بیش از یک پاسخ میشه ثبت کرد)
(بیش از یک پاسخ میشه ثبت کرد)
📢 نتیجه نظرسنجی با ۱۱۵ شرکتکننده:
🗳️ حدود ۴۵٪ از viewها در نظرسنجی شرکت داشتند.
✅ ۴۷٪ افراد ۱:۱ دارند یا دوست دارن داشته باشند و مفید میدوننش.
❌ ۱۵٪ باور دارن که کار بیخود و ادایی است.
♻️ بین ۳۲ تا ۴۳ درصد دوست دارن تا بیشتر در مورد جلسه یکبهیک مفید و اثرگذار بدونن، پس راجع بهش خواهیم نوشت 😊
«حدنصاب ۵۰ درصد توی ذهنم داشتم برای جلسه دورهمی، و ۶۰ درصد برای ضبط ویدیو یا پادکست که محقق نشدن»
🗳️ حدود ۴۵٪ از viewها در نظرسنجی شرکت داشتند.
✅ ۴۷٪ افراد ۱:۱ دارند یا دوست دارن داشته باشند و مفید میدوننش.
❌ ۱۵٪ باور دارن که کار بیخود و ادایی است.
♻️ بین ۳۲ تا ۴۳ درصد دوست دارن تا بیشتر در مورد جلسه یکبهیک مفید و اثرگذار بدونن، پس راجع بهش خواهیم نوشت 😊
«حدنصاب ۵۰ درصد توی ذهنم داشتم برای جلسه دورهمی، و ۶۰ درصد برای ضبط ویدیو یا پادکست که محقق نشدن»
📌 چطور جلسات یکبهیک سازنده و مفید داشته باشیم؟ بخش اول، از منظر عضو تیم
مقدمه: چرا جلسات یکبهیک مهم هستن؟
جلسات یکبهیک (One-on-One یا 1:1) یکی از ابزارهای پایهای لیدرشیپ محسوب میشن که فرصت مناسبی رو برای ایجاد ارتباط عمیقتر و هدفمند بین عضو تیم و رهبر تیم فراهم میکنن. این جلسات از جلسات معمول کاری متمایز هستن و بهجای تمرکز روی وظایف روزمره، بر توسعه فردی، بهبود روابط کاری، و رشد متقابل تأکید دارن.
برخلاف جلسات فنی، اسکرام، یا گزارشگیری که ماهیت عملیاتی دارن، جلسات یکبهیک فضای امن و محرمانهای هستن برای بیان دغدغهها، دریافت راهنمایی، و برنامهریزی مسیر شغلی. این جلسات بر پایه اعتماد متقابل، شفافیت، و تعهد به رشد دوطرفه استوار میشن.
دلیل اینکه گاهی جلسات یکبهیک تبدیل میشن به جلسات بیهوده، ادایی یا حتی گاها بازجویی و ممیزی، فقدان یا ضعف مهارتها و خصوصیاتی که ذکر کردم در لیدر است. لیدری که خودش صلاحیت و پختگی هدایت و راهنمایی رو نداره؛ مهارت دقیق شنیدن و درک کُنجهای رفتاری رو نداره، نمیتونه جلسات خوبی رو برگزار کنه.
🎯 اهداف استراتژیک جلسات یکبهیک
- دریافت بازخورد عملکردی: شناسایی نقاط قوت و فرصتهای بهبود
- مطرح کردن چالشهای کاری: حل مسائل عملیاتی و رفع موانع
- برنامهریزی مسیر رشد: تعیین اهداف توسعه فردی و شغلی
- بهبود دینامیک تیم: ارائه ایدهها برای بهبود فرآیندها و همکاری
- درخواست منابع و حمایت: تأمین ابزار و آموزشهای مورد نیاز
اهداف ثانویه:
- تقویت اعتماد متقابل
- افزایش انگیزه و تعلق سازمانی
- پیشگیری از فرسودگی شغلی
- ایجاد فرهنگ یادگیری مستمر
📆 تناوب و زمانبندی علمی
هر ۲ تا ۴ هفته یکبار - این بازه بر اساس تحقیقات رفتار سازمانی و تجربیات شرکتهای پیشرو تعیین شده. زمانش هم ۳۰ تا ۴۵ دقیقه برای جلسات معمول و ۶۰ دقیقه برای جلسات فصلی یا سالانه.
چرا این تناوب؟
- کوتاهتر از ۲ هفته: ممکنه به سطحیسازی منجر بشه
- بیشتر از ۴ هفته: باعث ضعیف شدن ارتباط و انباشت مسائل میشه
- انعطافپذیری: در دورههای پروژههای حساس یا تغییرات سازمانی میشه تناوب رو افزایش داد
🛠 آمادگی برای جلسه
حتمن از چند روز قبل خورده خورده یه فهرست از مطالبی که قصد طرح کردنشون رو دارید تهیه کنید، بدون آمادگی جلسه ۱:۱ رفتن یعنی اتلاف وقت (البته از سمت عضو، وقت تلف کردنه، بعدا خواهم گفت چرا از سمت لیدر مصداق بارز ناپختگیه):
- عملکرد و دستاورد: پروژههای تکمیل شده، مهارتهای جدید، موفقیتها
- چالشها و موانع: مسائل فنی، ارتباطی، یا منابع
- رشد و توسعه: اهداف یادگیری، مهارتهای مورد نیاز، فرصتهای آموزشی
- تیم و فرآیند: پیشنهادات بهبود، مسائل همکاری
- انگیزه و رضایت: سطح انگیزه، تعادل کار-زندگی، چشمانداز آینده
🤔 آمادهسازی مثالهای عینی:
- مثالهای موفق: پروژه/کاری که خوب انجام دادین
- چالشهای خاص: مشکلی که نیاز به راهنمایی دارین
- اهداف رشد: مهارت یا موقعیتی که میخواهید کسب کنین
🧘♀️ آمادهسازی ذهنی:
- ذهن باز و پذیرا داشته باشین
- انتظارات واقعبینانهای رو تعریف کنین
- فضای امن برای صحبت آماده کنین
🗣 هنر گفتوگوی مؤثر در جلسه
صداقت سازنده:
- شفافیت: مسائل رو بدون پردهپوشی بیان کنین
- سازندگی: همراه با مشکل، راهحل پیشنهاد بدید (نقد بدون پیشنهاد راهکار عموما نِق زدن تلقی میشه)
- احترام: از زبان محترمانه و حرفهای استفاده کنین
رویکرد راهحلمحور:
- توصیفی نه قضاوتی: رفتارها و نتایج رو توصیف کنین، نه شخصیت افراد رو
- تأثیرمحور: درباره تأثیر مسائل روی کار و تیم صحبت کنین
- آیندهنگر: روی راهحلها و بهبود آینده تمرکز کنین
💬 نظر و تجربهتون رو حتمن بگید، خوشحال میشم بشنوم. در ضمن در صورت استقبال بخش بعد به مثالهایی از گفتگو سازنده و غیرسازنده + ساختار پیشنهادی خواهم پرداخت و باز هم در صورت استقبال، مطلب بعدترش، از منظر تیملیدر...
مقدمه: چرا جلسات یکبهیک مهم هستن؟
جلسات یکبهیک (One-on-One یا 1:1) یکی از ابزارهای پایهای لیدرشیپ محسوب میشن که فرصت مناسبی رو برای ایجاد ارتباط عمیقتر و هدفمند بین عضو تیم و رهبر تیم فراهم میکنن. این جلسات از جلسات معمول کاری متمایز هستن و بهجای تمرکز روی وظایف روزمره، بر توسعه فردی، بهبود روابط کاری، و رشد متقابل تأکید دارن.
برخلاف جلسات فنی، اسکرام، یا گزارشگیری که ماهیت عملیاتی دارن، جلسات یکبهیک فضای امن و محرمانهای هستن برای بیان دغدغهها، دریافت راهنمایی، و برنامهریزی مسیر شغلی. این جلسات بر پایه اعتماد متقابل، شفافیت، و تعهد به رشد دوطرفه استوار میشن.
دلیل اینکه گاهی جلسات یکبهیک تبدیل میشن به جلسات بیهوده، ادایی یا حتی گاها بازجویی و ممیزی، فقدان یا ضعف مهارتها و خصوصیاتی که ذکر کردم در لیدر است. لیدری که خودش صلاحیت و پختگی هدایت و راهنمایی رو نداره؛ مهارت دقیق شنیدن و درک کُنجهای رفتاری رو نداره، نمیتونه جلسات خوبی رو برگزار کنه.
🎯 اهداف استراتژیک جلسات یکبهیک
- دریافت بازخورد عملکردی: شناسایی نقاط قوت و فرصتهای بهبود
- مطرح کردن چالشهای کاری: حل مسائل عملیاتی و رفع موانع
- برنامهریزی مسیر رشد: تعیین اهداف توسعه فردی و شغلی
- بهبود دینامیک تیم: ارائه ایدهها برای بهبود فرآیندها و همکاری
- درخواست منابع و حمایت: تأمین ابزار و آموزشهای مورد نیاز
اهداف ثانویه:
- تقویت اعتماد متقابل
- افزایش انگیزه و تعلق سازمانی
- پیشگیری از فرسودگی شغلی
- ایجاد فرهنگ یادگیری مستمر
📆 تناوب و زمانبندی علمی
هر ۲ تا ۴ هفته یکبار - این بازه بر اساس تحقیقات رفتار سازمانی و تجربیات شرکتهای پیشرو تعیین شده. زمانش هم ۳۰ تا ۴۵ دقیقه برای جلسات معمول و ۶۰ دقیقه برای جلسات فصلی یا سالانه.
چرا این تناوب؟
- کوتاهتر از ۲ هفته: ممکنه به سطحیسازی منجر بشه
- بیشتر از ۴ هفته: باعث ضعیف شدن ارتباط و انباشت مسائل میشه
- انعطافپذیری: در دورههای پروژههای حساس یا تغییرات سازمانی میشه تناوب رو افزایش داد
🛠 آمادگی برای جلسه
حتمن از چند روز قبل خورده خورده یه فهرست از مطالبی که قصد طرح کردنشون رو دارید تهیه کنید، بدون آمادگی جلسه ۱:۱ رفتن یعنی اتلاف وقت (البته از سمت عضو، وقت تلف کردنه، بعدا خواهم گفت چرا از سمت لیدر مصداق بارز ناپختگیه):
- عملکرد و دستاورد: پروژههای تکمیل شده، مهارتهای جدید، موفقیتها
- چالشها و موانع: مسائل فنی، ارتباطی، یا منابع
- رشد و توسعه: اهداف یادگیری، مهارتهای مورد نیاز، فرصتهای آموزشی
- تیم و فرآیند: پیشنهادات بهبود، مسائل همکاری
- انگیزه و رضایت: سطح انگیزه، تعادل کار-زندگی، چشمانداز آینده
🤔 آمادهسازی مثالهای عینی:
- مثالهای موفق: پروژه/کاری که خوب انجام دادین
- چالشهای خاص: مشکلی که نیاز به راهنمایی دارین
- اهداف رشد: مهارت یا موقعیتی که میخواهید کسب کنین
🧘♀️ آمادهسازی ذهنی:
- ذهن باز و پذیرا داشته باشین
- انتظارات واقعبینانهای رو تعریف کنین
- فضای امن برای صحبت آماده کنین
🗣 هنر گفتوگوی مؤثر در جلسه
صداقت سازنده:
- شفافیت: مسائل رو بدون پردهپوشی بیان کنین
- سازندگی: همراه با مشکل، راهحل پیشنهاد بدید (نقد بدون پیشنهاد راهکار عموما نِق زدن تلقی میشه)
- احترام: از زبان محترمانه و حرفهای استفاده کنین
رویکرد راهحلمحور:
- توصیفی نه قضاوتی: رفتارها و نتایج رو توصیف کنین، نه شخصیت افراد رو
- تأثیرمحور: درباره تأثیر مسائل روی کار و تیم صحبت کنین
- آیندهنگر: روی راهحلها و بهبود آینده تمرکز کنین
Please open Telegram to view this post
VIEW IN TELEGRAM
📌 چطور جلسات یکبهیک سازنده و مفید داشته باشیم؟ بخش دوم، از منظر لیدر
توی قسمت اول در مورد جلسه یکبهیک و چجوری برگزار کردنش از منظر عضو تیم نوشتم. این قسمت میشنیم اون سمت میز و از نگاه تیملید به موضوع نگاه میکنیم. فرق یه تیم سالم و تیمی که داره از درون میپاشه، خیلی وقتها توی همین نیمساعتهای یکبهیک مشخص میشه. اما فقط "داشتن" جلسه یکبهیک کافی نیست؛ باید "بلد بود" که چجوری اون رو به یک گفتوگوی رشدآفرین تبدیل کرد و «تعهد» به رشد و توسعه اعضاء تیم رو ثابت کرد.
🧰 ویژگیهای تیملید آماده برای جلسه ۱:۱
✅ شنونده فعال: با ذهن باز و بدون قضاوت گوش میده
✅ کنجکاوی بدون سلطه: سوال میپرسه تا درک کنه، نه برای بازجویی یا وادار کردن طرف مقابل به پسگرفتن نظرش
✅ دغدغهی رشد: به جای کنترل، به دنبال پرورش دیگرانه، همچنین دغدغه به رخ کشیدن توانایی خودش رو نداره
✅ پایداری ارتباط: فقط در زمان مشکل جلسه نمیذاره، همیشه فرصت گفتگو بازه
✅ خودآگاهی: نسبت به تاثیر رفتار و سبک رهبری خودش آگاهه
📝 آمادگی قبل از جلسه برای مدیر
🔤 باید نگاهی به فعالیتهای فرد بندازه (PRها، مشارکتها، صحبتها)
🔤 نوتهای جلسه قبل رو مرور کنه و ببین قولهایی که داده انجام شده یا نه
🔤 اگر بازخورد داره، با مثال و دقت آماده میکنه (نه کلیگویی)
🔤 یک فضای امن و بیتنش فراهم میکنه
💡 نکات کلیدی و رویکرد ذهنی مناسب
➖ سؤال بپرس، سخنرانی نکن: از جنس «چه چیزی میتونم بهتر انجام بدم؟»
➖ ایجاد تعهد به جای اجبار: فرد باید احساس کنه بخشی از راهحلهاست
➖ بازخورد دوطرفه باشه: خودت هم مشتاق شنیدن بازخورد باش
➖ نقش کوچ داشته باش نه مدیر پروژه: این جلسه جای ابلاغ وظایف نیست
❓ آیا هر کسی میتونه ۱:۱ خوب برگزار کنه؟
«نه». برگزاری جلسه یکبهیک موثر، نیازمند بلوغ حرفهای، مهارت شنیدن، و نگرش انسانی به تیم؛ در کنار تجربه و دانش است. بدون یاد گرفتن و تمرین کردن این مهارتها نتیجهی مطلوب محاله!
#️⃣ اگر دوست داشتید کلیدواژه یا سرنخ برای بیشتر خوندن داشته باشید، پیشنهادم:
Active Listening
Coaching/Growth Mindset
GROW model (coaching framework)
Psychological Safety
Radical Candor
Co-Active Coaching
Mindset Shift
💬 نظر و تجربه شما به عنوان لیدر یا عضو تیم از ۱:۱ چیه؟
توی قسمت اول در مورد جلسه یکبهیک و چجوری برگزار کردنش از منظر عضو تیم نوشتم. این قسمت میشنیم اون سمت میز و از نگاه تیملید به موضوع نگاه میکنیم. فرق یه تیم سالم و تیمی که داره از درون میپاشه، خیلی وقتها توی همین نیمساعتهای یکبهیک مشخص میشه. اما فقط "داشتن" جلسه یکبهیک کافی نیست؛ باید "بلد بود" که چجوری اون رو به یک گفتوگوی رشدآفرین تبدیل کرد و «تعهد» به رشد و توسعه اعضاء تیم رو ثابت کرد.
🧰 ویژگیهای تیملید آماده برای جلسه ۱:۱
📝 آمادگی قبل از جلسه برای مدیر
💡 نکات کلیدی و رویکرد ذهنی مناسب
❓ آیا هر کسی میتونه ۱:۱ خوب برگزار کنه؟
«نه». برگزاری جلسه یکبهیک موثر، نیازمند بلوغ حرفهای، مهارت شنیدن، و نگرش انسانی به تیم؛ در کنار تجربه و دانش است. بدون یاد گرفتن و تمرین کردن این مهارتها نتیجهی مطلوب محاله!
Active Listening
Coaching/Growth Mindset
GROW model (coaching framework)
Psychological Safety
Radical Candor
Co-Active Coaching
Mindset Shift
Please open Telegram to view this post
VIEW IN TELEGRAM
Telegram
tech-afternoon
📌 چطور جلسات یکبهیک سازنده و مفید داشته باشیم؟ بخش اول، از منظر عضو تیم
مقدمه: چرا جلسات یکبهیک مهم هستن؟
جلسات یکبهیک (One-on-One یا 1:1) یکی از ابزارهای پایهای لیدرشیپ محسوب میشن که فرصت مناسبی رو برای ایجاد ارتباط عمیقتر و هدفمند بین عضو تیم…
مقدمه: چرا جلسات یکبهیک مهم هستن؟
جلسات یکبهیک (One-on-One یا 1:1) یکی از ابزارهای پایهای لیدرشیپ محسوب میشن که فرصت مناسبی رو برای ایجاد ارتباط عمیقتر و هدفمند بین عضو تیم…
❤8 4👍2
وقتی به جای «حس» و معیارهای کیفی، بریم سراغ معیار «کمی» و خصوصا «اعداد»، خیلی از مشکلات رو میشه زودتر شناسایی کرد، راهکارهای بهتری براشون پیدا کرد؛ و حتی توی گفتوگوها از جدل دور شد. در این پست و شاید پستهای احتمالی بعدی، در معرفی و ستایش اعدادی مینویسم که به ما کمک میکنن تا بهتر کار کنیم و کار بهتر کنیم... مثل اعدادی که میشه از کُد بیرون کشید، اعدادی که میشه از دل جیرا (یا هر ابزار مدیریت تسک دیگه) بیرون کشید، اعدادی که میشه از API یا زیرساخت بیرون کشید...
شروع رو به معرفی metricهای رایج میپردازم، و بعد به صورت مفصلتر روی Cyclomatic Complexity صحبت میکنیم که یکی از پرکاربردترین معیارهای تخمین پیچیدگی و تعداد مسیرهای اجرایی بستهشده توی تابع یا کلاسه.
این متریکها رو IDEها یا افزونههاشون یا ابزارهای مستقل یا سرویسهای ابری و غیرابری محاسبه و گزارش میکنن. حالا یکی قویتر، یکی ضعیفتر. ولی بیتفاوتی به اینها میتونه در طول زمان مشکلات زیادی ایجاد کنه. حالت بهینهاش هم که یکپارچگی با CI/CD و جلوگیری خودکار از ورود کد فاقد متریکهای قابل قبول به محیطهای استیج و پروداکشن است.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14 4❤3🔥2👏1
🍰 یک هفته دیگه، یعنی ۱۱ آگوست ۲۰۲۴ (۲۱ مرداد) یکسالگی کانال تکافترنون خواهد بود.
تصویر بالا، کارنامهی «بیمعنی» عملکردشه، چون تعداد پستها، اعضاء، ویو، فوروارد مطالب و... مادامیکه پشتوانهی «اثر معنادار» یا «یادگیری» نداشته باشن، تهی از معنی خواهند بود.
خوشحال میشم تا موضوع بعدی به انتخاب شما باشه، و امیدوارم از بین موضوعاتی که شما پیشنهاد بدید، موردی باشه که اندکی در موردش بدونم تا به عنوان مطلب «ویژه» برای یکسالگی کانال با هم بخونیمش...
منتظر پیشنهادات، فیدبک و نقد شما هستم... 😊
پینوشت:
۱. کد استخراج محتوای کانال تلگرامی به صورت بلاگ (JSON + HTML) و امکان فیلتر و جستوجو و آمار و... رو بهزودی منتشر میکنم.
۲. گزارش محبوبترین مطالب (بر حسب مشاهده، ریاکشن و فوروارد) رو هم میگذارم که شاید جالب باشه چه موضوعاتی بیشتر مورد توجه بوده طی این یک سال.
تصویر بالا، کارنامهی «بیمعنی» عملکردشه، چون تعداد پستها، اعضاء، ویو، فوروارد مطالب و... مادامیکه پشتوانهی «اثر معنادار» یا «یادگیری» نداشته باشن، تهی از معنی خواهند بود.
خوشحال میشم تا موضوع بعدی به انتخاب شما باشه، و امیدوارم از بین موضوعاتی که شما پیشنهاد بدید، موردی باشه که اندکی در موردش بدونم تا به عنوان مطلب «ویژه» برای یکسالگی کانال با هم بخونیمش...
منتظر پیشنهادات، فیدبک و نقد شما هستم... 😊
پینوشت:
۱. کد استخراج محتوای کانال تلگرامی به صورت بلاگ (JSON + HTML) و امکان فیلتر و جستوجو و آمار و... رو بهزودی منتشر میکنم.
۲. گزارش محبوبترین مطالب (بر حسب مشاهده، ریاکشن و فوروارد) رو هم میگذارم که شاید جالب باشه چه موضوعاتی بیشتر مورد توجه بوده طی این یک سال.
❤18👏3😍2
وقتی توسعه نرمافزار به صورت تیمی انجام میشه، فقط کیفیت کد یا معماری نیست که اهمیت داره؛ بلکه نحوهی همکاری، ریتم کاری تیم، ظرفیت تحویل، و الگوهای رفتاری در برابر چالشها هم به اندازهی کد مهم هستن، و خوشبختانه، قابل اندازهگیری هم میتونن باشن.
توی قسمت دوم، چند متریک مرتبط با تحلیل رفتار تیم در طول اسپرینتها و بازخوردهایی که از طریق Jira، GitHub/GitLab، و یا سایر سیستمهای دخیل در چرخه توسعه نرمافزار رو مرور میکنیم.
ادامه دارد...
عددها همیشه حرف آخر رو نمیزنن، اما خیلی وقتها شروع بهتری برای گفتوگو و تصمیمهای جمعی هستن. ترکیب دادههای Jira، Git، CI/CD، و ابزارهای متنوع موجود یا استفاده از API پلتفرمها برای استخراج و بعدش آنالیز اعداد، میتونه دید بسیار روشنی از سلامت فرآیند توسعه و رفتار تیم به ما بده و این جزوی از وظایف engineering managerها یا team leadهاست که نسبت به اعداد بیتفاوت نباشن و به صورت روشمند تحلیل کنن...
Please open Telegram to view this post
VIEW IN TELEGRAM
❤12 5🤓2👍1
در قسمتهای قبل در مورد متریکهای کد و متریکهای برنامهریزی نوشتم؛ این قسمت برخی از متریکهای مخزنکد رو مرور میکنیم...
زمان بین باز شدن یک pull request تا merge نهایی، یکی از شاخصهای کلیدی DevOps برای سنجش تحویل سریع و با کیفیته. افزایش Lead Time معمولاً به دلیل منتظر موندن برای review، test failure، یا فقدان reviewer فعاله.
نسبت PRهایی که حداقل یک بررسیکنندهی انسانی (non-author) داشتن. پوشش پایین میتونه امنیت، کیفیت و حتی حس تعلق تیمی رو تحت تاثیر قرار بده. اینکه ۱ نفر مرورکننده رو هم حذف یا جزو مستحبات حساب کنیم نتایج خوبی نداره؛ برخی شرکتهای بزرگ تا ۱۲ نفر (به جز AI داخلی) هر PR رو مرور میکنن برای سنجش کیفیت و امنیت کد.
اندازهی PRها از نظر تعداد خطوط تغییر یافته. PRهای بزرگتر باعث کاهش کیفیت review، فرسایش توجه reviewerها، و احتمال بیشتر برای بروز باگ میشن. عدد مناسب معمولاً زیر ۴۰۰ خطه (البته خودش شمارش خطوط کد بحث مفصلیه که انواع خط کد چیه؟ یا چجوری باید شمرد...)
چند بار در روز یا هفته PR merge میشه؟ این عدد نشون میده که آیا تیم به صورت پیوسته و در بازههای کوچک تحویل انجام میده یا تحویل به صورت big-bang و آخر اسپرینت صورت میگیره. بازههای کوچکتر = ریسک کمتر = feedback سریعتر. البته به استراتژی و سیاستهای توسعه نرمافزار شرکت خیلی وابسته است.
زمان از باز کردن PR تا merge شدنش. این متریک شامل چند مرحلهست: Time to First Review، Review Duration، و Time to Merge. PR های که بیش از ۴۸ ساعت طول میکشن، معمولاً کیفیت کد و روحیه تیم رو تحت تأثیر منفی قرار میدن.
درصد تغییراتی که پس از merge، نیاز به اصلاح یا revert پیدا میکنن. عدد بالا میتونه نشونهی ضعف در review یا تست ناکافی باشه.
تعداد باگهایی که بعد از merge به محیطهای بالاتر (Staging یا Production) منتقل میشن. این عدد برای سنجش کیفیت تحویل و اثربخشی فرآیند تست قبل از ادغام حیاتیه.
نسبت اعضای تیم که در بازهای مشخص، در reviewهای دیگران شرکت میکنن. مشارکت کم میتونه باعث ایجاد bottleneck یا کاهش کیفیت کد بشه.
PRهایی که مدت زیادی باز میمونن بدون فعالیت. این موارد معمولاً نشاندهنده مشکلات در اولویتبندی، درگیری منابع، یا ابهام در نیازمندیهاست.
📌 جمعبندی:
اندازهگیری این متریکها به خودی خود هدف نیست؛ هدف اصلی، ایجاد گفتوگو در تیم برای پیدا کردن گلوگاهها، بهبود تعاملات، و کاهش زمان و هزینه تحویل با حفظ کیفیته. اعداد، آینهای برای دیدن واقعیت کار تیمی ما هستند. بدون سوگیری، بدون توجیه! این متریکها هم یهویی و یکشبه قابل حصول نیستن، اول باید تصمیم بگیریم به سمت «قابلاندازهگیری شدن» حرکت کنیم؛ بعدتر اگر درست پیش بریم، متریک خواهیم داشت.
و در عین حال بدون شروع ولو با گامهای کوچیک هم چیزی محقق نمیشه!
Please open Telegram to view this post
VIEW IN TELEGRAM
❤11👍4🔥4👏2 1
🚀 «مدل عملیاتی محصول» برای تیمهای نرمافزاری
چجوری از «تحویل فیچر» به «تحویل ارزش» تغییر مسیر بدیم؟
وقتی ساختار تیمها (وظایف و تخصص افراد و ماموریت خود تیم) درست چیده نشه، خیلی راحت به دام «لیست وظایف» میوفتن، یعنی اینکه مرتبا تیم از خودش میپرسه: تسک بعدی چیه؟ فیچر بعدی کی باید ریلیز بشه؟
مدل عملیاتی محصول (Product Operating Model یا POM) میگه محور رو از «پروژه و خروجی» بچرخونیم به «محصول» و نتیجه (Outcome). این یعنی تیم رو حولِ ارزش واقعی برای کاربر و بیزنس سازماندهی کنیم، و از ایده تا اجرا و بهبود پیوسته، همه چیز رو یکجا متمرکز کنیم.
🎯 اصلا POM یعنی چه؟
یک چارچوب سازمانی که محصول رو در مرکز قرار میده و تیمهای چندتخصصه (مدیریت محصول، مهندسی، طراحی، دیتا، و...) بهصورت مداوم، و حول یک «چشمانداز روشن» با هم کار میکنن؛ نه اینکه پروژههای مقطعی داشته باشیم و تیم توسعه نرمافزار، فیچر رو تولید کنه، بعد تیم دیتا بدون اینکه سر تا ته داستان چی بوده فقط وظیفه داشته باشه مثلا کارهای data engineering رو انجام بده و بگه «انجام شد و تامام» و بره برای تیم بعدی و بعدی و بعدیش...
بلکه چرخهی عمر پیوستهی محصول، با بازخوردها و بهبودهای مکرر یکجا رقم میخوره.
نتیجه؟ پاسخگویی سریعتر به نیاز بازار و یادگیری دائمی تیم ← Domain knowledge (تخصص دامنه) توی تیم رسوب میکنه!
🧩 چه تغییری برای مهندسی ایجاد میشه؟
➖ تیمهای چندتخصصه و پایدار
مهندسها در تیمهای محصولِ ثابت کار میکنند، مالکیت «سر تا سری» از طراحی تا نگهداری دارن، و روی تجربهٔ کاربر و اثر بیزنسی حساسند.
➖ از پروژه به محصول
صورتمسئله از «تحویل فیچر» به «حل مسئله با Outcome مشخص» تغییر میکنه.
➖ اختیار و خودمختاری
تیم محصول (ازجمله مهندسی) دربارهی «چگونه حل کردن مسئله» تصمیم میگیره؛ با اسپرینتهای کوتاه، CI/CD و بازخورد پیوسته؛ و نه انجام خواسته یا وظیفهای که بهش محول شده.
➖ اندازهگیری بر پایهی نتیجه
موفقیت یعنی «ارزش تحویلی و یادگیری»، نه صرفاً اتمام تسک.
➖ همکاری مداوم
محصول، طراحی، مهندسی و بیزنس با دادهی واقعی و ریسرچ کاربر تصمیم میگیرن.
🏗 ساختار تیمها خیلی مهم هستن و بحث مفصلیه (اگر دوست داشتید مطلب Team Topologies رو بخونید یا ۱۰ دقیقه از این ویدیو رو از ۰۰:۵۷:۳۵ تا ۱:۰۸:۰۵ ببینید ) ولی هدف کلی اینه که کاهش بار شناختی (Cognitive Load) و تسهیل تحویل خودمختار محصول محقق بشن.
📊 مزایای عملی POM
برای سازمان:
- سرعت بازار: Time-to-market کمتر
- انعطاف: پاسخ سریعتر به تغییرات
- کیفیت: کاهش باگ و مشکلات فنی
- نوآوری: فضای بیشتر برای آزمایش و یادگیری
برای تیمها:
- مالکیت: احساس مسئولیت بالاتر نسبت به محصول
- انگیزه: دیدن تأثیر مستقیم کار روی کاربران
- یادگیری: رشد مهارتهای چندتخصصه
- خودمختاری: آزادی عمل در روشها
برای مهندسان:
- کمتر شدن Context switching
- درک عمیقتر از domain
- همکاری نزدیکتر با نقشهای دیگه
- تمرکز بر کیفیت کد و architecture
🚧 چالشهای پیادهسازی
مقاومت فرهنگی
نیازهای فنی
مهارتهای جدید
💡 نکات کلیدی
- تغییر تدریجی: یکباره همه چیز رو عوض نکنید. الکی هم زور نزنید چون نمیشه!!
- اندازهگیری: بدون metric، نمیتونید بهبود رو ببینید؛ لطفا به حستون اعتماد نکنید، اعداد دقیقتر از حس شما هستن.
- صبر: فرهنگسازی زمان میبره، عجله نکنید.
- یادگیری: از شکستها هم میشه یاد گرفت. خواهشا درگیر cognitive dissonance نشید!
- تطبیق: هر سازمان منحصربهفرده، کپیکاری نکنید!
در نظر داشته باشین که POM فقط یک چارچوب نیست، بلکه تغییر fundamental در نحوه فکر کردن درباره محصول و تیمسازیه. موفقیتش به commitment مدیریت و پذیرش تیمها بستگی داره. به درد هر سازمانی نمیخوره، دنبال خدا و خرما و خر و خیارشور و خربزه و ۷ تا چیز دیگه که با خ شروع بشن، به صورت همزمان نباشید... در سازمانی که بلوغ و دانش و تخصص و تجربه و تابآوری و... هنوز به نقطه حدنصاب نرسیده، نمیشه یهو بپریم POM پیاده کنیم. باید «یکی» «یکی» پیشنیازها رو اول انجام بدیم... مگه اینکه دنبال شوآف باشیم
چجوری از «تحویل فیچر» به «تحویل ارزش» تغییر مسیر بدیم؟
وقتی ساختار تیمها (وظایف و تخصص افراد و ماموریت خود تیم) درست چیده نشه، خیلی راحت به دام «لیست وظایف» میوفتن، یعنی اینکه مرتبا تیم از خودش میپرسه: تسک بعدی چیه؟ فیچر بعدی کی باید ریلیز بشه؟
مدل عملیاتی محصول (Product Operating Model یا POM) میگه محور رو از «پروژه و خروجی» بچرخونیم به «محصول» و نتیجه (Outcome). این یعنی تیم رو حولِ ارزش واقعی برای کاربر و بیزنس سازماندهی کنیم، و از ایده تا اجرا و بهبود پیوسته، همه چیز رو یکجا متمرکز کنیم.
🎯 اصلا POM یعنی چه؟
یک چارچوب سازمانی که محصول رو در مرکز قرار میده و تیمهای چندتخصصه (مدیریت محصول، مهندسی، طراحی، دیتا، و...) بهصورت مداوم، و حول یک «چشمانداز روشن» با هم کار میکنن؛ نه اینکه پروژههای مقطعی داشته باشیم و تیم توسعه نرمافزار، فیچر رو تولید کنه، بعد تیم دیتا بدون اینکه سر تا ته داستان چی بوده فقط وظیفه داشته باشه مثلا کارهای data engineering رو انجام بده و بگه «انجام شد و تامام» و بره برای تیم بعدی و بعدی و بعدیش...
بلکه چرخهی عمر پیوستهی محصول، با بازخوردها و بهبودهای مکرر یکجا رقم میخوره.
نتیجه؟ پاسخگویی سریعتر به نیاز بازار و یادگیری دائمی تیم ← Domain knowledge (تخصص دامنه) توی تیم رسوب میکنه!
🧩 چه تغییری برای مهندسی ایجاد میشه؟
مهندسها در تیمهای محصولِ ثابت کار میکنند، مالکیت «سر تا سری» از طراحی تا نگهداری دارن، و روی تجربهٔ کاربر و اثر بیزنسی حساسند.
صورتمسئله از «تحویل فیچر» به «حل مسئله با Outcome مشخص» تغییر میکنه.
تیم محصول (ازجمله مهندسی) دربارهی «چگونه حل کردن مسئله» تصمیم میگیره؛ با اسپرینتهای کوتاه، CI/CD و بازخورد پیوسته؛ و نه انجام خواسته یا وظیفهای که بهش محول شده.
موفقیت یعنی «ارزش تحویلی و یادگیری»، نه صرفاً اتمام تسک.
محصول، طراحی، مهندسی و بیزنس با دادهی واقعی و ریسرچ کاربر تصمیم میگیرن.
🏗 ساختار تیمها خیلی مهم هستن و بحث مفصلیه (اگر دوست داشتید مطلب Team Topologies رو بخونید یا ۱۰ دقیقه از این ویدیو رو از ۰۰:۵۷:۳۵ تا ۱:۰۸:۰۵ ببینید ) ولی هدف کلی اینه که کاهش بار شناختی (Cognitive Load) و تسهیل تحویل خودمختار محصول محقق بشن.
📊 مزایای عملی POM
برای سازمان:
- سرعت بازار: Time-to-market کمتر
- انعطاف: پاسخ سریعتر به تغییرات
- کیفیت: کاهش باگ و مشکلات فنی
- نوآوری: فضای بیشتر برای آزمایش و یادگیری
برای تیمها:
- مالکیت: احساس مسئولیت بالاتر نسبت به محصول
- انگیزه: دیدن تأثیر مستقیم کار روی کاربران
- یادگیری: رشد مهارتهای چندتخصصه
- خودمختاری: آزادی عمل در روشها
برای مهندسان:
- کمتر شدن Context switching
- درک عمیقتر از domain
- همکاری نزدیکتر با نقشهای دیگه
- تمرکز بر کیفیت کد و architecture
🚧 چالشهای پیادهسازی
مقاومت فرهنگی
نیازهای فنی
مهارتهای جدید
💡 نکات کلیدی
- تغییر تدریجی: یکباره همه چیز رو عوض نکنید. الکی هم زور نزنید چون نمیشه!!
- اندازهگیری: بدون metric، نمیتونید بهبود رو ببینید؛ لطفا به حستون اعتماد نکنید، اعداد دقیقتر از حس شما هستن.
- صبر: فرهنگسازی زمان میبره، عجله نکنید.
- یادگیری: از شکستها هم میشه یاد گرفت. خواهشا درگیر cognitive dissonance نشید!
- تطبیق: هر سازمان منحصربهفرده، کپیکاری نکنید!
در نظر داشته باشین که POM فقط یک چارچوب نیست، بلکه تغییر fundamental در نحوه فکر کردن درباره محصول و تیمسازیه. موفقیتش به commitment مدیریت و پذیرش تیمها بستگی داره. به درد هر سازمانی نمیخوره، دنبال خدا و خرما و خر و خیارشور و خربزه و ۷ تا چیز دیگه که با خ شروع بشن، به صورت همزمان نباشید... در سازمانی که بلوغ و دانش و تخصص و تجربه و تابآوری و... هنوز به نقطه حدنصاب نرسیده، نمیشه یهو بپریم POM پیاده کنیم. باید «یکی» «یکی» پیشنیازها رو اول انجام بدیم... مگه اینکه دنبال شوآف باشیم
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥13 5❤2
از اونجایی که تعداد تیمهایی که تلاش کردن/میکنن تا DDD رو پیادهسازی کنن و یا محصول مبتنی بر معماری مایکروسرویس توسعه بدن، ولی در میانهی راه متوجه دشواریها، مشکلات و یا اشتباهات متعدد طراحی و پیادهسازی میشن، کم نیست؛ خوبه تا پرسش رو مرور کنیم، تا اگر موضوع مورد اقبالی بود بیشتر در موردش گپ بزنیم.
تا حالا به خواستگاه و پیشینهی خالقین DDD یا Microservice توجه داشتید؟ منظورم «خواستگاه نیازهایی» است که به خاطر برطرف شدن اون نیازها، افرادی با «پیشینه و تجربهی مشخص در تعامل با نوع خاصی از مسائل و سازمانها» شروع به طراحی راهکار یا پاسخ برای اون نیازها در اون سازمانها کردن؛ و بعدتر این راهکارها در سازمانهایی با چه مختصات و ابعادی، توسط چه افرادی توسعه و تکامل پیدا کرد تا امروز به انضمام این تعداد کتاب و مقاله و ویدیو و کنفرانس، در اختیار ما باشه؟!
بیاید با هم چند تا سوال کاریکاتوریزه رو مرور کنیم:
۱: از نظر امکانات در دسترس: آیا یک پزشک حاذق که تمام عمرش در پیشرفتهترین بیمارستانهای ژاپن یا سوییس تحصیل و کسبتجربه کرده؛ به صورت مستقیم (و طبیعتا بدون تغییر و سازگارپذیری) میتونه بره در یکی از مناطق محروم اتیوپی شروع به درمان کنه؟
۲: از نظر مقیاسها: آیا مرسومه که از ابزارآلات تعمیر ماشینهای معدن در کارگاه ساعتسازی استفاده کنن یا برعکس؟
هدفم از طرح این دو سوال، اینه که خیلی از مشکلاتی که میبینیم به خاطر یک عدم سازگاری یا تناسب بین نیاز، شرایط، و راهکاره! توجه به پیشنیازهای محیطی، و بستری که یک معماری میتونه توش به شکل صحیح پیاده بشه، یا کمتر مورد توجه قرار میگیره یا با خطای ادراکی روبرو میشه و نتیجهاش یا شکسته، یا دردسر، یا موجود عجیبالخلقهای که کسی قادر به درکش نیست!
🔑 چاره کار چیه؟
» اگر دنبال یک مسیر قابل تعمیم به عام باشیم، راه رو به خطا رفتیم؛ عملا عیار یک architect یا software engineer سنیور یا بالاتر (بسته به سایز سازمان و محصول) در میزان موفقیت و ظرافتهای طراحی مسیر، راهکار و معماری مشخص میشه. قرار هم نبوده و نیست، همه یک میزان موفقیت کسب کنن. خیلیها هم شکست میخورن یا پیروزینمایی میکنن.
(موضوعاتی مثل Strategic DDD یا Modular Monolith/Modulith، شناسایی پیشنیازها، فازبندی تغییرات و پیادهسازی، امکانپذیری transformation و... میتونن محور این سری از مطالب باشن)
👨🏼🦳 مارتین فالر: توی مقاله معروف "Microservice Prerequisites" سه تا پیشنیاز اساسی رو مطرح میکند:
قابلیت Rapid provisioning: قابلیت راهاندازی سریع infrastructure
قابلیت Basic monitoring: نظارت و observability
قابلیت Rapid application deployment: استقرار سریع نرمافزار
«در صورت ادامه بحث، چند مورد دیگه رو هم من بنا به تجربه اضافه خواهم کرد»
👨🏼🦳 کریس ریچاردسون توی کتاب "Microservices Patterns" بحث pattern-based approach رو ارائه میکنه وبارها تأکید داره مایکروسرویس «نسخهی واحد برای همه» نیست و باید دید کِی و چرا سراغش بریم؛ حتی «دلایل نادرست برای پذیرش مایکروسرویس» رو هم مستند کرده.
👨🏼🦳 استفان تیلکوف توی مقاله «Don’t start with a monolith» میگه وقتی هدف نهایی شما معماریِ مایکروسرویس باشه (بهویژه برای سیستمهای بزرگ)، «شروع با مونولیت» غالباً انتخاب درستی نیست و باید از اول به مرزبندیهای سختگیرانه و سیستمهای مستقل فکر کرد. بعدتر تیلکوف الگوی Self-Contained Systems (SCS) رو هم بهعنوان رویکرد همخانواده و کماصطکاکتر معرفی میکنه. ۴ سال بعدش، سم نیومن میاد روی روشها و الگوهای تکاملی برای شکستن مونولیت تمرکز میکنه (نه نفی یا اثبات مطلق هر کدوم)، و راهکارهای عملی برای مهاجرت تدریجی ارائه میده. کتاب معروف نیومن یعنی "Monolith to Microservices" عملاً پاسخ عملیِ «چگونه از مونولیت به مایکروسرویس برسیم؟» حساب میشه (اینو گفتم که بگم بین علما و بزرگان هم تفاوت نظر وجود داره 😁 خصوصا در مورد فالر و ریچاردسون؛ چون فالر استراتژی «اول مونولیت» برای شروع کارهای جدید رو طرح میکنه و میگه با این نکته که حتی اگه بعداً احتمالاً به مایکروسرویس برسید! این دیدگاه روبهروی موضع تیلکوف قرار میگیره و نشون میده اختلافنظر معنادار بین علما جدیه! )
Please open Telegram to view this post
VIEW IN TELEGRAM
قسمت اول سری «مایکروسرویس و DDD برای تیمهای کوچیک؟»
✅ خواستگاه و قصهی شکلگیری
بعد از مقدمهای که هدفش طرح مسئله بود، این بار میخوام قبل از اینکه به سوال «چهکار کنیم؟» بپردازیم، در مورد «اینها از کجا اومدند؟» فکر کنیم. شاید پاسخ همین سوال که خواستگاه و مسئلهای که اینها براش به وجود اومدن، برای تصمیمگیری عدهای راهگشا باشه. من به برخی نیازها و خصوصیاتشون اشاره میکنم؛ و تصمیم با خواننده خواهد بود که آیا اساسا «مسئلهای که چنین پاسخهایی براش ایجاد شده» در سازمان و تیم و محصولش وجود داره یا نه؟
🎂 الف: DDD از کجا و از دل چه نیازی بیرون اومد؟
خالق: اریک ایوانز (Eric Evans)
سال انتشار: ۲۰۰۴
محیط پیدایش: شرکتهای بزرگ مشاورهای و enterprise.
اریک ایوانز از اوایل دهه ۹۰ میلادی روی پروژههای متعدد نرمافزاری و عموما مرتبط با شرکتهای «large enterprise» کار میکرده، و وقتی کتاب معروف "Domain-Driven Design: Tackling Complexity in the Heart of Software" رو در سال ۲۰۰۴ منتشر میکنه، عملا ماحصل یک دهه تجربهی کار روی سیستمهای پیچیده enterprise رو در قالب یک روش ساختاریافته معرفی کرد. سابقهی کار توی شرکتهایی که مسائل پیچیده بیزنسی دارن و نیازمند درک عمیق domain دارن رو کسب کرده بوده؛ و با تیمهای بزرگ (معمولاً +۲۰ نفر) که روی پروژههای چندساله کار میکردن رو داشته (خصوصیت مشترک چنین سازمانهایی).
توی این تیپ سازمانها هر domain، فرد یا افراد متخصص خودش رو داره که باید زیر و بم دامنه رو بدونن؛ و ارتباط بین دامنهای از طریق اون افراد ضروریه. اغلب هم Legacy systems دارن و باید با اونا integration انجام بشه.
مسئلهی اصلی: پیچیدگی دامنههای کسبوکار (قوانین متغیر، اصطلاحات تخصصی، استثناهای ریز و درشت، چندین سابدامین با رفتارهای متفاوت).
پاسخِ DDD: نزدیککردن مدل نرمافزار به زبان و منطق دامنه؛ با مفاهیمی مثل:
مفهوم Ubiquitous Language: یعنی اینکه تیم فنی و بیزنس، و به تبعش توی محصول و مستندات، برای یک مفهوم خاص، فقط یک ترم مشترک استفاده بشه. توی سیستمهای بزرگ و پیچیده، صدها و گاها چند هزار عبارت و مخفف استفاده میشه که اگر به سمت زبان مشترک نریم، توسعهدهنده یه جا یه مخفف رو میشنوه، یه جا ترم کامل، و یه جا یک کلمه از ترم رو؛ تا اینجا باعث گیج شدنش میشه، ولی مشکل بزرگتر وقتیه که ترمهای مشابه وجود داره و هر دامنه به فراخور میزان کاربرد، منظورش از یه ترم متفاوته و به یه چیز خاص اشاره میکنه. مثلا تعریفش از «هزینه» یه چیزیه که توسعه دهنده دامنه دیگه به یه چیز دیگه میگه «هزینه» (انواع مختلفی از هزینه مثل ثابت، متغیر، نیمه متغیر، مستقیم، توزیع و... بسته وجود داره)؛ و این عدم استفاده از یک زبان مشترک توی سازمانهای بزرگ، میتونه منجر به سردرگمی و اشتباهات محاسباتی و... بشه.
مفهوم Bounded Context میگه باید مرزبندی شفاف برای مدلها و معانی داشت؛ هر کانتکست فرهنگ خودش رو داره و باید دقیقا مشخص باشه کدوم قابلیت مربوط به کدوم دامنه میشه. توی سیستمهای خیلی بزرگ، خیلی وقتها باید چند جلسه با متخصصین دو تا دامنه بشینیم که بتونیم تصمیم بگیریم آیا این قابلیت توی کدوم دامنه قرار بگیره بهتره. (با نگاه پیادهسازی و همچنین آینده محصول).
بارها پیش میاد که توی سازمان بزرگ باید بگردی توی مستندات یا از افراد مختلف، که متخصص فلان دامنه کیه، چون حتی نمیشناسیش!
مفهوم Context Mapping، یعنی نقشهی ارتباط بین bounded contextsها، که ارتباط بین کانتکستها رو هم از منظر روابط تیمها تبیین میکنه هم از نظر الگوهای ارتباطی. به بیان ساده، اینقدر داستان بزرگ و پیچیده هست که نیازه تا برای ارتباط بین تیمهای متعدد، که گاها به چند ده، یا حتی چند صد تیم میرسه، بیان بگن انواع ارتباطات بین کانتکستها و تیمها در چه قالبهایی میگنجه.
اینها توصیف مختصری از خواستگاه و بافتار پیدایشی DDD بود که توسط برخی از جواگره حتی گاها با domain-centric جابجا بیان میشه!
حالا کجا این مفاهیم شکوفا شده؟ پاسخ: سازمانهای عمدتا بزرگ و بعدتر متوسط (در مقیاس جهانی)، چرا تعریف مقیاس و سایز مهمه؟ چون گاهی ما به یه شرکت ۳۰۰ نفره میگیم بزرگ!! که واقعا بزرگ محسوب نمیشه. یا گاهی یک سازمان ۱۱ هزار نفره رو بزرگ میدونیم، درحایلکه ساختارش از نظر بلوغ، شبیه یک شرکت ۵۰ نفره است (مثال و تجربه عینی توی ذهنمه 😁). در چنین فضاهایی، DDD هزینهی هماهنگی رو کم، و سرعت تغییرِ درست رو زیاد میکنه خصوصا که چرخهی عمر بلندمدت دارن. ولی وقتی سعی میکنیم قبای بزرگتر از قامتمون تن کنیم، تبدیل به یه شوخی پرهزینه خواهیم شد.
اگر دوست داشتید قسمت بعد رو با همین رویه در مورد مایکروسرویس گپ بزنیم:⚙️
و اگر دوست داشتید تمایز DDD و domain-centric:🤪
بعد از مقدمهای که هدفش طرح مسئله بود، این بار میخوام قبل از اینکه به سوال «چهکار کنیم؟» بپردازیم، در مورد «اینها از کجا اومدند؟» فکر کنیم. شاید پاسخ همین سوال که خواستگاه و مسئلهای که اینها براش به وجود اومدن، برای تصمیمگیری عدهای راهگشا باشه. من به برخی نیازها و خصوصیاتشون اشاره میکنم؛ و تصمیم با خواننده خواهد بود که آیا اساسا «مسئلهای که چنین پاسخهایی براش ایجاد شده» در سازمان و تیم و محصولش وجود داره یا نه؟
🎂 الف: DDD از کجا و از دل چه نیازی بیرون اومد؟
خالق: اریک ایوانز (Eric Evans)
سال انتشار: ۲۰۰۴
محیط پیدایش: شرکتهای بزرگ مشاورهای و enterprise.
اریک ایوانز از اوایل دهه ۹۰ میلادی روی پروژههای متعدد نرمافزاری و عموما مرتبط با شرکتهای «large enterprise» کار میکرده، و وقتی کتاب معروف "Domain-Driven Design: Tackling Complexity in the Heart of Software" رو در سال ۲۰۰۴ منتشر میکنه، عملا ماحصل یک دهه تجربهی کار روی سیستمهای پیچیده enterprise رو در قالب یک روش ساختاریافته معرفی کرد. سابقهی کار توی شرکتهایی که مسائل پیچیده بیزنسی دارن و نیازمند درک عمیق domain دارن رو کسب کرده بوده؛ و با تیمهای بزرگ (معمولاً +۲۰ نفر) که روی پروژههای چندساله کار میکردن رو داشته (خصوصیت مشترک چنین سازمانهایی).
توی این تیپ سازمانها هر domain، فرد یا افراد متخصص خودش رو داره که باید زیر و بم دامنه رو بدونن؛ و ارتباط بین دامنهای از طریق اون افراد ضروریه. اغلب هم Legacy systems دارن و باید با اونا integration انجام بشه.
مسئلهی اصلی: پیچیدگی دامنههای کسبوکار (قوانین متغیر، اصطلاحات تخصصی، استثناهای ریز و درشت، چندین سابدامین با رفتارهای متفاوت).
پاسخِ DDD: نزدیککردن مدل نرمافزار به زبان و منطق دامنه؛ با مفاهیمی مثل:
مفهوم Ubiquitous Language: یعنی اینکه تیم فنی و بیزنس، و به تبعش توی محصول و مستندات، برای یک مفهوم خاص، فقط یک ترم مشترک استفاده بشه. توی سیستمهای بزرگ و پیچیده، صدها و گاها چند هزار عبارت و مخفف استفاده میشه که اگر به سمت زبان مشترک نریم، توسعهدهنده یه جا یه مخفف رو میشنوه، یه جا ترم کامل، و یه جا یک کلمه از ترم رو؛ تا اینجا باعث گیج شدنش میشه، ولی مشکل بزرگتر وقتیه که ترمهای مشابه وجود داره و هر دامنه به فراخور میزان کاربرد، منظورش از یه ترم متفاوته و به یه چیز خاص اشاره میکنه. مثلا تعریفش از «هزینه» یه چیزیه که توسعه دهنده دامنه دیگه به یه چیز دیگه میگه «هزینه» (انواع مختلفی از هزینه مثل ثابت، متغیر، نیمه متغیر، مستقیم، توزیع و... بسته وجود داره)؛ و این عدم استفاده از یک زبان مشترک توی سازمانهای بزرگ، میتونه منجر به سردرگمی و اشتباهات محاسباتی و... بشه.
مفهوم Bounded Context میگه باید مرزبندی شفاف برای مدلها و معانی داشت؛ هر کانتکست فرهنگ خودش رو داره و باید دقیقا مشخص باشه کدوم قابلیت مربوط به کدوم دامنه میشه. توی سیستمهای خیلی بزرگ، خیلی وقتها باید چند جلسه با متخصصین دو تا دامنه بشینیم که بتونیم تصمیم بگیریم آیا این قابلیت توی کدوم دامنه قرار بگیره بهتره. (با نگاه پیادهسازی و همچنین آینده محصول).
بارها پیش میاد که توی سازمان بزرگ باید بگردی توی مستندات یا از افراد مختلف، که متخصص فلان دامنه کیه، چون حتی نمیشناسیش!
مفهوم Context Mapping، یعنی نقشهی ارتباط بین bounded contextsها، که ارتباط بین کانتکستها رو هم از منظر روابط تیمها تبیین میکنه هم از نظر الگوهای ارتباطی. به بیان ساده، اینقدر داستان بزرگ و پیچیده هست که نیازه تا برای ارتباط بین تیمهای متعدد، که گاها به چند ده، یا حتی چند صد تیم میرسه، بیان بگن انواع ارتباطات بین کانتکستها و تیمها در چه قالبهایی میگنجه.
اینها توصیف مختصری از خواستگاه و بافتار پیدایشی DDD بود که توسط برخی از جواگره حتی گاها با domain-centric جابجا بیان میشه!
حالا کجا این مفاهیم شکوفا شده؟ پاسخ: سازمانهای عمدتا بزرگ و بعدتر متوسط (در مقیاس جهانی)، چرا تعریف مقیاس و سایز مهمه؟ چون گاهی ما به یه شرکت ۳۰۰ نفره میگیم بزرگ!! که واقعا بزرگ محسوب نمیشه. یا گاهی یک سازمان ۱۱ هزار نفره رو بزرگ میدونیم، درحایلکه ساختارش از نظر بلوغ، شبیه یک شرکت ۵۰ نفره است (مثال و تجربه عینی توی ذهنمه 😁). در چنین فضاهایی، DDD هزینهی هماهنگی رو کم، و سرعت تغییرِ درست رو زیاد میکنه خصوصا که چرخهی عمر بلندمدت دارن. ولی وقتی سعی میکنیم قبای بزرگتر از قامتمون تن کنیم، تبدیل به یه شوخی پرهزینه خواهیم شد.
اگر دوست داشتید قسمت بعد رو با همین رویه در مورد مایکروسرویس گپ بزنیم:
و اگر دوست داشتید تمایز DDD و domain-centric:
Please open Telegram to view this post
VIEW IN TELEGRAM
قسمت دوم سری «مایکروسرویس و DDD برای تیمهای کوچیک؟»
✅ خواستگاه و قصهی شکلگیری مایکروسرویس (بخش ۱)
مثل دو قسمت قبل، هدفم اینه که خواستگاه مایکروسرویس رو مرور کنم، تا بدونیم آیا «مسئلهی مشترک» باهاش داریم یا نه!
خلق و ترویج مایکروسرویس رو نمیشه به یک نفر خاص نسبت داد، بلکه یه «جریان صنعتی» بود که با ایدهها و نوشتههای فالر و جیمز لوئیس پررنگ شد، بعدتر با تجربههای نتفلیکس و آمازون عملی شد، و سم نیومن اون رو با «راهنمای مهاجرت» همراه کرد. حوالی ۲۰۱۳–۲۰۱۶، همزمان با بلوغ DevOps، کانتینرها و CI/CD تبدیل به تب داغ صنعت شد و خواستگاهش هم عمدتا شرکتهای بزرگی بود که پلتفرم دیجیتال بومیای داشتن که توسط تیمهای چندمهارته توسعه داده میشد و نیاز به تغییرات مداوم، مقیاسپذیری و تابآوری بالا هم بینشون خصیصه مشترک بود.
یعنی شرکتهای بزرگ تکنولوژی مثل آمازون، نتفلیکس و گوگل توی مسیر رشد سریع و بزرگشدن تیمهای مهندسیشون، با مشکلات مشابهی در معماری Monolith مواجه بودن و به راهحلهای مشابهی رسیدن.
وقتی این شرکتها تیمهای مهندسی چند صد نفره (و حتی چندهزار نفره) داشتن که همگی روی یک یا چند کدبیس خیلی بزرگ کار میکردن، یه تغییر کوچیک توی یک بخش از سیستم، نیاز به تست و دیپلوی کل سیستم رو به وجود میآورد، که طبیعتا فرآیند کند و به شدت پرریسکی محسوب میشد.
❓ مسئلهی اصلی چی بود؟
🔤 استقلال تیمی برای تحویل سریعتر (کاهش وابستگیهای سفتوسخت بین تیمها).
🔤 مقیاسپذیری ناهمگن.
🔤 تابآوری و تحمل خطا (خرابی یک بخش، کل سیستم رو نخوابونه).
🔤 پیچیدگی سازمانی (دهها/صدها تیم، دامنههای متعدد، خطوط توسعه موازی).
به بیان سادهتر، مسئلهی اصلی، تنگناهای معماری Monolith در مقیاس بزرگ؛ یعنی کندی توسعه، سختی در اعمال تکنولوژیهای جدید، ریسک بالای Deployment و مشکلات مقیاسپذیری (Scalability) بود.
💡 پاسخ مایکروسرویس چی بود؟ شکستن اپلیکیشن یکپارچه به مجموعهای از سرویسهای کوچیک، مستقل، و با ارتباطات سبک؛ با مفاهیمی مثل:
➖ استقلال در استقرار: هر سرویس یک واحد مستقل محسوب میشه که میتونه بدون نیاز به هماهنگی با سایر سرویسها، توسعه داده بشه، تست و نهایتا منتشر بشه. این ویزگی برای سازمانی با دهها یا صدها تیم که هرکدوم میخوان با سرعت حرکت کنن، نعمته. دیگر لازم نیست تیم «پرداخت» منتظر تیم «انبارداری» بمونه تا با هم محصول رو منتشر کنن.
➖ سازماندهی حول قابلیتهای کسبوکار: این خیلی شبیه به مفهوم Bounded Context در DDD است که توی پست قبل اشاره کردم. هر سرویس مسئول یک قابلیت کامل بیزنسیه (مثلا مدیریت کاربرها، سیستم پیشنهاددهی، یا پردازش پرداخت). این یعنی تیمها مالکیت کامل یک بخش از بیزنس رو عهده میگیرن.
➖ حاکمیت و دادههای غیرمتمرکز: هر تیم میتونه تکنولوژی (زبان برنامهنویسی، دیتابیس و...) مناسب برای سرویس خودش رو انتخاب کنه. سرویس «جستجو» میتونه از Elasticsearch استفاده کنه در حالی که سرویس «مالی» از PostgreSQL استفاده کنه. این انعطاف، به تیمها اجازه میده بهترین ابزار رو برای حل مسئلهشون به کار بگیرن، اما در عین حال پیچیدگی نگهداری و هماهنگی رو «به شدت» بالا میبره.
➖ اتوماسیون زیرساخت: مایکروسرویس بدون فرهنگ DevOps و ابزارهای CI/CD تقریبا غیرممکنه. وقتی به جای یک اپلیکیشن، دهها یا صدها سرویس برای مدیریت، مانیتورینگ و استقرار دارید، تنها راه نجات، اتوماسیون کامل فرآیندهاست.
🔤 «یک سرویس = یک قابلیتِ واضح + تیمِ مالک + داده/قراردادِ مستقل + چرخهی انتشارِ مستقل»
♻️ پیشفرضهای محیطی (زمین بازی)
مایکروسرویس نه صرفاً معماریِ کُد، که طراحی سازمانیه (قانون کانوی). بدون این پیشفرضها، نتیجه معمولاً «مونولیتِ توزیعشده» است:
*️⃣ زیرساختِ خودکار: IaC، محیطهای چندگانه، انتشار بیدرد (Blue/Green, Canary).
*️⃣ پایپلاینهای CI/CD بالغ: تست خودکار، کیفیت پایدار، Rollback ساده.
*️⃣ قابلیت Observability: لاگ همبسته، تریس توزیعشده، متریک، آلارم.
*️⃣ قراردادهای پایدار: نسخهبندی API/اسکیما، سازگاری تدریجی، Consumer-Driven Contracts.
*️⃣ مالکیت داده: تا حد امکان دیتابیسِ اختصاصی/طرح تجمیع رویدادها؛ پرهیز از «Shared DB».
*️⃣ نضباط توزیعی: مدیریت شکست شبکه، Retry/Timeout/Idempotency، Backpressure.
*️⃣ فرهنگ تیمی: تیمهای کوچکِ end-to-end با ریشهی DevOps.
ادامه دارد...
مثل دو قسمت قبل، هدفم اینه که خواستگاه مایکروسرویس رو مرور کنم، تا بدونیم آیا «مسئلهی مشترک» باهاش داریم یا نه!
خلق و ترویج مایکروسرویس رو نمیشه به یک نفر خاص نسبت داد، بلکه یه «جریان صنعتی» بود که با ایدهها و نوشتههای فالر و جیمز لوئیس پررنگ شد، بعدتر با تجربههای نتفلیکس و آمازون عملی شد، و سم نیومن اون رو با «راهنمای مهاجرت» همراه کرد. حوالی ۲۰۱۳–۲۰۱۶، همزمان با بلوغ DevOps، کانتینرها و CI/CD تبدیل به تب داغ صنعت شد و خواستگاهش هم عمدتا شرکتهای بزرگی بود که پلتفرم دیجیتال بومیای داشتن که توسط تیمهای چندمهارته توسعه داده میشد و نیاز به تغییرات مداوم، مقیاسپذیری و تابآوری بالا هم بینشون خصیصه مشترک بود.
یعنی شرکتهای بزرگ تکنولوژی مثل آمازون، نتفلیکس و گوگل توی مسیر رشد سریع و بزرگشدن تیمهای مهندسیشون، با مشکلات مشابهی در معماری Monolith مواجه بودن و به راهحلهای مشابهی رسیدن.
وقتی این شرکتها تیمهای مهندسی چند صد نفره (و حتی چندهزار نفره) داشتن که همگی روی یک یا چند کدبیس خیلی بزرگ کار میکردن، یه تغییر کوچیک توی یک بخش از سیستم، نیاز به تست و دیپلوی کل سیستم رو به وجود میآورد، که طبیعتا فرآیند کند و به شدت پرریسکی محسوب میشد.
به بیان سادهتر، مسئلهی اصلی، تنگناهای معماری Monolith در مقیاس بزرگ؛ یعنی کندی توسعه، سختی در اعمال تکنولوژیهای جدید، ریسک بالای Deployment و مشکلات مقیاسپذیری (Scalability) بود.
♻️ پیشفرضهای محیطی (زمین بازی)
مایکروسرویس نه صرفاً معماریِ کُد، که طراحی سازمانیه (قانون کانوی). بدون این پیشفرضها، نتیجه معمولاً «مونولیتِ توزیعشده» است:
ادامه دارد...
Please open Telegram to view this post
VIEW IN TELEGRAM
قسمت سوم سری «مایکروسرویس و DDD برای تیمهای کوچیک؟»
✅ خواستگاه و قصهی شکلگیری مایکروسرویس (بخش ۲)
🤦🏻♂️ سوءبرداشتهای پرتکرار
🔤 برای سرعت، حتماً مایکروسرویس!: اگر مشکل دارید؛ شاید پاسخ مشکلتون چیز دیگهای یا از جای دیگهای باشه. سربارِ ارتباطات مضاعف شبکهای و بین سرویسی رو در نظر بگیرید که از چاله به چاه نیوفتید. شاید Modular Monolith/Modulith با مرزبندی درست، سریعتر و کمریسکتر باشه.
🔤 هر جدول = یک سرویس: واحد تقسیم و شکستن سرویسها «قابلیت یا کانتکست» است، نه جدول.
🔤 مایکروسرویس = کوبرنتیز: کوبرنتیز ابزاره، نه توجیه. کاش وقت شه روزی خواستگاه کوبرنتیز رو هم بنویسم تا با ۳ تا سرور فیزیکی فاز «مقیاسپیذیری» بر نداریم! swarm و k3s و... هم هستن!
🔤 سرویس کوچیکتر ⇒ بهتر: ریزدانهگیِ افراطی، انفجار هماهنگی به بار میاره!
🔤 میخواهیم تراکنش توزیعشدهی سراسری داشته باشیم: نشونهی تقسیم و شکست غلطه؛ به event-driven و... فکر کنید.
🗑 بوی بدی (Smells) که نشون میده راه رو کج رفتیم
- انتشار همزمان چند سرویس برای یک تغییر کوچیک (Coupling پنهان).
- استفاده از Shared Database/Schema بین سرویسها.
- آشفتگی ارتباطات (چند ده Call برای یک درخواست کاربر).
- استفاده سراسری از Two-Phase Commit (2PC)، بدون پذیرش event-driven/Outbox/....
- کتابخونههای Shared سنگین که نسخهبندی رو قفل میکنن (بهجای قرارداد سبک).
💀 چه زمانی سراغش نرویم؟
- یک یا دو تیم کوچیک دارید و بیشترین درد شما کیفیت تست/اتوماسیون/استقراره؛ نه مرزهای دامنه.
- تغییرات کمبسامده و پیچیدگی دامنه متوسط.
- هنوز Observability، CI/CD، IaC در سطح پایهای هم آماده نیست.
- «مالکیتِ end-to-end» برای هیچ سرویس/تیمی تعریف نشده.
در این حالتها، Modulith با مرزبندی DDD (Bounded Context) «پلهی اول» بهتریه. هم بدهی معماری تولید نمیکنید، هم راهِ جداسازی آینده رو باز میگذارید.
🌱 نشونههای آمادگی :
- میتونید برای یک قابلیت، تیمِ مالک، بکلاگ، KPI و انتشار مستقل تعریف کنید.
- مولفههای Trace/Log/Metric شما پاسخگوست: «اگر چیزی خراب شد، میدونید دقیقاً کجا و چرا؟»
- قراردادهایتان نسخهپذیره و Breaking Change رو تدریجی عرضه میکنید.
- دادهها مالک مشخص دارن و اشتراکِ مستقیمِ Schema ندارید.
- در لایهی ارتباطات Fail-Fast/Retry/Timeout/Idempotency، «پروتکل تیم» است نه لطفِ داوطلبانهی دولوپرها.
جمعبندی:
مایکروسرویس پاسخیه به استقلال تیمی، مقیاسپذیری ناهمگن و تحویل پیوسته در سازمانهای بزرگ/روبهرشد با زیرساخت و فرهنگ آماده.
اگر این زمین بازی فراهم نباشه، نتیجه معمولاً پیچیدگی توزیعشده است، نه چابکی!
🤦🏻♂️ سوءبرداشتهای پرتکرار
- انتشار همزمان چند سرویس برای یک تغییر کوچیک (Coupling پنهان).
- استفاده از Shared Database/Schema بین سرویسها.
- آشفتگی ارتباطات (چند ده Call برای یک درخواست کاربر).
- استفاده سراسری از Two-Phase Commit (2PC)، بدون پذیرش event-driven/Outbox/....
- کتابخونههای Shared سنگین که نسخهبندی رو قفل میکنن (بهجای قرارداد سبک).
💀 چه زمانی سراغش نرویم؟
- یک یا دو تیم کوچیک دارید و بیشترین درد شما کیفیت تست/اتوماسیون/استقراره؛ نه مرزهای دامنه.
- تغییرات کمبسامده و پیچیدگی دامنه متوسط.
- هنوز Observability، CI/CD، IaC در سطح پایهای هم آماده نیست.
- «مالکیتِ end-to-end» برای هیچ سرویس/تیمی تعریف نشده.
در این حالتها، Modulith با مرزبندی DDD (Bounded Context) «پلهی اول» بهتریه. هم بدهی معماری تولید نمیکنید، هم راهِ جداسازی آینده رو باز میگذارید.
🌱 نشونههای آمادگی :
- میتونید برای یک قابلیت، تیمِ مالک، بکلاگ، KPI و انتشار مستقل تعریف کنید.
- مولفههای Trace/Log/Metric شما پاسخگوست: «اگر چیزی خراب شد، میدونید دقیقاً کجا و چرا؟»
- قراردادهایتان نسخهپذیره و Breaking Change رو تدریجی عرضه میکنید.
- دادهها مالک مشخص دارن و اشتراکِ مستقیمِ Schema ندارید.
- در لایهی ارتباطات Fail-Fast/Retry/Timeout/Idempotency، «پروتکل تیم» است نه لطفِ داوطلبانهی دولوپرها.
جمعبندی:
مایکروسرویس پاسخیه به استقلال تیمی، مقیاسپذیری ناهمگن و تحویل پیوسته در سازمانهای بزرگ/روبهرشد با زیرساخت و فرهنگ آماده.
اگر این زمین بازی فراهم نباشه، نتیجه معمولاً پیچیدگی توزیعشده است، نه چابکی!
✍️ پینوشت: اگر تا اینجا این چند پست رو دنبال کردید، امیدوارم مفید بوده باشه. اعداد نشون میده که خوبه که این بحث رو اینجا متوقف کنیم. لذا پستهای بعدی احتمالا به موضوعات دیگهای اختصاص خواهد داشت.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15❤5✍1🥴1
tech-afternoon
🎞 فیلم مستند پایتون! شرکت Cult-Repo که کارش روایت داستان محصولات کدباز در مدیوم فیلمه، حالا فیلم جدیدی در راه داره... پایتون! من فیلمهاشون رو دوست دارم و نوع متفاوتی از یادگیری داره. اگر شما هم به این موضوعات علاقه دارید، دنبالشون کنید دوستانی که از قدیمیتر…
مستند پایتون... منتشر شد!
فیلم خیلی خوبیه، مهم نیست پایتوننویس هستید یا نه، الهامبخشیاش از جایی میاد که یه پروژهی جانبی دهه ۹۰ میلادی در آمستردام چرا و چجوری تبدیل به یه زبان محبوب و پرکاربرد شد!
📱 تماشا در یوتیوب
فیلم خیلی خوبیه، مهم نیست پایتوننویس هستید یا نه، الهامبخشیاش از جایی میاد که یه پروژهی جانبی دهه ۹۰ میلادی در آمستردام چرا و چجوری تبدیل به یه زبان محبوب و پرکاربرد شد!
📱 تماشا در یوتیوب
YouTube
The Story of Python and how it took over the world | Python: The Documentary
This is the story of the world's most beloved programming language: Python. What began as a side project in Amsterdam during the 1990s became the software powering artificial intelligence, data science and some of the world’s biggest companies. But Python's…
❤5 5👍2😍1
🧠 🚀 هوش مصنوعی در تیم توسعه: ابزار روزمره به جای تقلب!
با رایج شدن مدلهای هوش مصنوعی توی محیطهای توسعه؛ مسیر تعامل برنامهنویس با مدل، از حالت پرسش و پاسخ یا Ask، به توانمندی ویرایش یا Edit رسید و بعدتر به حالت Agent. در طول این مسیر، نیاز به سر و سامون دادن به رفتار مدل و اعمال تنظیمات دلخواه، ضرورتش بیشتر و بیشتر شد. حالا این تنظیمات میتونه پرامپتهای از پیش ذخیره شده باشه برای صرفهجویی در زمان، یا مثلا دستورالعملهایی مثل ساختار نامگذاری متغیرها یا اینکه همیشه لاگها رو به شیوه خاص بنویسه یا... برای همین فایلهایی مثل
توی این پست، اول این فایلها رو با مثال مرور میکنم، بعدتر به اهمیت توجه به یکسانسازی/استانداردسازی اونها در تیمهای توسعه توسط platform engineering خواهم نوشت. این ابزارها خیلی سریع دارن توی ریپازیتوریهای حرفهای و شرکتها، جا میافتن و مهمه که بدونیم دقیقاً چیان؟ چرا مهمان؟ و اصلاً چطور میتونن به تیم ما کمک کنن؟
✅ این فایلها چی هستن؟
اگه بخوام ساده بگم، این فایلها نقش «دستورالعمل استفاده از هوش مصنوعی» رو دارن برای توسعهدهندهها و ابزارهای هوشمند مثل GitHub Copilot، Cody، یا حتی agentهای داخلی تیمها.
به کمک این فایلها، میتونیم به ابزار AI یاد بدیم که:
- چه سبکی از کدنویسی رو تو پروژهمون ترجیح میدیم
- از چه کتابخونهها یا معماریهایی استفاده میکنیم
- چه چیزهایی ممنوعه یا نیاز به تایید دارن
- حتی چه تسکهایی رو میتونه خودش انجام بده یا نیمهکاره پیشنویس بزنه
🔧 مثالهای کاربردی:
👨💻فایل copilot-instructions.md:
فایل سادهایه که توش توضیح میدیم Copilot تو این ریپو چطوری باید رفتار کنه. مثلاً:
- از Flurl.Http استفاده کن، نه HttpClient
- وقتی اسم متد با Get شروع شد، حتماً یه تست یونیت بساز
- همیشه Exceptionهای گلوبال با ProblemDetails هندل میشن
🤖 فایل AGENTS.md:
اگه تو تیممون agent داریم (مثلاً برای اینکه PR میزنه یا کد جنریت میکنه؛ یا از منابع کانفلوئنس شرکت اطلاعات میخونه یا به جیرا دسترسی داره یا...)، این فایل نقش پروفایل اون agent رو داره.
توش توضیح میدیم که این agent قراره چی کار کنه، چه دادهای داره، چه دامنۀ تصمیمگیریای داره و کی باید بررسی کنه خروجیاشو.
📘 فایل .instructions.md:
یه فایل کلیتر برای راهنمایی خود ابزارها یا همتیمیها. توش ممکنه توضیح بدیم تو این پروژه چه Naming Convention داریم، چطوری باید migration ساخت، یا اینکه اصلاً ساختار پوشهها چطوریه.
ادامه در پست بعدی...
با رایج شدن مدلهای هوش مصنوعی توی محیطهای توسعه؛ مسیر تعامل برنامهنویس با مدل، از حالت پرسش و پاسخ یا Ask، به توانمندی ویرایش یا Edit رسید و بعدتر به حالت Agent. در طول این مسیر، نیاز به سر و سامون دادن به رفتار مدل و اعمال تنظیمات دلخواه، ضرورتش بیشتر و بیشتر شد. حالا این تنظیمات میتونه پرامپتهای از پیش ذخیره شده باشه برای صرفهجویی در زمان، یا مثلا دستورالعملهایی مثل ساختار نامگذاری متغیرها یا اینکه همیشه لاگها رو به شیوه خاص بنویسه یا... برای همین فایلهایی مثل
AGENTS.md یا .github/copilot-instructions.md یا .instructions.md به وجود اومدن.توی این پست، اول این فایلها رو با مثال مرور میکنم، بعدتر به اهمیت توجه به یکسانسازی/استانداردسازی اونها در تیمهای توسعه توسط platform engineering خواهم نوشت. این ابزارها خیلی سریع دارن توی ریپازیتوریهای حرفهای و شرکتها، جا میافتن و مهمه که بدونیم دقیقاً چیان؟ چرا مهمان؟ و اصلاً چطور میتونن به تیم ما کمک کنن؟
✅ این فایلها چی هستن؟
اگه بخوام ساده بگم، این فایلها نقش «دستورالعمل استفاده از هوش مصنوعی» رو دارن برای توسعهدهندهها و ابزارهای هوشمند مثل GitHub Copilot، Cody، یا حتی agentهای داخلی تیمها.
به کمک این فایلها، میتونیم به ابزار AI یاد بدیم که:
- چه سبکی از کدنویسی رو تو پروژهمون ترجیح میدیم
- از چه کتابخونهها یا معماریهایی استفاده میکنیم
- چه چیزهایی ممنوعه یا نیاز به تایید دارن
- حتی چه تسکهایی رو میتونه خودش انجام بده یا نیمهکاره پیشنویس بزنه
🔧 مثالهای کاربردی:
👨💻فایل copilot-instructions.md:
فایل سادهایه که توش توضیح میدیم Copilot تو این ریپو چطوری باید رفتار کنه. مثلاً:
- از Flurl.Http استفاده کن، نه HttpClient
- وقتی اسم متد با Get شروع شد، حتماً یه تست یونیت بساز
- همیشه Exceptionهای گلوبال با ProblemDetails هندل میشن
.github/copilot-instructions.md
# Shared Platform Coding Standards
- Use `async/await`, not callbacks.
- Follow project’s naming conventions.
- Include dependency vulnerability tagging in comments.
- Provide default error handling structure.
- Always include logging statements.
🤖 فایل AGENTS.md:
اگه تو تیممون agent داریم (مثلاً برای اینکه PR میزنه یا کد جنریت میکنه؛ یا از منابع کانفلوئنس شرکت اطلاعات میخونه یا به جیرا دسترسی داره یا...)، این فایل نقش پروفایل اون agent رو داره.
توش توضیح میدیم که این agent قراره چی کار کنه، چه دادهای داره، چه دامنۀ تصمیمگیریای داره و کی باید بررسی کنه خروجیاشو.
AGENTS.md
# AGENTS.md — Developer Platform Guide for AI Agents
## Environment Setup
- `make setup` to install dependencies.
- `make test` for running full test suite.
- `docker compose up` to launch local services.
## Code Style
- Pre-commit: `black`, `isort`, `eslint`.
- Linting: `./tools/lint`.
- Tests: coverage must exceed 85%.
## Development Workflow
- Branch naming: `feat/*`, `fix/*`.
- PR guidelines: include ticket link, test coverage, and denoscription.
## Platform Behavior
- Always run `make build` before tests.
- Platform maintains shared Docker images, secrets, and env configurations.
📘 فایل .instructions.md:
یه فایل کلیتر برای راهنمایی خود ابزارها یا همتیمیها. توش ممکنه توضیح بدیم تو این پروژه چه Naming Convention داریم، چطوری باید migration ساخت، یا اینکه اصلاً ساختار پوشهها چطوریه.
backend.instructions.md
---
applyTo: "backend/**/*.py"
---
# Backend Python Guidelines
- Format using Black (line length 88).
- Use Pydantic for input validation.
- Comment public functions with docstrings.
- Follow platform’s API client patterns.
ادامه در پست بعدی...
Please open Telegram to view this post
VIEW IN TELEGRAM
tech-afternoon
🧠 🚀 هوش مصنوعی در تیم توسعه: ابزار روزمره به جای تقلب! با رایج شدن مدلهای هوش مصنوعی توی محیطهای توسعه؛ مسیر تعامل برنامهنویس با مدل، از حالت پرسش و پاسخ یا Ask، به توانمندی ویرایش یا Edit رسید و بعدتر به حالت Agent. در طول این مسیر، نیاز به سر و سامون…
ادامه و جمعبندی:
🏗 پیشنهاد برای تیمها و شرکتها:
قبل از اینکه مدلهای زبانی تبدیل به ابزار تقلب یا تولید کدهای «نفهمیدهشده» بشن، سعی کنید ساختارمند و صحیح به عنوان ابزار کمکی به تیم معرفی کنید و براش برنامه و آموزش و منابع در نظر بگیرید.
اگه تبدیل بشن به بخشی از یه زیرساخت مشترک تیمی، دقیقاً مثل تمپلیتهای .editorconfig یا CI/CDهای سراسری، اونوقت واقعاً اثر میذارن و سرعت توسعه و کیفیت محصول رو افزایش میدن. و به نظرم اینکار باید توسط تیم پلتفرم یا DevEx انجام بشه. اونا میتونن یه repo مرکزی بسازن برای این دستورالعملها، یا حتی یه پک آماده بدن که با هر پروژه جدید بشه cloneش کرد. مثلا میتونید از این ریپو برای دیدن انواع پرامپتها یا دستورالعملها الهام بگیرید و نسخه بومی تیمتون رو بسازید...
💡 اگه میخوایم هوش مصنوعی رو به عنوان یه همکار قابلاعتماد و سازنده وارد تیم کنیم، نه یه ابزار دیمی و فانتزی، لازمه این زیرساختهای ساده ولی مهم رو جدی بگیریم.
فایلهایی مثل AGENTS.md یا copilot-instructions.md شاید کوچیک باشن، ولی یه قدم بزرگان برای کار تیمی، استانداردسازی، و استفاده درست از AI تو توسعهی نرمافزار.
🏗 پیشنهاد برای تیمها و شرکتها:
قبل از اینکه مدلهای زبانی تبدیل به ابزار تقلب یا تولید کدهای «نفهمیدهشده» بشن، سعی کنید ساختارمند و صحیح به عنوان ابزار کمکی به تیم معرفی کنید و براش برنامه و آموزش و منابع در نظر بگیرید.
اگه تبدیل بشن به بخشی از یه زیرساخت مشترک تیمی، دقیقاً مثل تمپلیتهای .editorconfig یا CI/CDهای سراسری، اونوقت واقعاً اثر میذارن و سرعت توسعه و کیفیت محصول رو افزایش میدن. و به نظرم اینکار باید توسط تیم پلتفرم یا DevEx انجام بشه. اونا میتونن یه repo مرکزی بسازن برای این دستورالعملها، یا حتی یه پک آماده بدن که با هر پروژه جدید بشه cloneش کرد. مثلا میتونید از این ریپو برای دیدن انواع پرامپتها یا دستورالعملها الهام بگیرید و نسخه بومی تیمتون رو بسازید...
فایلهایی مثل AGENTS.md یا copilot-instructions.md شاید کوچیک باشن، ولی یه قدم بزرگان برای کار تیمی، استانداردسازی، و استفاده درست از AI تو توسعهی نرمافزار.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🔥2
قبل از شروع خوبه تا تعریفمون رو از ترمهای «ریز تصمیم» و «تصمیم روزانه» شفاف کنیم:
«تصمیمات روزمره» یک اصطلاح کلی است که تمام انتخابهای روزانهی ما رو در بر میگیره، در حالی که «ریزتصمیم» نوع خاصی از تصمیمات روزمره هستن که کوچک، سریع و در طول زمان انباشته میشن تا نتایج، عادات و طرز فکرهای بزرگتری رو شکل بدن. در اصل، همه ریز تصمیمها، تصمیمات روزمره هستن، ولی همه تصمیمات روزمره، ریزتصمیم نیستن، چون دومی روی کوچیک بودن و قدرت تجمعی تصمیمها تأکید داره.
هر انتخابی که در طول یک روز معمولی انجام میشود، از تصمیمات بزرگ زندگی گرفته تا تصمیمات کوچک.
دامنهاش میتونه شامل انتخابهای مهم زندگی مثل محل زندگی، جابجاییهای شغلی بزرگ یا تصمیمات فنی بزرگ باشه. تأثیر این انتخابها بر جهت کلی و کیفیت زندگی و کار فرد تأثیر میگذاره.
انتخابهای کوچیک و به ظاهر بیاهمیتی که در لحظه گرفته میشن و اغلب به تلاش آگاهانهی کمی نیاز دارن.
ویژگیهای غالبشون سریع بودن (اغلب در عرض چند ثانیه گرفته میشن)، متعدد بودن (یک فرد روزانه هزاران ریز تصمیم میگیره)، انباشتپذیری (اگرچه به تنهایی بیاهمیت هستن، اما برای شکلگیری عادات و تأثیرگذاری بر نتایج آینده جمع میشن).
برای مثال تصمیمگیری در مورد اینکه برای صبحانه چه چیزی بخوریم، چه زمانی از خواب بیدار شیم، کدی که مینویسیم رو تست کنیم یا نه، الان وسط کار توییتر ببینم یا نه، یه سرچ کنم که این خط کد یا این معماری نمونه بهتری داره یا نه، یا امروز یه کار کوچیک برای اهدافم انجام بدم یا نه.
تأثیرشون رو در شکلدهی عادات و طرز فکر (اینها بلوکهای سازنده رفتار و الگوهای فکری هستن)، یا تأثیرگذاری بر نتایج بزرگتر ( میتونن منجر به تغییرات بلندمدت بشن و حتی توی رویدادهای بزرگ زندگی، مثل ایجاد یک رابطه موفق از طریق مجموعهای از تعاملات کوچیک و مثبت، یا تغییر مسیر شغلی و موفقیت پروژه ناشی از رفتارهای درست ولی کوچیک، نقش داشته باشن)، یا انرژی ذهنی رو حفظ میکنن (با خودکارسازی یا تنظیم گزینههای پیشفرض برای ریز تصمیمها، افراد میتوانند بار شناختی و خستگی ذهنی رو کاهش بدن).
فکر کنم با چند خط بالا، سرنخها رو گرفته باشین که منظورم چیه. اینکه یک تیم هرکاری میکنه نمیتونه به «حال خوب» فردی و جمعی برسه، که خود این شامل موفقیت و پیشرفت فنی، محصولی، و رضایت تمام عناصر دخیل در چرخه محصول از مالک تا تولیدکننده تا مصرفکننده میشه؛ یکی از دلایلش بیتوجهی به این ریزتصمیمهاست.
ما آدمها ما در طول روز فقط مقدار محدودی از انرژی ذهنی یا بودجه تصمیمگیری (Decision-making bandwidth) داریم. هر تصمیم، هرچند کوچیک، بخشی از این ظرفیت رو مصرف میکنه. این ایده به مفهومی به نام Decision Fatigue (خستگی تصمیمگیری) مرتبطه.
برای همینه که مثلا زاکربرگ، جابز، یا اوباما در مورد محدود کردن انتخابهای غیرضروری روزانه صحبت کردن (مثل پوشیدن لباس تکراری روزانه)، چون میخواستن ظرفیت تصمیمگیریشون رو برای مسائل مهم نگه دارن. یا مثلاً قضات دادگاه صبحها تصمیمهای عادلانهتری میگیرن نسبت به عصرها. یا McKeown موضوع تمرکز بر «تمرکز انرژی روی تصمیمات مهم» رو طرح میکنه برای از بین بردن "نشت انرژی شناختی" در ریزتصمیمهای بیارزش.
با این مثالها فکر میکنم نیازی به طولانی کردن مطلب نباشه که به عنوان عضو یا لیدر تیم فنی، تصمیمات کوچیک روزانه رو چقدر باید جدی گرفت و چقدر مهمه که انرژی رو سر ریزتصمیمات کماهمیت هدر ندیم! نمونههای زیادی از ریزتصمیمات اشتباه توی تیمهای فنی هست مثل:
- نوشتن کد بدون تست اولیه (و گفتن اینکه “الان مهم نیست، بعداً مینویسم تستشو”)
- چک نکردن لاگها بعد از دیپلوی یا رها کردن هشدارهای CI/CD به حال خودشون
- اینکه بگیم “فعلاً یه راهحل موقت میذارم تا بعداً بهترش کنم” (که هیچوقت بهتر نمیشه)
- باز کردن پیام اسلک/تیمز وسط تمرکز و بعدش گمکردن تسک اصلی
- انتخاب سریع و بدون بررسی لایبرری یا پکیج، بدون اینکه نگاه کنیم آخرین آپدیتش کی بوده یا چقدر در جامعه فنی پذیرفته شده
- گفتن “فعلاً این naming بد رو تحمل میکنم، وقت ندارم عوضش کنم” و بعدش به دام تکنیکال دِبت افتادن
- یا حتی نگفتن یک جمله تشکر یا فیدبک کوچیک که میتونه انرژی مثبت زیادی تو تیم پخش کنه
اینها همه ریزتصمیم هستن؛ سریع، جزئی، اما به طرز عجیبی مؤثر.
🔧 پس چیکار کنیم؟
برای اینکه ریزتصمیمها در خدمت ما و تیممون باشن، نه علیهمون، چند تا اصل مهم رو میتونیم دنبال کنیم:
Please open Telegram to view this post
VIEW IN TELEGRAM
خودکارسازی (Automation)
قاعدهگذاری (Decision Rules)
طراحی تجربه فنی خوب (DevEx Design)
آگاهسازی تیمی (Team Awareness)
مصرف آگاهانه انرژی ذهنی
🎯 جمعبندی
«ریزتصمیمها، آجرهای پنهان ساختار رفتار تیم هستن.»
تصمیمهای کوچیک روزانه، یا ما رو به سمت تعالی فنی میبرن، یا در مسیر فرسایش تدریجی قرار میدن.
اگر میخوای تیم فنیای داشته باشی که هم خلاقه، هم سریع، هم سالم، باید کمک کنی اعضای تیم انرژی تصمیمگیریشون رو برای تصمیمهای مهم نگه دارن و ریزتصمیمهای مهم ولی ناپیدا رو جدی بگیرن.
قاعدهگذاری (Decision Rules)
طراحی تجربه فنی خوب (DevEx Design)
آگاهسازی تیمی (Team Awareness)
مصرف آگاهانه انرژی ذهنی
🎯 جمعبندی
«ریزتصمیمها، آجرهای پنهان ساختار رفتار تیم هستن.»
تصمیمهای کوچیک روزانه، یا ما رو به سمت تعالی فنی میبرن، یا در مسیر فرسایش تدریجی قرار میدن.
اگر میخوای تیم فنیای داشته باشی که هم خلاقه، هم سریع، هم سالم، باید کمک کنی اعضای تیم انرژی تصمیمگیریشون رو برای تصمیمهای مهم نگه دارن و ریزتصمیمهای مهم ولی ناپیدا رو جدی بگیرن.
تلسکرایب ابزاریه برای تهیه خروجیهای مختلف، گزارش و برچسبگذاری مبتنی بر LLM از محتوای کانالهای تلگرامی.
اول یه اسکریپت پایتون بود که برای دیدن آمار کانال نوشتم (آمار خود تلگرام دیتایی که دوست داشتم از کانال ببینم رو ارائه نمیکرد) ولی الان یه اپلیکیشن جمعوجور کدباز داتنتیه که در صورت پیدا کردن فرصت آزاد، بهبودش خواهم داد.
امکانات:
- تهیه خروجی مارکدان از محتوای کانال تلگرامی
- بهروزرسانی محتوای خروجی گرفته شده
- تهیه گزارش از محتوای سایت (مثال تکافترنون)
- ساخت سایت ایستا بر اساس محتوا (مثال تکافترنون)
- آپلود مطالب در وردپرس (هنوز کامل نشده و باگ داره)
- تهیه عنوان و هشتگ مطالب با LLM (هنوز کامل نشده و باگ داره)
📱 مخزن کد
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥5 4❤2
🎯 معرفی گیتوی اختصاصی هوش مصنوعی: AgentGateway چیه و چرا به وجود اومده؟
این روزها که گاهی عاقلانه و گاهی جوگیرانه، استفاده از agentها و MCPها رایج شده، و ارتباط و یکپارچگی نرمافزارها با مدلهای هوش مصنوعی داغه، باید یه مشکل اساسی رو بررسی کنیم:
💡 چطوری این agentها بتونن ابزارهای مختلف رو کشف کنن، بهشون متصل بشن، احراز هویت کنن، نتیجه بگیرن و اگه لازم شد fallback بزنن؟ برای پاسخ به این نیاز، گیتویهایی اختصاصی برای ارتباط با agents وارد میشن!
🛠 حالا AgentGateway چیه؟
پروژه AgentGateway یه پروژه متنبازه که agents هوش مصنوعی، سرورهای MCP و ارائهدهندههای LLM رو در هر محیطی به هم وصل میکنه. این اتصالات دوطرفه، امن، مقیاسپذیر و stateful هستن و امکانات لازم مثل امنیت سازمانی، observability، انعطافپذیری و multi-tenancy رو ارائه میده.
✅ وظایف کلیدی AgentGateway:
🔗 ارتباط یکپارچه:
- اتصال امن و مقیاسپذیر بین agentها و ابزارها
- پشتیبانی از پروتکلهای agent مثل MCP و A2A
- تبدیل REST APIهای موجود به ابزارهای agent-native
🛡 امنیت و مدیریت:
- احراز هویت JWT و سیستم RBAC قدرتمند
- محافظت در مقابل حملات tool poisoning
- کنترل دسترسی در سطح agent، tool و tenant
⚡️ عملکرد سریع:
- با Rust نوشته شده تا کارایی بالا، تأخیر کم، قابلیت اطمینان و پایداری رو حفظ کنه
- مدیریت اتصالات طولانیمدت و الگوهای fan-out داره
📊 نظارت و مدیریت:
- از metrics و tracing داخلی برای رصد تعاملات پشتیبانی میکنه
- پورتال سلفسرویس برای توسعهدهنده ارائه میکنه
❓ فرق اساسیش با API Gateway چیه؟
نوع درخواستها:
- گیتوی API: عمدتاً REST/HTTP
- گیتوی Agent: تعاملات پیچیده مثل Agent ↔️ Tool، Agent ↔️ Agent، Agent ↔️ LLM
پروتکل ارتباطی:
- گیتوی API: HTTP
- گیتوی Agent: MCP و A2A که پروتکلهای JSON-RPC برای ارتباط agents و tools هستن
مدیریت session:
- گیتوی API: درخواستهای کوتاهمدت HTTP
- گیتوی Agent: میتونه sessionهای stateful که باید context جلسه رو حفظ کنن و پیامها رو مداوماً ارسال و دریافت کنن رو ارائه کنه
پیچیدگی پردازش:
- گیتوی API: قادر به forward کردن ساده درخواستها است
- گیتوی Agent: دسترسی به چندین سرور MCP، تجمیع پاسخها و بازگردوندن نتیجه منسجم رو داره
🚫 چرا گیتویهای سنتی کافی نیستند؟
گیتویهای سنتی برای معماری microservices RESTful طراحی شدن که درخواستهای HTTP کوتاهمدت دریافت میکنن، backend رو انتخاب میکنن و درخواست رو forward میکنن. ولی:
🔴 مشکلات اساسی:
- عدم پشتیبانی از session awareness
- ضعف در مدیریت ارتباطات دوطرفه
- این الگوهای ارتباطی resource intensive هستند و میتونن گیتویهای سنتی رو مختل کنن
- نیاز به بازطراحی اساسی برای پشتیبانی از use caseهای agentic AI دارن
🚀 ویژگیهای منحصربهفرد AgentGateway
ارائه data plane یکپارچه:
مدیریت اتصال agent با پشتیبانی از پروتکلهای agent و قابلیت یکپارچهسازی REST APIهای موجود
امکان multiplexing و federation:
ارائه endpoint واحد برای federation چندین سرور MCP و مجازیسازی tool server بر اساس هر client
پشتیبانی از هر framework:
سازگاری با هر framework agentic که از پروتکلهای MCP و A2A پشتیبانی میکنه، مثل LangGraph، AutoGen، kagent، Claude Desktop و OpenAI SDK
خصوصیت platform-agnostic:
قابلیت اجرا در هر محیطی از bare metal تا virtual machine، containers و Kubernetes
بهروزرسانی پویا:
امکان بهروزرسانی از طریق رابط xDS بدون downtime
🛡 سیاستهای امنیتی و ترافیک:
مدیریت ترافیک:
- دستکاری headerها، redirect، rewrite
- پاسخ مستقیم بدون ارسال به backend
امنیت پیشرفته:
- تنظیمات CORS، احراز هویت MCP
- پشتیبانی از TLS برای backend، محدودیت نرخ محلی و توزیع شده
- پشتیبانی از JWT Auth و external authorization
انعطافپذیری:
- قابلیتهای request mirroring، timeout، retry logic
🎯 کی از AgentGateway استفاده کنه خوبه؟
- سازمانهای بزرگ: مدیریت ارتباطات پیچیده بین agents
- توسعهدهندههای AI: یکپارچهسازی tools و agents
- تیمهای DevOps: استقرار در محیطهای مختلف
- محققین: آزمایش فریمورکهای جدید agent
مخزن گیتهاب
مستندات رسمی
این روزها که گاهی عاقلانه و گاهی جوگیرانه، استفاده از agentها و MCPها رایج شده، و ارتباط و یکپارچگی نرمافزارها با مدلهای هوش مصنوعی داغه، باید یه مشکل اساسی رو بررسی کنیم:
🛠 حالا AgentGateway چیه؟
پروژه AgentGateway یه پروژه متنبازه که agents هوش مصنوعی، سرورهای MCP و ارائهدهندههای LLM رو در هر محیطی به هم وصل میکنه. این اتصالات دوطرفه، امن، مقیاسپذیر و stateful هستن و امکانات لازم مثل امنیت سازمانی، observability، انعطافپذیری و multi-tenancy رو ارائه میده.
🔗 ارتباط یکپارچه:
- اتصال امن و مقیاسپذیر بین agentها و ابزارها
- پشتیبانی از پروتکلهای agent مثل MCP و A2A
- تبدیل REST APIهای موجود به ابزارهای agent-native
🛡 امنیت و مدیریت:
- احراز هویت JWT و سیستم RBAC قدرتمند
- محافظت در مقابل حملات tool poisoning
- کنترل دسترسی در سطح agent، tool و tenant
⚡️ عملکرد سریع:
- با Rust نوشته شده تا کارایی بالا، تأخیر کم، قابلیت اطمینان و پایداری رو حفظ کنه
- مدیریت اتصالات طولانیمدت و الگوهای fan-out داره
📊 نظارت و مدیریت:
- از metrics و tracing داخلی برای رصد تعاملات پشتیبانی میکنه
- پورتال سلفسرویس برای توسعهدهنده ارائه میکنه
نوع درخواستها:
- گیتوی API: عمدتاً REST/HTTP
- گیتوی Agent: تعاملات پیچیده مثل Agent ↔️ Tool، Agent ↔️ Agent، Agent ↔️ LLM
پروتکل ارتباطی:
- گیتوی API: HTTP
- گیتوی Agent: MCP و A2A که پروتکلهای JSON-RPC برای ارتباط agents و tools هستن
مدیریت session:
- گیتوی API: درخواستهای کوتاهمدت HTTP
- گیتوی Agent: میتونه sessionهای stateful که باید context جلسه رو حفظ کنن و پیامها رو مداوماً ارسال و دریافت کنن رو ارائه کنه
پیچیدگی پردازش:
- گیتوی API: قادر به forward کردن ساده درخواستها است
- گیتوی Agent: دسترسی به چندین سرور MCP، تجمیع پاسخها و بازگردوندن نتیجه منسجم رو داره
🚫 چرا گیتویهای سنتی کافی نیستند؟
گیتویهای سنتی برای معماری microservices RESTful طراحی شدن که درخواستهای HTTP کوتاهمدت دریافت میکنن، backend رو انتخاب میکنن و درخواست رو forward میکنن. ولی:
🔴 مشکلات اساسی:
- عدم پشتیبانی از session awareness
- ضعف در مدیریت ارتباطات دوطرفه
- این الگوهای ارتباطی resource intensive هستند و میتونن گیتویهای سنتی رو مختل کنن
- نیاز به بازطراحی اساسی برای پشتیبانی از use caseهای agentic AI دارن
ارائه data plane یکپارچه:
مدیریت اتصال agent با پشتیبانی از پروتکلهای agent و قابلیت یکپارچهسازی REST APIهای موجود
امکان multiplexing و federation:
ارائه endpoint واحد برای federation چندین سرور MCP و مجازیسازی tool server بر اساس هر client
پشتیبانی از هر framework:
سازگاری با هر framework agentic که از پروتکلهای MCP و A2A پشتیبانی میکنه، مثل LangGraph، AutoGen، kagent، Claude Desktop و OpenAI SDK
خصوصیت platform-agnostic:
قابلیت اجرا در هر محیطی از bare metal تا virtual machine، containers و Kubernetes
بهروزرسانی پویا:
امکان بهروزرسانی از طریق رابط xDS بدون downtime
🛡 سیاستهای امنیتی و ترافیک:
مدیریت ترافیک:
- دستکاری headerها، redirect، rewrite
- پاسخ مستقیم بدون ارسال به backend
امنیت پیشرفته:
- تنظیمات CORS، احراز هویت MCP
- پشتیبانی از TLS برای backend، محدودیت نرخ محلی و توزیع شده
- پشتیبانی از JWT Auth و external authorization
انعطافپذیری:
- قابلیتهای request mirroring، timeout، retry logic
🎯 کی از AgentGateway استفاده کنه خوبه؟
- سازمانهای بزرگ: مدیریت ارتباطات پیچیده بین agents
- توسعهدهندههای AI: یکپارچهسازی tools و agents
- تیمهای DevOps: استقرار در محیطهای مختلف
- محققین: آزمایش فریمورکهای جدید agent
مخزن گیتهاب
مستندات رسمی
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
GitHub - agentgateway/agentgateway: Next Generation Agentic Proxy for AI Agents and MCP servers
Next Generation Agentic Proxy for AI Agents and MCP servers - agentgateway/agentgateway
❤6👍2 2