قرار است وارد دنیای طراحی سیستم (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)، میآموزیم چرا سیستمهای بزرگ همیشه در معرض خطا هستند و طراح باید این خطاها را پیشبینی کند.
این مسیر، یک نقشهٔ راه مرحلهبهمرحله است تا بدون عجله، مفاهیم از سادهترین شکل تا پیچیدهترین حالت روی هم انباشته شوند. بعد از پایان هر بخش، به بخش بعدی میرویم و همینطور پایهٔ یادگیریمان را گسترش میدهیم.
تمام هدف این مقدمه همین است: مشخص کنیم کجا هستیم، به کجا میرویم، و چطور میخواهیم به آن برسیم.
امیر معصوم بیگی