<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های امیر معصوم بیگی</title>
        <link>https://virgool.io/feed/@m_33467671</link>
        <description></description>
        <language>fa</language>
        <pubDate>2026-04-14 19:14:53</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/2406038/avatar/EsT5R5.jpg?height=120&amp;width=120</url>
            <title>امیر معصوم بیگی</title>
            <link>https://virgool.io/@m_33467671</link>
        </image>

                    <item>
                <title>انتزاع (Abstraction) در طراحی سیستم‌های مدرن (2)</title>
                <link>https://virgool.io/@m_33467671/%D8%A7%D9%86%D8%AA%D8%B2%D8%A7%D8%B9-abstraction-%D8%AF%D8%B1-%D8%B7%D8%B1%D8%A7%D8%AD%DB%8C-%D8%B3%DB%8C%D8%B3%D8%AA%D9%85-%D9%87%D8%A7%DB%8C-%D9%85%D8%AF%D8%B1%D9%86-2-eszob0ua2zwq</link>
                <description>فهرست بخش ۱ — مقدمه و مفهوم انتزاع (Abstraction)چرا طراحی سیستم پیچیده استنقش انتزاع در مهار پیچیدگیتعریف ساده و دقیق انتزاعانتزاع در زندگی روزمرهانتزاع در مهندسی نرم‌افزارچرا بدون انتزاع طراحی سیستم ممکن نیستبخش ۲ — انتزاع در سه حوزهٔ اصلی سیستم‌های بزرگ۲.۱ انتزاع در پایگاه داده (Database Abstraction)نقش دیتابیس در سیستم‌های بزرگمشکل هم‌زمانی و ناسازگاری دادهتراکنش (Transaction) به‌عنوان ابزار انتزاعرفتار «همه یا هیچ»مثال کامل: انتقال پولچگونه دیتابیس پیچیدگی داخلی را پنهان می‌کند۲.۲ انتزاع در ارتباطات شبکه: Remote Procedure Call (RPC)چالش‌های ارتباط سرویس‌ها بر روی شبکهRPC چیستRPC چگونه فراخوانی شبکه‌ای را شبیه تابع محلی می‌کندساختار کلی RPCمثال کاربردی در یک فروشگاه آنلاین۲.۳ انتزاع در رفتار داده — Consistency Modelsچرا در سیستم‌های توزیع‌شده نسخه‌های داده ممکن است متفاوت باشدتعریف مدل سازگاری (Consistency Model)سازگاری نهایی — Eventual Consistencyسازگاری بر پایه «وابستگی منطقی بین رویدادها» — Causal Consistencyسازگاری ترتیبی — Sequential Consistencyسازگاری سخت / خطی — Strict / Linearizable Consistencyمثال‌هایی برای هر مدلبخش ۳ — انتزاع در مدیریت خرابی‌ها — Failure Modelsاهمیت شناخت انواع خرابی در سیستم توزیع‌شدهتعریف مدل خرابی (Failure Model)خرابی آشکار — Fail-stop Failureخرابی خاموش — Crash Failureخرابی در ارسال/دریافت پیام — Omission Failureحالت «ارسال نشدن پیام» — Send Omissionحالت «دریافت نشدن پیام» — Receive Omissionخرابی زمانی — Temporal Failureخرابی غیرقابل‌پیش‌بینی / نامطمئن — Byzantine Failureمثال عملی برای هر نوع خرابیبخش ۴ — جمع‌بندی نهایینقش انتزاع در طراحی سیستم‌های واقعیمزایای طراحی با انتزاعارتباط انتزاع با مقیاس‌پذیری، قابلیت اطمینان و سادگی تفکراین مفاهیم چگونه در طراحی Instagram، Uber، YouTube و سیستم‌های مشابه به‌کار می‌روندچرا فهم انتزاع مقدمۀ تمام مباحث مهم‌تر مثل دیتابیس، کش، لا‌بالنسر، صف پیام و… استبخش ۱ — مقدمه و مفهوم انتزاع (Abstraction)چرا طراحی سیستم پیچیده استسیستم‌های نرم‌افزاری مدرن از ده‌ها و گاهی صدها جزء مستقل تشکیل شده‌اند: سرویس‌ها، پایگاه‌داده‌ها، کش‌ها، صف‌های پیام، سرویس‌های احراز هویت، ذخیره‌سازی، شبکه، مانیتورینگ و زیرساخت اجرا. هر جزء رفتار، خطاها و محدودیت‌های خاص خود را دارد. این اجزا باید با سرعت، پایداری و هماهنگی کامل در کنار هم کار کنند.اگر بخواهیم همهٔ جزئیات هر جزء را هم‌زمان در ذهن نگه داریم، حجم اطلاعات از توان ذهنی ما فراتر می‌رود و امکان تصمیم‌گیری در سطح طراحی کلان از بین می‌رود.نقش انتزاع در مهار پیچیدگیانتزاع روشی است که به ما اجازه می‌دهد دربارهٔ یک موضوع پیچیده با یک تصویر ساده‌شده فکر کنیم. این روش بخش‌هایی از سیستم را به‌صورت «جعبه»‌هایی تعریف می‌کند که فقط رفتار بیرونی‌شان برای ما مهم است، نه نحوهٔ پیاده‌سازی درونی آن‌ها.انتزاع تمرکز ما را از جزئیات غیرضروری جدا می‌کند و روی مسئلهٔ اصلی قرار می‌دهد. بدون انتزاع مجبور می‌شدیم هم‌زمان به ریزترین مواردی مثل بسته‌های شبکه، قفل‌گذاری دیتابیس یا جزئیات سیستم‌عامل فکر کنیم، و هیچ‌چیز قابل طراحی نمی‌شد.تعریف ساده و دقیق انتزاعانتزاع یعنی ایجاد یک مدل ساده از یک بخش پیچیدهٔ سیستم، به‌گونه‌ای که بتوان با آن مدل کار کرد بدون این‌که نیاز باشد همهٔ جزئیات داخلی را بدانیم.در عمل یعنی: «چیزی را آن‌طور ببینیم و استفاده کنیم که لازم داریم، نه آن‌طور که در واقعیت پیاده‌سازی شده است».انتزاع در زندگی روزمرهنمونه‌های انتزاع را هر روز می‌بینیم.وقتی از خودرو استفاده می‌کنیم، لازم نیست بدانیم موتور چگونه احتراق می‌کند، سوخت چطور تزریق می‌شود یا ECU چطور فرمان می‌دهد. برای ما خودرو یک «رابط ساده» دارد: فرمان، پدال گاز، پدال ترمز.یا وقتی از برق شهری استفاده می‌کنیم، لازم نیست بدانیم برق چگونه تولید و منتقل می‌شود؛ فقط کلید را می‌زنیم و لامپ روشن می‌شود.این‌ها نمونه‌های روشن انتزاع هستند: لایهٔ پیچیده پنهان شده و ما با یک مدل ساده کار می‌کنیم.انتزاع در مهندسی نرم‌افزاردر نرم‌افزار نیز بسیاری از ابزارها و مفاهیم بر اساس انتزاع ساخته شده‌اند.کتابخانه‌ها (Libraries)، چارچوب‌ها (Frameworks)، APIها، حتی زبان‌های برنامه‌نویسی—all یک لایهٔ ساده‌تر روی واقعیت پیچیده ایجاد می‌کنند.وقتی از یک کتابخانهٔ آماده استفاده می‌کنیم، لازم نیست بدانیم الگوریتم داخلی آن چگونه نوشته شده؛ فقط رفتار و ورودی و خروجی آن را می‌شناسیم.همین باعث می‌شود توسعه سریع‌تر، قابل‌پیش‌بینی‌تر و گفت‌وگوی بین برنامه‌نویسان ساده‌تر شود.چرا بدون انتزاع طراحی سیستم ممکن نیستطراحی سیستم نیازمند نگاه کلان است: اینکه داده از کجا می‌آید، چگونه پردازش می‌شود، چگونه ذخیره می‌شود، چگونه بین سرویس‌ها جابه‌جا می‌شود و در صورت افزایش حجم چه تغییری لازم است.اگر هنگام طراحی مجبور باشیم به موارد ریزتری مانند جزئیات پروتکل‌های شبکه، نحوهٔ مدیریت حافظه، اجرای تراکنش‌ها یا پیاده‌سازی ذخیره‌سازی فکر کنیم، ذهن ما از مسئلهٔ اصلی منحرف می‌شود و طراحی قابل انجام نیست.انتزاع این اجازه را می‌دهد که سیستم را در لایه‌های جداگانه ببینیم—هر لایه با سطح مشخصی از جزئیات—و دقیقاً در همان سطحی فکر کنیم که برای تصمیم‌گیری لازم است.بخش ۲ — انتزاع در سه حوزهٔ اصلی سیستم‌های بزرگسیستم‌های توزیع‌شده سه نقطهٔ حساس دارند که بیشترین پیچیدگی در آن‌ها دیده می‌شود:کار با داده و مدیریت هم‌زمانی → پایگاه دادهارتباط سرویس‌ها از طریق شبکه → RPCرفتار داده در شرایط چند نسخه‌ای → مدل‌های سازگاری دادهانتزاع باعث می‌شود این سه بخش، که در باطن بسیار پیچیده‌اند، برای طراح سیستم قابل مدیریت و قابل دلیل‌آوردن باشند.۲.۱ انتزاع در پایگاه داده (Database Abstraction)۱. نقش دیتابیس در سیستم‌های بزرگدر سیستم‌های مدرن، پایگاه داده مرکز نگهداری اطلاعات است:کاربر، سفارش‌ها، پیام‌ها، فایل‌ها، پرداخت‌ها، لاگ‌ها و …این بخش حساس‌ترین نقطهٔ سیستم است، زیرا داده باید همیشه صحیح، منظم و قابل اعتماد باقی بماند.اما دیتابیس در باطن با مشکلات جدی روبه‌روست:چند کاربر ممکن است هم‌زمان یک داده را تغییر دهندممکن است سیستم هنگام نوشتن داده خاموش شودممکن است بخشی از داده بازنویسی شود و بخشی نهممکن است دو عملیات مرتبط با هم نیمه‌کاره بماننداگر برنامه‌نویس مجبور بود کل این جزئیات را مدیریت کند، کار غیرممکن می‌شد.اینجاست که انتزاع دیتابیس وارد می‌شود.۲. مشکل هم‌زمانی و ناسازگاری دادهفرض کنید دو کاربر هم‌زمان موجودی حساب خود را تغییر می‌دهند.اگر عملیات‌ها به ترتیب درست اجرا نشوند، ممکن است موجودی اشتباه شود.یا تصور کنید در یک فروشگاه آنلاین:کاربر A در حال پرداخت استکاربر B هم‌زمان همان کالا را اضافه می‌کندموجودی کالا محدود استاگر دیتابیس خودش نتواند ترتیب درست عملیات را فراهم کند، دادهٔ اشتباه وارد سیستم می‌شود.این پیچیدگی‌ها برای برنامه‌نویس قابل مدیریت نیست، بنابراین دیتابیس باید یک تصویر ساده‌شده بدهد.۳. تراکنش (Transaction) به‌عنوان ابزار انتزاعتراکنش ابزاری است که دیتابیس برای ساده کردن کار ارائه می‌دهد.تراکنش می‌گوید:یک مجموعهٔ چندعملیاتی یا کامل انجام می‌شود، یا اصلاً انجام نمی‌شود.این رفتار «همه یا هیچ» یعنی:عملیات ناقص هیچ‌وقت پذیرفته نمی‌شودداده در حالت نیمه‌کاره نمی‌مانداگر سیستم وسط کار خراب شود، عملیات به حالت قبل برمی‌گرددبرنامه‌نویس فقط دستورهایی مثل این می‌بیند:BEGINCOMMITROLLBACKدرحالی‌که دیتابیس پشت صحنه:قفل‌گذارینوشتن لاگهماهنگی نسخهٔ دادهجلوگیری از تداخل عملیات‌هابازیابی پس از خرابیرا انجام می‌دهد.تمام این کارها «پنهان» می‌شوند.این یعنی انتزاع واقعی.۴. مثال کامل: انتقال پولفرض کنید می‌خواهید ۵۰٬۰۰۰ تومان از حساب A به حساب B منتقل کنید.این عملیات شامل دو کار است:کم کردن موجودی Aاضافه کردن موجودی Bاین دو باید دقیقاً با هم انجام شوند.اگر یکی انجام شود و دیگری نه، سیستم دچار خطای خطرناک می‌شود.تراکنش تضمین می‌کند:یا هر دو انجام می‌شود، یا هیچ‌کدام.و این ساده‌ترین شکل انتزاعی است که برنامه‌نویس می‌بیند، درحالی‌که در باطن پیچیدگی بسیار بیشتری وجود دارد.۲.۲ انتزاع در ارتباطات شبکه: Remote Procedure Call (RPC)۱. چالش‌های ارتباط سرویس‌هادر سیستم‌های توزیع‌شده، سرویس‌ها مستقل‌اند و روی سرورهای مختلف اجرا می‌شوند.برای انجام یک کار ساده، ممکن است چند سرویس با هم تعامل کنند.اما «ارتباط از طریق شبکه» مشکلات زیادی دارد:بسته‌بندی پیامرمزگذاری و رمزگشاییارسال از طریق شبکهقطعی شبکهتأخیرتکرار مجدد درخواست (Retry)Timeoutدریافت و بازکردن پیامخطاهای احتمالی در هر مرحلهاگر برنامه‌نویس مجبور بود برای هر درخواست این مراحل را کنترل کند، ساخت سیستم امکان‌پذیر نبود.۲. RPC چیست؟RPC یک لایهٔ انتزاعی است که به برنامه‌نویس اجازه می‌دهد یک تابع را طوری صدا بزند که انگار آن تابع در همان برنامه اجرا می‌شود.در ظاهر، یک تابع معمولی:user = UserService.Get(10)در باطن، یک عملیات شبکه‌ای کامل:بسته‌بندی درخواستارسال روی شبکهاجرا روی سرور دیگردریافت نتیجهباز کردن پاسخمدیریت خطاهااین انتزاع باعث می‌شود برنامه‌نویس «شبکه» را مثل «تابع» ببیند.۳. RPC چگونه فراخوانی شبکه‌ای را شبیه تابع محلی می‌کندکاربرد RPC دقیقاً این است:شبکه را از چشم برنامه‌نویس پنهان کند.در عمل RPC:ساختار پیام ایجاد می‌کندارتباط برقرار می‌کندخطاها را مدیریت می‌کندنتیجه را برمی‌گردانداما در ظاهر:تو همچنان داری یک تابع ساده صدا می‌زنی.۴. مثال کاربردی در فروشگاه آنلاینفرض کنید «سرویس سبد خرید» باید قیمت یک محصول را بگیرد.ظاهر کد:price = ProductService.GetPrice(productId)اما در واقع:این درخواست روی شبکه ارسال شدهبه سرویس محصولات رسیدهپردازش شدهنتیجه بازگشتهRPC تمام این جزئیات را مخفی کرده و فقط یک «رابط ساده» ارائه داده.این یعنی انتزاع در شبکه.۲.۳ انتزاع در رفتار داده — مدل‌های سازگاری (Consistency Models)برای اینکه مدل‌های سازگاری را درست بفهمیم، باید ابتدا ببینیم چرا اصلاً مسئله‌ای به نام «ناسازگاری داده» در سیستم‌های توزیع‌شده وجود دارد.اگر این قدم را خوب بفهمی، تمام مدل‌های بعدی کاملاً شفاف و قابل‌درک می‌شوند.۱. چرا نسخه‌های داده متفاوت می‌شوند؟در یک سیستم ساده که فقط یک سرور دارد، داده همیشه یک‌نسخه است.هر تغییری که انجام شود، در همان لحظه برای تمام عملیات‌ها قابل مشاهده است.اما امروزه تقریباً هیچ سیستم بزرگی تک‌سروری نیست.سیستم‌ها برای سرعت، پایداری و تحمل خطا، داده را روی چندین سرور ذخیره می‌کنند.همین موضوع به‌ظاهر ساده، مهم‌ترین علت تفاوت نسخه‌های داده است.حال چند دلیل اصلی را به‌صورت کامل و با مثال‌های واضح توضیح می‌دهیم:الف) تأخیر در هماهنگی بین سرورهاوقتی داده روی چند سرور پخش شده باشد، هر تغییری باید در شبکه پخش شود تا همهٔ سرورها آن تغییر را ببینند.اما شبکه همیشه سریع و تضمینی نیست.مثال راحت:سرور شماره ۱ اطلاعات کاربر را به‌روز کرد.سرور شماره ۲ هنوز اطلاع ندارد.سرور شماره ۳ به دلیل شلوغی شبکه چند ثانیه دیرتر متوجه می‌شود.در همین فاصلهٔ زمانی کوتاه،سه نسخهٔ متفاوت از یک داده وجود دارد.در یک سیستم واقعی با میلیون‌ها کاربر، این اتفاق دائمی است.ب) افزایش سرعت مهم‌تر از هماهنگ‌بودن لحظه‌ای استفرض کن اینستاگرام برای لایک کردن یک پست، به‌جای اینکه فوراً عدد لایک را نمایش دهد،اول باید مطمئن شود:همهٔ سرورها نسخهٔ جدید را دارندهمهٔ نسخه‌ها بررسی و هماهنگ شده‌اندهیچ سروری عقب نیستاین کار چندین میلی‌ثانیه یا حتی ثانیه طول می‌کشد.در مقیاس اینستاگرام، همین تأخیر کوچک باعث فروپاشی تجربهٔ کاربر می‌شود.پس سیستم تصمیم می‌گیرد:«ابتدا سرعت را تضمین کنیم، هماهنگی بعداً انجام شود.»اینجا است که نسخه‌های مختلف داده ایجاد می‌شود.پ) خرابی‌ها و اختلالات طبیعیدر یک سیستم توزیع‌شده،خرابی یک «استثنا» نیست؛خرابی یک «حالت طبیعی» است.مثلاً:یک سرور خاموش می‌شودیک لینک شبکه برای چند ثانیه قطع می‌شودپردازش یک سرور کند می‌شودپیام بین دو سرور دیر می‌رسددر چنین شرایطی، یک بخش از سیستم نسخهٔ جدید را دریافت می‌کند،اما بخش دیگر تا مدتی نسخهٔ قدیمی را نگه می‌دارد.نتیجهتا وقتی داده روی چند سرور وجود دارد،ناسازگاری داده «نه یک خطا»،بلکه «یک واقعیت اجتناب‌ناپذیر» است.برای همین سیستم‌های توزیع‌شده مجبورند یک قانون‌نامه داشته باشند که بگوید:«اگر کاربر داده را خواند، اجازه داریم چه نسخه‌ای را به او نشان دهیم؟»این قانون‌نامه همان مدل سازگاری (Consistency Model) است.حالا که علت اختلاف نسخه‌ها را کاملاً فهمیدیم،می‌توانیم سراغ انواع مدل‌های سازگاری برویم.۲. سازگاری نهایی (Eventual Consistency)این مدل ساده‌ترین شکل سازگاری است،و بسیاری از سرویس‌های بزرگ دنیا از آن استفاده می‌کنند،به‌خصوص سیستم‌هایی که تعداد خواندن بسیار زیاد استو دقت لحظه‌ای اهمیت زیادی ندارد.تعریف سادهدر این مدل، سیستم می‌گوید:«ممکن است الآن نسخه‌ها یکی نباشند،اما در نهایت همهٔ سرورها به نسخهٔ درست و مشترک خواهند رسید.»یعنی:در لحظه = احتمال تفاوتبعد از کمی زمان = هماهنگی کاملاین مدل چه دردی را دوا می‌کند؟اگر بخواهیم همهٔ سرورها همیشه هماهنگ باشند،سرعت سیستم به‌شدت پایین می‌آید.Eventual Consistency با خلاص شدن از این محدودیت سرعت،به ما اجازه می‌دهد سیستم‌های بسیار سریع بسازیم.مثال عملی — DNSوقتی رکورد IP یک دامنه تغییر می‌کند:بعضی سرورها فوراً نسخهٔ جدید را می‌بینندبعضی‌ها چند دقیقه دیرتراما نهایتاً همه یک نسخه خواهند داشتهیچ‌کس از DNS انتظار ندارد «در لحظهٔ تغییر»، همهٔ سرورها هماهنگ شوند.مثالی کاملاً روزمرهدر واتساپ، وقتی پیام ارسال می‌کنی:تیک یک خاکستری یعنی «سرور دریافت کرده»تیک دو خاکستری یعنی «به دستگاه طرف رسیده»تیک دو آبی یعنی «خوانده شده»این مدل رفتار یعنی «هماهنگی مرحله‌به‌مرحله»که کاملاً با Eventual Consistency هماهنگ است.۳. سازگاری مبتنی بر وابستگی رویدادها (Causal Consistency)اگر رویدادها به هم مربوط باشند،سیستم باید ترتیب آن‌ها را برای همه حفظ کند.اما اگر هیچ رابطه‌ای نداشته باشند،نیازی به حفظ ترتیب نیست.به زبان ساده‌تر:«اگر یک اتفاق نتیجهٔ اتفاق دیگری باشد،باید همیشه اولی دیده شود و بعد دومی.»مثال بسیار ساده و واضحدر شبکهٔ اجتماعی:کاربر A می‌نویسد:«کسی فیلم X را دیده؟»کاربر B پاسخ می‌دهد:«بله، خیلی خوبه.»این دو رویداد به هم «وابسته‌اند».پس سیستم باید همیشه این ترتیب را رعایت کند:سؤالپاسخاما اگر کاربر C پست دیگری بنویسد،هیچ ارتباطی بین آن پست و سؤال A وجود ندارد،پس ترتیب نمایش اهمیتی ندارد.چرا این مدل مهم است؟اگر سیستم ترتیب رویدادهای مرتبط را رعایت نکند،رفتار سیستم نامفهوم و آزاردهنده می‌شود.۴. سازگاری ترتیبی (Sequential Consistency)در این مدل،سیستم تضمین می‌کند عملیات هر کاربر دقیقاً به همان ترتیبی دیده شود که خودش انجام داده است.اما:سیستم تضمین نمی‌کند ترتیب واقعی «زمان» برای همه یکی باشد.مثال روشنکاربر A سه پست می‌گذارد:سلامامروز هوا خوبهدارم می‌رم بیرونحتی اگر این پست‌ها در شبکه با تأخیر پراکنده شوند،سیستم باید همیشه آن‌ها را به همان ترتیب اصلی نمایش دهد.اما اگر کاربر B هم‌زمان پست بگذارد،رعایت ترتیب بین پست‌های A و B مهم نیست.این مدل کجا مفید است؟در شبکه‌های اجتماعی، انجمن‌ها و اپلیکیشن‌هایی که رفتار کاربر مهم‌تر از ترتیب زمانی کامل است.۵. سازگاری سخت / خطی (Strict / Linearizable Consistency)این قوی‌ترین، دقیق‌ترین،اما سنگین‌ترین مدل سازگاری است.تعریف کاملدر این مدل:هر خواندن باید جدیدترین مقدار واقعی را برگرداندحتی اگر تغییر، کمتر از یک میلی‌ثانیه قبل انجام شده باشدهیچ سروری نباید نسخهٔ قدیمی را برگرداندبه این ترتیب، سیستم مانند یک «دادهٔ یکتا و مرکزی» رفتار می‌کند،حتی اگر داده روی ده‌ها سرور ذخیره شده باشد.مثال مهم — تغییر رمز عبوراگر کاربر رمز عبور خود را تغییر دهد:هیچ بخش سیستم نباید حتی یک لحظه رمز قبلی را قبول کندهیچ نسخهٔ قدیمی نباید وجود داشته باشدامنیت کامل باید تضمین شودبرای همین، این مدل در سیستم‌های بانکی، احراز هویت، پرداخت و بخش‌های بسیار حساس استفاده می‌شود.هزینهٔ این مدلبرای حصول این سطح از دقت:ارتباط بین سرورها کندتر می‌شودنیاز به هماهنگی لحظه‌ای وجود داردبرخی عملیات قابل پردازش موازی نیستندپس این مدل بسیار «گران» است و فقط در بخش‌هایی استفاده می‌شود که چاره‌ای جز آن وجود ندارد.بخش ۳ — انتزاع در مدیریت خرابی‌ها: Failure Modelsمقدمه — چرا شناخت خرابی مهم است؟در دنیای سیستم‌های توزیع‌شده، خرابی یک استثنا نیست؛ بلکه یک وضعیت عادی است.در سیستمی که صدها یا هزاران سرور دارد:همیشه یک سرور در حال خاموش شدن استهمیشه یک بخش از شبکه کمی کندتر از بقیه استهمیشه تعدادی از پیام‌ها دیر می‌رسندهمیشه احتمال خرابی نرم‌افزار، اشکالات کدنویسی یا حملهٔ بیرونی وجود دارداگر سیستم فقط زمانی درست کار کند که «هیچ‌چیز خراب نشود»،آن سیستم عملاً قابل استفاده نیست.طراح سیستم باید بتواند بگوید:چه نوع خرابی‌ای رخ داده؟چه تاثیری روی سیستم می‌گذارد؟چگونه باید با آن برخورد کرد؟هروقت بتوانیم خرابی‌ها را روشن و دقیق دسته‌بندی کنیم،می‌توانیم برای هر دسته یک استراتژی دفاعی طراحی کنیم.این دسته‌بندی همان مدل‌های خرابی (Failure Models) است.۳.۱ نقش مدل خرابی در طراحی سیستممدل خرابی کمک می‌کند رفتار درست یک سیستم را «قبل از خرابی، حین خرابی، و بعد از خرابی» تعریف کنیم.برای مثال:اگر یک سرور خاموش شود، آیا سیستم باید منتظر بماند؟اگر پیامی نرسید، باید دوباره ارسال شود؟اگر یک بخش خراب شد، آیا بقیهٔ سیستم باید ادامه دهند؟اگر دادهٔ ناهماهنگ تولید شد، سیستم باید چه کند؟بدون مدل خرابی، هیچ‌کس دقیق نمی‌داند سیستم چه کند.و نتیجه‌اش، رفتارهای عجیب و غیرقابل‌پیش‌بینی است.بنابراین شناخت مدل‌های خرابی، پایهٔ مقاومت یک سیستم است.۳.۲ مدل‌های خرابی (Failure Models) — توضیح کامل و مثال‌محورخرابی قابل‌تشخیص (Fail-stop Failure)خرابی خاموش (Crash Failure)خرابی در ارسال/دریافت پیام (Omission Failure)حالت «ارسال نشدن پیام» (Send Omission)حالت «دریافت نشدن پیام» (Receive Omission)خرابی زمانی (Temporal Failure)خرابی نامطمئن و غیرقابل‌پیش‌بینی (Byzantine Failure) – پیچیده‌ترین حالتدر ادامه، هر کدام از این مدل‌ها را جداگانه و با جزئیات بررسی می‌کنیم.۱. Fail-stop Failure — (خرابی قابل تشخیص)تعریف سادهدر این نوع خرابی:سرور از کار می‌افتداما بقیهٔ سرورها متوجه این خرابی می‌شوندسیستم می‌داند آن سرور «خاموش» استاین ساده‌ترین نوع خرابی است.چرا ساده است؟چون سیستم می‌تواند بلافاصله تصمیم بگیرد:«این سرور دیگر ماشین حساب نیست. پس درخواست‌ها را نفرستید.»مثال واقعیتصور کن یک سرور دیتابیس سخت‌افزارش می‌سوزد.سیستم مانیتورینگ فوراً گزارش می‌دهد: «سرور پاسخ نمی‌دهد».در این حالت:درخواست‌ها دیگر به آن سرور ارسال نمی‌شوندسیستم می‌تواند از replica دیگری استفاده کندFail-stop ساده‌ترین خرابی است چون تشخیص آن قطعی است.۲. Crash Failure — خرابی خاموشتعریفدر این نوع خرابی:سرور ناگهان متوقف می‌شوداما سیستم نمی‌تواند با قطعیت تشخیص دهد که مشکل از خرابی سرور است یا فقط یک تأخیر موقتچرا سخت‌تر از Fail-stop است؟چون سیستم باید بین دو احتمال تصمیم بگیرد:آیا سرور مرده است؟یا زنده است، اما فقط دیر جواب می‌دهد؟و این تشخیص همیشه سخت است.مثال واقعیفرض کن یک میکروسرویس به‌طور ناگهانی برای چند ثانیه پاسخ نمی‌دهد:شاید واقعا crash شدهشاید CPU پر شدهشاید شبکه برای چند ثانیه کند شدهسیستم از بیرون فقط «بی‌پاسخی» می‌بیندو باید تصمیم بگیرد:صبر کند؟یا آن را مرده فرض کند؟این تصمیم اگر اشتباه گرفته شود، مشکلات جدی ایجاد می‌کند.۳. Omission Failure — ارسال یا دریافت انجام نمی‌شوداین مدل از خرابی زمانی رخ می‌دهد که «پیام رد و بدل نمی‌شود»اما سرور لزوماً کاملاً خراب نشده.دو نوع دارد:۳.۱ ارسال انجام نمی‌شود (Send Omission)سرور می‌خواهد پیامی بفرستد،اما پیام در شبکه گم می‌شودیا اصلاً خارج نمی‌شود.مثال واضحدر یک سیستم پرداخت:سرویس فروشگاه به سرویس پرداخت درخواست می‌فرستدپیام از شبکه عبور نمی‌کندپرداخت انجام نشدهاما فروشگاه خبر نداردنتیجه؟ممکن است کاربر پول پرداخت کرده باشد اما سیستم ثبت نکرده باشد.۳.۲ دریافت انجام نمی‌شود (Receive Omission)پیام به مقصد می‌رسد،اما سرور دریافت‌کننده:به دلیل شلوغیاشکال نرم‌افزاریا تاخیر زیادپیام را پردازش نمی‌کند.مثال واقعیدر یک صف پیام (Message Queue):سرویس A پیام را ارسال می‌کندسرویس B پیام را دریافت نمی‌کنداما پیام واقعاً رسیده بودهدر چنین شرایطی، سیستم ممکن است پیام را «پردازش نشده» تشخیص دهد و دوباره ارسال کندو این چند بار پردازش شدن یک پیام می‌تواند مشکل‌ساز شود.۴. Temporal Failure — خروجی درست، اما «دیر»تعریفدر این نوع خرابی:سرور کار درست انجام می‌دهداما آن‌قدر دیر که دیگر پاسخ به درد نمی‌خورداین یکی از دردناک‌ترین خرابی‌هاست چون سیستم در ظاهر کار می‌کنداما از نظر کاربر، «خراب» دیده می‌شود.مثال سادهدر اپلیکیشن اسنپ یا اوبر:راننده موقعیت خود را ۱۰ ثانیه دیرتر ارسال می‌کندمسافر فکر می‌کند راننده «ایستاده»درحالی‌که راننده در حال حرکت استاطلاعات درست استاما “به‌موقع” نیستپس سیستم عملاً مفید نیست.مثال مهم‌تردر سامانهٔ بورس،ارائهٔ قیمت سهام با تأخیر باعث می‌شود معامله‌گر تصمیم اشتباه بگیرد.در چنین سیستم‌هایی حتی تأخیر ۵۰۰ میلی‌ثانیه فاجعه است.۵. Byzantine Failure — پیچیده‌ترین و خطرناک‌ترین خرابیاین نوع خرابی کابوس تمام طراحان سیستم‌های بزرگ است.تعریف کاملدر این خرابی:سرور ممکن است رفتار تصادفی نشان دهدممکن است اطلاعات اشتباه، قدیمی یا متناقض ارسال کندممکن است گاهی درست و گاهی غلط کار کندممکن است پیام‌های ساختگی بفرستدممکن است نتایج اشتباه تولید کندو بدتر از همه:هیچ‌کس نمی‌فهمد که کدام بخش راست می‌گوید.مثال ملموسفرض کن سه سرور باید بگویند:«موجودی حساب چقدر است؟»سرور ۱: موجودی = ۵۰۰سرور ۲: موجودی = ۵۰۰سرور ۳: موجودی = ۱۳ میلیونکدام درست می‌گوید؟آیا سرور ۳ خراب است؟آیا ۱ و ۲ هماهنگ نشده‌اند؟آیا حملهٔ هکری شده؟هیچ‌چیز مشخص نیست.چرا این خرابی وحشتناک است؟چون سرور خراب ساکت نمی‌ماندبلکه «مشغول خرابکاری» است.برخلاف Fail-stop که سرور کامل خاموش می‌شودو مشکل ساده و قابل تشخیص است،در Byzantine Failureسرور زنده استاما قابل اعتماد نیست.مثال واقعی: بلاک‌چیندر بلاک‌چین،باید همیشه فرض کرد که برخی نودها:خراب شده‌اندیا دستکاری شده‌اندیا تحت کنترل مهاجم‌اندبرای همین بلاک‌چین مجبور است از الگوریتم‌های بسیار سنگین مثل:PoWPoSاستفاده کند تا جلوی رفتارهای Byzantine گرفته شود.۳.۳ چرا برخی خرابی‌ها ساده و برخی بسیار خطرناک‌اند؟Fail-stop ساده استچون «خرابی قابل تشخیص» استCrash سخت‌تر استچون «بی‌پاسخی» همیشه نشانهٔ خرابی نیستOmission دردسرساز استچون پیام‌ها گم می‌شوند و سیستم باید تصمیم بگیرد چه کندTemporal به‌ظاهر کار می‌کنداما «دیر بودن» سیستم را بی‌استفاده می‌کندByzantine خطرناک‌ترین استچون «سرور خراب می‌تواند دروغ بگوید»و تشخیص حقیقت از دروغ تقریباً غیرممکن استطراح سیستم باید برای هر کدام استراتژی مناسب بسازدوگرنه سیستم در دنیای واقعی پایدار نخواهد بود.بخش ۴ — جمع‌بندی نهاییانتزاع (Abstraction) شاید در ظاهر یک مفهوم ساده باشد، اما در عمل ستونِ اصلی طراحی سیستم‌های بزرگ است. تقریباً تمام شرکت‌های بزرگ دنیا—از اینستاگرام و اوبر گرفته تا یوتیوب و گوگل—تمام معماری سیستم خود را روی شانهٔ همین مفهوم ساخته‌اند. حالا باید ببینیم دقیقاً چرا انتزاع چنین جایگاهی دارد و نبود آن چه نتایجی دارد.در ادامه این بخش را در پنج محور اصلی جمع‌بندی می‌کنیم.۱. نقش انتزاع در طراحی سیستم‌های واقعیهدف اصلی انتزاع این است که پیچیدگی را قابل مدیریت کند.وقتی یک سیستم فقط از یک سرور تشکیل شده باشد، فهم آن ساده است. اما وقتی:صدها سرویس داریدصدها پایگاه داده در مناطق مختلفمیلیون‌ها کاربر فعالده‌ها سیستم ذخیره‌سازیکش، صف پیام، CDN، کنترل ترافیک، load balancerآن وقت حتی «فهمیدن اینکه سیستم دقیقاً چه‌کار می‌کند» مشکل می‌شود.در چنین شرایطی انتزاع کاری می‌کند که بتوانید:به جای نگاه کردن به هزار جزئیات، یک تصویر قابل فهم داشته باشیدرفتار هر بخش را فقط از طریق یک رابط ساده تحلیل کنیدسیستم را به بخش‌های مستقل‌تر تقسیم کنیددر حقیقت انتزاع برای طراح سیستمِ بزرگ مثل «نقشهٔ راه» است.بدون آن، معمار سیستم نمی‌تواند دید کلی داشته باشد و نمی‌تواند دلیل درستی برای انتخاب‌های طراحی ارائه دهد.۲. مزایای طراحی با انتزاعوقتی سیستم را در لایه‌های انتزاعی می‌بینیم، چند مزیت مهم ایجاد می‌شود:الف) امکان تغییر بخش‌ها بدون خراب کردن کل سیستموقتی هر لایه فقط یک وظیفهٔ مشخص دارد، می‌توان یک بخش را عوض کرد بدون اینکه بقیه آسیب ببینند.مثال:دیتابیس را تغییر می‌دهیمکش را عوض می‌کنیمload balancer را ارتقا می‌دهیمو سیستم همچنان کار می‌کند چون قراردادهای بین این اجزا ساده و ثابت مانده‌اند.ب) امکان رشد سیستم بدون افزایش پیچیدگی مغز انسانمغز انسان قادر نیست هزاران ارتباط پیچیده را مدیریت کند.انتزاع این پیچیدگی را «سطح‌بندی» می‌کند.مثلاً:از نگاه کلان: فقط چند سرویس اصلی می‌بینیماز نگاه میانی: جزئیات ارتباطات سرویس‌هااز نگاه دقیق: نحوهٔ ذخیره‌سازی، صف، کش، پیام و…این تفکیک باعث می‌شود بتوانید سیستم بسیار بزرگ را طراحی، عیب‌یابی و توسعه دهید.پ) افزایش سرعت توسعهوقتی توسعه‌دهنده مجبور نباشد تمام جزئیات شبکه، پایگاه داده، مدل خرابی، مدل سازگاری و… را هر بار از نو حل کند، توسعه سریع‌تر می‌شود.انتزاع یعنی:RPC مثل فراخوانی تابع محلی استtransaction مثل یک بستهٔ «همه یا هیچ» دیده می‌شودconsistency model مثل قانون قابل‌پیش‌بینی رفتار می‌کندfailure model مثل یک دسته‌بندی شفاف استاین یعنی سرعت واقعی توسعه.ت) قابلیت همکاری تیم‌هادر شرکت‌های بزرگ ۲۰۰ تیم هم‌زمان روی یک محصول کار می‌کنند.انتزاع باعث می‌شود هر تیم فقط «جهان خودش» را ببیند.مثلاً:تیم A مسئول دیتابیس استتیم B مسئول لاگ‌گیری استتیم C مسئول پیام‌رسانی استهر تیم تنها API و رفتار لایهٔ خودش را می‌بیند، و نیازی نیست از جزئیات داخلی دیگر تیم‌ها خبر داشته باشد.۳. ارتباط انتزاع با مقیاس‌پذیری، قابلیت اطمینان و سادگی تفکرانتزاع فقط فهم مفهومی نیست، بلکه مستقیماً روی کیفیت سیستم تأثیر دارد.الف) ارتباط با مقیاس‌پذیری (Scalability)برای بزرگ شدن یک سیستم، باید بتوانید:بخش‌ها را مستقل مقیاس دهیدترافیک را بین سرویس‌ها تقسیم کنیدمنابع را جداگانه افزایش دهیداین کار فقط زمانی ممکن است که هر بخش «یک انتزاع واضح» داشته باشد.مثال:یک سرویس stateless را می‌توان با اضافه کردن چند replica مقیاس دادیک صف پیام را می‌توان shard کردیک کش را می‌توان توزیع‌شده کرداین‌ها بدون انتزاع امکان‌پذیر نیست.ب) ارتباط با قابلیت اطمینان (Reliability)خرابی همیشه اتفاق می‌افتد.اما اگر سیستم بر اساس مدل‌های انتزاعی خرابی طراحی شده باشد:خرابی قابل پیش‌بینی می‌شودرفتار قابل کنترل می‌شودکنارآمدن با خرابی امکان‌پذیر می‌شودمثلاً اگر بدانید:Omission Failure یعنی پیام ممکن است گم شودCrash Failure یعنی سیستم نمی‌داند مشکل از کجاستByzantine Failure یعنی لازم است سرورها همدیگر را تایید کنندمی‌توانید معماری مقاوم بسازید.پ) ارتباط با سادگی تفکروقتی هزاران جزئیات نامرتبط را حذف می‌کنید،تفکر شما واضح‌تر می‌شود.در طراحی سیستم‌های بزرگ، شفاف فکر کردن مهم‌تر از داشتن جزئیات زیاد است.۴. کاربرد انتزاع در طراحی Instagram، Uber، YouTube و سیستم‌های مشابههمهٔ سیستم‌های بزرگ دنیا از انتزاع استفاده می‌کنند.بیایید چند مثال واقعی ببینیم:Instagramلایک و کامنت با Eventual Consistency انجام می‌شود چون سرعت مهم‌تر است.انتقال تصویرها توسط CDN انجام می‌شود؛ یک لایهٔ انتزاعی از شبکهٔ جهانی.هر درخواست HTTP توسط Load Balancer به نزدیک‌ترین سرور هدایت می‌شود.دیتابیس‌ها شارد شده‌اند و هر shard یک انتزاع از «بخشی از کاربرها» است.Uberموقعیت راننده با مدل‌های مخصوص خرابی زمانی (Temporal Failure) مدیریت می‌شود.سرویس‌های راننده و مسافر با RPC با هم صحبت می‌کنند و این پیچیدگی شبکه پنهان شده.سیستم Matching راننده و مسافر به چند لایه تقسیم شده است:الگوریتم → موتور جستجو → سرویس‌ها → cache → پایگاه داده.YouTubeسیستم ویدیوها روی چند CDN جهانی با مدل Eventual Consistency منتشر می‌شود.تعداد بازدید ابتدا در cache ذخیره می‌شود، سپس به‌صورت batch در دیتابیس ثبت می‌گردد (به‌خاطر مدل consistency).صف پیام Kafka برای پردازش ویدیو استفاده می‌شود؛ یعنی یک انتزاع کامل از جریان داده.در تمام این‌ها یک الگوی واضح دیده می‌شود:هیچ‌کدام کل سیستم را یکجا نمی‌بینند؛ هر بخش فقط انتزاع لایهٔ خودش را می‌بیند.۵. چرا فهم انتزاع مقدمۀ تمام مباحث مهم‌تر است؟تمام مفاهیم اصلی طراحی سیستم—پایگاه دادهکشload balancerصف پیامCDNreplicatonshardingconsistencyfailure models—همگی بر پایهٔ انتزاع ساخته شده‌اند.اگر انتزاع را نفهمیم:نمی‌دانیم چرا باید Shard کنیممتوجه نمی‌شویم چرا consistency مدل داردنمی‌دانیم cache باید چه رفتاری داشته باشدنمی‌فهمیم چرا load balancer فقط یک «جعبه» در دیاگرام استنمی‌دانیم failure model چه تاثیری داردنمی‌توانیم معماری را به‌درستی تحلیل کنیمانتزاع اولین قدم است، چون:بدون انتزاع هیچ بخش دیگری قابل فهم نیستاین موضوع شبیه معماری ساختمان است:قبل از طراحی برق، لوله‌کشی، تهویه، سازه، آسانسورباید «نقشهٔ کلی» وجود داشته باشدانتزاع همان نقشهٔ کلی است.جمع‌بندی نهاییانتزاع ابزار اصلی مهندسان نرم‌افزار برای فکر کردن به سیستم‌های بزرگ است.بدون آن سیستم‌های امروزی—از فروشگاه آنلاین گرفته تا یوتیوب و اینستاگرام—اصلاً قابل طراحی نیستند.انتزاع:پیچیدگی را حذف نمی‌کند، مدیریت‌پذیر می‌کندبخش‌ها را جدا می‌کند تا قابل توسعه شوندمسیر طراحی صحیح را مشخص می‌کندپایهٔ مباحث مهمی مثل consistency، failure، replication و scalability استبه همین دلیل است که در آموزش طراحی سیستم،حتماً باید انتزاع اولین درس باشد.نویسنده : امیر معصوم بیگی</description>
                <category>امیر معصوم بیگی</category>
                <author>امیر معصوم بیگی</author>
                <pubDate>Sat, 29 Nov 2025 01:56:31 +0330</pubDate>
            </item>
                    <item>
                <title>مقدمهٔ مسیر یادگیری طراحی سیستم (1)</title>
                <link>https://virgool.io/@m_33467671/%D9%85%D9%82%D8%AF%D9%85%D9%87%D9%94-%D9%85%D8%B3%DB%8C%D8%B1-%DB%8C%D8%A7%D8%AF%DA%AF%DB%8C%D8%B1%DB%8C-%D8%B7%D8%B1%D8%A7%D8%AD%DB%8C-%D8%B3%DB%8C%D8%B3%D8%AA%D9%85-1-klkemndbvgug</link>
                <description>مقدمهٔ مسیر یادگیری طراحی سیستمقرار است وارد دنیای طراحی سیستم (System Design) شویم؛ دنیایی که در آن باید یاد بگیریم چطور سامانه‌هایی بسازیم که در مقیاس بزرگ کار کنند، زیر بار سنگین دوام بیاورند، به میلیون‌ها کاربر سرویس بدهند و در عین حال قابل نگه‌داری و توسعه باشند. طراحی سیستم شغلی نیست که با حفظ‌کردن چند الگو حل شود؛ یک مهارت است، و مثل هر مهارت دیگری باید مرحله‌به‌مرحله آن را ساخت و عمیق کرد.برای همین، در این مسیر یادگیری، قرار نیست یکباره به طراحی Uber یا WhatsApp بپریم.برعکس، یک مسیر مشخص‌شده را قدم‌به‌قدم جلو می‌بریم.در این مسیر:اول می‌فهمیم مصاحبهٔ طراحی سیستم (System Design Interview) چیست و چطور باید با آن برخورد کرد.یاد می‌گیریم قبل از ارائهٔ هر طرح، چطور سؤال بپرسیم، نیازها را روشن کنیم و محدودهٔ مسئله را مشخص کنیم.سپس وارد بخش‌های بنیادین طراحی سیستم می‌شویم: از ویژگی‌های غیرعملکردی (Non-functional Characteristics) گرفته تا محاسبات سرانگشتی (Back-of-the-envelope Calculations).بعد از آن، با مهم‌ترین قطعات دنیای سیستم‌های بزرگ، یعنی بلوک‌های سازندهٔ سیستم (Building Blocks) آشنا می‌شویم: Load Balancer، Database، Cache، Queue، CDN و بقیهٔ ابزارهای اصلی که تقریباً در طراحی هر سرویس بزرگی دیده می‌شوند.وقتی این پایه‌ها را ساختیم، سراغ طراحی سرویس‌های واقعی می‌رویم؛ سرویس‌هایی مثل YouTube، Twitter، Instagram، TinyURL و Google Docs.و در نهایت، با مطالعهٔ شکست‌های بزرگ (Spectacular Failures)، می‌آموزیم چرا سیستم‌های بزرگ همیشه در معرض خطا هستند و طراح باید این خطاها را پیش‌بینی کند.این مسیر، یک نقشهٔ راه مرحله‌به‌مرحله است تا بدون عجله، مفاهیم از ساده‌ترین شکل تا پیچیده‌ترین حالت روی هم انباشته شوند. بعد از پایان هر بخش، به بخش بعدی می‌رویم و همین‌طور پایهٔ یادگیری‌مان را گسترش می‌دهیم.تمام هدف این مقدمه همین است: مشخص کنیم کجا هستیم، به کجا می‌رویم، و چطور می‌خواهیم به آن برسیم.امیر معصوم بیگی</description>
                <category>امیر معصوم بیگی</category>
                <author>امیر معصوم بیگی</author>
                <pubDate>Sat, 29 Nov 2025 00:47:34 +0330</pubDate>
            </item>
                    <item>
                <title>تبدیل به pdf قابل جستجو (Readiris PDF)</title>
                <link>https://virgool.io/@m_33467671/%D8%AA%D8%A8%D8%AF%DB%8C%D9%84-%D8%A8%D9%87-pdf-%D9%82%D8%A7%D8%A8%D9%84-%D8%AC%D8%B3%D8%AA%D8%AC%D9%88-readiris-pdf-jzmytky83gka</link>
                <description>سلام ، امیر معصوم بیگی هستم در این مقاله میخوام خیلی مختصر و مفید یک نرم افزار رو معرفی کنم که شما با این نرم افزار میتونین پی دی اف های خودتون رو قابل سرچ کنین ، اگر شما هم کتابی گرفتید و این کتاب از تصاویر تشکیل شده و نیاز دارید که بتونید داخل متن این تصاویر جستجو کنید پس این مقاله واسه شماس :)اول از همه بهتر هست که ما به حقوق نویسندگان هر کتابی توجه داشته باشیم ، اما برخی مواقع پیش میاد ما میخواد به مطالب یک کتاب سریع تر دسترسی داشته باشیم و حتی قرار نیست این کتاب رو با کسی به اشتراک بزاریم ، مثلا دنبال یک مطلب در کتابیم و میخوایم ببینیم چند بار این مطلب تکرار شده ، خلاصه سر کارمون با جستجو در یک پی دی اف هست.اما چه مشکلاتی برای ما فارسی زبان ها وجود داره ؟ خلاصه بگم خیلی از برنامه ها فارسی رو پشتیبانی نمیکنن . ولی خب طبعا اگر قرار نبود راه حلی ارائه بشه که این مقاله هم نوشته نمیشد :) امروز میخوام نرم افزار Readiris PDF رو به شما معرفی کنم این نرم افزار میتونه به شما کمک کنه یک pdf رو به ورد یا به یک پی دی اف قابل جستجو تبدیل کنید . برای اینکار ابتدا این نرم افزار رو نصب کنید که با جستجو در اینترنت میتونید اینکار رو انجام بدید ، من برای جلوگیری از نقص حقوق موئلفین اینجا نمیتونن مراحل نصب این نرم افزار رو عنوان کنم اما خب معمولا این مرحله رو همه باهش آشنا و ازش میگذرم  .بعد از نصب این نرم افزار شما پی دی اف خودتون را این نرم افزار باز میکنید ، این نرم افزار به طور خودکار پی دی اف شمارو به یک پی دی اف قابل جستجو تبدیل میکنه ، بعد اون شما میتونید وارد تب convert که در پایین میگذارم بشید و خروجی مورد نظر خودتون رو انتخاب کنید که میتونه دوباره بک پی دی اف  یا ورد تبدیل کنید ، که البته این دفعه این پی دی اف قابل جستجو خواهد بود . خیلی ممنون از اینکه وقتتون رو برای خوندن این مقاله گزاشتید ، روز خوش </description>
                <category>امیر معصوم بیگی</category>
                <author>امیر معصوم بیگی</author>
                <pubDate>Wed, 18 Dec 2024 17:38:33 +0330</pubDate>
            </item>
                    <item>
                <title>نیاز های کارکردی و غیر کارکردی در نرم افزار (Functional,Non Functional)</title>
                <link>https://virgool.io/@m_33467671/%D9%86%DB%8C%D8%A7%D8%B2-%D9%87%D8%A7%DB%8C-%DA%A9%D8%A7%D8%B1%DA%A9%D8%B1%D8%AF%DB%8C-%D9%88-%D8%BA%DB%8C%D8%B1-%DA%A9%D8%A7%D8%B1%DA%A9%D8%B1%D8%AF%DB%8C-%D8%AF%D8%B1-%D9%86%D8%B1%D9%85-%D8%A7%D9%81%D8%B2%D8%A7%D8%B1-functionalnon-functional-rbp8srhg1oag</link>
                <description>من امیر معصوم بیگی هستم ، علاقه مند به به طراحی ، توسعه و پیاده سازی سیستم های نرم افزارینیاز های کارکردی و غیر کارکردی در نرم افزار (Functional,Non Functional)مقدمه: نیازهای کارکردی(عملکردی) و غیرکارکردی(غیر عملکرد) چیست؟وقتی می‌خواهیم یک سیستم طراحی کنیم، باید هم به چیستی کارکردها و هم به کیفیت اجرای آن‌هاتوجه کنیم. این دو جنبه با نیازهای کارکردی(Functional Requirements) و غیرکارکردی(Non-Functional Requirements) تعریف می‌شوند.مثال‌های متنوع و روزمره:سیستم مدیریت مدرسه:نیاز کارکردی: امکان ثبت‌نام دانش‌آموزان، ثبت نمرات و ارسال گزارش به والدین.نیاز غیرکارکردی: سیستم باید از همزمانی کاربران پشتیبانی کند و داده‌ها محرمانه باشند.اپلیکیشن تاکسی آنلاین:نیاز کارکردی: یافتن راننده، محاسبه کرایه، پرداخت آنلاین.نیاز غیرکارکردی: اپ باید در کمتر از 5 ثانیه راننده  نزدیک را پیدا کند.سامانه بانکی آنلاین:نیاز کارکردی: انتقال وجه، مشاهده موجودی، پرداخت قبض.نیاز غیرکارکردی: امنیت بالا برای جلوگیری از هک و نمایش درست در موبایل و کامپیوتر.بازی موبایل:نیاز کارکردی: قابلیت انجام مراحل بازی، ذخیره امتیاز، و  بازی چندنفره.نیاز غیرکارکردی: بازی نباید هنگ کند و باید روی دستگاه‌های قدیمی هم اجرا شود.رستوران دیجیتال:نیاز کارکردی: نمایش منو، سفارش آنلاین، و رزرو میز.نیاز غیرکارکردی: اپ باید حتی در ساعت‌های اوج شلوغی به خوبی کار کند.سیستم خزنده وب:نیاز کارکردی: پیدا کردن لینک‌ها، دانلود صفحات، و ذخیره اطلاعات.نیاز غیرکارکردی: باید با سرعت بالا و بدون نقض قوانین سایت‌ها عمل کند.این مقدمه نشان می‌دهد که نیازهای کارکردی به وظایف سیستم و نیازهای غیرکارکردی به کیفیت اجرامربوط هستند.نیازهای کارکردی (Functional Requirements):این نیازها به وظایفو عملکردهای اصلی یک سیستم اشاره دارند. به زبان ساده، این‌ها چیزهایی هستند که سیستم باید حتماً انجام بده تا هدف اصلی خودش رو برآورده کنه.مثال‌های متنوع:اپلیکیشن فروشگاه آنلاین:امکان جستجوی محصولات.افزودن کالا به سبد خرید.ثبت سفارش و پرداخت آنلاین.سیستم دانشگاهی:ثبت‌نام دانشجویان در کلاس‌ها.نمایش برنامه درسی.ثبت نمرات پایان ترم.نرم‌افزار حسابداری:ثبت تراکنش‌ها (درآمد و هزینه).تولید گزارش مالی.محاسبه مالیات به صورت خودکار.سامانه خبررسانی:نمایش اخبار جدید به ترتیب زمانی.دسته‌بندی اخبار بر اساس موضوع.جستجوی خبرهای خاص.اپلیکیشن پیام‌رسان:ارسال پیام متنی.برقراری تماس صوتی و تصویری.ایجاد گروه‌های چت.سیستم مدیریت پروژه:تعریف پروژه‌ها و وظایف.تعیین مهلت‌ها و تخصیص افراد به وظایف.نمایش وضعیت پیشرفت پروژه.نیازهای کارکردی، پایه و اساس سیستم هستند. اگر این نیازها درست تعریف و اجرا نشن، سیستم عملاً ناقص یا بی‌فایده خواهد بود!نیازهای غیرکارکردی (Non-Functional Requirements):این نیازها به کیفیت اجرای عملکردها اشاره دارن، نه به وظایف اصلی. این موارد تعیین می‌کنن سیستم چطورکار کنه و تجربه کاربران رو بهبود می‌بخشن.مثال‌های متنوع:اپلیکیشن فروشگاه آنلاین:سرعت: سفارش  باید در کمتر از 2 ثانیه ثبت بشه.در دسترس بودن: سایت باید 99.9٪ مواقع در دسترس باشه.مقیاس‌پذیری: باید هم‌زمان از 10,000 کاربر پشتیبانی کنه.سیستم دانشگاهی:امنیت: نمرات و  اطلاعات دانشجوها باید رمزنگاری بشه.پایداری: در زمان  انتخاب واحد، سیستم نباید دچار اختلال بشه.نرم‌افزار حسابداری:قابلیت اطمینان: گزارش‌های مالی نباید هیچ خطای محاسباتی داشته باشن.کاربرپسندی: حتی کاربران مبتدی باید بتونن به راحتی از سیستم استفاده       کنن.اپلیکیشن پیام‌رسان:تاخیر کم: پیام‌ها  باید در کمتر از 1 ثانیه ارسال بشن.امنیت: پیام‌ها  باید رمزنگاری شده باشن و فقط برای گیرنده قابل مشاهده باشن.بازی موبایل:پایداری: بازی نباید هنگام انجام مراحل هنگ کنه.سازگاری: باید روی  دستگاه‌های قدیمی و جدید به خوبی اجرا بشه.نیازهای غیرکارکردی، تضمین می‌کنن که سیستم علاوه بر انجام وظایفش، با کیفیت و قابل اعتماد باشه.حالا برای اینکه بتونیم درک درستی از این نیاز ها داشته باشیم ، مثال های دیگه ای میزنیم که چالشی تر هستن ، سعی کنین قبل دیدن پاسخ این سوالات ، ببینید به نظرتون جزوه کدوم دسته محسوب میشن . بزنید بریم 😊در دنیای واقعی و در حوزه نرم‌افزار، بعضی از نیازها ممکن است به راحتی قابل تفکیک به نیازهای عملیاتی (Functional) و غیرعملیاتی(Non-Functional) نباشند. این نوع نیازها به‌ویژه زمانی پیش می‌آیند که مشخصات سیستم با پیچیدگی‌های خاص خود روبرو می‌شود. در ادامه چند مثال آورده‌ام که تشخیص اینکه آیا نیاز به دسته‌بندی عملیاتییا غیرعملیاتی تعلق دارند، می‌تواند سخت باشد:. 1 عملکرد بالا و قابل مقیاس بودنتوضیح: سیستم باید بتواند در شرایط بار سنگین، به تعداد زیاد  درخواست‌ها پاسخ دهد و همچنان سریع عمل کند.چالش: آیا این نیاز یک ویژگی عملیاتی است که مربوط به نحوه‌ی پردازش داده‌ها و انجام عملیات است یا یک ویژگی غیرعملیاتی که به مقیاس‌پذیری و عملکرد سیستم در سطح بزرگ‌تری اشاره دارد؟کجا تشخیص سخت است: این نیاز ممکن است ابتدا به نظر بیاید که مربوط به عملکرد سیستم (Functional) است اما به‌طور کلی جزء نیازهای غیرعملیاتی به شمار می‌رود چون بیشتر به مقیاس‌پذیری      و نحوه‌ مدیریت منابع اشاره دارد..2 امنیت داده‌هاتوضیح: سیستم باید قابلیت رمزنگاری داده‌ها را داشته باشد.چالش: آیا این مورد یک نیاز عملیاتی است چون در پیاده‌سازی ویژگی‌های امنیتی و پردازش داده‌ها اثر می‌گذارد، یا یک نیاز غیرعملیاتی که به حفاظت از داده‌ها در سطح سیستم اشاره دارد؟کجا تشخیص سخت است: رمزنگاری در عمل  عملیاتی و امنیتی است، اما مفهوم امنیت در اصل بیشتر به غیرعملیاتی  تعلق دارد.پس وقتی داریم از یک عمل عملیاتی که سیستم به اون وابسته هست صحبت میکنیم ، مثل اینکه داده ها هنگام انتقال باید رمزگذاری بشن و سپس ارسال بشن و اگر اینکار اتفاق نیفته سیستم ما عمکرد خودش رو درست انجام نداده ، اینجا یک نیاز کارکردی هست ، اما وقتی داریم میگیم برنامه باید امن باشه یک نیاز غیرکاربردی یا غیر عملکردی هست.3 در دسترس بودن (Availability)توضیح: سیستم باید در 99.99% مواقع در دسترس باشد و downtime به حداقل برسد.چالش: این نیاز ممکن است به نظر برسد که یک نیاز عملیاتی است  چون به نحوه عملکرد سیستم و دسترسی به آن اشاره دارد، اما از آنجایی که بیشتر به عملکرد سیستم در مقیاس بزرگ و پایداری سیستم اشاره دارد، این نیاز غیرعملیاتی است..4 رابط کاربری (UI) و تجربه کاربری (UX)توضیح: سیستم باید رابط کاربری ساده، جذاب و کاربردی داشته باشد.چالش: طراحی رابط کاربری و تجربه کاربری به طور مستقیم بر نحوه استفاده و تعامل کاربران با سیستم تأثیر می‌گذارد، اما ممکن است نیازهای عملکردی (برای مثال در مورد قابلیت‌های خاص سیستم) و غیرعملیاتی (مثلاً در مورد راحتی و رضایت کاربر) را در بر بگیرد.کجا تشخیص سخت است: این نیاز ممکن است به‌طور همزمان هم به ویژگی‌های عملیاتی (عملکردها و قابلیت‌ها) و هم به ویژگی‌های غیرعملیاتی (کیفیت تجربه کاربر) تعلق داشته باشد..5 پایداری و انعطاف‌پذیری در برابر تغییراتتوضیح: سیستم باید به راحتی قابل نگهداری و گسترش باشد.چالش: این نیاز ممکن است در ابتدا به نظر برسد که به قابلیت‌های  عملیاتی نرم‌افزار برای تطبیق با تغییرات یا گسترش نیاز دارد، اما بیشتر به نگهداری و گسترش پذیری سیستم که جنبه‌ای از نیازهای غیرعملیاتی دارد، اشاره دارد..6 دقت در پردازش داده‌هاتوضیح: سیستم باید داده‌ها را با دقت بالا پردازش کند و اشتباهات را کاهش دهد.چالش: این ویژگی ممکن است به نظر برسد که یک نیاز عملیاتی است چون بر نحوه پردازش داده‌ها تأثیر می‌گذارد، اما در عین حال به کیفیت خروجی  سیستم و اعتمادپذیری آن مربوط می‌شود، که می‌تواند به نیاز غیرعملیاتی تعلق داشته باشد..7 زمان پاسخگویی (Response Time)توضیح: سیستم باید در پاسخ به درخواست‌ها کمتر از 2 ثانیه زمان بگیرد.چالش: این نیاز می‌تواند یک ویژگی عملیاتی باشد چون به عملکرد سیستم در زمان اجرای عملیات مربوط می‌شود، اما از آنجایی که بیشتر به تجربه      کاربر و کارآیی سیستم در سطح کلان اشاره دارد، جزو نیازهای غیرعملیاتی     محسوب می‌شود ، در عین حال اگر در یک سیستم بانکی تراکنش باید حداکثر در طی      یک مدت زمان خاص پاسخ داده شود ، این به عنوان یک نیاز عملکردی تلقی میشوددر ادامه مثال های دیگه ای برای درک بهتر موضوع میارم که تفاوت ها بهتر مشخص بشه ، این مثال ها در بعضی اوقات میتونند نیاز عملکردی و در بعضی موارد نیاز غیرعملکردی باشند..1 ورود به سیستم (Login)عملکردی: ورود به سیستم به طور مستقیم با انجام وظیفه‌ی شناسایی      و احراز هویت کاربر مرتبط است. برای مثال، وقتی یک کاربر می‌خواهد وارد      حساب کاربری خود شود و سیستم باید نام کاربری و رمز عبور را بررسی کرده و      دسترسی را فراهم کند، این نیاز یک ویژگی عملکردی است.غیرعملکردی: اگر نیاز به امنیت بالاتر در فرآیند ورود (مثل نیاز به استفاده از روش‌های احراز هویت چند      عاملی) وجود داشته باشد، این ویژگی تبدیل به یک نیاز غیرعملکردی می‌شود زیرا به‌طور کلی به کیفیت امنیت سیستم مربوط است، نه به انجام فرآیند ورود..2 ذخیره داده‌ها در پایگاه دادهعملکردی: ذخیره‌سازی داده‌ها در پایگاه داده زمانی که هدف آن انجام      وظیفه‌ای خاص مانند ثبت اطلاعات کاربر یا تراکنش‌ها باشد، یک نیاز عملکردی     است زیرا به طور مستقیم با پردازش و ذخیره‌سازی اطلاعات مرتبط است.غیرعملکردی: اگر نیاز به مقیاس‌پذیری  برای ذخیره‌سازی داده‌ها در حجم‌های بسیار بالا (مثلاً در یک سیستم بزرگ با      داده‌های زیاد) وجود داشته باشد، این نیاز تبدیل به یک ویژگی غیرعملکردی     می‌شود زیرا بیشتر به چگونگی طراحی و گسترش سیستم در مقیاس کلان مربوط است..3 جستجو در اطلاعاتعملکردی: زمانی که سیستم باید قادر به جستجو در پایگاه داده     برای پیدا کردن اطلاعات خاص باشد (مثل جستجوی محصولات در یک فروشگاه آنلاین)، این یک نیاز عملکردی است چون به‌طور مستقیم با انجام عملیات جستجو و  برگرداندن نتایج مرتبط است.غیرعملکردی: اگر سیستم نیاز به انجام جستجوهای سریع در داده‌های حجیم داشته باشد، و انتظار می‌رود که  زمان جستجو در زیر 2 ثانیه باشد، این ویژگی به یک نیاز غیرعملکردی تبدیل می‌شود چون بیشتر به عملکرد کلی و تجربه کاربر در سطح سیستم مرتبط است..4 ارسال ایمیل تأییدعملکردی: ارسال یک ایمیل تأیید پس از ثبت نام یا انجام یک عملیات خاص (مثل خرید) نیاز به عملکرد خاصی دارد که به‌طور مستقیم به انجام وظایف سیستم مرتبط است. برای مثال، ارسال ایمیل تأیید پس از ثبت‌نام یک کاربر، یک نیاز عملکردی است.غیرعملکردی: اگر سیستم نیاز به ضمانت ارسال ایمیل‌ها در بازه زمانی خاص (مثلاً در کمتر از 5 ثانیه) داشته باشد تا تجربه کاربر حفظ شود، این نیاز به‌عنوان یک ویژگی غیرعملکردی در نظر گرفته می‌شود..5 گزارش‌گیریعملکردی: ایجاد و نمایش گزارش‌ها (مثل گزارش‌های مالی، تحلیل داده‌ها)نیازهای عملکردی هستند زیرا به‌طور مستقیم با توانایی سیستم در پردازش   و نمایش اطلاعات مشخص و انجام وظایف مرتبط با تحلیل داده‌ها مرتبط‌اند.غیرعملکردی: اگر سیستم نیاز به قابلیت سفارشی‌سازی گزارش‌ها داشته باشد، به‌گونه‌ای که کاربران بتوانند گزارش‌ها  را بر اساس نیاز خود فیلتر و تنظیم کنند، این ویژگی به یک نیاز غیرعملکردی تبدیل می‌شود زیرا به ویژگی‌های قابل تنظیم سیستم و نحوه تعامل کاربر با آن مربوط است..6 امنیتعملکردی: برای مثال، کنترل دسترسی به اطلاعات خاص (مانند محدود کردن دسترسی کاربران به داده‌های حساس) یک نیاز عملکردی است زیرا به‌طور مستقیم به انجام وظیفه‌ای مشخص در سیستم (یعنی مدیریت دسترسی و  اطلاعات حساس) مربوط می‌شود.غیرعملکردی: اما اگر سیستم نیاز به پروتکل‌های امنیتی پیشرفته (مثل احراز هویت دو مرحله‌ای، رمزنگاری      داده‌ها و غیره) داشته باشد، این ویژگی تبدیل به یک نیاز غیرعملکردی می‌شود زیرا بیشتر به نحوه حفاظت و امنیت کلی سیستم مرتبط است..7 مقیاس‌پذیریعملکردی: مقیاس‌پذیری زمانی که به‌طور خاص با افزایش تعداد کاربران      و درخواست‌ها برای انجام وظایف خاص (مانند افزایش تراکنش‌ها در یک سیستم فروش آنلاین) در ارتباط باشد، می‌تواند به عنوان یک نیاز عملکردی در نظر گرفته شود.غیرعملکردی: در اکثر مواقع، مقیاس‌پذیری      به ویژگی‌های طراحی کلی سیستم اشاره دارد که مربوط به توانایی آن در مدیریت بارهای بیشتر در آینده است. این ویژگی معمولاً به‌عنوان یک نیاز غیرعملکردی     در نظر گرفته می‌شود..8 پشتیبان‌گیری و بازیابی(Backup and Recovery)عملکردی: در برخی سیستم‌ها، نیاز به پشتیبان‌گیری داده‌ها به‌طور مستقیم به عملیات اجرایی مانند جلوگیری از دست رفتن داده‌ها در صورت      وقوع خطا در سیستم مربوط می‌شود. این یک نیاز عملکردی است چون مستقیماً بر عملیات حفاظت از داده‌ها تأثیر می‌گذارد.غیرعملکردی: در شرایطی که نیاز به زمان  بازیابی مشخص (مثلاً بازیابی داده‌ها در کمتر از یک ساعت بعد از خرابی) وجود داشته باشد، این نیاز به‌طور کلی به نحوه عملکرد سیستم در مواقع بحران و      مدیریت وضعیت‌های اضطراری مرتبط است و به‌عنوان یک نیاز غیرعملکردی     شناخته می‌شود..9 پشتیبانی از چند زبان(Multilingual Support)عملکردی: در صورتی که سیستم به‌طور خاص نیاز به پشتیبانی از      زبان‌های مختلف برای نمایش اطلاعات به کاربران داشته باشد (مثلاً در یک سایت فروشگاهی که برای بازارهای مختلف طراحی شده باشد)، این نیاز به‌طور مستقیم با عملیات سیستم ارتباط دارد و یک نیاز عملکردی است.غیرعملکردی: اگر نیاز به قابلیت تغییر زبان به‌صورت پویا در هر نقطه از سیستم وجود داشته باشد تا تجربه کاربری بهبود یابد، این ویژگی تبدیل به یک نیاز غیرعملکردی می‌شود چون      بیشتر به تجربه کاربر و طراحی سیستم در سطح کلان مربوط است.جمع‌بندی:در این مثال‌ها، ویژگی‌هایی که به‌طور مستقیم با انجام عملیات خاص در سیستم ارتباط دارند (مانند ورود به سیستم، ذخیره داده‌ها، یا ارسال ایمیل تأیید) به‌عنوان نیازهای عملکردی در نظر گرفته می‌شوند. اما ویژگی‌هایی که بیشتر به کیفیت کلی سیستم، کارایی، یا تجربه کاربر مربوط می‌شوند (مانند امنیت، مقیاس‌پذیری، یا پشتیبانی از چند زبان) به‌طور معمول نیازهای غیرعملکردی هستند، مگر اینکه مستقیماً بر روی فرآیندهای خاص سیستم اثر بگذارند.سخن پایانیبا توجه به اینکه این موضوع یکی از موضوعات پایه ای طراحی نرم افزار هست ، سعی کردم در این مقاله با جمع بندی مطالب و به صورت خیلی ساده این مطلب رو برای شما جا بندازم ، دلیل تنوع مثال ها به این علت بود که تفکیک این که یک نیاز عملکردی یا غیرعملکردی هست بعضی اوقات دشوار هست اما تا حدودی زیادی فکر میکنم با خوندن این مقاله بتونید تفاوت های زیادی رو براش عنوان کنید. پاییز سال 1403</description>
                <category>امیر معصوم بیگی</category>
                <author>امیر معصوم بیگی</author>
                <pubDate>Mon, 09 Dec 2024 06:31:49 +0330</pubDate>
            </item>
                    <item>
                <title>&quot;برآورد تقریبی: هنر محاسبات سریع و دقیق برای طراحی سیستم‌ها&quot;</title>
                <link>https://virgool.io/@m_33467671/%D8%A8%D8%B1%D8%A2%D9%88%D8%B1%D8%AF-%D8%AA%D9%82%D8%B1%DB%8C%D8%A8%DB%8C-%D9%87%D9%86%D8%B1-%D9%85%D8%AD%D8%A7%D8%B3%D8%A8%D8%A7%D8%AA-%D8%B3%D8%B1%DB%8C%D8%B9-%D9%88-%D8%AF%D9%82%DB%8C%D9%82-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%B7%D8%B1%D8%A7%D8%AD%DB%8C-%D8%B3%DB%8C%D8%B3%D8%AA%D9%85-%D9%87%D8%A7-issyw6tp78p2</link>
                <description>من امیر معصوم بیگی هستم  ، علاقه مند به به طراحی ، توسعه و پیاده سازی سیستم های نرم افزاری&quot;برآورد تقریبی: هنر محاسبات سریع و دقیق برای طراحی سیستم‌ها&quot;مقدمه:فرض کن تو یه جلسه کاری نشستی و یکی از مدیرها ازت می‌پرسه: &quot;اگه بخوایم یه سیستمی راه بندازیم که روزی چند هزار پیام رو پردازش کنه، چند تا سرور لازم داریم؟&quot; یا مثلاً تو یه مصاحبه شغلی ازت می‌خوان تخمین بزنی که توییتر چجوری اطلاعات میلیون‌ها کاربر رو ذخیره و مدیریت می‌کنه. خب، اینجا وقت نداری لپ‌تاپ رو باز کنی، ماشین‌حساب بیاری یا یه برنامه دقیق بنویسی، درسته؟ اینجاست که &quot;برآورد تقریبی&quot; یا همون  Back-of-the-Envelope Estimation مثل یه ناجی وارد بازی می‌شه.حالا این روش چیه؟ خیلی ساده‌ست. تصور کن داری چیزی رو روی یه تیکه کاغذ یا حتی پشت پاکت نامه می‌نویسی. هدف این نیست که دقیق‌ترین جواب دنیا رو بدی، بلکه فقط می‌خوای یه دید کلی داشته باشی. مثل وقتی که می‌خوای تخمین بزنی برای سفر چند لیتر بنزین می‌خوای. سریع فاصله رو در مصرف ماشین ضرب می‌کنی و یه عدد گرد و راحت به دست میاری.تو دنیای تکنولوژی هم داستان همینه. مثلاً مهندس‌های گوگل وقتی می‌خوان یه سرویس بزرگ مثل جیمیل طراحی کنن، نمیان از همون اول همه‌چی رو دقیق حساب کنن. اول چند تا فرض ساده می‌کنن:مثلاً چند نفر از این سرویس استفاده می‌کنن؟هر نفر چقدر داده تولید می‌کنه؟این داده‌ها چقدر فضا لازم دارن؟برآورد تقریبی دقیقاً همین جا به کار میاد. یه جور محاسبه سرانگشتیه که تو رو از گیر کردن توی جزئیات نجات می‌ده و کمک می‌کنه بفهمی طرح کلی چطوری باید باشه.این روش تو زندگی عادی هم کلی کاربرد داره. مثلاً:می‌خوای برای مهمونی نوشیدنی بخری؟ تعداد مهمونا رو ضربدر      دو کن، همینه!داری فکر می‌کنی برای تعطیلات چقدر پول کنار بذاری؟ مسیر      رو ضربدر قیمت بنزین کن.توی این مقاله قراره همین روش ساده و کاربردی رو با زبون خودمونی یاد بگیریم و با چند مثال واقعی، مثل توییتر و دیتاسنترها، حسابی دستمون راه بیفته. آماده‌ای؟! 😊برآورد تقریبی: راهی برای حل مسائل پیچیده با روش‌های سادهگاهی وقتا توی زندگی و کار، نیاز نیست همه‌چیز رو دقیق بدونی. مثلاً اگه یکی ازت بپرسه برای اینکه یه آپارتمان رو نقاشی کنی چند قوطی رنگ لازمه، نیازی نیست دقیق بشینی دیوارها رو متر کنی یا میزان جذب رنگ هر دیوار رو محاسبه کنی! کافیه به طور تقریبی طول و عرض خونه رو در نظر بگیری، یه عدد حدودی ضرب و تقسیم کنی، و به یه تخمین برسی. برآورد تقریبی دقیقاً همینه: رسیدن به یه جواب سریع که خیلی هم دور از واقعیت نباشه.حالا چرا این روش توی طراحی سیستم‌ها و کارهای فنی انقدر مهمه؟ چون وقتی با یه سیستم بزرگ سر و کار داری، مسائل به شدت پیچیده می‌شن و جزئیات ممکنه اذیتت کنن. برآورد تقریبی کمک می‌کنه خیلی سریع‌تر مسیر درست رو پیدا کنی.مثال واقعی:فرض کن می‌خوای یه سرویس مثل اینستاگرام طراحی کنی. سؤال اینه که برای ذخیره‌سازی عکس‌های کاربران چقدر فضای دیسک لازمه؟ خب، می‌تونی اینجوری فکر کنی:مثلاً یه کاربر معمولی روزی ۵ تا عکس      آپلود می‌کنه.هر عکس به طور متوسط ۵ مگابایته.سرویس ۱۰۰ میلیون کاربر فعال داره.خیلی راحت با یه ضرب و تقسیم می‌تونی بفهمی روزی چقدر داده تولید می‌شه. حالا اگه بخوای این اطلاعات رو برای ۵ سال ذخیره کنی، باز هم با همین روش ساده می‌تونی به یه عدد حدودی برسی. نیازی نیست محاسبات دقیق انجام بدی؛ فقط یه تخمین کلی کافیه.چرا این روش انقدر جذابه؟سریع و ساده‌ست: برآورد تقریبی نیاز به ابزار خاصی نداره؛ فقط      مغزت و شاید یه قلم و کاغذ.تمرکز رو روی اصول نگه می‌داره: به جای غرق شدن توی جزئیات، بهت کمک می‌کنه روی ایده‌های کلی تمرکز کنی.تصمیم‌گیری بهتر: وقتی یه دید کلی داری، می‌تونی تصمیم‌های بزرگ‌تری بگیری.مثال روزمره:تو زندگی عادی هم این روش کلی به کار میاد. مثلاً:می‌خوای برای عید آجیل بخری؟ اگه بدونی هر نفر حدود نیم کیلو آجیل می‌خوره، کافیه تعداد مهمون‌ها رو ضربدر نیم کنی. نیازی نیست دقیق میزان اشتهای هر نفر رو حساب کنی!داری برنامه‌ریزی می‌کنی که برای سفر چقدر هزینه کنی؟ می‌دونی هر کیلومتر تقریباً ۱۰ هزار تومن هزینه داره، مسافت رو در این عدد ضرب کن.نکته طلایی:هدف از برآورد تقریبی این نیست که جواب کاملاً دقیق بدی. این یه ابزار کمکیه برای اینکه سریع‌تر و مطمئن‌تر به یه دید کلی برسی. حالا این دید کلی تو رو توی مسیر درست قرار می‌ده تا بعداً وقت و انرژی بیشتری برای جزئیات بذاری.این فقط شروع ماجراست! تو بخش‌های بعدی، به نکات تخصصی‌تر و جذاب‌تر، مثل &quot;Power of Two&quot; و تأخیر سیستم‌ها، می‌پردازیم. آماده‌ای؟ 😊قدرت دو (Power of Two): چرا برای سیستم‌ها مهمه؟وقتی درباره طراحی سیستم‌ها یا ذخیره‌سازی داده‌ها حرف می‌زنیم، یکی از اولین چیزایی که باید بدونی، مفهوم &quot;Power of Two&quot; یا همون &quot;توان‌های دو&quot; هست. این مفهوم شاید اولش یه چیز ریاضی خشک به نظر برسه، ولی وقتی کاربردش رو ببینی، احتمالاً نظرت عوض می‌شه.داستان از کجا شروع می‌شه؟دنیای کامپیوتر خیلی با دنیای ما که بر پایه ده‌گانست فرق داره. تو کامپیوتر همه‌چیز با اعداد باینری (صفر و یک) کار می‌کنه. برای همین، توان‌های دو نقش کلیدی دارن. مثلاً:1 بایت = 8 بیت (معادل 2 به توان 3 بیت)1 کیلوبایت = 1024 بایت  (معادل 2 به توان 10 بایت)1 مگابایت = 1024 کیلوبایت (معادل 2 به توان 10 کیلوبایت)همین‌جوری تا گیگابایت  ، ترابایت و پتابایت پیش  می‌ره!پس اگه بدونی چطوری با این توان‌های دو کار کنی، خیلی راحت‌تر می‌تونی حجم داده‌ها رو تخمین بزنی.چرا توان‌های دو مهم هستن؟مثلاً فرض کن یه سیستم ذخیره‌سازی طراحی می‌کنی. تعداد کاراکترهایی که کاربرها تایپ می‌کنن چقدر فضا می‌بره؟ برای هر کاراکتر معمولی (مثل حروف انگلیسی) 1 بایت لازمه. ولی اگه داده‌ها رو به شکلی ذخیره کنی که همیشه با توان دو هماهنگ باشه، هم محاسبات ساده‌تر می‌شه و هم سیستم بهینه‌تر کار می‌کنه.مثال ساده:بیایم حجم یه چت ساده رو تخمین بزنیم:هر پیام شامل 100 کاراکتره.هر کاراکتر 1 بایت می‌بره.اگه 1 میلیون نفر روزی 10 پیام  بفرستن، حجم داده‌ها این‌طوری حساب می‌شه:خب، بیایم این محاسبات رو انجام بدیم:هر پیام  100 کاراکتر × 1 بایت = 100 بایتتعداد پیام‌ها در روز: 1,000,000 نفر × 10 پیام = 10,000,000 پیامحجم کل داده‌ها در روز: 10,000,000 پیام × 100 بایت = 1,000,000,000 بایتتبدیل به مگابایت: 1,000,000,000 بایت ÷ (1024 × 1024) ≈ 953.67 مگابایتبنابراین، اگه 1 میلیون نفر هر روز 10 پیام بفرستن، حجم کل داده‌ها تقریبا 953.67 مگابایت می‌شه. ما برای راحتی کار ، عدد رو گرد میکنیم و 1024 در نظر میگیریم که معادل 1 گیگ میشه،  حالا اگه این داده‌ها رو برای یک سال ذخیره کنیم، حجمش می‌شه365*1 = 365 گیگابایتنکته مهم:وقتی این برآوردها رو انجام می‌دی، همیشه حواست باشه اعدادت گرد و راحت باشن. مثلاً اگه نتیجه‌ای که گرفتی 995 مگابایته، بهتره همون 1 گیگابایت در نظر بگیری. اینجوری هم محاسبات ساده‌تر می‌شه و هم احتمال خطا کمتره.کاربرد تو دنیای واقعی:توان‌های دو فقط برای محاسبات ذخیره‌سازی نیستن. این مفهوم تو شبکه‌ها، کش کردن داده‌ها، و حتی طراحی حافظه هم استفاده می‌شه. مثلاً اگه یه سرور داری که 32 گیگابایت رم داره، بهینه‌ترین حالت اینه که حافظه‌ها رو بر اساس بلوک‌های توان دو تقسیم کنی.جمع‌بندی:&quot;Power of Two&quot; یه ابزار ساده ولی قدرتمنده. وقتی یاد بگیری چطوری ازش استفاده کنی، هم محاسباتت سریع‌تر می‌شه و هم سیستمی که طراحی می‌کنی بهتر و بهینه‌تر کار می‌کنه. حالا که این مفهوم رو یاد گرفتی، تو بخش بعدی درباره یکی از مسائل حیاتی دیگه یعنی &quot;Latency&quot;  یا همون تاخیر صحبت می‌کنیم؛ چیزی که می‌تونه سیستم‌هاتو سریع یا کند کنه! 😊تأخیر (Latency): وقتی زمان اهمیت پیدا می‌کندفرض کن می‌خوای یه فیلم آنلاین ببینی. دکمه پخش رو می‌زنی و فیلم فوراً شروع می‌شه. حالا تصور کن بعد از زدن دکمه، ۱۰ ثانیه طول بکشه تا پخش شروع بشه. چه احساسی داری؟ احتمالاً به اینترنت یا سرویس استریم غر می‌زنی! اینجا چیزی که اذیتت کرده، تأخیر (Latency) هست.تأخیر یعنی مدت زمانی که طول می‌کشه تا یه درخواست به سرور برسه و جوابش برگرده. این زمان تو دنیای سیستم‌های کامپیوتری و شبکه، اهمیت فوق‌العاده‌ای داره، چون همه‌مون دوست داریم کارها سریع و بی‌دردسر انجام بشه.تأخیر تو سیستم‌های کامپیوتری یعنی چی؟تو کامپیوتر، تأخیر می‌تونه مربوط به هر چیزی باشه:زمان پردازش توی  CPUمدت زمان لازم برای خواندن داده‌ها از حافظه یا دیسکمدت زمانی که یه بسته داده از یه سرور به سرور دیگه منتقل می‌شهبه قول معروف، حافظه سریع است، ولی دیسک کند!تأخیر معمول در عملیات کامپیوتری:آقای Dr. Jeff Dean (یکی از مهندسان ارشد گوگل) یه جدول معروف از تأخیرهای معمول عملیات کامپیوتری درست کرده. این جدول نشون می‌ده چقدر بعضی کارها سریع‌تر از بقیه هستن:خواندن از حافظه کش     (Cache) چند نانوثانیه (ns)دیسک SSD: چند میلی‌ثانیه     (ms)ارسال داده به یه سرور دیگه: چند میلی‌ثانیه تا چند صد میلی‌ثانیهبرای اینکه بهتر بفهمی، بیا یه مثال ساده بزنیم:خواندن 1 بایت از حافظه رم: مثل اینه که از خونه‌ت یه فنجون قهوه برداری.خواندن 1 بایت از دیسک سخت  (HDD): مثل اینه که بری سوپرمارکت محل و قهوه      بخری.ارسال داده به یه سرور دیگه تو کشور دیگه: مثل اینه که سوار هواپیما بشی و بری قهوه رو از یه کافی‌شاپ تو شهر دیگه بگیری!چطور تأخیر رو کم کنیم؟خب، کسی از تأخیر خوشش نمیاد، پس چیکار می‌شه کرد؟ چند راه‌حل ساده:داده‌ها رو فشرده کن: وقتی می‌خوای داده‌ها رو از یه نقطه به نقطه دیگه بفرستی، حجمش رو کم کن تا سریع‌تر ارسال بشه.از کش (Cache) استفاده کن: اگه داده‌ها رو نزدیک‌تر به جایی که استفاده می‌شن نگه داری، نیاز به رفت‌وبرگشت‌های اضافه کم می‌شه.تا جایی که می‌تونی دیسک رو دور بزن: اگه اطلاعات رو توی حافظه (RAM) ذخیره کنی، دسترسی خیلی سریع‌تره.یه نکته جالب درباره مراکز داده (Data Centers) :دیتاسنترها معمولاً توی مناطق مختلف دنیا پخش هستن. وقتی یه کاربر ایرانی بخواد به یه سرور آمریکایی متصل بشه، داده‌ها باید کلی راه طی کنن. برای همین شرکت‌های بزرگ مثل گوگل یا آمازون سرورهاشون رو نزدیک کاربرانشون قرار می‌دن تا تأخیر رو کم کنن.جمع‌بندی:تأخیر چیزی نیست که همیشه بتونی ازش فرار کنی، ولی با شناخت بهترش می‌تونی طراحیهات رو بهینه‌تر کنی. یه قانون طلایی اینه: &quot;تا جایی که می‌تونی، داده‌ها رو نزدیک نگه دار و دیسک رو دور بزن!&quot;تو بخش بعدی، درباره یه مفهوم حیاتی دیگه حرف می‌زنیم: &quot;Availability&quot; یا همون در دسترس‌پذیری، که نشون می‌ده یه سیستم چقدر می‌تونه همیشه آماده به کار باشه! 😊در دسترس‌پذیری (Availability): همیشه روشن و آماده به کارفرض کن یه روز صبح می‌خوای وارد اینستاگرام بشی و با یه پیغام خطا روبه‌رو می‌شی: &quot;سرویس در دسترس نیست&quot;. چه احساسی پیدا می‌کنی؟ احتمالاً اول اینترنتت رو چک می‌کنی، بعد از دوستات می‌پرسی که آیا برای اونا هم این مشکل پیش اومده. حالا تصور کن این قطعی یه ساعت، یه روز یا حتی بیشتر طول بکشه! واقعاً عصبانی‌کننده‌ست. اینجا دقیقاً چیزی که تحت تأثیر قرار گرفته، در دسترس‌پذیری(Availability) سیستمه.در دسترس‌پذیری یعنی چی؟در دسترس‌پذیری یعنی یه سیستم یا سرویس چه مقدار از زمان رو می‌تونه بدون هیچ وقفه‌ای کار کنه و خدمات ارائه بده. این مفهوم رو معمولاً با درصد بیان می‌کنن. مثلاً:100% در دسترس‌پذیری یعنی هیچ‌وقت قطعی نداره (که در عمل غیرممکنه).99.9% در دسترس‌پذیری یعنی در طول یه سال، فقط حدود ۸ ساعت قطعی خواهیم داشت.سطح خدمات (SLA) و نقش &quot;نه‌ها&quot;وقتی یه شرکت بزرگ مثل گوگل یا آمازون به شما یه سرویس می‌فروشه، یه قرارداد به اسم SLA (Service Level Agreement)  ارائه می‌ده. این قرارداد مشخص می‌کنه که چقدر سرویسشون در دسترس خواهد بود. معمولاً این سطح خدمات رو با تعداد &quot;نه‌ها&quot; (nines) نشون می‌دن:(99% یا 2 تا نه): حدود ۸۷ ساعت قطعی در سال. (99.9%  یا 3 تا نه): حدود ۸ ساعت قطعی در سال. (99.99%  یا 4 تا نه): حدود ۵۲ دقیقه قطعی در سال. نکته : 2 تا نه ، همون تعداد عدد 9 که در درصد هستش ، همینقد ساده 😊هر چی تعداد &quot;نه‌ها&quot; بیشتر باشه، سرویس بهتره، اما هزینه ارائه این سطح هم بیشتر می‌شه.چطور در دسترس‌پذیری رو بالا ببریم؟هیچ سیستمی نمی‌تونه همیشه 100% در دسترس باشه، ولی می‌تونیم با طراحی‌های هوشمندانه این زمان رو به حداکثر برسونیم:پشتیبان‌گیری از داده‌ها (Replication) : اطلاعات رو توی چند سرور      مختلف ذخیره کن تا اگه یکی خراب شد، داده‌ها از جای دیگه بازیابی بشن.تعادل بار (Load Balancing) : وقتی تعداد زیادی کاربر به سیستم وصل می‌شن، یه سرور ممکنه خیلی شلوغ بشه. با توزیع بار بین چند      سرور، می‌تونی از این مشکل جلوگیری کنی.نقاط شکست رو کم کن (Single Point of Failure) : اگه یه بخش از سیستمت خراب بشه و کل سرویس رو از کار بندازه، یعنی یه نقطه ضعف بزرگ داری. باید      مطمئن بشی که سیستم بتونه با از کار افتادن یه بخش، به کارش ادامه بده.مثال واقعی:تصور کن یه فروشگاه آنلاین داری که روزانه هزاران سفارش ثبت می‌کنه. اگه سایتت حتی برای یه ساعت قطع بشه:مشتری‌ها اعتمادشون رو از دست می‌دن.کلی فروش رو از دست می‌دی.ممکنه رقبا مشتری‌هاتو جذب کنن.برای همین شرکت‌های بزرگ کلی هزینه می‌کنن تا سرویس‌هاشون همیشه آماده به کار باشن.جمع‌بندی:در دسترس‌پذیری یکی از مهم‌ترین معیارها تو طراحی سیستم‌هاست. با روش‌هایی مثل پشتیبان‌گیری، توزیع بار، و حذف نقاط ضعف، می‌تونی مطمئن بشی که سیستم همیشه آماده خدمت‌رسانیه.تو بخش بعدی، می‌ریم سراغ یه مثال واقعی از برآورد سیستم‌های بزرگ: &quot;توییتر چطور نیازهای ذخیره‌سازی و پردازش خودش رو تخمین می‌زنه؟&quot; 😊مثال واقعی: تخمین نیازهای توییترحالا که با مفاهیم پایه مثل برآورد تقریبی، تأخیر و در دسترس‌پذیری آشنا شدی، وقتشه یه مثال واقعی رو بررسی کنیم. این بار می‌خوایم ببینیم توییتر، به‌عنوان یکی از بزرگ‌ترین شبکه‌های اجتماعی دنیا، چطور از برآورد تقریبی استفاده می‌کنه تا نیازهای ذخیره‌سازی و پردازش خودش رو محاسبه کنه.فرضیات اولیه:برای این مثال فرض کنیم توییتر اطلاعات زیر رو به ما داده:توییتر حدود 300 میلیون کاربر فعال ماهانه داره.حدود 50 درصد این کاربرها روزانه وارد توییتر می‌شن.هر کاربر به‌طور متوسط روزانه 2 توییت ارسال می‌کنه.10 درصد توییت‌ها شامل فایل‌های مدیا (عکس یا ویدیو) هستن.توییت‌ها باید برای مدت 5 سال ذخیره بشن.برآورد نیازهای پردازش (QPS):مفهوم QPS (Queries Per Second) یعنی تعداد درخواست‌هایی که سیستم در هر ثانیه باید پاسخ بده.مفهوم DAU (Daily Active Users)  : مخفف عبارت  Daily Active Users است که به معنی کاربران فعال روزانه است. این اصطلاح در تحلیل سیستم‌ها و اپلیکیشن‌ها استفاده می‌شود تا تعداد کاربرانی را نشان دهد که در یک روز مشخص از سرویس یا اپلیکیشن استفاده می‌کنند.به‌عنوان مثال: اگر توییتر 300 میلیون کاربر ماهانهداشته باشد و 50 درصد آن‌ها به‌صورت روزانه وارد حسابشان شوند،  DAU توییتر برابر است با:300 میلیون × 50٪ =   150میلیون کاربر فعال روزانه.مفهوم DAU  یکی از معیارهای مهم برای ارزیابی میزان تعامل کاربران با یک سرویس یا اپلیکیشن است و اغلب برای سنجش عملکرد و رشد پلتفرم‌ها استفاده می‌شود.حالا بریم بهتر نیاز های توییتر رو ارزیابی کنیم :1. تعداد کاربران روزانه (DAU) :300 میلیون کاربر × 50٪ =   150میلیون کاربر فعال روزانه2. تعداد توییت‌های روزانه:150 میلیون کاربر × 2 توییت در روز =  300  میلیون توییت در روز3. تعداد توییت در هر ثانیه (QPS) :300 میلیون توییت ÷ (24 ساعت × 3600 ثانیه) 3500 ≈  توییت در ثانیه4. حالت اوج (Peak QPS) : معمولاً در زمان‌های اوج، تعداد درخواست‌ها ممکنه 2 برابر بشه:3500 توییت در ثانیه × 2 = 7000 توییت در ثانیهبرآورد نیازهای ذخیره‌سازی:برای ذخیره‌سازی، باید حجم هر توییت رو حساب کنیم:1. حجم هر توییت:شناسه توییت  (tweet_id):  64 بایتمتن توییت 140 کاراکتر = 140 بایتمدیا (در صورت وجود) 1مگابایت (در نظر گرفتن حالت میانگین)حجم هر توییت = 64 بایت + 140 بایت + حجم مدیا (در صورت وجود)2. محاسبه حجم مدیا: فقط 10 درصد توییت‌ها شامل مدیا هستن:150 میلیون کاربر × 2 توییت × 10٪ × 1 مگابایت =   30  ترابایت در روز3. حجم کل ذخیره‌سازی برای 5 سال:30 ترابایت در روز × 365 روز × 5 سال 55 ≈  پتابایتنتیجه‌گیری:توییتر باید سیستمی طراحی کنه که در اوج ترافیک، توان پردازش 7000  درخواست در ثانیه رو داشته باشه.فضای ذخیره‌سازی لازم برای مدیا در  طول 5 سال، حدود 55 پتابایت خواهد بود.نکته مهم:این اعداد فقط تخمینی هستن و ممکنه تو دنیای واقعی کمی متفاوت باشن. هدف این مثال اینه که ببینیم چطور می‌شه با چند فرض ساده، نیازهای یه سیستم بزرگ رو برآورد کرد.تو بخش بعدی، چند نکته طلایی رو بررسی می‌کنیم که می‌تونه برآوردها رو دقیق‌تر و بهتر کنه. 😊نکات طلایی برای برآورد دقیق‌تر و بهترحالا که دیدیم چطور می‌شه از برآورد تقریبی استفاده کرد، وقتشه چند نکته کلیدی رو یاد بگیریم که کمک می‌کنن محاسباتمون دقیق‌تر و حرفه‌ای‌تر باشه. این نکات شاید ساده به نظر برسن، ولی وقتی پای طراحی سیستم‌های بزرگ در میون باشه، می‌تونن معجزه کنن!. 1 گرد کردن و ساده کردن اعدادمحاسبه با اعداد پیچیده وقت‌گیر و گاهی گیج‌کننده‌ست. برای همین همیشه اعداد رو گرد کن.مثال: به‌جای اینکه بگی 99987  تقسیم بر 9.1، سریع می‌گی: 100000 تقسیم بر 10. نتیجه تقریباً همونه، ولی محاسبه‌ش خیلی راحت‌تره.به‌جای حساب کردن 1023بایت، همون 1 کیلوبایت رو در نظر بگیر.. 2 نوشتن فرضیاتهمیشه فرضیاتی که انجام می‌دی رو بنویس. این کار به دو دلیل مهمه:ممکنه بعداً لازم باشه دوباره فرضیاتت رو بررسی کنی.مصاحبه‌کننده یا همکارت می‌تونه دقیقاً بفهمه بر چه اساسی محاسبه کردی.مثال: اگه گفتی هر کاربر روزی  2 توییت ارسال می‌کنه، حتماً این فرض رو مشخص کن.. 3 برچسب‌گذاری واحدهاوقتی اعدادی مثل 5  یا 1000 رو می‌نویسی، حتماً مشخص کن منظور چیه.مثال:5 کیلوبایت؟ 5 مگابایت؟ یا 5 گیگابایت؟به‌جای نوشتن 10 بنویس 10 گیگابایت،  اینجوری هیچ ابهامی باقی نمی‌مونه.. 4 استفاده از تقریب‌های رایجبرای برآورد بهتر، بعضی اعداد رو همیشه تو ذهنت نگه دار. این کار باعث می‌شه سریع‌تر تصمیم بگیری.مثال:(تعداد ثانیه‌های یک روز: 86400 تقریباً 86000 ) (تعداد روزهای یک سال: 365 تقریباً 360 ) . 5 تمرین کردن سوالات پرکاربردیه سری از سوالات تو مصاحبه‌ها یا جلسات طراحی سیستم زیاد پرسیده می‌شن. اگه این سوالات رو از قبل تمرین کنی، می‌تونی خیلی راحت‌تر و سریع‌تر جواب بدی.مثال‌های پرکاربرد:برآورد تعداد درخواست در ثانیه (QPS).حجم داده موردنیاز برای ذخیره‌سازی.تعداد سرورهای لازم برای یک سرویس.. 6 استفاده از ابزارهاگاهی وقتا یه ابزار ساده مثل قلم و کاغذ یا حتی یه ماشین‌حساب می‌تونه سرعتت رو چند برابر کنه. همچنین ابزارهای آنلاین برای برآورد ذخیره‌سازی یا پردازش داده‌ها وجود دارن که می‌تونی ازشون استفاده کنی.. 7 آماده بودن برای سوالات تکمیلیکارفرما یا مصاحبه کننده یا تیم ممکنه ازت سوالات بیشتری بپرسن، مثل اینکه:اگه تعداد کاربران 2 برابر بشه، چه تغییری توی سیستم لازمه؟اگه بخوای داده‌ها رو سریع‌تر پردازش کنی، چه  راهکاری داری؟نکته پایانیهدف از برآورد تقریبی این نیست که جواب دقیق بدی. مهم اینه که نشون بدی می‌تونی یه مسئله پیچیده رو به بخش‌های کوچیک‌تر تقسیم کنی و یه تخمین منطقی بزنی. با این روش، همیشه یه قدم جلوتر از بقیه خواهی بود!سعی من در این مقاله این بود که شما با کلیت تخمین در سیستم های نرم افزاری آشنا بشید و یک دید خوب برای این موضوع پیدا کنید ، منابع زیادی هستن که میتونید به عنوان رفرنس تکمیلی تر مطالعه کنید ، کتاب های آقای Alex Xu یکی از قویترین کتاب ها برای حوزه طراحی نرم افزار هست System Design Interview An Insider’s Guide by Alex Xuدوست دار شما امیر معصوم بیگی</description>
                <category>امیر معصوم بیگی</category>
                <author>امیر معصوم بیگی</author>
                <pubDate>Fri, 06 Dec 2024 15:05:36 +0330</pubDate>
            </item>
                    <item>
                <title>یک چت پی تی رایگان و بدون فیلترشکن ؟! Microsoft Copilot</title>
                <link>https://virgool.io/@m_33467671/%DB%8C%DA%A9-%DA%86%D8%AA-%D9%BE%DB%8C-%D8%AA%DB%8C-%D8%B1%D8%A7%DB%8C%DA%AF%D8%A7%D9%86-%D9%88-%D8%A8%D8%AF%D9%88%D9%86-%D9%81%DB%8C%D9%84%D8%AA%D8%B1%D8%B4%DA%A9%D9%86-microsoft-copilot-xtcameefaw5x</link>
                <description>من امیر معصوم بیگی هستم یک توسعه دهنده !اگر مثل من خیلی دوست داشته باشید از هوش مصنوعی برای راحتی کارهاتون استفاده کنین ، متوجه میشید که خیلی از اون ها ایراد های مختلفی دارن ، بعضی هاشون صرفا فقط برای ایرانی ها مشکل سازن ، و متاسفانه این موضوع همیشه میتونه باعث دردسر بشه ، میخوام در چند پست بیام و چندین مدل هوش مصنوعی که میتونید باهش کار کنید رو به شما معرفی کنم ، و خوبی و بدی هرکدوم رو بهتون نشون بدم امروز میخوام مدل هوش مصنوعی ماکروسافت رو بهتون معرفی کنم که در آدرس https://copilot.microsoft.com میتونید بهش دسترسی داشته باشید ، اول از همه ویژگی هاش رو بگم که ببینید اصلا در حدی هست که به دردتون بخوره یا نه !نیاز به فیلترشکن نداره !نیاز به ثبت نام واسه استفاده های معمولی ندارهقدرت پاسخ گویی بسیار خوبی داره و در حد gpt3.5 ~4 هست ، البته بعضی اوقات ضعیف تر عمل میکنهفارسی رو به راحتی پشتیبانی میکنهمیتونید داخل گوشی یا وب ازش استفاده کنین ، با توجه تجربم داخل گوشی سریع تر عمل میکنه ، احتمالا بخاطر اینه در وب بخاطر تحریم ها یخورده سرعت رو کند تر میکنهبا ثبت نام کردن میتونید واسش فایل بفرستید که براتون خلاصه کنهاندازه جوابش خیلی خوبه ، منظورم از اندازه تعداد کاراکتر هایی که میتونه براتون ارسال کنه ! معمولا همه هوش مصنوعی هایی که به صورت یک چت بات ارائه میشن ، میزان کاراکتری که در جواب برمیگردونن محدوده ، حالا بعضی با گرفتن هزینه این محدودیت هارو کمتر میکنن یا به نحوی با گرفتن پول واستون دورش میزنن که اینجا خیلی واردش نمیشم !میتونید واسش عکس بفرستید و ازش بخواید براتون تصویر ایجاد کنه ، البته قابلیت 6 و 8 که الان گفتم باید ثبت نام کرده باشین اینا ویژگی های کلی این این ربات داره و با دیدنشون میتونید تصمیم بگیرید واقعا ارزش داره اصلا بررسیش کنین ؟!اما تا اینجا نکات خوبش رو گفتم ، اما بدش چطور ؟! خوب واقعیت اینه همه ی این مدل ها یک سری ویژگی های جذاب دارن و یک سری ویژگی بد ! مخصوصا اگه داخل ایران باشی و شاید اون مدل واقعا اون عیب رو نداره ولی این مشکل واسه کسی که داخل ایرانه به هر حال ممکنه رخ بده !اما ایرادات !!!با اینکه گفتم تعداد کاراکتر های پاسخش خیلی خوبه و طولانیه ، اما متاسفانه در نسخه وب (اندروید رو مطمئن نیستم) وقتی پاسخ خیلی زیاد میشه ، هنگ میکنه و گیر میکنه و هیچ پاسخی هم بهت نمیده و منتظری که بهت پاسخ بده ، در آخر میبینی بهتره مرورگر رو رفرش کنی و دوباره ازش سوال کنی ، معمولا بعد اینکار مشکل رفع میشه ، اما خب یک خورده رو مخ هستن ، البته مشابه این مشکل رو chat gpt هم داره ، تو یک پست دیگه Chat gpt رو بررسی میکنیم :)وقتی تصویر میفرستی که برات خلاصه کنه بعضی اوقات در تصویر قبلی گیر میکنه و هرچی عکس میفرستی همون قبلیو واست میفرستهمحدود به وب و موبایل هستید و داخل اپلیکشن خودتون به صورت api نمیتونید ازش استفاده کنید ، حداقل من نشنیدم ، اگه کسی خبر داشت بگه متن رو اصلاح کنم :)پاسخ هاش به تنوع Chat Gpt نیست ، من به شخصه خیلی با این ویژگی chat gpt حال میکنم ، میتونم قشنگ بهش چطور پاسخ بده و خیلی اوقات خوب جواب میده ، البته نسخه پولیش :)مواردی که بالاتر گفتم ، کلیت این مدل بود با توجه زمانی که واسش گزاشتم و باهش کار کردم ، معمولا وقتی حوصله ندارم فیلترشکن یا شکن رو روشن کنم با این مدل کار میکنم و خیلی وقتا واسه کارای روزمره کارم رو راه میندازه که خوب بد نیست امیدوارم این پست واستون مفید بوده باشه :)</description>
                <category>امیر معصوم بیگی</category>
                <author>امیر معصوم بیگی</author>
                <pubDate>Thu, 21 Nov 2024 19:29:09 +0330</pubDate>
            </item>
                    <item>
                <title>استفاده از چت چی پی (Chat GPT) به صورت کاملاً رایگان ???</title>
                <link>https://virgool.io/@m_33467671/%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-%DA%86%D8%AA-%DA%86%DB%8C-%D9%BE%DB%8C-chat-gpt-%D8%A8%D9%87-%D8%B5%D9%88%D8%B1%D8%AA-%DA%A9%D8%A7%D9%85%D9%84%D8%A7%D9%8B-%D8%B1%D8%A7%DB%8C%DA%AF%D8%A7%D9%86-owr0omqnwlr1</link>
                <description>من امیر معصوم بیگی هستم و این دفعه میخوام به شما یه سایت جذاب رو معرفی کنم !اگر شما هم مثل بسیاری از افراد دیگر  دوست داشتید که از چت چی پی  (Chat GPT) استفاده کنید، اما به دلیل مشکلات ثبت نام، تردید داشته‌اید ?،  سایت poe.com ? را به شما پیشنهاد می‌دهم.این سایت، علاوه بر ارائه چت چی پی، چندین مدل دیگر از رقبای چت چی پی  را نیز ارائه می‌دهد. با یک اکانت ایمیل ?، می‌توانید به راحتی در سایت  ثبت نام کنید، و نیازی به ثبت شماره تلفن همراه ? ندارید.با وجود اینکه برخی از قابلیت‌های پرمخاطب چت چی پی مانند جداسازی چت‌ها  یا برخی از قابلیت‌های پولی ? در این سایت وجود ندارد، اما برای استفاده  عادی، این سایت به عنوان یک اکانت معمولی چت چی پی به شما کمک می‌کند.پس برای استفاده از چت چی پی به صورت کاملاً رایگان، با مراجعه به سایت poe.com ? می‌توانید به راحتی از این خدمات استفاده کنید. ? https://poe.com/ </description>
                <category>امیر معصوم بیگی</category>
                <author>امیر معصوم بیگی</author>
                <pubDate>Sat, 06 May 2023 11:42:07 +0330</pubDate>
            </item>
                    <item>
                <title>آموزش اینترفیس یا رابط (interface) در سیشارپ ، از توهم یادگیری تا واقعیت</title>
                <link>https://virgool.io/@m_33467671/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%A7%DB%8C%D9%86%D8%AA%D8%B1%D9%81%DB%8C%D8%B3-%DB%8C%D8%A7-%D8%B1%D8%A7%D8%A8%D8%B7-interface-%D8%AF%D8%B1-%D8%B3%DB%8C%D8%B4%D8%A7%D8%B1%D9%BE-%D8%A7%D8%B2-%D8%AA%D9%88%D9%87%D9%85-%DB%8C%D8%A7%D8%AF%DA%AF%DB%8C%D8%B1%DB%8C-%D8%AA%D8%A7-%D9%88%D8%A7%D9%82%D8%B9%DB%8C%D8%AA-owju3ywnswsz</link>
                <description>سلام من امیر معصوم بیگی هستم و قصد دارم یه موضوع جالب و بسیار مهم در سیشارپ رو با شما به اشتراک بزارم ، شاید با خودتون بگید که چرا توهم یادگیری در اینترفیس ! واقعیت اینه اگر تازه با اینترفیس آشنا شده باشید و تجربه زیادی در برنامه نویسی نداشته باشید و کورس های آموزش اینترفیس رو مشاهده کنید ، متاسفانه در اکثر کتب و آموزش های تصویری این مبحث به طور کاملا اشتباه آموزش داده میشه ! در واقع فقط بخشی از کارایی اینترفیس گفته میشه و همین باعث میشه وقتی وارد برنامه نویسی های پیشرفته میشید که به شدت از اینترفیس استفاده شده به مشکل شدید میخورید ! همین شد که تصمیم گرفتم این مبحث رو به صورت جامع برای شما باز کنم و توضیح بدم که توضیح عامیانه اینترفیس چیه و استفاده واقعی و کارایی اصلی اون در سیشارپ به چه صورته !اما اول از همه بزارید بگم قراره بیشتر روی کدوم بخش اینترفیس مانور بدیم (:ما قراره روی قابلیت تغیر شکل اینترفیس بحث کنیم و بگیم چرا این قابلیت خیلی مهمه و چرا توجه بهش در سیشارپ خیلی اهمیت دارهاما خب اول از این شروع میکنم که به صورت عامیانه و در بیشتر تدریس ها در مورد اینترفیس چی میگن !اینترفیس : یک اینترفیس یا رابط یک قرارداد را تعریف می کند. هر کلاس یا ساختاری که آن قرارداد را  پیاده سازی می کند باید پیاده سازی اعضای تعریف شده در رابط را ارائه بده .اما این یعنی چی ! کد زیر رو ببینید که بیشتر در موردش صحبت کنیم interface ISendEmailHandler {
    SendEmail(string description);
}
public class SendEmailHandler : ISendEmailHandler 
 {
 public  SendEmail(string description)
    {
          // Write Code
     }
}
در مثال بالا ما یک اینترفیس به نام ISendEmailHandler تعریف کردیم ، این ایترفیس متدی به اسم SendEmail داره ، همونجوری که میبینید ما هیچ پیاده سازی ای برای این متد قرار ندادیم ، دلیلش اینه که ما در اینترفیس ها قرارداد رو تعریف میکنیم نه پیاده سازی ! دلیل اون هم اینه که ما در خیلی از سناریو ها نیاز به یک قابلیتی داریم ولی چگونگی اجرای اون عملکرد برای ما اهمیت چندانی ندارد ! مثلا در این مثال ما کلاس SendEmailHandler رو نوشتیم ، در این کلاس ما فقط نیاز داریم که متدی داشته باشه که با فراخانی متد یک ایمیل ارسال بشه ، اینکه این کلاس چطور اون رو پیاده سازی میکنه برای ما اهمیتی ندارد ، به همین علت اینترفیسی ایجاد میکنیم ، و هر وقتی خواستیم کلاسی این ویژگی رو حتما اجرا کنه این اینترفیس رو به ارث میبره .اما ویژگی های اینترفیس اعلان می شوند اما دارای هیچ جزئیات اجرایی نیستند. صرفا عنوان و  سیگناچر متد ها و مشخصه ها را تعریف می کنند. کد اجرایی آنها در کلاس هایی  که از آن اینترفیس ارث می برند ، نوشته می شود.مشخصه های آن جزئی و متد های آن جزئی یا مجرد است. مقادیر مشخص نشده اند.نمی توان آن را مستقیما اینستانس یا همان نمونه سازی کرد. اینترفیس ها برای تعریف مشخصه های مشترک و عملکرد مشابه استفاده می شوند.کلاس هایی که از یک اینترفیس ارث می برند ، موظف هستند تمام متد ها و مشخصه های آن اینترفیس را پیاده سازی کنند.اینترفیس ها دسترسی سطح را افزایش می دهند. کد نوشته شده مستقل تر است و قابل استفاده مجدد می باشد.اینترفیس ها در سی شارپ پیاده سازی مجدد می شوند. یک اینترفیس می تواند توسط چندین کلاس پیاده سازی شود که این بر خلاف استفاده از Absract کلاس هاست که فقط میتوان از یکی از آن ها ارث بری کرد !با توجه توضیحات بالا ، ما نمیتونیم از اینترفیس نمونه سازی کنیم و صرفا میتونیم ویژگی ها کلاس رو با اون مشخص کنیم و به کلاس بگیم که فلان ویژگی رو حتما داشته باشه !اما واقعیت همینه ؟واقعیت اینه که در اکثر آموزش ها تقریبا با کمی تغیر همین مطالب رو به شما میگن و متاسفانه این کاملا ناقصه !درسته ما برای اینکه یک قرار دادی رو تعین کنیم و بقیه رو مجبور به پیروی از اون کنیم از اینترفیس استفاده میکنیم ، علاوه بر اینکه میتونه چندین تا از این قرار داد ها رو برای یک کلاس تعریف کنی و البته نمیتونی از اینترفیس نمونه تعریف کنی .اما این همش نیست ! درواقع استفاده از اینترفیس ها و محبوبیت اون در دات نت کاملا به یک ویژگی دیگه که در اکثر آموزش ها به اون پرداخته نمیشه هستش !اونم قابلیت تغیر شکل ! بزارید به مثال قبل برگردیم و کمی در اون تغیر ایجاد کنیم !class MainClass
{
interface ISendEmailHandler {
    SendEmail(string description);
}
public class SendEmailHandler1 : ISendEmailHandler 
 {
 public string Name {get;set;}
   public  SendEmail(string description)
    {
           Console.WriteLine(description + &amp;quot Send From SendEmail1&amp;quot)
     }
}
public class SendEmailHandler2 : ISendEmailHandler   {    
 public string Title {get;set;}
 public SendEmail(string description)  
     {       

           Console.WriteLine(description + &amp;quot Send From SendEmail2&amp;quot)
     }

 }
    static void Main()
    {
// کد زیر امکان اجرا ندارد و به شما ارور کامپیال میدهد
        ISendEmailHandler  p = new ISendEmailHandler  (&amp;quotHello&amp;quot); // Have Err
// کد ها زیر بدون هیچ مشکلی اجرا و استفاده میشوند
        ISendEmailHandler  sender1 = new SendEmailHandler1 ();
        ISendEmailHandler  sender2 = new SendEmailHandler2 (&amp;quotHello 2&amp;quot);
         sender1.SendEmail(&amp;quotHello 1&amp;quot);      
         sender2.SendEmail(&amp;quotHello 2&amp;quot);      
    }
}
در مثال بالا یک کلاس جدید ایجاد کردیم و در هر کلاس از ایترفیس ISendEmailHandler استفاده کردیم ، در قسمت Main ابتدا سعی کردیم که یک نمونه از اینترفیس بسازیم که همونجوری که در کد هم نوشته شده به ارور میخوریم پس این کار امکان پذیر نیست ! اما در خط های بعدی در کمال تعجب میبینیم که ما دوباره با همون ساختار کد رو نوشتیم ولی کد هیچ ایرادی ندارد و اجرا میشود ، اما اگر دقت کنین میبینید که در قسمت دوم کد بجای new کردن یک اینترفیس ، از یک کلاس اینستس یا نمونه ساخته میشود ! این یکی از مهم ترین قابلیت های اینترفیس هست که به آن قابلیت تغیرشکل میگویند ! در واقع ایترفیس ها میتونن به کلاس هایی که اون رو نمونه سازی کردن تغیر شکل بدهند و به هر بخش از اون کلاس رو که اون اینترفیس رو پیاده کرده رو دسترسی داشته باشند و از اون استفاده کنن !که اگر این مثال رو در سیستم خودتون اجرا کنین ، میبینید که شما هیچ دسترسی به Name و Title که پروپرتی های اختصاصی این دو کلاس هستند دسترسی ندارید و فقط به متد SendEmail دسترسی دارید !نکته ای مهم که اگر بهش دقت نکنید بسیار در مبحث های پیشرفته مثل دپدنسی اینجکشن و وارون وابستگی به مشکل میخورید!چون اساس کارشون بر همین مبناس ! یعنی بجای اینکه شما یک کلاس رو به عنوان ورودی یک متد یا سازنده قرار بدید ، یک اینترفیس به عنوان ورودی اون متد قرار میگیره ، مثال زیر رو ببینید که بیشتر براتون جا بیفته !class MainClass
{
interface ISendEmailHandler
   {
    SendEmail(string description);
   }
public class SendEmailHandler1 : ISendEmailHandler 
   {
 public string Name {get;set;}
   public  SendEmail(string description)
    {
           Console.WriteLine(description + &amp;quot Send From SendEmail1&amp;quot)
     }
  }
public class SendEmailHandler2 : ISendEmailHandler 
   {    
 public string Title {get;set;}
 public SendEmail(string description)  
     {       

           Console.WriteLine(description + &amp;quot Send From SendEmail2&amp;quot)
     }

 }
    static void Main()
    {
// دو نمونه از کلاس ها ساختیم 
        SendEmailHandler1 sender1 = new SendEmailHandler1 ();
        SendEmailHandler2 sender2 = new SendEmailHandler2 (&amp;quotHello 2&amp;quot);
// حالا ما میتونیم این کلاس رو به متد هندلر در پایین ارسال کنیم و از قابلیت تغیر شکل استفاده کنیم
         Handler(sender1);
         Handler(sender2);
//  
    }
   static void Handler(ISendEmailHandler  sender)
     {
       sender.SendEmail(&amp;quotHello From Handler&amp;quot);  
     }
}
همونجور که در مثال بالا میبینید ما یک کلاس رو به متد Handler ارسال کردیم و حالا اون کلاس وقتی به این متد ارسال میشوند خودکار به اینترفیسی که آن را قبلا پیاده سازی کرده تغیر شکل میدهداین قابلیت کلیدی اینترفیس که به کلاس هایی که اون رو پیاده سازی کرده تبدیل میشود یکی از مهم ترین قابلیت ها در کل سیشارپ محسوب میشه و در صورتی که اون رو درک نکنین در خیلی از مباحث مرتبط باهش دچار مشکل میشید ، و همونجور که گفتم در مورد این قابلیت تغیر شکل معمولا در کورس های آموزشی توضیحی داده نمیشه و وقتی شما آموزشی مثل Asp.net Core میبیند که اساس اون در بسیاری از موارد همین قابلیتی به مشکل درک موضوع میخوریدامیدوارم که این آموزش برای شما بوده مفید باشه  :)</description>
                <category>امیر معصوم بیگی</category>
                <author>امیر معصوم بیگی</author>
                <pubDate>Sun, 30 Apr 2023 16:30:49 +0330</pubDate>
            </item>
                    <item>
                <title>آموزش Delegate در سی شارپ بخش 1</title>
                <link>https://virgool.io/@m_33467671/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-delegate-%D8%AF%D8%B1-%D8%B3%DB%8C-%D8%B4%D8%A7%D8%B1%D9%BE-%D8%A8%D8%AE%D8%B4-1-v3pewt1kfwr4</link>
                <description>مقدمه:در زبان برنامه‌نویسی C#، Delegate یکی از پیشرفته‌ترین قابلیت‌های این زبان است که به شما اجازه می‌دهد روش‌های جدیدی برای برنامه‌نویسی و الگوهای طراحی به‌کار برید. در این مقاله، با مفهوم Delegate و چگونگی استفاده از آن در C# آشنا خواهیم شد. دیلیگیت Delegate چیست ؟در C# مانند یک اشاره‌گر قابل فراخوانی به متد است. به به‌عبارت دیگر، این مکانیزمی است که اجازه می‌دهد به Delegate یک متد به‌ عنوان آرگومان به دیگر متدها ارسال کنید. به کمک آن می‌توانید کدی بنویسید که به صورت پویا تصمیم بگیرد کدام متد باید اجرا شود2. کاربردهای Delegate یکی از کاربردهای Delegate پیاده‌سازی مفهوم رویداد (Event) در C# است. به‌کمک رویدادها، می‌شود از روش‌هایی برای ارتباط بین کلاس‌ها استفاده کنید که بدون نیاز به سفارشی‌سازی کلاس‌ها با یکدیگر کار کنند.برخی از کاربردهای دیگر شامل پیاده‌سازی الگوی CallBack در برنامه‌ها و استفاده از الگوی Pub-Sub برای توزیع پیام‌های یک سیستم است.از مدل های کاربردی و پیش تعریف شده آن در سیشارپ میتوان به Arrow Function ها اشاره کرد که به طور مکرر در پروژه های حرفه ای استفاده میشن .3. تعریف Delegate در C#برای تعریف یک Delegate به صورت زیر عمل می‌کنیم:delegate bool SampleDelegate(string input);این مثال یک Delegate به اسم SampleDelegate تعریف می‌کند که نوع بازگشتی آن bool است و پارامتر ورودی string می‌پذیرد.4. استفاده از Delegateبعد از تعریف Delegate، باید یک متد با دستوراتی که می‌خواهیم اجرا شود بنویسیم:public static bool CheckLength(string input){
