چرا با LLMها باید از زبانهای «خستهکننده» استفاده کنی
خلاصهٔ کاملتر
نویسنده یه مشاور نرمافزاریه که دو سالِ گذشته رو روی پروژههای مختلف کار کرده و به یه الگوی جالب رسیده: مدلهای زبانی بزرگ روی زبانهایی که corpus آموزشی یکنواخت و سازگاری دارن، خروجی قابلاعتمادتری تولید میکنن. به زبان سادهتر، هر چقدر یه زبان «یه راه درست» بیشتری داشته باشه، ایجنت کدنویس کمتر گیج میشه.
اکوسیستم JavaScript با دوازدهتا فریمورک production-grade که هر کدوم overlap متفاوتی با بقیه دارن، یه نمونه بارز پراکندگیه. Python هم همینطور — انتخاب بین pip، poetry و uv، تصمیم بین async و task queue، و Django در مقابل FastAPI، همه با هم یه ماتریس گیجکننده میسازن که مدل نمیدونه کدوم رو وزن بده. در مقابل، Rails خروجی یکنواختتری از ایجنت میگیره چون «یه Rails» بیشتر وجود نداره — همون اصل convention over configuration که برای برنامهنویسهای انسانی خوب بود، برای مدلها هم خوبه.
نویسنده Go رو بهعنوان بهترین نمونه این اصل معرفی میکنه، هرچند تأکید میکنه که این اتفاق تا حدی تصادفی بوده. Go پنج مزیت کلیدی برای ایجنتهای کدنویس داره:
اول، مدل همزمانی. Goroutineها یه پریمیتیو ساده و یکدست هستن که هیچ مشکل «رنگ تابع» (colored function) مثل async/await ندارن. همه کدهای Go در corpus آموزشی از همین الگو استفاده میکنن:
results := make(chan string, len(urls))
for _, u := range urls {
go func(u string) {
resp, err := http.Get(u)
if err != nil {
results <- err.Error()
return
}
defer resp.Body.Close()
results <- resp.Status
}(u)
}
for range urls {
fmt.Println(<-results)
}دوم، کتابخانه استاندارد. پکیج net/http به تنهایی بخش قابلتوجهی از میکروسرویسهای اینترنت رو اجرا میکنه و پکیجهای رمزنگاری Go در سطح جهانی قوی هستن. ایجنت معمولاً نیازی به رفتن سراغ پکیجهای خارجی نداره.
سوم، toolchain یکپارچه. gofmt، go vet و go fix یه استایل کانونیکال واحد اعمال میکنن بدون هیچ چانهزنیای. gopls فیدبک معناشناختی real-time میده و golangci-lint اجازه میده استایلهای کدنویسی رو بهصورت استاتیک اعمال کنی — بدون اینکه مجبور باشی ایجنت رو با پرامپت هدایت کنی.
چهارم، پرفورمنس بدون مدیریت حافظه. مدلهای زبانی در مدیریت مستقیم حافظه ضعیف عمل میکنن. Rust با borrow checker برای انسانها عالیه اما برای ایجنتها مدام چالش ایجاد میکنه. Go پرفورمنس نزدیک به native رو با garbage collection ارائه میده و ایجنت رو از این دردسر رها میکنه.
پنجم، مجموعه محدود اشتباهات رایج. تعداد چیزهایی که میتونه در Go ایدیوماتیک غلط بشه محدودهی مشخصی داره — برخلاف Python با metaclassهای دلبخواهی. ایجنتها در پیدا کردن nil pointer با ابزار مناسب عملکرد خوبی نشون میدن.
نکات کلیدی:
- اکوسیستمهای پراکنده (JavaScript، Python) خروجی ایجنتهای کدنویس رو بیثباتتر میکنن
- زبانهایی با «یه راه درست» مثل Go و Rails خروجی یکنواختتری از LLM میگیرن
- Go پنج مزیت ترکیبی داره که هیچ زبان mainstream دیگهای همزمان ارائه نمیده
- نتیجهگیری نویسنده این نیست که «Go بهترین زبانه»، بلکه اینه که برای اکثر نرمافزارهای غیر-بصری با ایجنت، Go انتخاب عملیتریه
- این اصل کلیتره: هر چقدر variance در corpus آموزشی کمتر، inference قابلاعتمادتر




