پوشش دقیق حوزههای آزمون
این منبع تمرینی مستقیماً با استانداردهای معماری سطح تولید و مفاهیم کلیدی مورد نیاز در مصاحبههای پیشرفته مهندسی فرانتاند و فولاستک همسو است.
مبانی مدیریت وضعیت (۲۰٪): جریانهای قابل پیشبینی وضعیت، تغییرات دادهها از طریق توابع خالص (Pure Functions)، الزام به تغییرناپذیری ساختاری (Immutability)، سریالسازی اکشنها و ترکیب Root Reducer.
مدیریت جریانهای ناهمگام (۱۸٪): توسعه میدلورهای پیشرفته، مدیریت Side Effects از طریق Redux Thunk و Redux Saga، مدیریت وضعیتهای پیچیده API و مرزهای خطای جهانی.
بهینهسازی عملکرد (۱۵٪): مکانیسمهای Memoization در Selectorها با استفاده از Reselect، استراتژیهای سختگیرانه برای جلوگیری از Re-render در درخت کامپوننتهای React، تحلیلهای عمیق رندر با useSelector و تکنیکهای بهینهسازی حجم باندل.
تست و دیباگینگ (۱۲٪): تست واحد (Unit Testing) برای Reducerهای خالص، پیکربندی وضعیتهای Mock برای تست Selectorها، تنظیمات افزونه Redux DevTools و جریانهای کاری Time-travel debugging.
Redux Toolkit (۱۸٪): راهاندازی مدرن Store از طریق configureStore، ایجاد اسلایسهای کد ماژولار با createSlice، دریافت و کشینگ پیشرفته دادهها با RTK Query و مدیریت وضعیتهای رابطهای با createEntityAdapter.
یکپارچگی با React (۱۰٪): اتصالات اصولی با React Redux، استفاده از هوکهای سفارشی (useSelector, useDispatch)، تحلیل مقایسهای React Context در مقابل معماریهای Global Store و بهینهسازی مرزهای کامپوننتهای Container.
معماری و طراحی (۵٪): نرمالسازی وضعیت به سبک پایگاه دادههای رابطهای، الگوهای طراحی ساختاری برای درختهای جهانی پیچیده، یکپارچهسازی Feature Flagها در زمان اجرا و جریانهای مدیریت انتشار.
بهترین روشها و ضد-الگوها (۲٪): تعریف مرزهای تمیز بین وضعیت محلی و جهانی، مدیریت ایمن مقادیر غیرسریالشونده (Promises, Classes, Functions) و پایبندی به اصل معماری «پیشفرض روی وضعیت محلی».
درباره این دوره
موفقیت در مصاحبههای سطح Senior برای React یا توسعهدهنده فرانتاند، بسیار فراتر از دانستن نحوه ارسال یک Action ساده است. اپلیکیشنهای سازمانی مدرن برای مدیریت درختهای دادهای عظیم و چندلایه به صورت تمیز، مدیریت سیاستهای کشینگ پیچیده از طریق RTK Query و بهینه نگه داشتن چرخههای رندر، به Redux Toolkit (RTK) متکی هستند. مدیران فنی هنگام ارزیابی کاندیداها، به دنبال توسعهدهندگانی هستند که دقیقاً بدانند Selectorهای Memoized در پشت صحنه چگونه کار میکنند، Side Effectها چگونه به صورت تمیز مدیریت میشوند و چگونه یک Store را ساختاردهی کنند تا از کند شدن اپلیکیشن جلوگیری شود. من این مخزن جامع آزمونهای تمرینی را ساختم تا عمق فنی و دیدگاه معماری لازم برای پیروزی در این مراحل سخت مهندسی فرانتاند را در اختیار شما قرار دهم.
با ۵۵۰ سوال اصلی و با دقت طراحی شده، این محتوای تمرینی به بررسی عمیق باگهای واقعی محیط Production، جریانهای کاری پیچیده Async و معماهای کشینگ میپردازد. هر سوال دارای یک توضیح گسترده و خط به خط است که تحلیل میکند چرا یک انتخاب ساختاری یا پیکربندی خاص موفق میشود، در حالی که گزینههای جایگزین باعث نشت حافظه (Memory Leak)، تحریک رندرهای بینهایت یا افزایش حجم باندل نهایی میشوند. چه یک متخصص React باشید که به دنبال جایگاههای Mid-to-Senior با درآمد بالا است، چه یک مهندس Full Stack که میخواهد معماری وضعیت فرانتاند خود را تقویت کند، یا یک توسعهدهنده سازمانی که پیش از بررسیهای داخلی قصد بازبینی بهترین روشهای مدرن RTK را دارد، این بانک سوالات به عنوان ابزار آمادهسازی نهایی شما عمل میکند تا در اولین تلاش، مراحل فنی را با اطمینان پشت سر بگذارید.
نمونه سوالات تمرینی
این سه نمونه سوال الهام گرفته از محیط تولید را بررسی کنید تا سطح جزئیات ارائه شده برای هر گزینه در بانک سوالات را مشاهده نمایید.
سوال ۱: ایزولاسیون عملکرد و رفتار Memoization در Selectorها
یک توسعهدهنده با استفاده از ابزار createSelector از Redux Toolkit، سلکتوری ایجاد میکند تا لیست عظیمی از محصولات را بر اساس یک رشته داینامیک از دستهبندیها فیلتر کند. کامپوننت این سلکتور را با useSelector میخواند. در هنگام پروفایلینگ، توسعهدهنده متوجه میشود که این سلکتور خروجی آرایه خود را در هر تغییر وضعیت در کل اپلیکیشن دوباره محاسبه میکند، حتی زمانی که لیست محصولات و پارامتر دستهبندی کاملاً یکسان باقی ماندهاند. نقص ساختاری باعث این ابطال کش (Cache Invalidation) چیست؟
الف) سلکتور به جای استفاده از یک تابع ورودی مجزا، کل آبجکت وضعیت جهانی را به عنوان یک آرگومان inline میپذیرد.
ب) کامپوننت یک رفرنس آبجکت یا آرایه جدیداً ایجاد شده را به صورت inline به عنوان آرگومان داینامیک به فراخوانی سلکتور در useSelector پاس میدهد.
ج) متد createSelector به طور خودکار اندازه کش خود را به یک مقدار جهانی محدود میکند و آن را با چندین نمونه مستقل از کامپوننت ناسازگار میکند.
د) اسلایسهای Redux Toolkit اگر کامپوننت والد از React Hooks استفاده کند، به طور خودکار لایه اشتراک ساختاری Immer را دور میزنند.
ه) اسلایس وضعیت توسط createSlice مدیریت میشود که به طور پیشفرض تمام سلکتورهای Memoized سطح بالا را ابطال میکند.
و) سلکتور با وابستگی صریح به چیدمان پیکربندی میدلور configureStore تعریف شده است.
پاسخ صحیح و توضیح:
پاسخ صحیح: ب
دلیل صحیح بودن: createSelector برای تصمیمگیری در مورد رد محاسبات مجدد، به برابری دقیق رفرنس (===) مقادیر بازگشتی سلکتورهای ورودی خود متکی است. اگر کامپوننتی یک آرگومان inline پاس دهد که در هر چرخه رندر یک رفرنس آبجکت یا آرایه جدید ایجاد کند (مثلاً useSelector(state => selectCategorizedProducts(state, { category })) )، سلکتور ورودی همیشه یک رفرنس کاملاً جدید برمیگرداند. این امر باعث میشود سلکتور Memoized کش خود را پاک کرده و منطق فیلترینگ هزینهبر خود را در هر بار اجرا کند و مزایای عملکردی از بین برود.
دلیل نادرست بودن سایر گزینهها:
گزینه الف نادرست است: پاس دادن کل آبجکت وضعیت به یک سلکتور، الگوی معماری استاندارد است؛ سلکتورهای ورودی دقیقاً برای استخراج ایمن شاخههای خاص از آن وضعیت طراحی شدهاند.
گزینه ج نادرست است: اگرچه createSelector اندازه کش پیشفرض ۱ دارد، اما این مشکل خاص توسط تغییر آرگومانهای ورودی در یک نمونه واحد ایجاد شده است، نه لزوماً رقابت چندین نمونه برای یک سلکتور مشترک.
گزینه د نادرست است: اشتراک ساختاری Immer به طور یکپارچه در پشت صحنه createSlice کار میکند و هرگز صرفاً با معرفی React Hooks استاندارد شکسته یا دور زده نمیشود.
گزینه ه نادرست است: اسلایسهای ایجاد شده توسط createSlice کاملاً با Reselect سازگار هستند و روش استاندارد و اصولی برای ساخت معماریهای مدرن Redux میباشند.
گزینه و نادرست است: سلکتورها صرفاً روی ساختار دادهای درخت وضعیت (Plain State Tree) عمل میکنند و هیچ آگاهی یا وابستگی ساختاری به میدلورها یا پیکربندی configureStore ندارند.
سوال ۲: قوانین سریالسازی میدلور و مرزهای وضعیت غیرسریالشونده
یک توسعهدهنده سعی میکند سرعت یک قابلیت ردیابی آنی (Real-time) را با ذخیره مستقیم یک نمونه فعال WebSocket در وضعیت یک اسلایس Redux Toolkit افزایش دهد. اپلیکیشن بلافاصله شروع به نمایش هشدارهای مداوم در کنسول میکند که به میدلور بررسی سریالسازی (Serializability Check) اشاره دارد. دلیل معماری این هشدار چیست و روش صحیح برای حل آن چیست؟
الف) وضعیت Redux باید قبل از اتصال هرگونه سوکت خارجی به درخت میدلور، با استفاده از ابزارهای deep-freeze کاملاً منجمد شود.
ب) ذخیره مقادیر غیرسریالشونده مانند نمونههای کلاس، توابع یا سوکتهای فعال، مانع از عملکرد قابلیتهایی مانند Time-travel debugging، پایداری وضعیت (Persistence) و Hydration میشود. نمونه سوکت باید به خارج از Store منتقل شود، مثلاً به یک میدلور سفارشی یا یک React Context Ref.
ج) میدلور سریالسازی یک قابلیت قدیمی است که باید به طور صریح از درخت وابستگیهای Production حذف شود تا از کرش کردن مرورگر جلوگیری گردد.
د) نمونه WebSocket باید در داخل یک payload از createAsyncThunk قرار گیرد تا به طور خودکار به یک رشته JSON معتبر تبدیل شود.
ه) توسعهدهنده فراموش کرده است نمونه WebSocket را در پیکربندی دیکشنری createEntityAdapter ثبت کند.
و) Redux Toolkit ایجاب میکند که تمام سوکتهای شبکه فعال از یک آداپتور فرمت باینری سفارشی COMP-3 استفاده کنند تا بتوانند به درخت وضعیت اضافه شوند.
پاسخ صحیح و توضیح:
پاسخ صحیح: ب
دلیل صحیح بودن: یکی از ارکان اصلی طراحی Redux این است که درخت وضعیت منحصراً از آبجکتها، آرایهها و مقادیر اولیه (Primitives) ساده و سریالشونده جاوااسکریپت تشکیل شده باشد. افزودن آبجکتهای غیرسریالشونده (مانند نمونه WebSocket، Map، Set یا Function) قابلیتهای حیاتی مانند Time-travel debugging، لاگ خودکار وضعیت، پایداری وضعیت (redux-persist) و Hydration سمت سرور را مختل میکند. نمونههای عملیاتی پیچیده همیشه باید خارج از درخت وضعیت جهانی باشند. مدیریت آنها در یک لایه میدلور سفارشی یا دسترسی به آنها از طریق React Refs، استاندارد صنعت است.
دلیل نادرست بودن سایر گزینهها:
گزینه الف نادرست است: Redux Toolkit در هنگام کاهش (Reduction) با استفاده از Immer به طور خودکار محافظت از تغییرناپذیری را مدیریت میکند؛ افزودن دستی ابزارهای deep-freeze خارجی زائد است و مشکلات سریالسازی رفرنس را حل نمیکند.
گزینه ج نادرست است: بررسی سریالسازی یک ابزار حیاتی در حالت توسعه است که توسط Redux Toolkit برای تضمین سلامت معماری ارائه شده است؛ هرگز نباید صرفاً برای پنهان کردن الگوهای کدنویسی بد، خاموش شود.
گزینه د نادرست است: قرار دادن یک نمونه غیرسریالشونده در payload یک اکشن Thunk، به محض اینکه آن payload به Reducer یا زنجیره میدلور برسد، همان هشدار را ایجاد میکند.
گزینه ه نادرست است: createEntityAdapter یک ابزار بهینهسازی است که دقیقاً برای نرمالسازی مجموعهای از موجودیتهای تخت و سریالشونده طراحی شده است؛ این ابزار نمیتواند یک نمونه سوکت زنده را به دادههای سریالشونده تبدیل کند.
گزینه و نادرست است: مکانیسمهای فرمت باینری مانند COMP-3 مخصوص محیطهای قدیمی Mainframe (مانند COBOL) هستند و هیچ کاربرد یا معنایی در موتورهای اجرای استاندارد جاوااسکریپت وب ندارند.
سوال ۳: همگامسازی ساختاری وضعیت از طریق ابطال کش RTK Query
یک اپلیکیشن سازمانی React از RTK Query برای دریافت لیست کاربران فعال از طریق یک Query Endpoint به نام getUsers استفاده میکند. یک Mutation Endpoint مجزا به نام updateUser برای ویرایش آدرس ایمیل یک کاربر خاص اجرا میشود. اگرچه درخواست شبکه Mutation با کد موفق ۲۰۰ OK به پایان میرسد، اما UI همچنان ایمیل قدیمی را نشان میدهد تا زمانی که کاربر به طور دستی کل پنجره مرورگر را رفرش کند. نقاط انتهایی Query و Mutation چگونه باید به هم مرتبط شوند تا این بهروزرسانی وضعیت خودکار شود؟
الف) کوئری getUsers باید مجبور شود به طور مداوم در یک حلقه با فاصله ۵۰۰ میلیثانیه، سرور بکاند را Poll کند.
ب) تعریف Mutation باید به طور صریح از یک Trigger در Local Storage استفاده کند تا درخت DOM را خارج از چرخه حیات React بهروزرسانی کند.
ج) نقطه انتهایی کوئری getUsers باید یک نوع تگ (Tag) خاص را در آرایه providesTags خود تعریف کند و Mutation مربوط به updateUser باید همان تگ یکسان را در آرایه invalidatesTags خود تعریف کند تا یک Refetch خودکار تحریک شود.
د) کامپوننت باید به طور کامل Unmount شده و با استفاده از تریگرهای ردیابی استاندارد مرورگر در یک لایه useEffect، صفحه را Hard Reload کند.
ه) توسعهدهنده باید نقطه انتهایی کوئری را به یک اسلایس کلاسیک Redux تبدیل کند و پس از هر پاسخ API، به طور دستی یک رشته اکشن سفارشی را Dispatch کند.
و) Mutation باید به گونهای پیکربندی شود که وضعیت داخلی هر کامپوننت همتراز (Sibling View) را با استفاده از یک Event Bus جهانی مشترک تغییر دهد.
پاسخ صحیح و توضیح:
پاسخ صحیح: ج
دلیل صحیح بودن: RTK Query از یک سیستم داخلی و خودکار مبتنی بر تگ برای مدیریت تمیز ابطال کش استفاده میکند. با تعریف یک نوع تگ (مثلاً 'User') در ویژگی providesTags کوئری، RTK Query آن کش خاص را به نام آن تگ مرتبط میکند. وقتی Mutation با موفقیت به پایان میرسد، آرایه invalidatesTags آن یک سیگنال ابطال برای تگ 'User' ارسال میکند و به RTK Query میگوید که دادههای کش شده کاربر منقضی شدهاند. سپس سیستم به طور خودکار یک Refetch در پسزمینه برای هر کامپوننت فعالی که در حال گوش دادن به آن کوئری است، تحریک میکند.
دلیل نادرست بودن سایر گزینهها:
گزینه الف نادرست است: Short Polling تهاجمی باعث ایجاد فشار زیاد و غیرضروری روی سرور و مصرف پهنای باند میشود و یک سیستم ابطال کش رویداد-محور تمیز را با یک حلقه ناکارآمد جایگزین میکند.
گزینه ب نادرست است: دستکاری مستقیم و دستی DOM کاملاً چرخه رندر Declarative ریکت را دور میزند و همگامسازی وضعیت به نما (State-to-View) را میشکند.
گزینه د نادرست است: اجبار به ریلود صریح پنجره مرورگر، تجربه روان اپلیکیشنهای تک صفحهای (SPA) را از بین میبرد و هدف معماری استفاده از یک مدیریت وضعیت مدرن مانند RTK Query را کاملاً نادیده میگیرد.
گزینه ه نادرست است: RTK Query هوکهای خودکار ایجاد میکند و اکشنهای اسلایس داخلی را کاملاً خودش مدیریت میکند؛ نوشتن اسلایسهای Boilerplate دستی برای همگامسازی دادههای شبکه، دقیقاً همان پیچیدگیهایی را بازمیگرداند که RTK Query برای حذف آنها ساخته شده است.
گزینه و نادرست است: ایجاد یک Event Bus خارجی برای بهروزرسانی اجباری وضعیتهای همتراز، کانالهای جانبی شکننده و غیرقابل نگهداری ایجاد میکند که معماری جریان داده یکطرفه و پیشبینیپذیر Redux را میشکند.
آنچه در انتظار شماست
به آزمونهای سوالات مصاحبه خوش آمدید تا شما را برای آزمون تمرینی سوالات مصاحبه Redux Toolkit آماده کنیم.
شما میتوانید هر تعداد بار که بخواهید در آزمونها شرکت کنید.
این یک بانک سوالات عظیم و اصلی است.
در صورت داشتن سوال، از پشتیبانی مدرسان بهرهمند میشوید.
هر سوال دارای یک توضیح دقیق است.
سازگار با موبایل از طریق اپلیکیشن Udemy.
امیدواریم تا الان متقاعد شده باشید! سوالات بسیار بیشتری در داخل دوره وجود دارد.
Interview Questions Tests
مربی در Udemy
نمایش نظرات