tech-afternoon – Telegram
tech-afternoon
1.2K subscribers
172 photos
6 videos
6 files
162 links
تِک‌افترنون، رویدادی گاه‌به‌گاه است با موضوعات حول معماری و توسعه نرم‌افزار، این کانال هم برای اشتراک اخبار، آموزش، نکاتی حول مهندسی نرم‌افزار، دیتابیس‌، تکنولوژی و مدیریت تولید محصولات نر‌م‌افزاری خواهد بود.
youtube.com/@AminTechTalks/videos
امین مصباحی
Download Telegram
#️⃣ در ستایش اعداد...
1️⃣ قسمت اول: کُدمتریکس

وقتی به جای «حس» و معیارهای کیفی، بریم سراغ معیار «کمی» و خصوصا «اعداد»، خیلی از مشکلات رو می‌شه زودتر شناسایی کرد، راهکارهای بهتری براشون پیدا کرد؛ و حتی توی گفت‌و‌گوها از جدل دور شد. در این پست و شاید پست‌های احتمالی بعدی، در معرفی و ستایش اعدادی می‌نویسم که به ما کمک می‌کنن تا بهتر کار کنیم و کار بهتر کنیم... مثل اعدادی که می‌شه از کُد بیرون کشید، اعدادی که می‌شه از دل جیرا (یا هر ابزار مدیریت تسک دیگه) بیرون کشید، اعدادی که می‌شه از API یا زیرساخت بیرون کشید...

ابزارهایی مثل Code Metrics با اندازه‌گیری کمی کیفیت کد، نقاط ضعف رو شناسایی و فرصتی برای بازبینی فراهم می‌کنن.
شروع رو به معرفی metricهای رایج می‌پردازم، و بعد به صورت مفصل‌تر روی Cyclomatic Complexity صحبت می‌کنیم که یکی از پرکاربردترین معیارهای تخمین پیچیدگی و تعداد مسیرهای اجرایی بسته‌شده توی تابع یا کلاسه.

📈 انواع رایج Code Metrics

متریک Cyclomatic Complexity (CC): این شاخص، پیچیدگی منطقی کد رو بر اساس تعداد مسیرهای مستقل اجرا در یک تابع یا متد اندازه‌گیری می‌کنه. هر عبارت شرطی، حلقه یا انشعاب جدید، این عدد رو افزایش می‌ده. پیچیدگی بالا نشون‌دهنده‌ی کد دشوارتر برای درک، تست، و نگهداریه. معمولاً پیچیدگی کمتر از ۱۰ مطلوب، بین ۱۰ تا ۲۰ قابل قبول و بالاتر از ۲۰ نیازمند بازطراحیه.

متریک Lines of Code (LOC): این شاخص، تعداد خطوط کد موجود در یک پروژه یا ماژول رو اندازه‌گیری می‌کنه. معمولاً به دو صورت SLOC (Source Lines of Code) که شامل خطوط حاوی کد اجراییه و KLOC (Kilo Lines of Code) که هر هزار خط کد رو نشون می‌دن، ارائه می‌شه. این متریک اگرچه ساده است اما می‌تونه شاخص تقریبی از پیچیدگی و حجم پروژه باشه، هرچند نمی‌تونه به تنهایی کیفیت کد رو تعیین کنه.

متریک Maintainability Index (MI): این شاخص ترکیبیه که کیفیت نگهداری کد رو بر اساس عوامل مختلف از جمله پیچیدگی، حجم کد، تکرار و مستندات محاسبه می‌کنه. مقدارش بین ۰ تا ۱۰۰ است که عدد بالاتر نشون‌دهنده کد قابل نگهداری‌تره. این متریک به توسعه‌دهنده‌ها کمک می‌کنه تا قسمت‌های کد که نیاز به بهبود داره رو شناسایی کنیم.

متریک Cognitive Complexity: یکی از متریک‌های مدرن و پیشرفته‌تر برای اندازه‌گیری پیچیدگی کده که برخلاف Cyclomatic Complexity که صرفاً تعداد مسیرهای اجرا رو می‌شماره، تمرکز اصلیش روی میزان دشواری درک کد از دیدگاه ذهن انسانه. هدف اصلیش پیش‌بینی میزان تلاش ذهنی مورد نیاز برای خوندن، درک و اصلاح کده.

متریک Depth of Inheritance: یکی از متریک‌های مهم در برنامه‌نویسی شی‌گرا است که عمق سلسله مراتب وراثت در یک کلاس رو اندازه‌گیری می‌کنه. این متریک تعداد کلاس‌های والد (ancestor classes) که یک کلاس خاص ازشون ارث‌بری می‌کنه رو می‌شماره. این متریک اهمیت زیادی در ارزیابی پیچیدگی طراحی داره چون عمق وراثت بالا که بعضا هنر و سواد بالای طراحی برنامه‌نویس تصور/تخیل می‌شه، مشکلات متعددی ایجاد می‌کنه.

متریک Coupling and Cohesion: میزان وابستگی بین ماژول‌ها و کلاس‌های مختلف رو اندازه‌گیری می‌کنه که کمتر بودنش مطلوبه. Cohesion هم درجه‌ایه که اجزای یک ماژول با هم مرتبط هستن، که بالا بودنش بهتره. این دو متریک کیفیت طراحی و معماری نرم‌افزار رو نشون می‌دن و کد با Coupling پایین و Cohesion بالا قابلیت نگهداری و توسعه بهتری داره.