return input.Length &gt; 5;
}حالا می‌خواهیم از Delegate برای ارسال این متد به متد دیگر استفاده کنیم. برای این کار نیاز است که یک شیء از نوع Delegate ایجاد و متد مدنظر را به آن انتساب دهیم:SampleDelegate del = new SampleDelegate(CheckLength);و در نهایت، می‌توانیم از Delegate برای فراخوانی متد استفاده کنیم:string userInput = “Hello, World!”;
bool result = del(userInput); // true5.مولتی کست دلیگیت ( Multicast Delegate )دلیگیت ‌های C# می‌توانند بیش از یک متد را در خود ذخیره کنند. این نوع از Delegate به‌عنوان Multicast Delegate شناخته می‌شوند. برای استفاده از این نوع Delegate، می‌توانید از عملگر+ و - برای اضافه و حذف کردن متدها استفاده کنید. توجه داشته باشید که برای اینکار نیاز است تمام متد‌ها نوع بازگشتی Void داشته باشند.6. طراحی Event به کمک Delegateیکی از بهترین استفاده‌ها از Delegateدر پیاده سازی Eventها است. به عنوان یک مثال ساده، فرض کنید یک کلاس Publisher داریم که در صورت رخ‌دادن یک رویداد، می‌خواهیم متد‌های کلاس‌های مشترک (Subscriber) را فراخوانی کنیم. در اینجا می‌توانیم از Delegate برای طراحی این مفهوم استفاده کنیم.نتیجه گیری:در سیشارپ دیلیگیت ها ابزار بسیار قدرتمندی هستند که قابلیت‌های جدیدی به برنامه‌نویسان ارائه می‌دهند. مهمترین کاربردهای آن‌ها شامل طراحی رویدادها و الگوهای طراحی دیگر است. در این مقاله با مفهوم Delegate و چگونگی استفاده از آن در C# آشنا شدیم. با استفاده از این مفهوم می‌توانید برنامه‌های مؤثر و قابلیت‌های جدیدی طراحی کنید.تا اینجا به صورت مقدماتی با دلیگیت آشنا شدیم ، در بخش های بعد بیشتر به این مبحث میپردازیم و عمیق تر وارد اون میشیم .</description>
                <category>امیر معصوم بیگی</category>
                <author>امیر معصوم بیگی</author>
                <pubDate>Fri, 28 Apr 2023 03:22:22 +0330</pubDate>
            </item>
                    <item>
                <title>مبانی برنامه نویسی بدون یاد گیری فلوچارت به زبان ساده با مثال از دنیای واقعی</title>
                <link>https://virgool.io/@m_33467671/%D9%85%D8%A8%D8%A7%D9%86%DB%8C-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D8%A8%D8%AF%D9%88%D9%86-%DB%8C%D8%A7%D8%AF-%DA%AF%DB%8C%D8%B1%DB%8C-%D9%81%D9%84%D9%88%DA%86%D8%A7%D8%B1%D8%AA-%D8%A8%D9%87-%D8%B2%D8%A8%D8%A7%D9%86-%D8%B3%D8%A7%D8%AF%D9%87-%D8%A8%D8%A7-%D9%85%D8%AB%D8%A7%D9%84-%D8%A7%D8%B2-%D8%AF%D9%86%DB%8C%D8%A7%DB%8C-%D9%88%D8%A7%D9%82%D8%B9%DB%8C-eyr6z9ocpzwq</link>
                <description>سلام ، منو امیر معصوم بیگی هستم و میخوام تو این سری آموزش ها بهتون بگم چطوری میتونید برنامه نویسی رو درک کنید و با مبانی اون آشنا باشید :)واقعیت اینه خیلیا که وارد حوزه برنامه نویسی میشن ابتدا خیلی سردرگم میشن ! دلیلش اینه که هیچ چیزی درمورد این دنیای جدید نمیدونن ، و وقتی شروع میکنن حس میکنن که هیچ چیزی از اون نمیفهمن و این باعث میشه که از برنامه نویسی زده بشن ! برای همین خیلیا توصیه میکنن که قبل از برنامه نویسی واقعیه فلوچارت و تفکر الگوریتمی رو یاد بگیرن که خود اون باز یادگیریش واسه خیلیا مشکله و اصلا نمیفهمن استادشون منظورش چیه ! خب همین باعث شد که من این مقاله رو بنویسم ! مقاله ای که اصن شما درک کنین یعنی چی برنامه نویسی و اصول اولیش چیه !اصل 1 : اول از همه درک کنید که چیکار میخواید بکنید !برخلاف ریاضی و فیزیک و ... که ما خیلی ساله خوندیم و هیچی نفهمیدیم و فقط یادگرفتیم و نوشتیم ، برنامه نویسی اصلا اینجوری نیست ! ابتدا باید بفهمیم که اصن لغت برنامه نویسی یعنی چی و چرا نیازه که برنامه بنویسیم ، در نتیجه کاملا عملیه !برنامه نویسی : فکر کنین شما از یک فروشگاه خرید میکنین ، وارد فروشگاه میشید و کالای مورد نظرتون رو انتخاب میکنین و بعد هم به محل پرداخت میرید و مبلغ کالا رو پرداخت میکنید ! خب تبریک میگم شما یک برنامه نوشتید ! شاید گیج شده باشید که این یعنی چی ! درواقع برنامه نویسی به همین سادگیه ، شما میخواید یه کاری رو انجام بدید ولی با کامپیوتر ، در نتیجه بهش میگید که اینکارو بکن ، مثلا بهش میگید برو اون کالا رو انتخاب کن و بعد بخرش ! بر خلاف وقتی که خودتون اینکارو میکنید حالا کامپیوتر اینکارو میکنه ! پس وقتی که ما یک کاری رو میخوایم کامپیوتر واسمون انجام بده ، درواقع برنامه نویسی انجام دادیم ! پس تا الان فهمیدم اصن یعنی چی برنامه نویسی ! اصل 2 : زبان  برنامه نویسی صرفا یک ابزار برای نوشتن برنامه های شماست !خب ما فهمیدیم که باید به کامپیوتر بگیم که یه کاری رو واسمون انجام بده ! اما چطور !اینجاست که زبان های برنامه نویسی متولد میشن ! این زبان ها یا بهتره بگم ابزارها به ما کمک میکنن که بتونیم باهشون به کامپیوتر بفهمونیم چی میخوایم ! حالا فرض کنید میخواید یک میخ رو وارد دیوار کنید ! خب برای اینکار از چه ابزاری استفاده میکنین ؟ آیا با دستمال کاغدی میخ رو به دیوار میکوبید ؟! احتمالا نه :) ، یه ابزار خوب واسه اینکار چکشه ! و شما اون رو انتخاب میکنین و احتمالا بهترین گزینس اما صبر کنین ، آیا نمیشه با آچار فرانسه هم اینکارو کرد ؟! احتمالا واسه بعضی از میخ ها بشه ! و خب بهترین گزینه ما نیست :) حالا برگردیم به زبان های برنامه نویسی ! شما میخواید یه برنامه رو بنویسید ، در دنیای برنامه نویسی هم واسه نوشتن برنامه های مختلف ما ابزار های مختلفی داریم ، که واسه کار های مختلفی ساخته شدن ! و ما از این ابزار استفاده میکنیم که یک برنامه رو بنویسیم ! مثلا نمیایم واسه کوبیدن رو میخ از دستمال کاغذی استفاده کنیم و ابزار خودش رو انتخاب میکنیم :)اصل 3 : درک کنید که چطور برنامه مینویسید حفظ نکنید !خب حالا وقتشه که یک زبان برنامه رو انتخاب کنیم  و شروع و نوشتن برنامه خودمون کنیم !اما نگران نباشید ما قرار نیست کد بنویسیم ! قراره درک کنیم که زبان برنامه نویسی چیکار میکنه !میخوام یک سناریو رو تو ذهنتون تصور کنید ! سوال : علی میخواد بره خونه ! اون رو به خونه برسونید ! اما دقت کنید ، نمیدونیم که علی پول داره یا نه ، از جایی که وایساده تا خونشون یک کیلومتر راهه ، اون چطوری در راحت ترین راه میتونه به خونشون برسه ؟! علی فقط میتونه پیاده بره یا با ماشین !خب واسه جواب به این سوال ، باید اول سوال رو تحلیل کنیم و ببینیم که چی میگه !  علی باید به خونه برسه علی ممکنه که پول داشته باشه مسیر یک کیلو متره !باید در راحت ترین راه به خونه برسه !یا باید با ماشین بره یا پیاده !راحت ترین حالت با ماشینهخب حالا با توجه به اطلاعاتی که داریم باید سناریو خودمون رو بنویسیم !سناریو : خب اگر راحت ترین رو نظر بگیریم علی یک ماشین میگیره و میره خونشون و کاره ما تموم میشه ! اما اگه پول نداشت چی ؟ اون موقع باید علی پیاده به خونشون بره ، و چون مسیر زیاد نیست میتونه اینکارو بکنه و به خونه برسه !خب تبریک میگم شما یک برنامه نوشتین !شاید واستون عجیب باشه ، ولی برنامه نویسی همینه ! برنامه نویسی اینه که شما بفهمید که چه کاری باید انجام بدید ، محدودیت هاتون رو درک کنید و به کاری که میخواید رو انجام بدید !اما اگه بخوایم کد این رو بنویسیم مثلا یه چیزی مثل زیر میشه اگر (علی پول داشت) : با ماشین به خونه میره .در غیر این صورت : پیاده میره به خونه میره.پس قدم اول در برنامه نویسی اینه بفهمید که چکاری میخواید انجام بدید ! بعد قسمت های کلیدی اون مثل سوال قبل داشتن پول رو در بیارید و حالا با استفاده ابزارتون اون رو پیاده کنید !حالا در هر زبان برنامه نویسی ای برای فهموندن این قوائد مثل همین داشت پول برای علی دستوراتی داریم که به کامپیوتر بفهمونیم ، مثلا در زبان سی پلاس پلاس (در محیط کنسول) به شکل زیر مینویسیمif(aliHaveMonny) { cout &lt;&lt; &amp;quotبا ماشین میره&amp;quot ;
}else {
cout &lt;&lt; &amp;quotپیاده میره&amp;quot ;
} اول بیایم معنی کلمات انگلیسی که نوشتم رو بفمیم if : اگرaliHaveMonny : علی پول داشتcout :  دستوری برای چاپ کردن نتیجه یا نشان دادن نتیجهelse : در غیر این صورتخب حالا که معنی رو فهمیدیم میبینم که چیزی که نوشتیم خیلی با چیزی که بالاتر به زبان فارسی نوشته بودیم تفاوتی نمیکنه ، در برخی از زبان ها خیلی به زبان انسان نزدیکه ، در نتیجه همونجوری که میبیند اگر مفهوم رو ببنید دقیقا جوری نوشته میشه که ما حرف میزنیم و به کامپیوتر توضیح میدیم که چه کاری انجام بدهامیدوارم که این مقاله تا اینجای کار به شما کمک کرده باشه ، به امید دیدار : )</description>
                <category>امیر معصوم بیگی</category>
                <author>امیر معصوم بیگی</author>
                <pubDate>Thu, 27 Apr 2023 18:05:46 +0330</pubDate>
            </item>
                    <item>
                <title>استفاده از چت پی تی بدون استفاده از فیلترشکن ها !</title>
                <link>https://virgool.io/@m_33467671/%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-%DA%86%D8%AA-%D9%BE%DB%8C-%D8%AA%DB%8C-%D8%A8%D8%AF%D9%88%D9%86-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-%D9%81%DB%8C%D9%84%D8%AA%D8%B1%D8%B4%DA%A9%D9%86-%D9%87%D8%A7-z1f2tibq3uoy</link>
                <description>سلام ، من امیر معصوم بیگی هستم  و قصد دارم روش استفاده از چت پی تی بدون استفاده از فیلترشکن و هزینه ای اضاف رو بهتون بگم !احتمالا خیلیا اسم چت چی پی تی رو شنیدن ، ابزاری که با اومدنش خیلیارو شوکه کرد ، ابزاری که نشون داد هوش مصنوعی چقدر میتونه قدرتمند باشه !اما استفاده از این ابزار واسه خیلیا به این راحتیا نبود ، مخصوصا کسایی که در ایران بودن ، بخاطر اینکه این شرکت ایران رو تحریم کرده و شما نمیتونید با با ایپی ایران وارد بشید همین موضوع باعث شد که خیلیا مجبور بشن واسه ثبت نام در این پلتفرم شماره مجازی خریداری کنن و اقدام به ثبت نام تو این پلتفرم محبوب کنن ، اما مشکل اینجاست که شما هر دفعه نیاز به یک فیلترشکن یا ابزار های مشابه دارین که بتونین به راحتی از این ابزار استفاده کنین .از جایی که من خودمم همین مشکل رو داشتم ، شروع کردم به سرچ و دنبال روشی برای حل این مشکل گشتم ، متوجه شدم که دولت ایران سایتی رو ایجاد کرده که با نصب برنامه اون میتونید بخشی از این تحریم هارو رفع کنین ، که آدرس اون برنامه ، وبسایت به نشانی زیره : https://403.online/ البته باید خاطر نشان کرد که این وبسایت حداقل تا الان نتونسته همه سایت هایی که تحریم هستن رو پوشش بده ، ولی به نظر تلاشش رو کرده که اینکارو انجام بده ، و برای کاره ما که استفاده از chat gpt محبوبه کار رو راه انداخته و میتونه مشکل مارو حل کنه.اما واسه استفاده از اون باید  وارد این سایت بشید و در اون ثبت نام کنین و بعد از اون نسخه مخصوص به دستگاه خودتون رو نصب کنین که از لینک زیر میتونین اینکارو بکنین :  https://403.online/download بعد از نصب با وارد کردن اطلاعات اکانتتون میتونید وارد این برنامه بشید . بعد از اون باید برنامه رو فعال کنین که خیلی سخت نیست و بع راحتی با زدن دکمه ای که شبیه پاور هست میتونید اون رو فعال کنید که مثل تصویر زیر میشه :برنامه 403 آزاد از تحریم هااز این سرویس میتونید واسه اپلیکشین های دیگه ای هم استفاده کنین ، مثل ویژوال استودیو و غیره که لیست برنامه هایی که ساپورت میکنن رو توی سایت خودشون که بالاتر نوشتم قرار دادن ** امیدوارم که زمانی برسه که هیچوقت نیازی به همچین ابزار هایی نداشته باشیم  ، به امید دیدار</description>
                <category>امیر معصوم بیگی</category>
                <author>امیر معصوم بیگی</author>
                <pubDate>Thu, 20 Apr 2023 15:31:56 +0330</pubDate>
            </item>
                    <item>
                <title>ارسال فایل در asp.net core بعد از احراز هویت یا موارد مشابه</title>
                <link>https://virgool.io/@m_33467671/%D8%A7%D8%B1%D8%B3%D8%A7%D9%84-%D9%81%D8%A7%DB%8C%D9%84-%D8%AF%D8%B1-aspnet-core-%D8%A8%D8%B9%D8%AF-%D8%A7%D8%B2-%D8%A7%D8%AD%D8%B1%D8%A7%D8%B2-%D9%87%D9%88%DB%8C%D8%AA-%DB%8C%D8%A7-%D9%85%D9%88%D8%A7%D8%B1%D8%AF-%D9%85%D8%B4%D8%A7%D8%A8%D9%87-hd1sohgtwmkb</link>
                <description>سلام دوستان من امیر معصوم بیگی هستم تو این مقاله میخوام در مورد اینکه چطور میتونیم یک فایل رو asp.net core بعد از احراز هویت ارسال کنیم صحبت کنم . اگه شما هم تا الان تلاش کرده باشید که به فایل های wwwroot دسترسی پیدا کنین ، میبینین که این کار به راحتی با وارد کردن آدرس url در بالای صفحه اتفاق میفته ، مثلا شما آدرس زیر رو مینویسینhttps://localhost:7008/ANIMAL.JPGبعد میبینین که به راحتی به این آدرس دسترسی دارین و فایل رو دریافت میکنین ، واسه یه سری سناریو ها اینکار چیز خوبیه ، ولی اگر یک وقت شما خواستید در صورتی که مثلا کاربرتون لاگین کرده بود فایل رو ارسال کنین ، اون وقت باید چیکار کنین ؟ اول از همه لینک گیت هاب این پروژه به آدرس زیر که اگه این مقاله واستون مفید بود میتونید بهش ستاره هم بدید ? : https://github.com/AmBplus/GetStaticFileAfterAuthorizationPolicy نکته اول اینکه که هر فایلی که تو مسیر  wwwroot میزارید  در صورتی که در middleware استاتیک فایل هارو ادد کرده باشید اگر آدرس فایل رو وارد کنید اون رو به شما نشون میده ، میدل ور زیر :app.UseStaticFiles();اما خیلی وقتا ما نیاز داریم که به استاتیک فایل ها در wwwroot دسترسی داشته باشیم ، پس نمیتونیم در اکثر مواقع این میدلور رو حذف کنیم ، و این میدلور قبل از میدل ور های زیر که مربوط به احراز هویت هستن قرار میگیره :app.UseAuthentication();app.UseAuthorization();راه حل اینکار که سایت ماکروسافت هم ارائه داده ، اینه که ما یک پوشه دیگه در برنامه بسازیم ، بجز wwwroot و اینجور فایل هارو در اون مسیر قرار بدیم ، مثل عکس زیر که ما پوشه MyStaticFiles رو ایجاد کردیم و داخل اون یک پوشه به اسم images و درونش یک عکس گل قرار دادیم که قراره این عکس رو بعد از اینکه لاگین کردیم ببینیم ، اگه وارد لینک گیت هاب بشید میتونید سورس رو به طور کامل ببنید .حالا نیازه یه سری تنظیمات در فایل program.cs ایجاد کنیم ، برای منظور بعد از میدل ور های احراز هویت و قبل از میدل ور هایی که کنترلر یا صفحات ریزور رو شناسایی میکنه ما کد زیر رو قرار میدیمapp.UseStaticFiles(new StaticFileOptions{
