صفحه ورود به درستی رندر شد. REST API کد 200 OK را برگرداند. قالب آماده SaaS بدون حتی یک خطای linting بالا آمد. در عرض یک بعدازظهر، کاری را تمام کردید که قبلاً یک هفته طول میکشید. دستیارهای کدنویسی هوش مصنوعی توسعه نرمافزار را چنان کامل تغییر دادهاند که ساخت ویژگیها (features) اکنون کمتر شبیه مهندسی و بیشتر شبیه سفارش دادن از یک منو است. این راحتی واقعی است، اما بهایی دارد که تنها بعداً، معمولاً زمانی که حساسیت کار به بالاترین حد میرسد، خود را نشان میدهد. توسعهدهندگان شروع به نامیدن این تله با عنوان Vibe Coding کردهاند، و این نام مشکل را به شکلی بینقص توصیف میکند.
حلقه کپی-پیست
واقعیت این حلقه به این صورت است. نشانگر خود را در پنجره چت قرار میدهید و یک ویژگی را به زبان انگلیسی ساده توصیف میکنید. بلاک کدی فوراً ظاهر میشود. آن را هایلایت میکنید، کپی میکنید، به ویرایشگر خود برمیگردید، پیست میکنید و ذخیره میکنید. ترمینال هیچ خطایی نشان نمیدهد. مرورگر چیدمان (layout) درستی را نمایش میدهد. تغییر را commit میکنید و تیکت بعدی را باز میکنید. هیچ توقفی برای ردیابی منطق (logic) وجود نداشت. هیچ بررسیای روی وابستگیهای (dependencies) وارد شده انجام نشد. هیچ سوالی در مورد اینکه آیا آن کتابخانه شخص ثالث واقعاً لازم است یا یک ابزار کتابخانه استاندارد کار را راه میاندازد، پرسیده نشد. گردش کار صرفاً شامل «بپرس، کپی کن، پیست کن، اجرا کن» است. اگر ظاهر کار درست به نظر برسد، فرض میشود که عمق آن هم درست است. این به هیچ معنای معناداری کدنویسی نیست. این یعنی سرهم کردن قطعات پیشساخته بدون خواندن دفترچه راهنما. مانند هر میانبری، تا زمانی که درست کار میکند، خوب است؛ اما دقیقاً در لحظهای که کار نمیکند، مشکل شروع میشود.
از دست دادن کنترل در بدترین زمان
وقتی باگ در محیط تولید (production) ظاهر میشود، مسئولیت آن با شماست، نه هوش مصنوعی. ساعت دو صبح، چتبات به پلتفرم observability شما متصل نیست؛ اما شما هستید. اگر هرگز کدی را که منتشر کردهاید نخوانده باشید، نمیتوانید درباره علت شکست آن استدلال کنید. شما در فایلهایی که درکشان نمیکنید به دنبال grep میگردید و سعی میکنید منطقی را وصله پینه کنید که هرگز یاد نگرفتهاید. این احساس گیجکننده است. توسعهدهندهای که ساختارهای خود را مینویسد، یک نقشه ذهنی از سیستم میسازد. آنها میدانند لبههای تیز کجاست و کدام فرضها زیربنای سیستم را نگه داشتهاند. Vibe Coding آن نقشه را پاک میکند. شما به اپراتورِ جعبههای سیاه تبدیل میشوید. نحو (syntax) درست است، دمو مشتری را تحت تأثیر قرار داده، اما سیستم واقعاً متعلق به شما نیست. مالکیت مستلزم درک و فهم است، و درک کردن زمان میبرد. نادیده گرفتن این مرحله، هزینه را حذف نمیکند؛ بلکه آن را به گرانترین لحظه ممکن منتقل میکند.
کدِ کارآمد، لزوماً کدِ امن نیست
مدلهای هوش مصنوعی پاسخها را بر اساس الگوهای موجود در دادههای آموزشی تولید میکنند. آن الگوها شامل نمونههای بسیار قدیمی و ناامن هستند. تابع ورود (login) که کپی کردهاید ممکن است به جای استفاده از یک هش کند و نمکزنیشده (salted slow hash)، از یک هش سریع و منسوخ برای ذخیره رمز عبور استفاده کند، زیرا اسنپشاتهای آموزشی بر قطعات کدهای قدیمی انجمنها تمرکز داشتهاند. نقطه پایانی (endpoint) API ممکن است ورودی کاربر را مستقیماً در یک رشته SQL خام متصل کند، چون شما یک مثال ساده خواستهاید و مدل هم مطیع خواسته شما شده است. اعتبارنامههای پایگاه داده شما ممکن است در جاوااسکریپت سمت کلاینت نشت کند، چون هوش مصنوعی نمیدانست که شما در حال ساخت یک فرانتاند بدون سرور (serverless frontend) هستید، نه یک مسیر بکاند (backend route).
عدم اعتبارسنجی ورودیها بسیار رایج است. هندلر فرم تولیدشده فرض را بر کاربران مودب میگذارد و پیش از انتقال دادهها به لایههای عمیقتر، طول رشتهها، محدودههای عددی یا انواع فایلها را بررسی نمیکند. بررسیهای احراز هویت ممکن است بدون تایید مناسب در سمت سرور، به توکنهای سمت کلاینت متکی باشند و حس امنیت کاذبی ایجاد کنند. یک هوش مصنوعی ممکن است یک کوکی نشست (session cookie) بدون پرچمهای HttpOnly یا Secure تولید کند، زیرا آموزشهای آن شامل پاسخهای قدیمی Stack Overflow بوده است. هر یک از این مسائل در طول دمو نامرئی هستند. اپلیکیشن کار میکند. کاربران وارد میشوند. دادهها جریان دارند. اما یک مهاجم تنها به یک نقطه ورود بدون محافظ نیاز دارد. بررسی خروجی هوش مصنوعی با نگاه امنیتی، پارانویا نیست؛ بلکه حداقلِ استانداردهای یک نرمافزار حرفهای است.
مالیاتِ ناهماهنگی
یک پایگاه کد (codebase) در واقع یک داستان است. به اعضای جدید تیم میآموزد که کارها چگونه باید انجام شوند. Vibe Coding آن روایت را به دهها گویش متضاد تقسیم میکند. ویژگیای که دیروز ساختید از React hooks تابعی با state reducers صریح استفاده میکند. ویژگی امروز که از یک پرامپت کمی متفاوت تولید شده، از کامپوننتهای کلاس (class components) استفاده میکند چون مدل به الگوی قدیمیتر بازگشته است. لایه API بین استابهای تولیدشده توسط OpenAPI و هندلرهای مسیر نوشتهشده با دست، در نوسان است. قراردادهای نامگذاری بین camelCase و snake_case تغییر میکنند. مدیریت خطا در یک فایل ناپدید میشود و در فایلی دیگر به شکل بلوکهای try-catch تو در تو و طولانی باز میگردد.
با گذشت هفتهها، پروژه به یک حفاری باستانشناسی تبدیل میشود. شما نمیتوانید با خیال راحت یک ماژول را تغییر دهید، زیرا نمیدانید ماژول مجاور که توسط هوش مصنوعی تولید شده، چه فرضهایی را در نظر گرفته است. بازآفرینی (Refactoring) به یک بازی کند و پرخطرِ «ضربه زدن به موشهای حفرهای» تبدیل میشود. سیستم کامپایل میشود، اما دیگر انسجام ندارد. قابلیت نگهداری، با هزاران قطعه کد کپیشده، به تدریج از بین میرود.
هوش مصنوعی را به یک معلم تبدیل کنید
یادگیری واقعی زمانی رخ میدهد که شما خروجی را مورد پرسش و بررسی قرار دهید. با هوش مصنوعی مانند یک برنامهنویس ارشد رفتار کنید که سریع کد مینویسد اما همچنان منتظر بازبینی کد (code review) است. بپرسید چرا برای آن پیمایش درخت (tree traversal)، بازگشت (recursion) را به تکرار (iteration) ترجیح داده است. بپرسید آیا مسیر بهینهتری از نظر حافظه وجود دارد که موارد خاص (edge cases) را بهتر مدیریت کند. بپرسید وقتی ورودی null است، وقتی زمان درخواست شبکه به پایان میرسد (timeout)، یا وقتی دو کاربر بهطور همزمان تابع را فراخوانی میکنند، چه اتفاقی میافتد. از آن بخواهید منطق را خط به خط توضیح دهد، گویی در حال بررسی pull request یک همکار تازهکار هستید.
وقتی مدل را مجبور میکنید انتخابهای خود را توجیه کند، خودتان را هم مجبور به درک آنها میکنید. این کار پویایی رابطه را کاملاً تغییر میدهد. هوش مصنوعی از یک خلبان خودکار به یک مربی تبدیل میشود. هدف این نیست که خودتان هیچ کدی ننویسید؛ بلکه هدف این است که فقط کدی را عرضه کنید که کاملاً آن را درک میکنید، حتی اگر دستیار هوش مصنوعی پیشنویس نسخه اول را تهیه کرده باشد.
مهارتهایی که واقعاً اکنون اهمیت دارند
نوشتن نحو (syntax) روز به روز ارزانتر میشود. خواندن و استدلال کردن...
