این داستان واقعی من است: از گیجی کامل تا رسیدن به درک عمیق در طراحی سیستم
بگذارید روراست بهتان بگویم.
یک زمانی بود که هر فیلم یا مطلبی که اسم «طراحی سیستم» را میدیدم، سریع رد میکردم. با خودم میگفتم: «این چیزها مال مهندسهای خیلی باتجربه و معماران نرمافزاره، به من ربطی نداره.»
اما کاملاً در اشتباه بودم.
تا اینکه یک روز در مصاحبه کاری از من پرسیدند:
«میتونی یک اپلیکیشن مثل اسنپ یا تپسی طراحی کنی؟»
و من همانجا خشکم زد.
چند کلمهای درباره API و پایگاهداده MySQL گفتم و بعد… سکوت مطلق.
نمیدانستم وقتی تعداد کاربران زیاد شود چه کار کنم، از صفها (Queues) چیزی سر در نمیآوردم و حتی ایدهای نداشتم که موقعیت لحظهای رانندهها را چطور باید ذخیره کرد.
همان روز با خودم عهد کردم که دیگر این اتفاق نیفتد.
در ادامه، مسیرم را برایتان تعریف میکنم؛ مسیری که من را از یک آدم کاملاً گیج به کسی تبدیل کرد که با اعتماد به نفس درباره معماری نرمافزار حرف میزند و حتی در کارش، پیشنهادهای بهتری میدهد.
۱. اول از همه، قبول کردم که هیچی بلد نیستم!
طراحی سیستم در نگاه اول خیلی سخت و ترسناک است.
کلماتی مثل «شاردینگ»، «لود بالانسر» و «میکروسرویس» را میشنوید و شاید کمی بترسید.
اوایل فکر میکردم من خیلی نادانم، اما بعد فهمیدم که:
تقریباً همه اولش همین حس را دارند.
طراحی سیستم یک درسِ تک جلسهای نیست که در یک هفته یادش بگیرید. ترکیبی از چند موضوع مهم است:
- دادهها در سیستم چطور جابجا میشوند؟
- سرویسهای مختلف چطور با هم حرف میزنند؟
- یک سیستم چطور زیر بار ترافیک سنگین دوام میآورد؟
- و چطور سیستمی بسازیم که سریع، قابل اعتماد و بدون قطعی کار کند؟
وقتی قبول کردم که یادگیری اینها زمان میبرد، خیالم راحت شد. دیگر دنبال بینقص بودن نبودم و روی قدمهای کوچک تمرکز کردم.
۲. طراحی سیستم را به لقمههای کوچکتر تقسیم کردم
طراحی سیستم مثل یک پازل بزرگ است که از قطعات کوچکتر تشکیل شده. من هم برای خودم یک نقشه راه درست کردم:
الف) چیزهای خیلی پایهای
- وقتی آدرس یک سایت را در مرورگر میزنید، پشت صحنه چه خبر است؟
- DNS، لود بالانسر و CDN دقیقاً چه کار میکنند؟
- تفاوتهای اصلی TCP و UDP یا HTTP و HTTPS چیست؟
یاد گرفتن همین موارد ساده، دید من را کاملاً باز کرد. مثلاً اینکه CDN ها باعث میشوند ویدیوهای یوتیوب برای ما سریع لود شوند.
ب) نحوه ذخیره اطلاعات
- فرق پایگاهدادههای SQL و NoSQL چیست؟
- مفاهیمی مثل ایندکسگذاری و شاردینگ به چه دردی میخورند؟
- کجا بهتر است از MongoDB استفاده کنیم و کجا از PostgreSQL؟
این را با یک اشتباه بزرگ یاد گرفتم. در یک پروژه برای اطلاعات مهم مالی از دیتابیس اشتباهی استفاده کردیم و بعداً خیلی پشیمان شدیم.
ج) روشهای قویتر کردن سیستم
- مقیاسپذیری افقی و عمودی چه فرقی دارند؟
- کش کردن (Caching) با ابزارهایی مثل Redis یعنی چه؟
- روشهای مختلف لود بالانسینگ برای تقسیم بار ترافیک چیست؟
این قسمت برایم خیلی جذاب بود. حس میکردم حالا میتوانم سیستمی بسازم که به میلیونها نفر سرویس بدهد، حتی اگر فقط روی کاغذ باشد!
د) الگوهای معماری نرمافزار
- فرق معماری یکپارچه (مونولیت) با میکروسرویسها چیست؟
- معماری رویدادمحور یعنی چه؟
- صفهای پیام مثل کافکا به چه دردی میخورند؟
اینجا بود که فهمیدم چرا شرکتهای بزرگی مثل نتفلیکس از میکروسرویسها استفاده میکنند؛ چون در مقیاس بزرگ، این معماری منطقیتر است.
۳. به جای آموزش دیدن، فکر کردن دیگران را تماشا کردم
به جای اینکه ویدیوهای آموزشی خشک و تئوری ببینم، شروع کردم به تماشای فیلم مصاحبههای آزمایشی. این کار واقعاً همهچیز را عوض کرد.
چون وقتی یک نفر جلوی شما بلند بلند فکر میکند، اشتباه میکند، راهش را اصلاح میکند و دلیل تصمیمهایش را توضیح میدهد، شما فکر کردن را یاد میگیرید، نه حفظ کردن را.
یاد گرفتم که:
- اول مصاحبه سؤالهای درست بپرسم تا صورت مسئله شفاف شود.
- نیازمندیهای اصلی و غیرفانکشنیال سیستم را مشخص کنم.
- مراحل طراحی را قدم به قدم توضیح دهم.
- و مهمتر از همه، همیشه درباره مزایا و معایب هر انتخابم صحبت کنم.
۴. شروع کردم به کشیدن شکل و دیاگرام!
باورتان نمیشود، ولی یکی از بهترین کمکها برای من، نقاشی کردن بود!
نیازی نیست نقاش باشید. همین که جریان یک درخواست را از کاربر تا سرور و پایگاهداده روی کاغذ بکشید، همهچیز برایتان روشن میشود.
وقتی دیاگرام میکشیدم:
- جریان کار واقعیتر به نظر میرسید.
- میفهمیدم کجای سیستم ممکن است به مشکل بخورد.
- متوجه میشدم کَش را کجا بگذارم یا کِی از صف استفاده کنم.
حتی همین الان هم وقتی در مسئلهای گیر میکنم، اولین کارم برداشتن یک قلم و کاغذ است.
۵. با مثالهای واقعی تمرین کردم
وقتی اصول اولیه را یاد گرفتم، دیگر فقط تماشا نکردم و خودم دست به کار شدم.
روش تمرینم این بود:
- یک اپلیکیشن معروف را انتخاب میکردم: اینستاگرام، واتساپ، اسنپفود.
- نیازمندیهای اصلی آن را لیست میکردم (مثلاً در اینستاگرام: آپلود عکس، لایک کردن، کامنت گذاشتن).
- نیازمندیهای غیرفانکشنیال را اضافه میکردم (مثلاً: باید سریع باشد، همیشه در دسترس باشد).
- یک معماری کلی برایش طراحی میکردم.
هر هفته یک طراحی انجام میدادم و سعی میکردم برای هر مسئله، چند راهحل مختلف پیدا کنم. چون در دنیای واقعی، معمولاً یک جواب درست وجود ندارد، بلکه باید بین گزینههای مختلف، بهترین را با دلیل انتخاب کنید.
۶. هر چه یاد میگرفتم را در کار واقعی استفاده میکردم
دانش تئوری تا وقتی در عمل استفاده نشود، فایدهای ندارد.
در شرکتی که کار میکردم، یک سرویس حساس و پرترافیک داشتیم. من شروع کردم به پیادهسازی چیزهایی که یاد گرفته بودم:
- پیشنهاد دادم که معماری یکپارچه را به سرویسهای کوچکتر تقسیم کنیم.
- برای کارهای زمانبر، از صف استفاده کردیم.
- برای خطاهای احتمالی، مکانیزم تلاش مجدد طراحی کردیم.
شاید کارهایم بینقص نبود، اما به من اعتماد به نفس داد و فهمیدم طراحی سیستم فقط برای قبولی در مصاحبه نیست، بلکه یک مهارت کاربردی و ارزشمند است.
۷. برای دیگران توضیح میدادم
این آخرین و مهمترین مرحله بود.
بهترین راه برای اینکه بفهمید چیزی را واقعاً یاد گرفتهاید یا نه، این است که سعی کنید آن را به یک نفر دیگر یاد بدهید.
من هم شروع کردم به:
- کمک کردن به همکاران تازهکار.
- برگزار کردن جلسات کوتاه برای توضیح مفاهیمی مثل کش کردن یا پایگاهداده.
- نوشتن مطلب و کشیدن دیاگرام.
هر بار که چیزی را توضیح میدادم، بهتر یاد میگرفتم.
حرف آخر من با شما
اگر تازه در این مسیر قدم گذاشتهاید یا تجربه یک مصاحبه ناموفق را داشتهاید، این را از من بشنوید:
طراحی سیستم یک غول بیشاخودم نیست!
نیازی به ۱۰ سال سابقه کار ندارید.
لازم نیست چیزی را حفظ کنید.
فقط کافیست:
- از مفاهیم پایه شروع کنید.
- همیشه به مثالهای واقعی فکر کنید.
- برای حل مسائل یک چارچوب مشخص داشته باشید.
- هر هفته تمرین کنید.
- برای هر تصمیمی از خودتان بپرسید «چرا؟».
- و صبور باشید و قدم به قدم پیشرفت کنید.
اگر روزی فقط نیم ساعت وقت بگذارید، بعد از سه ماه خودتان از پیشرفتتان شگفتزده میشوید. مهم این است که رویکرد درستی داشته باشید، نه اینکه دنبال یک جواب آماده بگردید.
پرسش و پاسخهای متداول (FAQ)
۱. از کجا باید یادگیری طراحی سیستم را شروع کنم؟
بهترین نقطه شروع، درک مفاهیم پایهای اینترنت است. مثلاً اینکه وقتی آدرس یک سایت را تایپ میکنید چه اتفاقی میافتد. سپس به سراغ مفاهیم پایگاهداده، کشینگ و لود بالانسینگ بروید.
۲. طراحی سیستم سخت نیست؟
در ابتدا ممکن است کمی ترسناک به نظر برسد، اما اگر آن را به بخشهای کوچکتر تقسیم کنید و قدم به قدم پیش بروید، کاملاً قابل یادگیری است. مهمترین نکته این است که نترسید و بپذیرید که در ابتدا چیزی نمیدانید.
۳. آیا برای مصاحبه باید یک راه حل بینقص ارائه دهم؟
خیر. در مصاحبه طراحی سیستم، فرآیند فکری و رویکرد شما بسیار مهمتر از رسیدن به یک پاسخ نهایی و بینقص است. توانایی شما در تحلیل نیازمندیها و بررسی مزایا و معایب گزینههای مختلف، چیزی است که سنجیده میشود.
۴. چطور میتوانم بدون تجربه کاری، طراحی سیستم را تمرین کنم؟
اپلیکیشنهای معروفی که هر روز از آنها استفاده میکنید (مثل اینستاگرام، تلگرام یا اسنپ) را انتخاب کنید و سعی کنید روی کاغذ آنها را طراحی کنید. این بهترین تمرین برای تقویت مهارت شماست.
پاسخها