تکناو
TEKNAV

نرم‌افزار

توهم سرعت: چرا وایب‌کدینگ UI-محور بدهی ساختاری عمیق را پنهان می‌کند

وایب‌کدینگ UI-محور یک توهم خطرناک ایجاد می‌کند: اپ خوب به نظر می‌رسد پس خوب است — اما زیر ظاهر زیبا چه اتفاقی می‌افتد؟

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

پاسخ کوتاه: وایب‌کدینگ UI-محور رویکردی است که در آن توسعه نرم‌افزار از طراحی رابط کاربری شروع می‌شود و معماری backend به دنبال نیازهای UI شکل می‌گیرد. این روش گرچه در کوتاه‌مدت جذاب است و نتیجه سریع نشان می‌دهد، اما بدهی ساختاری عمیقی ایجاد می‌کند: پایگاه داده denormalized، منطق کسب‌وکار در کامپوننت‌های UI، و APIهایی که فقط برای یک صفحه طراحی شده‌اند. در نهایت تیم مجبور به بازنویسی کامل معماری می‌شود که هزینه آن بسیار بیشتر از طراحی domain-first از ابتدا است.
مقایسه رویکرد UI-اول در برابر رویکرد دامنه-اول در توسعه نرم‌افزار
توهم سرعت در وایب‌کدینگ UI-محور — یک MVP زیبا در ۲ ساعت، اما ۳ ماه بازنویسی معماری که UI دیکته کرده. رویکرد صحیح: دامنه → API → UI.

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

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

  • اثبات سریع ایده: می‌توانید به سرمایه‌گذار چیزی نشان دهید که «کار می‌کند»
  • feedback فوری: در ده دقیقه می‌فهمید طراحی‌تان درست است یا نه
  • انگیزه: دیدن نتیجه سریع توسعه‌دهنده را انرژی می‌دهد
  • ارتباط با ذینفعان: UI قابل نمایش است — معماری پشت‌صحنه نیست

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

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

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

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

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

  • کانبان board با ستون‌های Todo، In Progress، Done
  • کارت‌های قابل drag-and-drop
  • رنگ‌بندی اولویت
  • modal برای ایجاد task جدید

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

  • task‌ها در یک آرایه JavaScript در component state هستند — هیچ backend نیست
  • هر بار صفحه refresh شود، همه چیز از بین می‌رود
  • ساختار داده کاملاً flat است: {"{"}id, title, status, priority{"}"}
  • هیچ concept از user، team، یا project وجود ندارد
  • چند نفر نمی‌توانند همزمان استفاده کنند

این یک 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-محور

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

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

  • پایگاه داده schema‌ای که دقیقاً شبیه ساختار UI است — نه ساختار کسب‌وکار
  • API endpoint‌هایی با نام‌هایی مثل getHomepageData یا getDashboardStats
  • منطق کسب‌وکار پیچیده در React component
  • فقدان مدل دامنه — هیچ entity مرکزی مثل User، Order، Product در core وجود ندارد
  • تست‌هایی که فقط ظاهر را تست می‌کنند، نه رفتار

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

  • اولین چیزی که به ذینفعان نشان می‌دهید screenshot است، نه spec
  • data model را «بعداً» تعریف می‌کنید
  • وقتی یک feature جدید می‌خواهید، اول UI آن را در ذهن می‌بینید
  • تیم backend از تصمیمات UI آگاه نیست تا وقتی که دیر شده
«در Domain-Driven Design، UI آخرین لایه‌ای است که طراحی می‌شود — نه اولین. UI باید زبان دامنه را بیان کند، نه دامنه را شکل دهد.» — Eric Evans، Domain-Driven Design، ویرایش دوم ۲۰۲۴

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

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

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

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

  • چه موجودیت‌هایی وجود دارند؟ (User، Task، Project، Team)
  • هر موجودیت چه خصوصیاتی دارد؟
  • روابط بین موجودیت‌ها چیست؟
  • قوانین کسب‌وکار چه هستند؟ (یک User می‌تواند چند Team داشته باشد؟ یک Task می‌تواند بدون Project باشد؟)

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

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

  • resource‌های RESTful یا mutation‌های GraphQL را تعریف کنید
  • request/response schema را مستند کنید
  • error case‌ها را صریحاً تعریف کنید
  • authentication و authorization rules را مشخص کنید

مرحله ۳ — 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 چند تفاوت مهم دارد:

  • صریحاً خواسته که قبل از کد، طراحی باشد
  • هوش مصنوعی را موظف به تولید artifact‌های مستند (API spec) کرده
  • یک checkpoint تأیید انسانی قبل از شروع پیاده‌سازی تعریف کرده
  • ترتیب کار را مشخص کرده: دامنه → API → پیاده‌سازی

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

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

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

  • تصمیم چیست؟
  • چرا این تصمیم گرفته شد؟
  • گزینه‌های دیگر چه بودند و چرا رد شدند؟
  • پیامدها و trade-off‌ها چیستند؟