متریک Code Duplication: این شاخص درصد کدی رو که در پروژه تکرار شده رو اندازه‌گیری می‌کنه. کد تکراری مشکلات زیادی ایجاد می‌کنه از جمله افزایش حجم کد، دشواری در نگهداری و احتمال بالای باگ. ابزارهای مختلف می‌تونن این تکرارها رو شناسایی کنن و پیشنهاداتی برای حذف یا اجماع اون‌ها ارائه بدن. معمولاً کمتر از 3% تکرار قابل قبول در نظر گرفته می‌شه. در ضمن منظور از تکرار، کپی نعل‌به‌نعل نیست، گاهی الگوی یکسان باعث مشابهت می‌شن ولو اینکه اسامی متفاوت باشه.

این متریک‌ها رو IDEها یا افزونه‌هاشون یا ابزارهای مستقل یا سرویس‌های ابری و غیرابری محاسبه و گزارش می‌کنن. حالا یکی قوی‌تر، یکی ضعیف‌تر. ولی بی‌تفاوتی به این‌ها می‌تونه در طول زمان مشکلات زیادی ایجاد کنه. حالت بهینه‌اش هم که یکپارچگی با CI/CD و جلوگیری خودکار از ورود کد فاقد متریک‌های قابل قبول به محیط‌های استیج و پروداکشن است.

💬 چقدر به این متریک‌ها یا به صورت کلی‌تر، به اعداد اهمیت می‌دید؟ در مورد اعداد دیگه صحبت کنیم؟
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1443🔥2👏1
🍰 یک هفته دیگه، یعنی ۱۱ آگوست ۲۰۲۴ (۲۱ مرداد) یک‌سالگی کانال تک‌افترنون خواهد بود.

تصویر بالا، کارنامه‌‌ی «بی‌معنی» عملکردشه، چون تعداد پست‌ها، اعضاء، ویو، فوروارد مطالب و... مادامیکه پشتوانه‌ی «اثر معنادار» یا «یادگیری» نداشته باشن، تهی از معنی خواهند بود.

خوشحال می‌شم تا موضوع بعدی به انتخاب شما باشه، و امیدوارم از بین موضوعاتی که شما پیشنهاد بدید، موردی باشه که اندکی در موردش بدونم تا به عنوان مطلب «ویژه» برای یک‌سالگی کانال با هم بخونیمش...

منتظر پیشنهادات، فیدبک و نقد شما هستم... 😊

پی‌نوشت:
۱. کد استخراج محتوای کانال تلگرامی به صورت بلاگ (JSON + HTML) و امکان فیلتر و جست‌وجو و آمار و... رو به‌زودی منتشر می‌کنم.

۲. گزارش محبوب‌ترین مطالب (بر حسب مشاهده، ری‌اکشن و فوروارد) رو هم می‌گذارم که شاید جالب باشه چه موضوعاتی بیشتر مورد توجه بوده طی این یک‌ سال.
18👏3😍2
#️⃣ در ستایش اعداد...
2️⃣ قسمت دوم: متریک‌های عملکرد تیم توسعه

وقتی توسعه نرم‌افزار به صورت تیمی انجام می‌شه، فقط کیفیت کد یا معماری نیست که اهمیت داره؛ بلکه نحوه‌ی همکاری، ریتم کاری تیم، ظرفیت تحویل، و الگوهای رفتاری در برابر چالش‌ها هم به اندازه‌ی کد مهم‌ هستن، و خوشبختانه، قابل اندازه‌گیری هم می‌تونن باشن.

توی قسمت دوم، چند متریک مرتبط با تحلیل رفتار تیم در طول اسپرینت‌ها و بازخوردهایی که از طریق Jira، GitHub/GitLab، و یا سایر سیستم‌های دخیل در چرخه توسعه نرم‌افزار رو مرور می‌کنیم.

📈 متریک‌های تحلیلی تیم در اسپرینت‌ها

معیار Capacity: ظرفیت تیم و تک‌تک افراد برای انجام کار که با عدد story point سنجیده می‌شه، قبل از شروع اسپرینت باید مرخصی و... رو لحاظ کرد، و به صورت دوره‌ای هم بررسی capacity در کنار velocity و burn down و... باید برای تخمین بهتر و تدقیق اعداد لحاظ بشه.

معیار Velocity: نرخ تحویل تیم در هر اسپرینت، معمولاً بر حسب story points یا تعداد آیتم‌های کامل‌شده اندازه‌گیری می‌شه. اگرچه این عدد در بلندمدت معنا پیدا می‌کنه، اما کاهش یا نوسان زیادش ممکنه نشونه‌ی مشکلاتی در planning، تمرکز تیم یا دخالت‌های خارج از برنامه باشه.

معیار Capacity Utilization: این متریک نشون می‌ده که چه درصدی از ظرفیت اعلام‌شده‌ی تیم واقعاً صرف تحویل کار شده. تطابق نداشتن capacity و velocity می‌تونه نشونه‌ای از کارهای ad-hoc، باگ‌های اضطراری، یا estimation ضعیف باشه. اگر همیشه ۱۰۰٪ باشه، احتمالاً تیم over-committed هست و خطر burnout بالاست. اگر مدام کمتر از ۷۰٪باشه، ممکنه مشکل در تخمین‌گذاری یا تعریف کارها باشه. بهینه معمولاً بین ۷۵-۸۵٪ در نظر گرفته می‌شه.

معیار Commitment Reliability (Planned vs Delivered): مقایسه بین storyها و وظایفی که در ابتدای اسپرینت برنامه‌ریزی شدن با اون‌هایی که واقعاً کامل شدن. عدد پایین معمولاً نشونه‌ی overcommitment یا تغییر اولویت‌ها در طول اسپرینت هست.

معیار Bug Trend per Sprint: تحلیل تعداد باگ‌های گزارش‌شده، اولویت‌هاشون، و نسبت اون‌ها به featureهای جدید می‌تونه نشون‌دهنده‌ی کیفیت تحویل، فشار کاری بیش از حد، یا ناکارآمدی در QA باشه.