FileProvider = new PhysicalFileProvider(
    Path.Combine(builder.Environment.ContentRootPath, &amp;quotMyStaticFiles&amp;quot)),
RequestPath = &amp;quot/StaticFiles&amp;quot});کد بالا یک میدلور هست که پوشه mystaticfiles که ما ساختیم رو به برنامه معرفی میکنه ، و ما حالا از داخل برنامه میتونیم به اون دسترسی داشته باشیم ، تفاوتی که با پوشه wwwroot در حالت عادی داره اینه که اگر آدرس فایل های داخل این پوشه رو از url وارد کنیم ما چیزی رو نمیتونیم دریافت کنیم که هدف اصلی ما هم همینه .کل کد در قسمت program.cs به صورت زیره ، از اونجایی که واسه تست این برنامه ما میخواستیم احراز هویت رو هم انجام بدیم یه سری کد اضاف برای این منظور هم قرار گرفته  https://gist.github.com/AmBplus/09c3a34ab29619f3779c7dec33f8ebc8 برای اینکه ببینیم کاری که کردیم چطور میشه ازش استفاده کرد به صفحه GetFileWithAuth میریم که در آدرس زیر قرار دارهhttps://localhost:7008/GetFileWithAuth اگر بدون اینکه لاگین کرده باشید وارد این صفحه بشید ، شما به صفحه لاگین هدایت میشید و هیچیزی به شما نمایش داده نمیشه ، ولی اگر لاگین کرده باشید ، میتونید به این صفحه دسترسی داشته باشید و در متد Get این صفحه عکس یک گل که در آدرس زیر قرار داره برای شما ارسال میشهMyStaticFiles/Images/flower.jpgاگر این آدرس رو به صورت زیر وارد کنین هیچ چیزی به شما نمایش داده نمیشهhttps://localhost:7008/MyStaticFiles/Images/flower.jpg یاhttps://localhost:7008/Images/flower.jpgکه این بر خلاف حالت قبل که در wwwroot فایل قرار میدادیم هست ، در حالت قبل اگر مسیر بعد از wwwroot رو مینوشتیم فایل برای ما ارسال میشد ، در حالت این اتفاق نمیفته ، و الان اگر بخوایم به فایل دسترسی داشته باشیم میتونیم به صورت زیر عمل کنیم ، در اینجا به طور مثال یک صفحه ایجاد کردیم و در اون صفحه بعد از احراز هویت فایل رو به کاربر نشون میدیمسورس این صفحه به صورت زیره که در لینک گیت هاب پروژه که بالا فرستادم هم میتونید در پوشه pages اون رو مشاهده کنید . https://gist.github.com/AmBplus/e2376ba0c443964aee28ed8d80820e1c همونجوری که میبنید ما اتربیتوت [Authorize] رو در بالای صفحه گزاشتیم ، اگر با ریزور پیج آشنایی داشته باشید میدونید که ما نمیتونیم این اتریبوت رو بالای هندرلر ها بزاریم ، اگر در کنترلر میخواید استفاده کنید میتونید این اتربیوت رو بالای اکشن بزارید ، اما در قسمت OnGet همونجوری که میبینید ما یک نتیجه یک فایل فیزیکی یا همون PhysicalFileResult رو برمیگردونیم ، که  بعد از به دست آوردن مسیر ریشه پروژه و ساختن مسیر فایل ما اون رو به صورت یک PhysicalFile به راحتی برمیگردونیم ، که البته این فایل بعد از احراز هویت به کاربر برگردونده شده و ارسال فایل کاملا در اختیار ما قرار داره به طور خلاصه برای اینکه بخواید یک فایل رو فقط سرور خودتون برگردونه کار های زیر رو میکنید1. ایجاد یک پوشه در مسیر ریشه پروژه2. شناساندن مسیر ایجاد پوشه بعد از میدل ور های احراز هویت و بررسی دسترسی3. ارسال فایل از درون برنامه به صورت دستی و نه به صورت url بعد از چک کردن هایی که نیاز دارید .      *امیدوارم که این مقاله برای شما مفید بوده باشه ، در صورتی که ایرادی دیدید بگید اصلاح کنم .</description>
                <category>امیر معصوم بیگی</category>
                <author>امیر معصوم بیگی</author>
                <pubDate>Tue, 18 Apr 2023 00:26:53 +0330</pubDate>
            </item>
            </channel>
</rss>