این 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-اول در برابر دامنه-اول

برای درک بهتر تفاوت‌های این دو رویکرد، جدول زیر مقایسه‌ای از جنبه‌های کلیدی توسعه نرم‌افزار با ابزارهای وایب‌کدینگ ارائه می‌دهد. انتخاب رویکرد صحیح تأثیر مستقیمی بر هزینه‌های بلندمدت پروژه و پایداری محصول نهایی دارد.

جنبهUI-اول (UI-First)دامنه-اول (Domain-First)نتیجه بلندمدت
نقطه شروعطراحی رابط کاربری و نمایش بصریتعریف موجودیت‌های دامنه و قوانین کسب‌وکاردامنه-اول پایه‌ای مستحکم برای توسعه می‌سازد
ساختار دادهداده‌ها متناسب با یک نمایش خاص طراحی می‌شوندداده‌ها بر اساس روابط واقعی کسب‌وکار مدل می‌شوندداده‌های UI-اول با تغییر نیاز غیرقابل استفاده می‌شوند
منطق کسب‌وکاردر کامپوننت‌های frontend پراکنده می‌شوددر لایه دامنه متمرکز و قابل تست باقی می‌ماندمنطق پراکنده امنیت و نگهداری را تضعیف می‌کند
APIاندپوینت‌های تک‌صفحه‌ای بدون قابلیت reuseAPI contract کامل با OpenAPI پیش از کدنویسیAPI UI-اول با اضافه شدن mobile app فرو می‌پاشد
زمان تا MVP۲ ساعت تا یک دموی قابل نمایش۳ هفته تا یک MVP با معماری پایدارUI-اول سریع‌تر دمو می‌دهد اما دیرتر به محصول می‌رسد
بازنویسی معماری۳ ماه بعد نیاز به بازنویسی کاملبدون نیاز به بازنویسی معماریصرفه‌جویی ۵ تا ۶ هفته کار مهندسی

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

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

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

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

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

پرسش‌های پرتکرار

وایب‌کدینگ UI-محور چیست؟

وایب‌کدینگ UI-محور رویکردی در توسعه نرم‌افزار با هوش مصنوعی است که در آن برنامه‌نویس ابتدا رابط کاربری را با ابزارهایی مانند Lovable یا v0 می‌سازد و سپس معماری backend را بر اساس نیازهای UI طراحی می‌کند. این روش در ظاهر سریع است اما اغلب منجر به بدهی فنی پنهان می‌شود که در بلندمدت هزینه بازنویسی کامل را تحمیل می‌کند.

چرا وایب‌کدینگ UI-محور خطرناک است؟

خطر اصلی در این است که UI دیکته می‌کند داده‌ها چه ساختاری داشته باشند، نه نیازهای واقعی کسب‌وکار. نتیجه آن پایگاه داده denormalized، منطق کسب‌وکار در frontend، و APIهای تک‌صفحه‌ای است که قابلیت reuse و scale ندارند. این مشکلات تا زمان ورود به پروداکشن پنهان می‌مانند و سپس به بحران تبدیل می‌شوند.

تفاوت وایب‌کدینگ UI-محور و Domain-First چیست؟

در UI-first، توسعه از ظاهر شروع می‌شود و ساختار داده دنباله‌رو UI است. در Domain-First، ابتدا مدل دامنه و entityهای اصلی کسب‌وکار تعریف می‌شوند، سپس API contract نوشته می‌شود، و در نهایت UI بر اساس API ساخته می‌شود. رویکرد دوم بدهی ساختاری ایجاد نمی‌کند و در افق ۶ ماه سریع‌تر به محصول پایدار می‌رسد.

چگونه از دام وایب‌کدینگ UI-محور جلوگیری کنیم؟

قبل از هر کدی، entityهای اصلی دامنه را تعریف کنید و یک API contract کامل بنویسید. از هوش مصنوعی بخواهید ابتدا معماری را طراحی کند، سپس کد بزند. از داده hardcode در UI پرهیز کنید و منطق کسب‌وکار را در backend نگه دارید. این سرمایه‌گذاری اولیه ماه‌ها از بازنویسی جلوگیری می‌کند.

نشانه‌های MVP کاذب در وایب‌کدینگ چیست؟

MVP کاذب ظاهر محصول نهایی را دارد اما فاقد معماری واقعی است: داده‌ها hardcode هستند، پایگاه داده وجود ندارد یا صرفاً برای یک نمایش خاص طراحی شده، منطق کسب‌وکار در کامپوننت‌های React قرار دارد، و هیچ API contract مستندی وجود ندارد. این MVPها در دمو عالی کار می‌کنند اما در پروداکشن فرو می‌پاشند.