معیار Sprint Goal Achievement Rate: درصد اسپرینت‌هایی که هدف اصلی‌شون رو به طور کامل محقق می‌کنن. این متریک مهم‌تر از velocity خامه، چون نشون می‌ده تیم چقدر روی اهداف تجاری متمرکزه. نرخ کمتر از ۷۰٪ نشانه مشکل در برنامه‌ریزی یا اولویت‌بندیه.

ادامه دارد...

عددها همیشه حرف آخر رو نمی‌زنن، اما خیلی وقت‌ها شروع بهتری برای گفت‌وگو و تصمیم‌های جمعی هستن. ترکیب داده‌های Jira، Git، CI/CD، و ابزارهای متنوع موجود یا استفاده از API پلتفرم‌ها برای استخراج و بعدش آنالیز اعداد، می‌تونه دید بسیار روشنی از سلامت فرآیند توسعه و رفتار تیم به ما بده و این جزوی از وظایف engineering managerها یا team leadهاست که نسبت به اعداد بی‌تفاوت نباشن و به صورت روشمند تحلیل کنن...

💬 چقدر عدد توی تیمتون مهمه و چه متریک‌هایی رو دنبال می‌کنید؟ داده‌های کمی چقدر توی تصمیم‌گیری‌ها دخیلن؟
Please open Telegram to view this post
VIEW IN TELEGRAM
125🤓2👍1
#️⃣ در ستایش اعداد...
3️⃣ قسمت سوم: متریک‌های همکاری تیمی و کیفیت تحویل در مخازن کد

در قسمت‌های قبل در مورد متریک‌های کد و متریک‌های برنامه‌ریزی نوشتم؛ این قسمت برخی از متریک‌های مخزن‌کد رو مرور می‌کنیم...

*️⃣معیار Lead Time for Changes:
زمان بین باز شدن یک pull request تا merge نهایی، یکی از شاخص‌های کلیدی DevOps برای سنجش تحویل سریع و با کیفیته. افزایش Lead Time معمولاً به دلیل منتظر موندن برای review، test failure، یا فقدان reviewer فعاله.

*️⃣معیار Time to First Response: فاصله زمانی بین باز شدن PR و اولین بازخورد (review یا comment). زمان بالا نشونه‌ی کمبود تعامل، فقدان مسئولیت‌پذیری یا توزیع نامتوازن کارها توی تیمه.

*️⃣معیار Code Review Coverage:
نسبت PRهایی که حداقل یک بررسی‌کننده‌ی انسانی (non-author) داشتن. پوشش پایین می‌تونه امنیت، کیفیت و حتی حس تعلق تیمی رو تحت تاثیر قرار بده. اینکه ۱ نفر مرورکننده رو هم حذف یا جزو مستحبات حساب کنیم نتایج خوبی نداره؛ برخی شرکت‌های بزرگ تا ۱۲ نفر (به جز AI داخلی) هر PR رو مرور می‌کنن برای سنجش کیفیت و امنیت کد.

*️⃣معیار Pull Request Size:
اندازه‌ی PRها از نظر تعداد خطوط تغییر یافته. PRهای بزرگ‌تر باعث کاهش کیفیت review، فرسایش توجه reviewerها، و احتمال بیشتر برای بروز باگ می‌شن. عدد مناسب معمولاً زیر ۴۰۰ خطه (البته خودش شمارش خطوط کد بحث مفصلیه که انواع خط کد چیه؟ یا چجوری باید شمرد...)

*️⃣معیار Merge Frequency:
چند بار در روز یا هفته PR merge می‌شه؟ این عدد نشون می‌ده که آیا تیم به صورت پیوسته و در بازه‌های کوچک تحویل انجام می‌ده یا تحویل به صورت big-bang و آخر اسپرینت صورت می‌گیره. بازه‌های کوچک‌تر = ریسک کمتر = feedback سریع‌تر. البته به استراتژی و سیاست‌های توسعه نرم‌افزار شرکت خیلی وابسته است.

*️⃣معیار Pull Request Cycle Time:
زمان از باز کردن PR تا merge شدنش. این متریک شامل چند مرحله‌ست: Time to First Review، Review Duration، و Time to Merge. PR های که بیش از ۴۸ ساعت طول می‌کشن، معمولاً کیفیت کد و روحیه تیم رو تحت تأثیر منفی قرار می‌دن.

*️⃣معیار Rework Rate:
درصد تغییراتی که پس از merge، نیاز به اصلاح یا revert پیدا می‌کنن. عدد بالا می‌تونه نشونه‌ی ضعف در review یا تست ناکافی باشه.

*️⃣معیار Defect Escape Rate:
تعداد باگ‌هایی که بعد از merge به محیط‌های بالاتر (Staging یا Production) منتقل می‌شن. این عدد برای سنجش کیفیت تحویل و اثربخشی فرآیند تست قبل از ادغام حیاتیه.

*️⃣معیار Review Participation Rate:
نسبت اعضای تیم که در بازه‌ای مشخص، در reviewهای دیگران شرکت می‌کنن. مشارکت کم می‌تونه باعث ایجاد bottleneck یا کاهش کیفیت کد بشه.

*️⃣معیار Stale PRs
PRهایی که مدت زیادی باز می‌مونن بدون فعالیت. این موارد معمولاً نشان‌دهنده مشکلات در اولویت‌بندی، درگیری منابع، یا ابهام در نیازمندی‌هاست.

📌 جمع‌بندی:
اندازه‌گیری این متریک‌ها به خودی خود هدف نیست؛ هدف اصلی، ایجاد گفت‌وگو در تیم برای پیدا کردن گلوگاه‌ها، بهبود تعاملات، و کاهش زمان و هزینه تحویل با حفظ کیفیته. اعداد، آینه‌ای برای دیدن واقعیت کار تیمی ما هستند. بدون سوگیری، بدون توجیه! این متریک‌ها هم یهویی و یک‌شبه قابل حصول نیستن، اول باید تصمیم بگیریم به سمت «قابل‌اندازه‌گیری شدن» حرکت کنیم؛ بعدتر اگر درست پیش بریم، متریک خواهیم داشت.

