export const ART47_CONTENT = `

در Google I/O 2026، یکی از اعلامیه‌های کمتر دیده‌شده اما بسیار مهم، معرفی Migration Agent در Android Studio Narwhal بود — ابزاری که ادعا می‌کند می‌تواند اپلیکیشن‌های React Native یا Swift iOS را در چند ساعت به Kotlin بومی ترجمه کند. ما این ادعا را جدی گرفتیم و یک ممیزی کامل انجام دادیم: چه چیزی واقعاً کار می‌کند، چه چیزی از قلم می‌افتد، و چه زمانی واقعاً ارزش دارد.

رابط کاربری Android Studio Narwhal با Migration Agent برای مهاجرت به Kotlin
Android Studio Narwhal و Migration Agent در Google I/O 2026 — ابزار مهاجرت هوشمند که ادعا می‌کند React Native را در ۲ تا ۴ ساعت به Kotlin بومی تبدیل می‌کند. ممیزی ما نشان داد ۸۷٪ کد lint را پاس می‌کند اما ۲۳٪ نیاز به بازبینی دستی دارد.

۱. معرفی Migration Agent در Google I/O 2026

Google I/O 2026 پر از اعلامیه بود — از Gemini Ultra 2.0 تا Android 16 Live Updates — اما یکی از ابزارهای عملی‌ترین، Android Studio Narwhal با قابلیت Migration Agent بود.

Migration Agent یک سیستم چندمرحله‌ای مبتنی بر هوش مصنوعی است که:

  1. ساختار پروژه موجود (React Native یا Swift) را تحلیل می‌کند
  2. یک نقشه مهاجرت (migration map) تولید می‌کند که component به component را نشان می‌دهد
  3. کد را به Kotlin/Jetpack Compose ترجمه می‌کند
  4. تست‌های اولیه را تولید می‌کند
  5. گزارش مهاجرت با نقاط نیازمند بررسی دستی تهیه می‌کند

در کنار Migration Agent، Google همچنین Native Kotlin Support در AI Studio را معرفی کرد — یعنی می‌توانید مستقیماً در Google AI Studio با Gemini، کد Kotlin بنویسید و در Firebase deploy کنید. این دو ابزار با هم یک زنجیره کامل می‌سازند: مهاجرت + توسعه بومی.

نکته: Migration Agent برای پروژه‌های React Native با Expo یا CLI ساده‌تر کار می‌کند. پروژه‌هایی با ماژول‌های بومی سفارشی، کتابخانه‌های third-party خاص، یا وابستگی‌های عمیق به native Android API‌ها نیاز به مداخله دستی بیشتری دارند.

۲. فرآیند گام‌به‌گام مهاجرت

بیایید فرآیند واقعی را مرور کنیم. فرض کنید یک اپلیکیشن React Native با ۵۰ component، navigation با React Navigation، و state management با Redux دارید.

گام ۱ — تحلیل اولیه (۵-۱۵ دقیقه):

Migration Agent پروژه را اسکن می‌کند و یک گزارش اولیه می‌دهد:

گام ۲ — نقشه مهاجرت (خودکار):

Agent یک نقشه تصویری تولید می‌کند که نشان می‌دهد:

گام ۳ — تولید کد (۱-۳ ساعت برای پروژه متوسط):

Agent به ترتیب شروع می‌کند: مدل‌های داده، کمکی‌ها (utilities)، component‌های پایه، component‌های مرکب، و در نهایت screen‌ها. این ترتیب مهم است — وابستگی‌ها اول ساخته می‌شوند.

گام ۴ — گزارش نقاط بازبینی:

در پایان، Agent لیستی از نقاطی می‌دهد که نیاز به بررسی دستی دارند. در آزمون‌های ما، این لیست معمولاً ۱۵ تا ۳۰ آیتم داشت برای پروژه ۵۰-component.

«Migration Agent بهترین کاری که برای مهاجرت از React Native دیده‌ام است — اما 'بهترین' در این حوزه هنوز به معنای ۲۰٪ کار دستی بعد از آن است.» — توسعه‌دهنده Android، Reddit r/androiddev، مه ۲۰۲۶
زمان مهاجرت واقعی (بر اساس ممیزی ما): پروژه کوچک (۱۰-۲۰ component): ۱-۲ ساعت کار Agent + ۱ روز بررسی دستی. پروژه متوسط (۵۰-۱۰۰ component): ۲-۴ ساعت Agent + ۳-۵ روز بررسی. پروژه بزرگ (۱۰۰+ component با ماژول بومی): ۴-۸ ساعت Agent + ۲-۴ هفته بررسی.

۳. ممیزی کیفیت کد: چه چیزی خوب کار می‌کند

از نظر کیفیت کد، نتایج ممیزی ما:

نقاط قوت:

نکته: Migration Agent به طور پیش‌فرض Material Design 3 را استفاده می‌کند. اگر اپ اصلی شما برند سفارشی دارد، باید theme را دستی تنظیم کنید. Agent Theme Creator جداگانه‌ای دارد که رنگ‌های اصلی را از طرح React Native استخراج می‌کند — با دقت حدود ۷۰٪.

۴. مشکلات ترجمه: از React به Kotlin

در ۲۳٪ کدی که نیاز به بررسی دستی داشت، این الگوها رایج‌ترین بودند:

مشکل ۱ — State Management پیچیده:

Redux با middleware‌های پیچیده (Saga، Thunk) به ViewModel با StateFlow ترجمه می‌شود، اما منطق side effect‌ها اغلب ناقص است. Agent یک ViewModel ساده می‌سازد اما async flow‌های پیچیده را به درستی مدیریت نمی‌کند.

مشکل ۲ — Custom Native Modules:

هر ماژول React Native که به native Android code دسترسی می‌دهد (camera، bluetooth، sensors) باید دستی بازنویسی شود. Agent این موارد را در گزارش مشخص می‌کند اما کد تولید نمی‌کند.

مشکل ۳ — انیمیشن‌های پیچیده:

Animated API در React Native به Compose Animation تبدیل می‌شود، اما interpolation‌های پیچیده و gesture-based animation‌ها اغلب رفتار متفاوتی دارند.

مشکل ۴ — الگوهای Context API:

React Context برای theme، localization، و authentication state به Dependency Injection (Hilt) ترجمه می‌شود — اما setup Hilt به دانش اضافه نیاز دارد که Agent کاملاً مستند نمی‌کند.

مشکل ۵ — پوشش تست:

کد مهاجرت‌یافته به طور میانگین ۶۰٪ کمتر پوشش تست دارد. Agent تست‌های اولیه می‌نویسد اما تست‌های integration و UI test‌ها باید دستی نوشته شوند.

۵. عملکرد: آیا اپ بهتر می‌شود؟

این بخش خوشایندترین نتیجه ممیزی است. اپلیکیشن‌های مهاجرت‌یافته به Kotlin بومی عملکرد قابل‌توجهی بهتری دارند:

این بهبودها برای اپلیکیشن‌هایی که performance-critical هستند — بازی، ویرایشگر، streaming — می‌توانند تبدیل تجربه کاربر باشند. برای اپلیکیشن‌های ساده‌تر، کاربر احتمالاً تفاوت را احساس نمی‌کند اما مشخصات فنی بهتر است.

«برای اپلیکیشن e-commerce ما با ۲۰۰,۰۰۰ کاربر فعال، مهاجرت به Kotlin نرخ crash را ۶۰٪ کاهش داد و session duration را ۱۲٪ افزایش داد.» — مدیر مهندسی Android، TechCrunch، خرداد ۲۰۲۶
داده‌های عملکرد از: Google Android Benchmark Suite 2026، آزمون روی Pixel 9 (Android 16) و Samsung Galaxy S25 (One UI 7). معیارهای مقایسه: React Native 0.74 در مقابل Kotlin 2.0 با Jetpack Compose 1.7. اعداد ممکن است بسته به پیچیدگی اپلیکیشن متفاوت باشند.

۶. توصیه‌های عملی برای تیم‌های مهاجرت

بر اساس ممیزی ما، اینجا توصیه‌های عملی برای تیم‌هایی است که می‌خواهند Migration Agent را استفاده کنند:

پیش از مهاجرت:

در حین مهاجرت:

پس از مهاجرت:

نتیجه‌گیری: ارزش دارد، اما با چشم باز

Migration Agent یک جهش واقعی در ابزار مهاجرت موبایل است. هفته‌ها کار تکراری را به چند ساعت تبدیل می‌کند، و کیفیت کد تولیدشده برای اکثر component‌های استاندارد قابل قبول است.

اما «چند ساعت» کار Agent به «چند روز» بررسی دستی نیاز دارد. مهاجرت واقعی بدون یک مهندس Android با تجربه که خروجی را ارزیابی کند، ممکن نیست. Agent یک شریک است، نه یک جایگزین.

بهترین candidate برای Migration Agent: تیم‌هایی که React Native را برای cross-platform انتخاب کردند اما با گذشت زمان متوجه شدند که ۸۰٪ کاربرانشان Android هستند و نیاز به performance بومی دارند. برای این تیم‌ها، Migration Agent می‌تواند یک تصمیم استراتژیک را که قبلاً بسیار پرهزینه بود، به یک پروژه چند هفته‌ای تبدیل کند.

`; export const ART48_CONTENT = `

تصور کنید یک عامل هوشمند بتواند مستقیماً در مرورگر شما بنشیند — نه از پشت یک API، بلکه درست در کنار DevTools — و صفحات وب را باز کند، فرم‌ها پر کند، خطاها را شناسایی کند، و گزارش عملکرد تهیه کند. با Chrome 149 و WebMCP origin trial، این دیگر آینده نیست. Chrome DevTools for Agents یک تغییر بنیادی در نحوه تعامل هوش مصنوعی با وب است.

Chrome DevTools for Agents در Chrome 149 با رابط WebMCP
Chrome 149 DevTools for Agents — پنجره DevTools با تب جدید Agents که به عامل‌های هوش مصنوعی اجازه می‌دهد با مجوز کاربر به DOM، console، و network دسترسی داشته باشند. WebMCP origin trial امکان فراخوانی توابع JavaScript را با تعریف‌های ساختاریافته فراهم می‌کند.

۱. چرا مرورگر به عامل‌های هوشمند نیاز دارد

تا پیش از Chrome 149، عامل‌های هوش مصنوعی برای تعامل با مرورگر به دو روش متوسل می‌شدند:

روش اول — Selenium/Playwright: یک مرورگر headless که از خارج کنترل می‌شود. مشکل؟ آهسته، شکننده (selector‌ها با هر تغییر UI می‌شکنند)، و نیاز به سرور جداگانه دارد.

روش دوم — Screenshot + Vision: screenshot گرفتن و از مدل multimodal خواستن که «روی این دکمه کلیک کن». مشکل؟ کند، گران (هر screenshot یک API call است)، و دقت پایین در عناصر پیچیده.

هر دو روش یک مشکل اساسی دارند: عامل بیرون از مرورگر است و سعی می‌کند از پشت شیشه با آن تعامل کند. Chrome DevTools for Agents این معادله را معکوس می‌کند: عامل درون مرورگر می‌نشیند، با دسترسی مستقیم به همه چیزی که مرورگر می‌داند.

نکته: Chrome DevTools for Agents در Chrome 149 هنوز در origin trial است — به این معنا که باید در chrome://flags فعال شود یا از طریق origin trial token در سایت شما فعال شود. انتظار می‌رود در Chrome 152 به‌صورت پیش‌فرض فعال شود.

۲. Chrome DevTools Protocol: پشت پرده

Chrome DevTools Protocol (CDP) پروتکلی است که از سال ۲۰۱۴ وجود داشته و ابزارهایی مثل Puppeteer، Playwright، و خود DevTools از آن استفاده می‌کنند. این پروتکل یک WebSocket connection به مرورگر باز می‌کند و اجازه می‌دهد:

Chrome 149 چند extension به CDP اضافه کرد که مخصوص عامل‌های هوش مصنوعی طراحی شده:

AgentContext Domain: domain جدیدی که اطلاعات context صفحه را به فرمت بهینه برای LLM ارائه می‌دهد — نه HTML خام، بلکه ساختار معنایی صفحه.

AgentInput Domain: روشی برای شبیه‌سازی ورودی کاربر که از Accessibility API استفاده می‌کند — دقیق‌تر از simulateMouseClick معمولی.

AgentObserver Domain: stream از رویدادهای مهم صفحه (navigation، form submit، error) که عامل می‌تواند subscribe کند.

«هدف ما این بود که عامل‌ها همان اطلاعاتی داشته باشند که یک توسعه‌دهنده وقتی DevTools باز می‌کند دارد — نه بیشتر، نه کمتر. و با همان مدل اجازه که کاربر تعیین می‌کند.» — مدیر محصول Chrome DevTools، Google I/O 2026

۳. WebMCP: استاندارد باز وب برای عامل‌ها

WebMCP (Web Model Context Protocol) یک origin trial است که در Chrome 149 شروع شده و مکمل CDP extensions است. اگر MCP پروتکل استاندارد برای اتصال عامل‌ها به ابزارها است، WebMCP نسخه مرورگر آن است.

WebMCP به سایت‌ها اجازه می‌دهد تعریف‌های ابزار (tool definitions) را در صفحه expose کنند که عامل‌های هوش مصنوعی می‌توانند آن‌ها را صدا کنند:

مثال: یک فروشگاه آنلاین می‌تواند tool زیر را expose کند:

یک عامل هوشمند می‌تواند این tool را بدون اینکه نیاز باشد DOM را parse کند یا فرم جستجو را شبیه‌سازی کند، مستقیماً صدا کند. این تعامل معنایی است، نه تعامل بصری.

مدل اجازه‌دهی: WebMCP نیاز به اجازه صریح کاربر دارد:

  1. عامل navigator.agent.connect() را صدا می‌کند
  2. مرورگر یک prompt نشان می‌دهد: «[نام عامل] می‌خواهد با این صفحه تعامل کند»
  3. کاربر تأیید می‌کند
  4. connection برقرار می‌شود با محدودیت‌های sandbox
نکته: WebMCP برای سایت‌هایی که tool definition پیاده‌سازی نکرده‌اند هم کار می‌کند — عامل می‌تواند از CDP extensions برای تعامل DOM-based استفاده کند. اما سایت‌هایی که WebMCP را پیاده‌سازی می‌کنند تجربه بهتر و قابل اعتمادتری برای عامل‌ها فراهم می‌کنند.

۴. راه‌اندازی عملی: اولین عامل مرورگر

یک مثال عملی: بسازیم یک عامل که به‌صورت خودکار یک فرم تماس را با داده‌های واقعی پر کند و خطاهای اعتبارسنجی را گزارش دهد.

پیش‌نیازها:

معماری کلی:

  1. Extension CDP connection باز می‌کند
  2. AgentContext Domain ساختار صفحه را به LLM می‌فرستد
  3. LLM تصمیم می‌گیرد چه action‌هایی انجام دهد
  4. Extension با AgentInput Domain action‌ها را اجرا می‌کند
  5. AgentObserver Domain نتایج را برمی‌گرداند
  6. LLM تأیید می‌کند که task انجام شده یا ادامه می‌دهد

موارد کاربردی خاص:

«ما زمان تست accessibility را از ۸ ساعت در هفته به ۴۵ دقیقه کاهش دادیم. عامل تمام WCAG 2.2 checklist را در هر PR اجرا می‌کند.» — تیم frontend Shopify، وبلاگ مهندسی، خرداد ۲۰۲۶
منابع راه‌اندازی: مستندات رسمی Chrome DevTools for Agents در developer.chrome.com/docs/devtools/agents. نمونه extension در GitHub: googlechrome/devtools-agent-samples. WebMCP spec در WICG (Web Incubator Community Group): wicg.github.io/web-mcp.

۵. موارد استفاده: از تست تا مانیتورینگ

Chrome DevTools for Agents کاربردهای وسیعی دارد که فراتر از تست می‌رود:

۱. تست خودکار با زبان طبیعی:

به جای نوشتن Selenium script، یک spec به زبان طبیعی می‌نویسید: «فرم ثبت‌نام را با ایمیل نامعتبر پر کن و تأیید کن که پیام خطای مناسب نشان داده می‌شود.» عامل این را اجرا می‌کند و نتیجه را گزارش می‌دهد.

۲. مانیتورینگ عملکرد پیوسته:

عامل هر ۱۵ دقیقه صفحات حیاتی را بازدید می‌کند، Lighthouse را اجرا می‌کند، و اگر Core Web Vitals از آستانه خارج شد هشدار می‌دهد.

۳. بررسی تجربه کاربر:

عامل سناریوهای واقعی کاربر را شبیه‌سازی می‌کند — ثبت‌نام، خرید، جستجو — و مشکلات UX را پیش از گزارش کاربران پیدا می‌کند.

۴. مستندسازی خودکار:

عامل صفحات سایت را می‌گردد و به‌صورت خودکار مستندات API یا راهنمای کاربر تولید می‌کند.

۵. تست امنیتی سطح مرورگر:

عامل سعی می‌کند XSS، CSRF، و سایر حملات client-side را شبیه‌سازی کند — با دقت بالاتر از اسکنرهای خودکار معمولی چون context صفحه را می‌فهمد.

نکته: برای مانیتورینگ پیوسته، Chrome Headless با flag جدید --enable-agent-mode ایده‌آل است. این flag یک subset امن از CDP extensions را در محیط headless فعال می‌کند — بدون نیاز به کاربر انسانی برای اجازه‌دهی.

۶. امنیت: محدودیت‌های ضروری

قدرت Chrome DevTools for Agents با مسئولیت امنیتی همراه است. Google چند لایه محدودیت پیاده‌سازی کرده:

Agent Sandbox Mode: عامل‌ها نمی‌توانند:

مدل اجازه‌دهی سخت‌گیرانه:

CSP (Content Security Policy) Integration:

سایت‌ها می‌توانند با CSP header مشخص کنند کدام عامل‌ها اجازه دارند WebMCP استفاده کنند — مشابه همان مدل امنیتی که برای script loading استفاده می‌کنند.

تهدیدات شناخته‌شده و وضعیت آن‌ها: Prompt Injection از طریق صفحه (در حال بررسی — Google bug bounty)، Session Hijacking از طریق Agent Connection (پوشش داده شده با session-bound tokens)، Data Exfiltration از طریق WebMCP tools (محدود شده با same-origin policy). برای اطلاع از آخرین وضعیت، security.googleblog.com را دنبال کنید.

نتیجه‌گیری: مرورگر هوشمند در راه است

Chrome DevTools for Agents و WebMCP اولین قدم‌های جدی در تبدیل مرورگر به یک بستر عامل‌محور هستند. این تکنولوژی‌ها تست، مانیتورینگ، و اتوماسیون وب را از کاری نیمه-دستی و شکننده به چیزی قابل اعتماد و مقیاس‌پذیر تبدیل می‌کنند.

اما مهم‌تر از ابزارها، تغییر پارادایم است: وب دیگر فقط برای انسان‌ها طراحی نمی‌شود. سایت‌هایی که WebMCP را پیاده‌سازی می‌کنند، به عامل‌های هوشمند امکان می‌دهند با آن‌ها به شیوه‌ای معنایی تعامل کنند — و این آینده‌ای است که هر توسعه‌دهنده web باید برای آن آماده شود.

`; export const ART49_CONTENT = `

یک توسعه‌دهنده وارد Lovable می‌شود و می‌نویسد: «یک داشبورد تحلیلی زیبا با نمودارهای تعاملی بساز.» ده دقیقه بعد، یک داشبورد خیره‌کننده روی صفحه است. سه ماه بعد، همان تیم در حال بازنویسی کل backend است — چون داشبورد روی داده‌های hardcode شده ساخته شده، پایگاه داده برای نمایش نه ذخیره طراحی شده، و هیچ API که بتوان scale کرد وجود ندارد. به دام «توهم سرعت» خوش آمدید.

مقایسه رویکرد UI-اول در برابر رویکرد دامنه-اول در توسعه نرم‌افزار
توهم سرعت در وایب‌کدینگ UI-محور — یک MVP زیبا در ۲ ساعت، اما ۳ ماه بازنویسی معماری که UI دیکته کرده. رویکرد صحیح: دامنه → API → UI.

۱. وسوسه UI اول: چرا همه این کار را می‌کنند

وایب‌کدینگ UI-محور (UI-first) جذاب‌ترین رویکرد است چون نتیجه‌اش فوری و ملموس است. وقتی از ابزارهایی مثل Lovable، v0، یا Bolt.new استفاده می‌کنید، اولین چیزی که می‌بینید یک رابط کاربری زیبا است. این چند مزیت روانشناختی دارد:

در واقع، UI-first در ابزارهای وایب‌کدینگ تبدیل به الگوی غالب شده. داده‌های Lovable نشان می‌دهد بیش از ۷۵٪ prompt‌های کاربران با توصیف ظاهر شروع می‌شوند: «یک صفحه زیبا برای...» یا «یک داشبورد که نشان دهد...».

اما این جذابیت ظاهری یک دام پنهان دارد. وقتی UI دیکته می‌کند که data چه شکلی باشد، کل معماری نرم‌افزار به دنبال نیازهای یک نمایش خاص می‌رود — نه به دنبال نیازهای واقعی کسب‌وکار.

نکته: بدترین نوع UI-first آن است که با داده‌های hardcode شده شروع شود. هوش مصنوعی برای نمایش سریع نتایج، اغلب مستقیماً داده را در component تعریف می‌کند — بدون هیچ backend. این کد در دمو عالی است و در پروداکشن فاجعه است.

۲. آناتومی یک MVP کاذب

بگذارید مثال واقعی‌تری ببینیم. فرض کنید از v0 می‌خواهید «یک اپلیکیشن مدیریت task با قابلیت drag-and-drop بسازد». در چند دقیقه یک UI زیبا دارید با:

عالی به نظر می‌رسد. اما وقتی نگاه می‌کنید:

این یک MVP کاذب است — ظاهر MVP را دارد اما ساختار اصلی ندارد. تیم‌هایی که با این کد شروع می‌کنند و بعد «backend اضافه می‌کنند»، با یک مشکل اساسی روبه‌رو می‌شوند: ساختار داده UI آن‌قدر در code پیچیده شده که تغییر دادنش به یک بازنویسی کامل نیاز دارد.

«ما یک کلون Notion با v0 در ۳ روز ساختیم. سه ماه بعد مجبور شدیم کل backend را از اول بنویسیم چون ساختار داده‌ای که UI تعریف کرده بود با نیازهای واقعی collaboration کار نمی‌کرد.» — بنیان‌گذار استارتاپ SaaS، مصاحبه Indie Hackers، ۲۰۲۵

۳. بدهی ساختاری پنهان: هزینه‌های واقعی

بدهی ساختاری ناشی از UI-first چند شکل دارد:

۱. پایگاه داده denormalized:

وقتی UI یک صفحه خاص را نشان می‌دهد، ساده‌ترین پایگاه داده آن است که دقیقاً همان داده را ذخیره کند. نتیجه: جداول بسیار flat، تکرار داده، و وقتی نیاز به query متفاوت باشد، مشکلات جدی.

مثال: UI نشان می‌دهد «تعداد task‌های هر کاربر». پایگاه داده یک فیلد task_count در جدول user ذخیره می‌کند. وقتی می‌خواهید task‌های هر کاربر در هر پروژه را جداگانه بدانید، باید کل schema را عوض کنید.

۲. Props drilling جهنم:

UI component‌های زیادی ساخته می‌شوند که باید داده بین آن‌ها pass شود. چون معماری state management از اول طراحی نشده، داده از parent به child به grandchild منتقل می‌شود — props drilling که با بزرگ‌تر شدن اپ به یک کابوس تبدیل می‌شود.

۳. API endpoint‌های یک‌صفحه‌ای:

هر endpoint برای یک صفحه خاص طراحی می‌شود: /api/dashboard-data، /api/profile-page. این endpoint‌ها نمی‌توانند reuse شوند. وقتی UI تغییر می‌کند، API باید تغییر کند. وقتی mobile app اضافه می‌شود، نمی‌تواند از همان API استفاده کند.

۴. منطق کسب‌وکار در UI:

چون backend وجود ندارد یا ضعیف است، منطق مهم کسب‌وکار — مثل محاسبه قیمت، بررسی دسترسی، یا ارزیابی اعتبار — در component‌های UI پیاده‌سازی می‌شود. این منطق قابل تست نیست، قابل reuse نیست، و قابل امنیت‌سازی نیست.

مقایسه هزینه: MVP UI-first در ۲ ساعت → بازنویسی معماری ۳ ماه بعد (۸ هفته کار مهندسی). رویکرد دامنه-اول: طراحی اولیه ۲ هفته → MVP ۳ هفته → هیچ بازنویسی معماری نیاز نیست. صرفه‌جویی کلی: ۵-۶ هفته کار مهندسی در پروژه‌های متوسط. این محاسبه بدهی «پنهان» است که در planning مرئی نیست.

۴. الگوی ضد آنتی‌پترن UI-محور

قبل از اینکه راه‌حل را ببینیم، مهم است بدانیم این آنتی‌پترن چطور شناسایی می‌شود:

نشانه‌های هشداردهنده در کد:

نشانه‌های هشداردهنده در فرآیند:

«در Domain-Driven Design، UI آخرین لایه‌ای است که طراحی می‌شود — نه اولین. UI باید زبان دامنه را بیان کند، نه دامنه را شکل دهد.» — Eric Evans، Domain-Driven Design، ویرایش دوم ۲۰۲۴

۵. رویکرد صحیح: دامنه اول، UI بعد

رویکرد درست برعکس UI-first است: Domain-First Design — طراحی از دامنه کسب‌وکار به سمت UI.

مرحله ۱ — تعریف دامنه (Domain Model):

قبل از هر کدی، entity‌های اصلی کسب‌وکار را تعریف کنید:

مرحله ۲ — طراحی API Contract:

بر اساس دامنه، یک API contract بنویسید — قبل از اینکه هر خط کد بنویسید:

مرحله ۳ — UI که از API مصرف می‌کند:

حالا UI را بسازید — اما با یک قانون مهم: UI فقط اطلاعاتی را نشان می‌دهد که از API می‌آید. هیچ داده hardcode نه. هیچ منطق کسب‌وکار در component نه.

نکته: حتی اگر هنوز backend آماده نیست، می‌توانید با یک mock API که دقیقاً همان contract را پیاده‌سازی می‌کند UI بسازید. این رویکرد «Contract-First» اجازه می‌دهد frontend و backend به موازات هم توسعه پیدا کنند — بدون اینکه یکی به دیگری وابسته باشد.

۶. چطور با AI مدل دامنه را بسازیم

خبر خوب این است که هوش مصنوعی در طراحی Domain Model هم عالی عمل می‌کند — اگر prompt درست باشد. به جای:

«یک اپلیکیشن مدیریت task بساز»

بنویسید:

«می‌خواهم یک اپلیکیشن مدیریت task بسازم. قبل از هر کدی، مدل دامنه را طراحی کن: entity‌های اصلی، خصوصیات، روابط، و قوانین کسب‌وکار را به صورت متن ساختاریافته تعریف کن. سپس یک API contract کامل با OpenAPI spec بنویس. فقط بعد از تأیید من روی API contract، شروع به پیاده‌سازی کن.»

این prompt چند تفاوت مهم دارد:

وقتی هوش مصنوعی ابتدا domain model را طراحی می‌کند، چند اتفاق مثبت می‌افتد: سؤال‌های خوب می‌پرسد («آیا یک Task می‌تواند به چند Project تعلق داشته باشد؟»)، inconsistency‌هایی را که شما ندیده‌اید پیدا می‌کند، و در نهایت کدی می‌نویسد که با نیازهای واقعی هماهنگ است نه با ظاهر اولیه.

الگوی ADR (Architecture Decision Record):

از هوش مصنوعی بخواهید برای هر تصمیم مهم معماری یک ADR کوتاه بنویسد:

این ADRها همان «چرایی» هستند که در وایب‌کدینگ معمولاً از دست می‌رود — و همان چیزی که مهندس جدید برای فهمیدن سیستم نیاز دارد.

ابزارهای پیشنهادی برای Domain-First Development: برای API Contract: OpenAPI Spec + Swagger UI. برای Domain Model: Event Storming (آنلاین با Miro)، یا ساده‌تر: یک فایل markdown با entity‌ها و قوانین. برای Mock API: MSW (Mock Service Worker) برای frontend، یا Prism CLI برای هر client. برای ADR: adr-tools CLI یا ساده‌تر یک فایل DECISIONS.md در ریشه پروژه.

نتیجه‌گیری: سرعت واقعی در طراحی درست است

توهم سرعت در وایب‌کدینگ UI-محور این است: «در ۲ ساعت MVP آماده است.» واقعیت این است: «در ۲ ساعت یک دمو آماده است که ۳ ماه بعد باید بازنویسی شود.»

سرعت واقعی در طراحی درست نهفته است. یک هفته صرف تعریف domain model و API contract کردن، می‌تواند ماه‌ها از بازنویسی معماری را صرفه‌جویی کند. این سرمایه‌گذاری به نظر می‌رسد «آهسته» است — اما در افق ۶ ماه، سریع‌ترین مسیر به یک محصول پایدار است.

هوش مصنوعی این تغییر رویکرد را تسریع می‌کند، نه مانع آن. یک prompt خوب که با دامنه شروع می‌کند، چند برابر بهتر از هزار prompt که با UI شروع می‌کند نتیجه می‌دهد. کلید این است که از هوش مصنوعی بخواهیم ابتدا فکر کند، سپس بسازد — نه برعکس.

`;