من امیر معصوم بیگی هستم ، علاقه مند به به طراحی ، توسعه و پیاده سازی سیستم های نرم افزاری
"برآورد تقریبی: هنر محاسبات سریع و دقیق برای طراحی سیستمها"
مقدمه:
فرض کن تو یه جلسه کاری نشستی و یکی از مدیرها ازت میپرسه: "اگه بخوایم یه سیستمی راه بندازیم که روزی چند هزار پیام رو پردازش کنه، چند تا سرور لازم داریم؟" یا مثلاً تو یه مصاحبه شغلی ازت میخوان تخمین بزنی که توییتر چجوری اطلاعات میلیونها کاربر رو ذخیره و مدیریت میکنه. خب، اینجا وقت نداری لپتاپ رو باز کنی، ماشینحساب بیاری یا یه برنامه دقیق بنویسی، درسته؟ اینجاست که "برآورد تقریبی" یا
همون Back-of-the-Envelope Estimation مثل یه ناجی وارد بازی میشه.
حالا این روش چیه؟ خیلی سادهست. تصور کن داری چیزی رو روی یه تیکه کاغذ یا حتی پشت پاکت نامه مینویسی. هدف این نیست که دقیقترین جواب دنیا رو بدی، بلکه فقط میخوای یه دید کلی داشته باشی. مثل وقتی که میخوای تخمین بزنی برای سفر چند لیتر بنزین میخوای. سریع فاصله رو در مصرف ماشین ضرب میکنی و یه عدد گرد و راحت به دست میاری.
تو دنیای تکنولوژی هم داستان همینه. مثلاً مهندسهای گوگل وقتی میخوان یه سرویس بزرگ مثل جیمیل طراحی کنن، نمیان از همون اول همهچی رو دقیق حساب کنن. اول چند تا فرض ساده میکنن:
برآورد تقریبی دقیقاً همین جا به کار میاد. یه جور محاسبه سرانگشتیه که تو رو از گیر کردن توی جزئیات نجات میده و کمک میکنه بفهمی طرح کلی چطوری باید باشه.
این روش تو زندگی عادی هم کلی کاربرد داره. مثلاً:
توی این مقاله قراره همین روش ساده و کاربردی رو با زبون خودمونی یاد بگیریم و با چند مثال واقعی، مثل توییتر و دیتاسنترها، حسابی دستمون راه بیفته. آمادهای؟! 😊
گاهی وقتا توی زندگی و کار، نیاز نیست همهچیز رو دقیق بدونی. مثلاً اگه یکی ازت بپرسه برای اینکه یه آپارتمان رو نقاشی کنی چند قوطی رنگ لازمه، نیازی نیست دقیق بشینی دیوارها رو متر کنی یا میزان جذب رنگ هر دیوار رو محاسبه کنی! کافیه به طور تقریبی طول و عرض خونه رو در نظر بگیری، یه عدد حدودی ضرب و تقسیم کنی، و به یه تخمین برسی. برآورد تقریبی دقیقاً همینه: رسیدن به یه جواب سریع که خیلی هم دور از واقعیت نباشه.
حالا چرا این روش توی طراحی سیستمها و کارهای فنی انقدر مهمه؟ چون وقتی با یه سیستم بزرگ سر و کار داری، مسائل به شدت پیچیده میشن و جزئیات ممکنه اذیتت کنن. برآورد تقریبی کمک میکنه خیلی سریعتر مسیر درست رو پیدا کنی.
فرض کن میخوای یه سرویس مثل اینستاگرام طراحی کنی. سؤال اینه که برای ذخیرهسازی عکسهای کاربران چقدر فضای دیسک لازمه؟ خب، میتونی اینجوری فکر کنی:
خیلی راحت با یه ضرب و تقسیم میتونی بفهمی روزی چقدر داده تولید میشه. حالا اگه بخوای این اطلاعات رو برای ۵ سال ذخیره کنی، باز هم با همین روش ساده میتونی به یه عدد حدودی برسی. نیازی نیست محاسبات دقیق انجام بدی؛ فقط یه تخمین کلی کافیه.
تو زندگی عادی هم این روش کلی به کار میاد. مثلاً:
هدف از برآورد تقریبی این نیست که جواب کاملاً دقیق بدی. این یه ابزار کمکیه برای اینکه سریعتر و مطمئنتر به یه دید کلی برسی. حالا این دید کلی تو رو توی مسیر درست قرار میده تا بعداً وقت و انرژی بیشتری برای جزئیات بذاری.
این فقط شروع ماجراست! تو بخشهای بعدی، به نکات تخصصیتر و جذابتر، مثل "Power of Two" و تأخیر سیستمها، میپردازیم. آمادهای؟ 😊
وقتی درباره طراحی سیستمها یا ذخیرهسازی دادهها حرف میزنیم، یکی از اولین چیزایی که باید بدونی، مفهوم "Power of Two" یا همون "توانهای دو" هست. این مفهوم شاید اولش یه چیز ریاضی خشک به نظر برسه، ولی وقتی کاربردش رو ببینی، احتمالاً نظرت عوض میشه.
دنیای کامپیوتر خیلی با دنیای ما که بر پایه دهگانست فرق داره. تو کامپیوتر همهچیز با اعداد باینری (صفر و یک) کار میکنه. برای همین، توانهای دو نقش کلیدی دارن. مثلاً:
پس اگه بدونی چطوری با این توانهای دو کار کنی، خیلی راحتتر میتونی حجم دادهها رو تخمین بزنی.
مثلاً فرض کن یه سیستم ذخیرهسازی طراحی میکنی. تعداد کاراکترهایی که کاربرها تایپ میکنن چقدر فضا میبره؟ برای هر کاراکتر معمولی (مثل حروف انگلیسی) 1 بایت لازمه. ولی اگه دادهها رو به شکلی ذخیره کنی که همیشه با توان دو هماهنگ باشه، هم محاسبات سادهتر میشه و هم سیستم بهینهتر کار میکنه.
بیایم حجم یه چت ساده رو تخمین بزنیم:
خب، بیایم این محاسبات رو انجام بدیم:
هر پیام 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 گیگابایت رم داره، بهینهترین حالت اینه که حافظهها رو بر اساس بلوکهای توان دو تقسیم کنی.
جمعبندی:
"Power of Two" یه ابزار ساده ولی قدرتمنده. وقتی یاد بگیری چطوری ازش استفاده کنی، هم محاسباتت سریعتر میشه و هم سیستمی که طراحی میکنی بهتر و بهینهتر کار میکنه. حالا که این مفهوم رو یاد گرفتی، تو بخش بعدی درباره یکی از مسائل حیاتی دیگه یعنی "Latency" یا همون تاخیر صحبت میکنیم؛ چیزی که میتونه سیستمهاتو سریع یا کند کنه! 😊
فرض کن میخوای یه فیلم آنلاین ببینی. دکمه پخش رو میزنی و فیلم فوراً شروع میشه. حالا تصور کن بعد از زدن دکمه، ۱۰ ثانیه طول بکشه تا پخش شروع بشه. چه احساسی داری؟ احتمالاً به اینترنت یا سرویس استریم غر میزنی! اینجا چیزی که اذیتت کرده، تأخیر (Latency) هست.
تأخیر یعنی مدت زمانی که طول میکشه تا یه درخواست به سرور برسه و جوابش برگرده. این زمان تو دنیای سیستمهای کامپیوتری و شبکه، اهمیت فوقالعادهای داره، چون همهمون دوست داریم کارها سریع و بیدردسر انجام بشه.
تو کامپیوتر، تأخیر میتونه مربوط به هر چیزی باشه:
به قول معروف، حافظه سریع است، ولی دیسک کند!
آقای Dr. Jeff Dean (یکی از مهندسان ارشد گوگل) یه جدول معروف از تأخیرهای معمول عملیات کامپیوتری درست کرده. این جدول نشون میده چقدر بعضی کارها سریعتر از بقیه هستن:
برای اینکه بهتر بفهمی، بیا یه مثال ساده بزنیم:
خب، کسی از تأخیر خوشش نمیاد، پس چیکار میشه کرد؟ چند راهحل ساده:
دیتاسنترها معمولاً توی مناطق مختلف دنیا پخش هستن. وقتی یه کاربر ایرانی بخواد به یه سرور آمریکایی متصل بشه، دادهها باید کلی راه طی کنن. برای همین شرکتهای بزرگ مثل گوگل یا آمازون سرورهاشون رو نزدیک کاربرانشون قرار میدن تا تأخیر رو کم کنن.
تأخیر چیزی نیست که همیشه بتونی ازش فرار کنی، ولی با شناخت بهترش میتونی طراحیهات رو بهینهتر کنی. یه قانون طلایی اینه: "تا جایی که میتونی، دادهها رو نزدیک نگه دار و دیسک رو دور بزن!"
تو بخش بعدی، درباره یه مفهوم حیاتی دیگه حرف میزنیم: "Availability" یا همون در دسترسپذیری، که نشون میده یه سیستم چقدر میتونه همیشه آماده به کار باشه! 😊
فرض کن یه روز صبح میخوای وارد اینستاگرام بشی و با یه پیغام خطا روبهرو میشی: "سرویس در دسترس نیست". چه احساسی پیدا میکنی؟ احتمالاً اول اینترنتت رو چک میکنی، بعد از دوستات میپرسی که آیا برای اونا هم این مشکل پیش اومده. حالا تصور کن این قطعی یه ساعت، یه روز یا حتی بیشتر طول بکشه! واقعاً عصبانیکنندهست. اینجا دقیقاً چیزی که تحت تأثیر قرار گرفته، در دسترسپذیری(Availability) سیستمه.
در دسترسپذیری یعنی یه سیستم یا سرویس چه مقدار از زمان رو میتونه بدون هیچ وقفهای کار کنه و خدمات ارائه بده. این مفهوم رو معمولاً با درصد بیان میکنن. مثلاً:
وقتی یه شرکت بزرگ مثل گوگل یا آمازون به شما یه سرویس میفروشه، یه قرارداد به اسم SLA (Service Level Agreement) ارائه میده. این قرارداد مشخص میکنه که چقدر سرویسشون در دسترس خواهد بود. معمولاً این سطح خدمات رو با تعداد "نهها" (nines) نشون میدن:
نکته : 2 تا نه ، همون تعداد عدد 9 که در درصد هستش ، همینقد ساده 😊
هر چی تعداد "نهها" بیشتر باشه، سرویس بهتره، اما هزینه ارائه این سطح هم بیشتر میشه.
هیچ سیستمی نمیتونه همیشه 100% در دسترس باشه، ولی میتونیم با طراحیهای هوشمندانه این زمان رو به حداکثر برسونیم:
تصور کن یه فروشگاه آنلاین داری که روزانه هزاران سفارش ثبت میکنه. اگه سایتت حتی برای یه ساعت قطع بشه:
برای همین شرکتهای بزرگ کلی هزینه میکنن تا سرویسهاشون همیشه آماده به کار باشن.
در دسترسپذیری یکی از مهمترین معیارها تو طراحی سیستمهاست. با روشهایی مثل پشتیبانگیری، توزیع بار، و حذف نقاط ضعف، میتونی مطمئن بشی که سیستم همیشه آماده خدمترسانیه.
تو بخش بعدی، میریم سراغ یه مثال واقعی از برآورد سیستمهای بزرگ: "توییتر چطور نیازهای ذخیرهسازی و پردازش خودش رو تخمین میزنه؟" 😊
حالا که با مفاهیم پایه مثل برآورد تقریبی، تأخیر و در دسترسپذیری آشنا شدی، وقتشه یه مثال واقعی رو بررسی کنیم. این بار میخوایم ببینیم توییتر، بهعنوان یکی از بزرگترین شبکههای اجتماعی دنیا، چطور از برآورد تقریبی استفاده میکنه تا نیازهای ذخیرهسازی و پردازش خودش رو محاسبه کنه.
برای این مثال فرض کنیم توییتر اطلاعات زیر رو به ما داده:
مفهوم 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. حجم هر توییت:
حجم هر توییت = 64 بایت + 140 بایت + حجم مدیا (در صورت وجود)
2. محاسبه حجم مدیا:
فقط 10 درصد توییتها شامل مدیا هستن:
150 میلیون کاربر × 2 توییت × 10٪ × 1 مگابایت = 30 ترابایت در روز
3. حجم کل ذخیرهسازی برای 5 سال:
30 ترابایت در روز × 365 روز × 5 سال 55 ≈ پتابایت
این اعداد فقط تخمینی هستن و ممکنه تو دنیای واقعی کمی متفاوت باشن. هدف این مثال اینه که ببینیم چطور میشه با چند فرض ساده، نیازهای یه سیستم بزرگ رو برآورد کرد.
تو بخش بعدی، چند نکته طلایی رو بررسی میکنیم که میتونه برآوردها رو دقیقتر و بهتر کنه. 😊
حالا که دیدیم چطور میشه از برآورد تقریبی استفاده کرد، وقتشه چند نکته کلیدی رو یاد بگیریم که کمک میکنن محاسباتمون دقیقتر و حرفهایتر باشه. این نکات شاید ساده به نظر برسن، ولی وقتی پای طراحی سیستمهای بزرگ در میون باشه، میتونن معجزه کنن!
محاسبه با اعداد پیچیده وقتگیر و گاهی گیجکنندهست. برای همین همیشه اعداد رو گرد کن.
همیشه فرضیاتی که انجام میدی رو بنویس. این کار به دو دلیل مهمه:
وقتی اعدادی مثل 5 یا 1000 رو مینویسی، حتماً مشخص کن منظور چیه.
برای برآورد بهتر، بعضی اعداد رو همیشه تو ذهنت نگه دار. این کار باعث میشه سریعتر تصمیم بگیری.
یه سری از سوالات تو مصاحبهها یا جلسات طراحی سیستم زیاد پرسیده میشن. اگه این سوالات رو از قبل تمرین کنی، میتونی خیلی راحتتر و سریعتر جواب بدی.
گاهی وقتا یه ابزار ساده مثل قلم و کاغذ یا حتی یه ماشینحساب میتونه سرعتت رو چند برابر کنه. همچنین ابزارهای آنلاین برای برآورد ذخیرهسازی یا پردازش دادهها وجود دارن که میتونی ازشون استفاده کنی.
کارفرما یا مصاحبه کننده یا تیم ممکنه ازت سوالات بیشتری بپرسن، مثل اینکه:
هدف از برآورد تقریبی این نیست که جواب دقیق بدی. مهم اینه که نشون بدی میتونی یه مسئله پیچیده رو به بخشهای کوچیکتر تقسیم کنی و یه تخمین منطقی بزنی. با این روش، همیشه یه قدم جلوتر از بقیه خواهی بود!
سعی من در این مقاله این بود که شما با کلیت تخمین در سیستم های نرم افزاری آشنا بشید و یک دید خوب برای این موضوع پیدا کنید ، منابع زیادی هستن که میتونید به عنوان رفرنس تکمیلی تر مطالعه کنید ، کتاب های آقای Alex Xu یکی از قویترین کتاب ها برای حوزه طراحی نرم افزار هست
System Design Interview An Insider’s Guide by Alex Xu
دوست دار شما امیر معصوم بیگی