💡 «هیچ» بهبودی یهویی نخواهد بود...
و در عین حال بدون شروع ولو با گام‌های کوچیک هم چیزی محقق نمی‌شه!
Please open Telegram to view this post
VIEW IN TELEGRAM
11👍4🔥4👏21
🚀 «مدل عملیاتی محصول» برای تیم‌های نرم‌افزاری
چجوری از «تحویل فیچر» به «تحویل ارزش» تغییر مسیر بدیم؟

وقتی ساختار تیم‌ها (وظایف و تخصص افراد و ماموریت خود تیم) درست چیده نشه، خیلی راحت به دام «لیست وظایف» میوفتن، یعنی اینکه مرتبا تیم از خودش می‌پرسه: تسک بعدی چیه؟ فیچر بعدی کی باید ریلیز بشه؟

مدل عملیاتی محصول (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
🔥1352
💡 آیا مایکروسرویس و DDD برای تیم‌های کوچک مناسبه؟

از اونجایی که تعداد تیم‌هایی که تلاش کردن/می‌کنن تا 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
534🥴1
قسمت اول سری «مایکروسرویس و 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: 🤪
Please open Telegram to view this post
VIEW IN TELEGRAM
2353
قسمت دوم سری «مایکروسرویس و 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.

ادامه دارد...
Please open Telegram to view this post
VIEW IN TELEGRAM
11👍52
قسمت سوم سری «مایکروسرویس و 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، «پروتکل تیم» است نه لطفِ داوطلبانه‌ی دولوپرها.

جمع‌بندی:
مایکروسرویس پاسخیه به استقلال تیمی، مقیاس‌پذیری ناهمگن و تحویل پیوسته در سازمان‌های بزرگ/روبه‌رشد با زیرساخت و فرهنگ آماده.
اگر این زمین بازی فراهم نباشه، نتیجه معمولاً پیچیدگی توزیع‌شده است، نه چابکی!

✍️ پی‌نوشت: اگر تا اینجا این چند پست رو دنبال کردید، امیدوارم مفید بوده باشه. اعداد نشون می‌ده که خوبه که این بحث رو اینجا متوقف کنیم. لذا پست‌های بعدی احتمالا به موضوعات دیگه‌ای اختصاص خواهد داشت.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1551🥴1
🧠 🚀هوش مصنوعی در تیم توسعه‌: ابزار روزمره به جای تقلب!

با رایج شدن مدل‌های هوش مصنوعی توی محیط‌های توسعه؛ مسیر تعامل برنامه‌نویس با مدل، از حالت پرسش ‌و پاسخ یا 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
11🔥5
tech-afternoon
🧠 🚀هوش مصنوعی در تیم توسعه‌: ابزار روزمره به جای تقلب! با رایج شدن مدل‌های هوش مصنوعی توی محیط‌های توسعه؛ مسیر تعامل برنامه‌نویس با مدل، از حالت پرسش ‌و پاسخ یا Ask، به توانمندی ویرایش یا Edit رسید و بعدتر به حالت Agent. در طول این مسیر، نیاز به سر و سامون…
ادامه و جمع‌بندی:

🏗 پیشنهاد برای تیم‌ها و شرکت‌ها:
قبل از اینکه مدل‌های زبانی تبدیل به ابزار تقلب یا تولید کدهای «نفهمیده‌شده» بشن، سعی کنید ساختارمند و صحیح به عنوان ابزار کمکی به تیم معرفی کنید و براش برنامه و آموزش و منابع در نظر بگیرید.

اگه تبدیل بشن به بخشی از یه زیرساخت مشترک تیمی، دقیقاً مثل تمپلیت‌های .editorconfig یا CI/CDهای سراسری، اون‌وقت واقعاً اثر می‌ذارن و سرعت توسعه و کیفیت محصول رو افزایش می‌دن. و به نظرم این‌کار باید توسط تیم پلتفرم یا DevEx انجام بشه. اونا می‌تونن یه repo مرکزی بسازن برای این دستورالعمل‌ها، یا حتی یه پک آماده بدن که با هر پروژه جدید بشه cloneش کرد. مثلا می‌تونید از این ریپو برای دیدن انواع پرامپت‌ها یا دستورالعمل‌ها الهام بگیرید و نسخه بومی تیمتون رو بسازید...

💡 اگه می‌خوایم هوش مصنوعی رو به عنوان یه همکار قابل‌اعتماد و سازنده وارد تیم کنیم، نه یه ابزار دیمی و فانتزی، لازمه این زیرساخت‌های ساده ولی مهم رو جدی بگیریم.

فایل‌هایی مثل AGENTS.md یا copilot-instructions.md شاید کوچیک باشن، ولی یه قدم بزرگ‌ان برای کار تیمی، استانداردسازی، و استفاده درست از AI تو توسعه‌ی نرم‌افزار.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🔥2
اهمیت «ریز تصمیم‌ها» و «تصمیمات روزانه» در تیم‌های فنی!

قبل از شروع خوبه تا تعریف‌مون رو از ترم‌های «ریز تصمیم‌» و «تصمیم روزانه» شفاف کنیم:
«تصمیمات روزمره» یک اصطلاح کلی است که تمام انتخاب‌های روزانه‌ی ما رو در بر می‌گیره، در حالی که «ریزتصمیم» نوع خاصی از تصمیمات روزمره هستن که کوچک، سریع و در طول زمان انباشته می‌شن تا نتایج، عادات و طرز فکرهای بزرگتری رو شکل بدن. در اصل، همه ریز تصمیم‌ها، تصمیمات روزمره هستن، ولی همه تصمیمات روزمره، ریزتصمیم نیستن، چون دومی روی کوچیک بودن و قدرت تجمعی تصمیم‌ها تأکید داره.

🐘 تصمیمات روزمره (everyday decisions)
هر انتخابی که در طول یک روز معمولی انجام می‌شود، از تصمیمات بزرگ زندگی گرفته تا تصمیمات کوچک.
دامنه‌اش می‌تونه شامل انتخاب‌های مهم زندگی مثل محل زندگی، جابجایی‌های شغلی بزرگ یا تصمیمات فنی بزرگ باشه. تأثیر این انتخاب‌ها بر جهت کلی و کیفیت زندگی و کار فرد تأثیر می‌گذاره.

🐜 ریز تصمیم‌ها (micro decisions)
انتخاب‌های کوچیک و به ظاهر بی‌اهمیتی که در لحظه گرفته می‌شن و اغلب به تلاش آگاهانه‌ی کمی نیاز دارن.
ویژگی‌های غالبشون سریع بودن (اغلب در عرض چند ثانیه گرفته می‌شن)، متعدد بودن (یک فرد روزانه هزاران ریز تصمیم می‌گیره)، انباشت‌پذیری (اگرچه به تنهایی بی‌اهمیت هستن، اما برای شکل‌گیری عادات و تأثیرگذاری بر نتایج آینده جمع می‌شن).
برای مثال تصمیم‌گیری در مورد اینکه برای صبحانه چه چیزی بخوریم، چه زمانی از خواب بیدار شیم، کدی که می‌نویسیم رو تست کنیم یا نه، الان وسط کار توییتر ببینم یا نه، یه سرچ کنم که این خط کد یا این معماری نمونه بهتری داره یا نه، یا امروز یه کار کوچیک برای اهدافم انجام بدم یا نه.
تأثیرشون رو در شکل‌دهی عادات و طرز فکر (این‌ها بلوک‌های سازنده رفتار و الگوهای فکری هستن)، یا تأثیرگذاری بر نتایج بزرگتر ( می‌تونن منجر به تغییرات بلندمدت بشن و حتی توی رویدادهای بزرگ زندگی، مثل ایجاد یک رابطه موفق از طریق مجموعه‌ای از تعاملات کوچیک و مثبت، یا تغییر مسیر شغلی و موفقیت پروژه ناشی از رفتارهای درست ولی کوچیک، نقش داشته باشن)، یا انرژی ذهنی رو حفظ می‌کنن (با خودکارسازی یا تنظیم گزینه‌های پیش‌فرض برای ریز تصمیم‌ها، افراد می‌توانند بار شناختی و خستگی ذهنی رو کاهش بدن).

💡 اثرگذاری روی تیم‌ها و لیدرشیپ فنی
فکر کنم با چند خط بالا، سرنخ‌ها رو گرفته باشین که منظورم چیه. اینکه یک تیم هرکاری می‌کنه نمی‌تونه به «حال خوب» فردی و جمعی برسه، که خود این شامل موفقیت و پیشرفت فنی، محصولی، و رضایت تمام عناصر دخیل در چرخه محصول از مالک تا تولیدکننده تا مصرف‌کننده می‌شه؛ یکی از دلایلش بی‌توجهی به این ریزتصمیم‌هاست.

ما آدم‌ها ما در طول روز فقط مقدار محدودی از انرژی ذهنی یا بودجه تصمیم‌گیری (Decision-making bandwidth) داریم. هر تصمیم، هرچند کوچیک، بخشی از این ظرفیت رو مصرف می‌کنه. این ایده به مفهومی به نام Decision Fatigue (خستگی تصمیم‌گیری) مرتبطه.
برای همینه که مثلا زاکربرگ، جابز، یا اوباما در مورد محدود کردن انتخاب‌های غیرضروری روزانه صحبت کردن (مثل پوشیدن لباس تکراری روزانه)، چون می‌خواستن ظرفیت تصمیم‌گیری‌شون رو برای مسائل مهم نگه دارن. یا مثلاً قضات دادگاه صبح‌ها تصمیم‌های عادلانه‌تری می‌گیرن نسبت به عصرها. یا McKeown موضوع تمرکز بر «تمرکز انرژی روی تصمیمات مهم» رو طرح می‌کنه برای از بین بردن "نشت انرژی شناختی" در ریزتصمیم‌های بی‌ارزش.

با این مثال‌ها فکر می‌کنم نیازی به طولانی کردن مطلب نباشه که به عنوان عضو یا لیدر تیم فنی، تصمیمات کوچیک روزانه رو چقدر باید جدی گرفت و چقدر مهمه که انرژی رو سر ریزتصمیمات کم‌اهمیت هدر ندیم! نمونه‌های زیادی از ریزتصمیمات اشتباه توی تیم‌های فنی هست مثل:

- نوشتن کد بدون تست اولیه (و گفتن اینکه “الان مهم نیست، بعداً مینویسم تستشو”)
- چک نکردن لاگ‌ها بعد از دیپلوی یا رها کردن هشدارهای CI/CD به حال خودشون
- اینکه بگیم “فعلاً یه راه‌حل موقت می‌ذارم تا بعداً بهترش کنم” (که هیچ‌وقت بهتر نمی‌شه)
- باز کردن پیام اسلک/تیمز وسط تمرکز و بعدش گم‌کردن تسک اصلی
- انتخاب سریع و بدون بررسی لایبرری یا پکیج، بدون اینکه نگاه کنیم آخرین آپدیتش کی بوده یا چقدر در جامعه فنی پذیرفته شده
- گفتن “فعلاً این naming بد رو تحمل می‌کنم، وقت ندارم عوضش کنم” و بعدش به دام تکنیکال دِبت افتادن
- یا حتی نگفتن یک جمله تشکر یا فیدبک کوچیک که می‌تونه انرژی مثبت زیادی تو تیم پخش کنه

این‌ها همه ریزتصمیم‌ هستن؛ سریع، جزئی، اما به طرز عجیبی مؤثر.

🔧 پس چیکار کنیم؟

برای اینکه ریزتصمیم‌ها در خدمت ما و تیم‌مون باشن، نه علیه‌مون، چند تا اصل مهم رو می‌تونیم دنبال کنیم:
Please open Telegram to view this post
VIEW IN TELEGRAM
103💯2
خودکارسازی (Automation)
قاعده‌گذاری (Decision Rules)
طراحی تجربه فنی خوب (DevEx Design)
آگاه‌سازی تیمی (Team Awareness)
مصرف آگاهانه انرژی ذهنی

🎯 جمع‌بندی
«ریزتصمیم‌ها، آجرهای پنهان ساختار رفتار تیم هستن.»
تصمیم‌های کوچیک روزانه، یا ما رو به سمت تعالی فنی می‌برن، یا در مسیر فرسایش تدریجی قرار می‌دن.
اگر می‌خوای تیم فنی‌ای داشته باشی که هم خلاقه، هم سریع، هم سالم، باید کمک کنی اعضای تیم انرژی تصمیم‌گیری‌شون رو برای تصمیم‌های مهم نگه دارن و ریزتصمیم‌های مهم ولی ناپیدا رو جدی بگیرن.
14👍32
🚀 انتشار TeleScribe نسخه پیش‌نمایش

تلسکرایب ابزاریه برای تهیه خروجی‌های مختلف، گزارش و برچسب‌گذاری مبتنی بر LLM از محتوای کانال‌های تلگرامی.
اول یه اسکریپت پایتون بود که برای دیدن آمار کانال نوشتم (آمار خود تلگرام دیتایی که دوست داشتم از کانال ببینم رو ارائه نمی‌کرد) ولی الان یه اپلیکیشن جمع‌وجور کدباز دات‌نتیه که در صورت پیدا کردن فرصت آزاد، بهبودش خواهم داد.

امکانات:
- تهیه خروجی مارک‌دان از محتوای کانال تلگرامی
- به‌روزرسانی محتوای خروجی گرفته شده
- تهیه گزارش از محتوای سایت (مثال تک‌افترنون)
- ساخت سایت ایستا بر اساس محتوا (مثال تک‌افترنون)
- آپلود مطالب در وردپرس (هنوز کامل نشده و باگ داره)
- تهیه عنوان و هشتگ مطالب با LLM (هنوز کامل نشده و باگ داره)

📱 مخزن کد

⚙️ اگر باگ و مشکل دیدید، لطفا کامنت یا توی گیت‌هاب ثبت کنید. پیشنهاد و بهبود و... هم که بدیهیه که مزید امتنان است 🌱😊.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥542
🎯 معرفی گیت‌وی اختصاصی هوش مصنوعی: 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

مخزن گیت‌هاب
مستندات رسمی
Please open Telegram to view this post
VIEW IN TELEGRAM
6👍22
🔥 🐘 انتشار PostgreSQL 18، و اهمیت تغییراتش!

طبق روال سال‌های گذشته حوالی سپتامبر ریلیز نسخه جدید PostgreSQL انجام شد. حالا چرا این نسخه برای برخی سیستم‌ها می‌تونه قابل توجه و مهم باشه؟

- تغییرات انقلابی در I/O (Asyn I/O):
بالاخره! این قابلیت اومد و سرعت عملیات Read رو «تا» ۳ برابر افزایش می‌ده! معطلی‌های CPU برای I/O خیلی کمتر می‌شه و برای کارهای مثل VACUUM و اسکن‌های بزرگ، تاثیرش چشمگیره (من روی نسخه‌های پیش‌نمایش تست کردم و عالی بود).

- پشتیبانی از UUIDv7:
برای توسعه‌دهنده‌ها این شاید خیلی مهم باشه! (اگر دوست دارید در مورد انواع UUIDها بیشتر توضیح بدم: 🤪)
پشتیبانی Native از UUIDv7 یعنی Primary Key‌ها به صورت گلوبال یونیک میشن و هم چون بر اساس زمان مرتب هستن، عملکرد ایندکس B-tree به شکل چشمگیری بهتر میشه. (یعنی Page Split بی مورد نداریم!)

- قابلیت Virtual Generated Columns:
حالا ستون‌های محاسباتی به‌صورت پیش‌فرض مجازی هستن، یعنی فقط موقع خوانش محاسبه میشن و فضای دیسک رو اشغال نمی‌کنن. (البته اگه لازم باشه، می‌تونید همچنان STORED هم تعریف کنین).

افزودن NOT NULL بدون Downtime: کابوس اضافه کردن NOT NULL به جدول‌های بزرگ تموم شد! حالا می‌شه قید NOT NULL رو به‌صورت NOT VALID اضافه کنیم و بلافاصله برای ردیف‌های جدید اعمال بشه. اعتبارسنجی ردیف‌های موجود رو هم می‌تونیم بعداً بدون قفل کامل جدول انجام بدیم.

- امکان Skip Scan برای B-tree:
یه بهبود عالی برای بهینه‌سازی کوئری؛ اگه توی ایندکس‌های چند ستونی، ستون اول رو در WHERE فیلتر نکرده باشیم، باز هم ایندکس کار می‌کنه و کوئری‌های تحلیلی/گزارش‌گیری خیلی سریع‌تر میشن.

- امکان RETURNING هوشمند:
حالا میشه توی یک دستور UPDATE یا DELETE به هر دو مقدار قدیمی (OLD) و جدید (NEW) یک ستون در بخش RETURNING دسترسی داشته باشیم.

- آپگرید آسون‌تر:
قابلیت حفظ Planner Statistics حین آپگرید با pg_upgrade باعث میشه دیتابیس جدید خیلی سریع‌تر به پرفورمنس دلخواه برگرده.

اگر جزو افرادی هستین که به مهاجرت به PostgreSQL فکر می‌کنید، یه تعداد کارت‌های شسته‌رُفته برای مهاجرت از SQL Server به PostgreSQL با هشتگ #MSSQL_to_PGSQL توی کانال داریم (کارت‌های قرمز رنگ از بخش تصاویر هم قابل پیدا کردنه)
Please open Telegram to view this post
VIEW IN TELEGRAM
12👍54🙏1
⚙️ کمی در باب UUID

توی اکثر سیستم‌های اطلاعاتی، چه در مورد پیام‌های مورد تبادل بین سرویس‌های یک نرم‌افزار مبتنی بر مایکروسرویس صحبت کنیم، چه در مورد داده‌های دیتابیس، نیاز به یک روش مطمئن برای شناسایی منحصربه‌فرد داده‌ها وجود داره. استفاده از شناسه‌های ترتیبی (Sequential Integers) مثل Auto-Increment توی دیتابیس‌ها ساده و سریعه ولی توی محیط‌های توزیع‌شده که چندین سرور به طور همزمان ID تولید می‌کنن، برای جلوگیری از تکرار، نیاز به هماهنگی مرکزی دارن که خودش گلوگاه مقیاس‌پذیریه (Scalability).

برای پاسخ به این نیاز، UUID (Universally Unique Identifier) به وجود اومده. UUID‌ها شناسه‌های 128 بیتی (۳۶ کاراکتر) هستن که بدون نیاز به هماهنگی مرکزی، منحصر به فرد بودن رو در سطح جهانی تضمین می‌کنن. سال ۲۰۲۴، استاندارد رسمی RFC 9562 نسخه‌ی ۷ رو معرفی کرده: ۴۸ بیتِ اول «تایم‌استمپ یونیکس بر حسب میلی‌ثانیه»، بقیه بیت‌ها تصادفیِ امن. نتیجه؟ شناسه‌ها زمان‌مرتب و در عین حال یونیک هستن. چرا زمان‌مرتب بودن این شناسه‌ها مهمه؟ چون مثلا توی نسخه ۴، شناسه کاملا تصادفیه و اگر به ترتیب بخواهیم مرتب کنیم احتمال اینکه شناسه‌ای که الان تولید می‌کنید بعد از شناسه‌ای که دو ساعت پیش یا دو سال پیش تولید کردید قرار بگیره زیاده. این یعنی شروع مشکل. چه مشکلی؟ ایندکس جداول یا سری‌های زمانی.

فرض کنین یه کتاب دارید که شماره صفحاتش کاملا رندوم ولی یکتا باشه. در حالت عادی که شماره صفحات مرتب و دنبال هم هستن وقتی دنبال صفحه ۱۳۷ کتاب می‌گردید، اول یه جای کتاب رو باز می‌کنید و می‌بینید مثلا ۱۸۹ است، چون مطمئنید شماره ۱۳۷ قبلش است دیگه صفحات بعدی رو نگاه نمی‌کنید، یه جا قبل‌تر رو باز می‌کنید می‌بینید ۱۲۵ است، دیگه قبل‌تر و نمی‌گردید و چند صفحه جلوتر، ۱۳۷ رو پیدا می‌کنید. این یعنی پیدا کردن سریع‌تر مطالب. حالا اگر شماره صفحات رندوم باشه، هر بار که مرتبش کنیم با اولین مقدار جدید، نظم به هم می‌ریزه و پیدا کردن صفحات دشوار می‌شه.

مرور نسخه‌ها تا به امروز:

نسخه v1: مبتنی بر زمان و MAC Address » ترتیبی بر اساس زمان، یونیک جهانی » ولی افشای آدرس MAC (مشکل حریم خصوصی)

نسخه v2: مبتنی بر Domain محلی و Security » رزرو شده برای DCE Security » کاربری و استفاده بسیار محدود.

نسخه v3: مبتنی بر نام (MD5 Hashing) » همیشه برای یک "نام" و "دامین" مقدار یکسان تولید می‌شه. » از هش قدیمی MD5 استفاده می‌کنه که منسوخ شده.

نسخه v4: کاملاً تصادفی، یونیک جهانی با بالاترین میزان تصادفی بودن. » نامرتب؛ عملکرد ایندکس دیتابیس (B-tree) رو به شدت کاهش می‌دهه. » متاسفانه همچنان رایج، اما برای Primary Key نامناسب.

نسخه v5: مبتنی بر نام (SHA-1 Hashing) مشابه v3، اما از هش بهتر SHA-1 استفاده می‌کنه » فقط برای مواردی که نیاز به تکرارپذیری UUID است، مناسبه. » بهتر از v3، برای تولید شناسه‌های ثابت از URL یا نام.

نسخه v6: مشابه v1 ولی با ترتیب زمانی بهتر » مرتب زمانی، ولی بدون افشای MAC
» هنوز نسخه draft است، » کاربردش جایگزینی v1 در آینده

نسخه v7: مبتنی بر زمان یونیکس + مقدار تصادفی » مرتب بر اساس زمان و در عین حال یونیک جهانی + عملکرد بهینه دیتابیس » بهینه برای Primary Key خصوصا توی سیستم‌های توزیع‌شده و سری‌های زمانی » امکان افزودن کسریِ زیرِ میلی‌ثانیه و/یا کانتر هم برای تضمین مرتب‌بودن در همان میلی‌ثانیه پیش‌بینی شده.

نسخه v8: فضای سفارشی/تجربی برای نیازهای خاص.

📌 نسخه UUIDv7 به صورت بومی توی PostgreSQL 18 و SQL Server 2025 و پایتون ۳.۱۴ و دات‌نت ۹ و گو هم gofrs/uuid v5 پشتیبانی می‌شه ولی MySQL و MariaDB و جاوا هنوز نسخه بومی رو پیاده نکردن.
Please open Telegram to view this post
VIEW IN TELEGRAM
17👍64🔥1🙏1
🤔 نرم‌افزار، و این روزهای ایران!

نقد خودمونی، به جای قضاوت پایین به بالا یا برعکس!

چند خطی رو که مدت‌هاست می‌خواستم در قالب پادکست یا مطلب منتشر کنم رو به بهانه اتفاقات این چند روز و به صورت کلی، فضای حاکم بر اکوسیستم، به صورت خیلی خلاصه نوشتم.

اگر علاقه‌مند بودید و مطالعه کردید، نظر و فیدبکتون خوشحالم خواهد کرد.

لینک مطلب
👍15114👏1
🚀 بالاخره جت‌برینز، DataGrip رو هم برای استفاده غیرتجاری رایگان کرد!

شرکت JetBrains اعلام کرد که DataGrip، رو به عنوان محصول توسعه و مدیریت طیف وسیعی از پایگاه داده‌هاست، از این به بعد برای استفاده‌های غیرتجاری رایگان خواهد بود. این تصمیم در امتداد سیاست اخیر جت‌برینز که RustRover و Rider و WebStorm و CLion رو برای گسترش دسترسی دولوپرها به محصولاتش، مشروط به استفاده غیرتجاری رایگان کرده بود است.
دیتاگریپ بی‌ایراد یا کامل نیست، ولی حداقل نسبت به اکثر محیط‌های دیگه توسعه دیتابیس، برتری‌های قابل توجهی داره.

بد نیست نگاهی به وضعیت کلی JetBrains در جهان بندازیم:

شرکت JetBrains سال ۲۰۰۰ در پراگ (جمهوری چک) تأسیس شد. ولی دفتر مرکزیش در آمستردامه، ریشه‌های شرکت اروپاییه ولی دفاتر و کارمنداش علاوه بر اروپا، آسیا و آمریکا هم هست. گزارش ۲۰۲۴، میگه تیم JetBrains بیش از ۲۲۰۰ نفر نیروی انسانی در ۱۳ دفتر جهانی داره.

جت‌برینز بدون جذب سرمایه خارجی رشد کرده و یکی از نمونه‌های موفق مدل bootstrapping در صنعت نرم‌افزاره. توی گزارش سالانه ۲۰۲۳، رشد سالانه درآمدشون رو ۵.۶٪ اعلام کردن. و طبق منابع عمومی، درآمد JetBrains در سال ۲۰۲۴ حدود ۲۵۲ میلیون دلار تخمین زده شده.

توی یه گزارش‌ مربوط به ۲۰۲۲–۲۰۲۳، تعداد کاربران فعال (Recurring Active Users) به حدود ۱۱.۴ میلیون نفر اشاره شده.
🔥114👍4👌11
♻️ چرخه عمر نیروی انسانی (Employee Life Cycle) چیه؟

در بررسی ریشه‌های وضعیت فعلی توسعه نرم‌افزار در ایران، یکی از مهم‌ترین دلایل، ضعف فاحش در مدیریت چرخه عمر کارمند (Employee Life Cycle - ELC) است. این چرخه تمام مسیر یک فرد رو از پیش از جذب تا بعد از خروج پوشش می‌ده، توی شرکت‌ها و سازمان‌های ایرانی عموما جدی گرفته نمی‌شه یا به شوخی شبیهه. ELC یه مدل راهبردی توی مدیریت منابع انسانیه (HRM) که معمولا شامل ۶ مرحله کلیدی می‌شه.

چرخه عمر نیروی انسانی یه فرایند جامع است که شاید مستقیما ربطی به مهندسی نرم‌افزار نداشته باشه، ولی تاثیر مستقیم روی شکل‌دهی «سازمانِ نرم‌افزاری» داره. تاثیر مستقیم روی چشم‌انداز و خروجی تیم داره. یه بخشی هم متوجه تیم‌های نرم‌افزاری است که آیا محصولات خوبی برای این حوزه توسعه دادن یا نه.

مراحل ELC عموما:

برنامه‌ریزی نیروی کار یا Workforce Planning
جذب و گزینش یاRecruitment & Selection
فرایند پذیرش و آشنایی یا Onboarding
توسعه و آموزش یاDevelopment
مدیریت عملکرد یا Performance Management
نگهداشت یاRetention
فرایند خروج یا Offboarding

توجه به این موارد و یادگیری‌شون بخشی از اصول لیدرشیپ فنیه، ولی مستلزم یه همکاری عمیق بین همه بخش‌های سازمانه. یادمون نره خیلی از معضلات، از نداشتن شرح شغلی دقیق در آگهی جذب و بعدتر، از یک آنبوردینگ بد شروع می‌شه! آنبوردینگ خیلی از اون چیزی که تصور می‌شه مهم‌تر و اثرگذارتره، گاهی تا آخرین روز همکاری اثراتش دیده می‌شه؛ گاهی آثار یه آنبوردینگ بد حتی قابل اصلاح نیست!

🔗 در باب وضعیت امروز نرم‌افزار ایران، چند خطی رو در از منظر ELC نوشتم که اگر دوست داشتید مطالعه کنید و خوشحال می‌شم نظرتون رو به اشتراک بگذارین 😊
Please open Telegram to view this post
VIEW IN TELEGRAM
74🙏3👏1😐1