تصور کنید هر بار که چاقوی آشپزی خود را برمیدارید، وزن، شکل و تیغه آن تغییر کند؛ هرگز برای یک برش دقیق به آن اعتماد نمیکنید. برنامهنویسانی که امروز با ابزارهای کدنویسی هوش مصنوعی زاینده (Generative AI) — مثل کتابخانهداری که میلیاردها صفحه را خوانده و حالا با همان لحن جواب میدهد — کار میکنند، دقیقاً همین حس بیاعتمادی را تجربه میکنند. این ابزارها در عین قدرت، نوعی ناپایداری دارند که با ماهیت مهندسی نرمافزار در تضاد است.
طبق اعلام استک اورفلو (Stack Overflow) در گزارش جامع نظرسنجی توسعهدهندگان که در ۲۹ جولای ۲۰۲۶ منتشر شد، استفاده از هوش مصنوعی در میان توسعهدهندگان از ۷۶٪ به ۸۴٪ افزایش یافته است، اما در مقابل، میزان اعتماد به این ابزارها از ۴۰٪ به ۲۹٪ سقوط کرده است. این تضاد آماری نشاندهنده تنشی شدید بین سرعت تولید کد توسط AI و قابلیت اطمینان نرمافزاری است که در نهایت تولید میشود. پرسش بنیادینی که امروز در جامعه برنامهنویسان طنینانداز است این است: آیا میتوان به خروجیهایی با این سرعت بالا اعتماد کرد؟
برای دهها سال، اعتماد برنامهنویسان بر پایه پیشبینیپذیری و استفاده از «ابزارهای تیز» شکل گرفت. ابزاری تیز ابزاری است که دقیقاً همان کاری را میکند که کاربر انتظار دارد. حدود شش سال پیش، یک مقاله جنجالی درباره محیطهای توسعه (IDE) منتشر شد که استدلال میکرد این ابزارها چنان قدرتمند شدهاند که استفاده از Vim یا Emacs شبیه به زندگی در عصر غارنشینی است. اگرچه این ادعا بسیاری از توسعهدهندگان را برآشفت، اما بحث حیاتی و عمیقی را درباره این موضوع به راه انداخت که چرا این ابزارهای قدیمی هنوز کاربردی هستند. نظرات از دو طیف مختلف بود: برخی مقاله را به دلیل عدم درک نحوه کار توسعهدهندگان به شدت نقد کردند و برخی دیگر با شور و اشتیاق از مزایای استفاده تماموقت از Emacs میگفتند.
برنامهنویسان حرفهای — به عنوان صنعتگران کد — به ابزارهایی نیاز دارند که مانند امتداد دستانشان باشد. اشاره به کتاب The Pragmatic Programmer نوشته دیوید توماس و اندرو هانت، این نیاز به تسلط و مهارت ابزاری را تأکید میکند. برای یک فرد تازهکار، Vim و Emacs ممکن است مانند برنامههای ترمینالی غیرشهودی به نظر برسند که برای استفاده یا حتی خروج از آنها، باید مجموعهای از کلیدهای مخفی را حفظ کرد. اما برای یک کاربر باتجربه، این ابزارها به اندازه فکر کردن، طبیعی هستند. توسعهدهندگان با شخصیسازی ابزارها برای انطباق دقیق با جریان کاری خود و ایجاد اعتماد در آنها، به سطحی از «صلاحیت ناخودآگاه» (Unconscious Competence) میرسند؛ وضعیتی که در آن رفتار ابزار کاملاً پیشبینیپذیر است.
اما ابزارهای کدنویسی عاملمحور (Agentic) — سیستمهایی که میتوانند بهطور مستقل تصمیم بگیرند، اهداف را تعریف کرده و تغییرات گستردهای اعمال کنند — در حال حاضر فاقد این ثبات هستند. این ابزارها مانند همان چاقوی متغیر عمل میکنند؛ قابلیتهای آنها در نوسان دائمی است و همین امر ساخت «حافظه عضلانی» (Muscle Memory) را که توسعهدهندگان با IDEهای سنتی دارند، تقریباً غیرممکن میکند. در همین راستا، برخی ابزارهای جدید تلاش کردهاند با اتوماسیون بیشتر، بهرهوری را بالا ببرند، مانند سیستم Silent Architect که توانست زمان تکمیل تسکهای برنامهنویسی را تا ۲۲٪ کاهش دهد، اما چالش اعتماد همچنان پابرجاست. این نوسان نه تنها نشاندهنده نقص در خود ابزار، بلکه نشاندهنده نقص در فرآیند پیرامون ابزار و نحوه تقویت آن فرآیند است.
گذار به ابزارهای عاملمحور
ابزارهای توسعه همگام با فرآیند توسعه نرمافزار و رشد فردی برنامهنویس تکامل مییابند. اگر توسعهدهندهای یادگیری خود را در دوران ترمینالها آغاز کرده باشد، زمانی که IDEها یا رابطهای گرافیکی وجود نداشتند، درک او از خلق کد ریشه در همان ترمینالها دارد. در این بافت، اضافه کردن یک IDE صرفاً یادگیری یک ابزار جدید نیست، بلکه بازسازی و ریفاکتورینگ کل فرآیند نوشتن کد است.
اگرچه انتقال از ترمینال به IDE یک تغییر فرآیندی بزرگ است، اما انتقال از هر دوی اینها به ابزارهای کدنویسی عاملمحور حتی سختتر است. تریسیا گی (Tricia Gee)، حامی بهرهproductivity توسعهدهندگان، اشاره میکند که او اغلب با IDE خود سریعتر است زیرا دقیقاً میداند ابزار چگونه عمل میکند. او الگوی مشابهی را در متخصصان Vim و Emacs میبیند؛ با اینکه آنها میتوانند از ابزارهای ریفاکتورینگ در IntelliJ IDEA استفاده کنند، اما منحنی یادگیری برای آنها یک مانع است، زیرا انگشتانشان از پیش میدانند چه کاری انجام دهند. درک عمیق یک ابزار، فارغ از نوع آن، همان صلاحیت ناخودآگاه را ایجاد میکند.
شکاف دقت و شفافیت
ابزارهای سنتی در مرزهای سختگیرانهای عمل میکنند. یک linter، ابزار کانتینریسازی یا یک تحلیلگر استاتیک (Static Analyzer)، نقش مشخصی دارد و هرگز از دایره وظایف خود خارج نمیشود. اما هوش مصنوعی در حال نفوذ به تمام مراحل زنجیره ابزارهای چرخه حیات توسعه نرمافزار (SDLC) است و همین موضوع باعث گسترش بیاعتمادی در کل فرآیند شده است. این شکاف در سه محور اصلی دیده میشود:
- ابهام: بیارنه استروسترپ (Bjarne Stroustrup)، خالق C++، خاطرنشان میکند که زبان انگلیسی برای بیان نیازمندیهای بدون ابهام، زبانی «ضعیف» و ناکارآمد است، در حالی که کد، بیانی دقیق و صریح از یک راهکار است. عاملهای هوش مصنوعی بر پایه همین زبان مبهم (انگلیسی/طبیعی) تکیه میکنند و این امر منجر به ایجاد یک شکاف عمیق در دقت خروجی میشود.
- تاریکی (Opacity): عاملهای AI سریعتر هستند اما بسیار مبهمتر و کمتر از یک ابزار ریفاکتورینگ دستی، پیشبینیپذیرند. برخلاف Vim یا Emacs، جایی که کاربر برای رسیدن به نتیجه نیاز به تکرارهای مکرر ندارد، هوش مصنوعی ماهیتی احتمالی (Probabilistic) دارد.
- هزینه اعتبارسنجی: در حالی که تولید کد اکنون تقریباً رایگان شده است، اعتبارسنجی آن کد برای جلوگیری از شکستهای هزینهبر در محیط عملیاتی (Production)، زمانبرتر از هر زمان دیگری است. زمانی که در مرحله نوشتن کد ذخیره میشود، اغلب در مرحله تأیید و بررسی از دست میرود.
تغییر گلوگاه توسعه
کدنویسی عاملمحور باعث شده گلوگاه اصلی توسعه نرمافزار از «خلق» به «بازبینی» تغییر کند. چون عاملها میتوانند در یک لحظه صدها خط کد را تغییر دهند، توسعهدهندگان با تغییرات (Diffs) عظیمی روبهرو میشوند که به دلیل حجم زیاد، اغلب بهجای بررسی دقیق و حسابشده، صرفاً تأیید (Rubber-stamp) میشوند. اگرچه مفهوم «LLM-as-a-judge» (استفاده از مدل زبان بزرگ به عنوان داور) به عنوان یک راهکار مقیاسپذیر در حال تکامل است، اما مهندسی روشی برای اعتماد به یک AI جهت بازبینی کدی که توسط یک AI دیگر نوشته شده، همچنان یک چالش بزرگ است.
این تغییر، نقصهای موجود در فرهنگهای سازمانی را برملا میکند. ابزارهایی مثل CI/CD، تستهای واحد خودکار و linters، در واقع کدگذاری شدهی فرآیندهای قبلی بودند، اما خودِ فرآیند نبودند. داشتن یک ابزار CI/CD عالی به این معنا نبود که شما سریعتر محصول را عرضه میکنید، یک IDE عالی لزوماً کد بهتری تولید نمیکرد و امتیازات داستان (Story Points) در یک Issue Tracker، تضمینکننده تخمین دقیق تلاش نبود. بخش بزرگی از فرآیند در قالب «فرهنگ» وجود داشت — یعنی رفتارها و هنجارهای افرادی که نرمافزار را میساختند. ابزارهای جدید برای موفقیت، نیازمند تغییر در فرهنگ سازمانی هستند.
در سازمانهای مهندسی بزرگ، ابزارها زمانی شکست میخورند که با فرهنگهای موجود سازگار نباشند. توسعهدهندگان عاشق ساختن چیزها و حل مسائل هستند؛ اگر ابزاری به آنها کمک نکند تا این کار را بهتر انجام دهند، نادیده گرفته میشود. کدنویسی عاملمحور به دلیل اینکه به توسعهدهندگان اجازه داد مسائل را سریعتر حل کنند، به سرعت پذیرفته شد، اما همزمان مشکل عمیق «نیازمندیهای نامشخص و متغیر» را نمایان کرد. اکنون، حل یک مسئله نیازمند تعریف بسیار دقیق هم برای «مسئله» و هم برای «راهکار» است.
زنجیره اعتماد انسانمحور
مدل سنتی SDLC بر یک زنجیره اعتماد و پیشبینیپذیری انسانمحور تکیه داشت:
- مدیران محصول: نیازمندیهای ویژگیها و عملکردها را بر اساس تحقیق، گفتگو با مشتری و شناخت رقبا ایجاد میکردند.
- معماران: مشخصات نرمافزار را بر اساس سالها تجربه و شناخت از زیرساختهای فنی موجود طراحی میکردند.
- مهندسان: کامیتها را بر اساس دانش منطق کد و شناخت از بدنه موجود کد (Codebase) ساخته و بازبینی میکردند.
- تیم QA: بر اساس تجربه خود از نحوه شکست خوردن نرمافزارها، سعی میکردند سیستم را بشکنند.
- تیم DevOps/SRE: عملکرد و منابع را بر اساس تجربیات پیشین پایش و مدیریت میکردند.
اعتماد از طریق کار با انسانها، درک نحوه تفکر آنها و محدود کردن راههایی که یک فرد یا ابزار میتوانست دچار خطا شود، ساخته میشد. هوش مصنوعی این زنجیره را مختل میکند، زیرا اجازه میدهد یک توسعهدهنده به یک «جزیره تکنفره» (Silo of One) تبدیل شود. جیمی دلانگه (Jaime DeLanghe)، مدیر محصول Slack، اشاره میکند که توسعهدهندگان ممکن است بررسیهای خود با طراحان یا متخصصان موضوعی (Domain Experts) را متوقف کنند، زیرا یک عامل میتواند بهسادگی طرح را پیاده کند یا کد را توضیح دهد. نتیجه این رویه، تولید PRهای عظیم و بررسینشده است که در بلندمدت منجر به بدهی فنی شدید میشود.
حفاظهای جدید برای بازگرداندن اعتماد
برای ترمیم این اعتماد شکسته، رهبران صنعت پیشنهاد میکنند تمرکز از «ابزار» به «فرآیند» تغییر یابد. بسیاری اکنون به دنبال AI SREها، بازبینی خودکار کد، مدیریت حافظه/زمینه (Context Managers) و بهبودهای Control Plane هستند. با این حال، یک فرآیند معیوب با ابزارهای بهتر، همچنان معیوب است؛ فرهنگ باید در کنار ابزار تکامل یابد.
راهکارهای پیشنهادی برای بازگرداندن قابلیت اطمینان عبارتند از:
- مالکیت صریح: چری میجرز (Charity Majors)، مدیر فناوری Honeycomb، استدلال میکند که عبارت «انسان در حلقه» (Human-in-the-loop) نباید مانند یک دعوتنامه نمادین و از روی دلسوزی باشد. او تأکید میکند: «من حلقه را ساختم، من مالک حلقهام و تنها دلیل وجود این حلقه من هستم. این حلقه لعنتی مال من است!» انسانی که کد را ارسال میکند و کسی که PR را تأیید میکند، مالک نهایی نتیجه هستند. اگر سیستم در یک جمعه شب خراب شود، خطا متعلق به فرد «بین کیبورد و صندلی» است، نه عامل AI.
- شفافیت پرامپت: دین کنخت (Dane Knecht)، مدیر فناوری Cloudflare، پیشنهاد میکند رونوشتهای پرامپت (Prompt Transcripts) در Pull Requestها گنجانده شود. این کار به بازبین اجازه میدهد منطق حل مسئله توسعهدهنده و نحوه شکلگیری کد را ببیند. او میگوید «اینکه بتوان یک PR را باز کرد و دید توسعهدهنده واقعاً چگونه فکر میکرده، بسیار جذاب است.»
- حفاظهای قطعی (Deterministic Guardrails): اسکات هانسلمن (Scott Hanselman) از مایکروسافت هشدار میدهد: «اگر هر چیزی را به شانس واگذار کنید، واقعاً به شانس سپرده خواهد شد.» او مثالی از ساخت یک اپلیکیشن Ring Light برای x64 میزند؛ بدون پرامپت صریح برای نسخه ARM، این مورد هرگز اتفاق نمیافتاد. این موضوع نیاز به مشخصات صریح، مانند استفاده از فایلهای
spec.mdرا برای تضمین بیان دقیق تمام خواستهها ضروری میکند. - ضبط زمینه و دانش: عاملها به همان «پختگی» و تجربهای نیاز دارند که توسعهدهندگان ارشد در طول سالها کسب میکنند. این امر مستلزم ثبت دانش ضمنی شرکت در مکانهایی مانند Stack Internal، تأیید آن و ارائه آن به عنوان زمینه (Context) به عامل است. فراهم کردن حافظه کوتاهمدت و بلندمدت کمک میکند تا عامل زمینه درست مورد نیاز کد را درک کند.
- مبارزه با کدهای تکراری (WET): لالی بار-ایلان (Laly Bar-Ilan)، دانشمند ارشد در Bit، اشاره میکند که در حالی که اصل DRY (تکرار نکن) حیاتی است، هوش مصنوعی ذاتاً «WET» (همه چیز را دوباره بنویس - Write Everything Twice) است. بدون نظارت، توسعهدهندگان مختلف ممکن است از یک عامل بخواهند یک دکمه بسازد و این منجر به ایجاد کامپوننتهای تکراری و پراکنده در سراسر کدبیس شود.
هزینه عدم قطعیت
اجرای کدهای تولید شده توسط AI رایگان نیست. سازمانها با هزینههای پنهانی روبهرو هستند که عاملها ممکن است نادیده بگیرند:
- زیرساخت: میزان محاسبات (Compute)، حافظه و حجم ترافیک در محیطهای Cloud-native.
- وابستگیها: هزینه APIهای میزبانی شده و وابستگیهای شخص ثالث.
- هزینه شکست: سختترین مورد برای بودجهبندی، شامل زمان توقف (Downtime)، رخنههای امنیتی و هزینههای فرصت است.
ابزارهایی که نرمافزاری تولید میکنند بدون اینکه این هزینهها را در نظر بگیرند، فشار زیادی به فرآیندهایی وارد میکنند که زمانی برای تولید نرمافزارهای قابل اطمینان استفاده میشدند. آنیل دَش (Anil Dash) پیشنهاد میکند که صنعت در حال تلاش برای اعمال سیستمهای غیرقطعی (Non-deterministic) در سناریوهایی است که نیاز به کد قطعی دارند. او استدلال میکند که LLMها در این زمینه بد هستند و میپرسد چرا از آنها به عنوان «چکش برای تمام چیزهایی که میخ نیستند» استفاده میکنیم. در بسیاری از موارد، مؤثرترین راه برای جلب اعتماد، دانستن زمان «نادیده گرفتن هوش مصنوعی» است. یک اسکریپت ساده Bash که شش سال بدون خطا کار کرده است، اغلب ارزشمندتر از یک راهکار احتمالی AI است.
در واقع، ما زمانی اعتماد داشتیم چون پیشبینیپذیری وجود داشت: میدانستیم نقاط قوت و ضعف یک شخص چیست و انتظار رفتاری سازگار از دوشنبه تا سهشنبه داشتیم. ماهیت احتمالی AI و سرعت بالای تغییرات آن، این پیشبینیپذیری را از بین برد.
تیمهای موفق کسانی نخواهند بود که بیشترین کد را تولید میکنند، بلکه کسانی هستند که حلقههای بازخورد (Feedback Loops) تنگ و دقیق میسازند، دانش استاندارد (Gold-standard) را برای بهترین زمینه فراهم میکنند و ابزارهایی میسازند که فرآیند را با جریانهای کاری همسو کند. با استفاده از یک گردشکار متفکرانه و صریح که قضاوت و مسئولیتپذیری انسانی را حفظ کند، میتوانیم شروع به بازسازی اعتماد در این سیستمهای جدید کنیم.
گام بعدی شما
- اگر از ابزارهای کدنویسی هوش مصنوعی استفاده میکنید، متن پرامپتهای کلیدی خود را در توصیحات PR قرار دهید تا بازبینی کد تسهیل شود.
- برای موارد حساس، بهجای تکیه بر توصیههای مدل، از فایلهای
.mdبرای تعریف دقیق مشخصات فنی استفاده کنید. - بررسی کنید که آیا ابزارهای AI شما منجر به ایجاد توابع تکراری (WET code) در پروژه شدهاند یا خیر.
اما تأثیر این بیاعتمادی بر آینده استخدام برنامهنویسان جدیتر است؛ در تحلیل ما درباره تغییر تعریف «برنامهنویس ارشد» در عصر عاملها بخوانید که چگونه پارادایم برنامهنویسی از تولید خط به خط به ارکستراسیون تغییر میکند.




گفتگو