Codoloper

آموزش برنامه‌نویسی به فارسی

یاد بگیر، پیشرفت کن، بساز.

منبع آموزشی برنامه‌نویسی به زبان فارسی - مستندات، دوره‌ها و مطالب کاربردی برای همه سطوح.

داکیومنت ها:

JavascriptHTMLCSSReact JSبیشتر
1// برنامه‌نویسی به فارسی
2import { learn } from 'codoloper'
3
4const developer = learn({
5"lang": "فارسی"
6"level": "همه سطوح"
7free: true
8})
بلاگ

مطالب جدید

تازه‌ترین مطالب آموزشی و خبرهای مرتبط.

دیپلوی روی سرور ایران بدون اینترنت بین‌الملل یا نت ملی نوشته شده توسط عرفان دهقانی

دیپلوی روی سرور ایران بدون اینترنت بین‌الملل یا نت ملی

یه سناریو که هر توسعه‌دهنده‌ی ایرانی باهاش آشناست: سرور گرفتی، همه چیز رو آپلود کردی، npm install می‌زنی — و بعد پنج دقیقه نشستی نگاه می‌کنی که cursor چشمک می‌زنه و چیزی دانلود نمی‌شه. یا بدتر: همه چیز کار می‌کنه، بعد یه روز نت قطع می‌شه و نمی‌تونی حتی یه dependency ساده آپدیت کنی.

قطع اینترنت بین‌الملل یه اتفاق خوب نیست و نباید عادی‌اش کنیم. ولی واقعیت اینه که این اتفاق می‌افته — گاهی جند هفته، گاهی بیشتر — و اگه سرورت وابسته به سرورهای خارجی باشه، یه قطعی ساده می‌تونه کل deploy و maintenance رو فلج کنه. این مقاله برای اونه که اگه یه روز اتفاق افتاد، آماده باشی.

مشکل اینجاست که اکثر ابزارها، package managerها، و حتی خود لینوکس به‌صورت پیش‌فرض از سرورهای خارج دانلود می‌کنن. اگه قبل از دیپلوی این‌ها رو تنظیم نکنی، اولین باری که نت ملی جدا می‌شه — یا از همون اول اگه سرورت به اینترنت بین‌الملل وصل نیست — همه چیز می‌شکنه.

اینجا یه checklist عملی از چیزهایی که باید انجام بشه می‌آورم، بر اساس تجربه‌ی مستقیم.

۱. میرور خود توزیع لینوکس

اولین و مهم‌ترین کار اینه که میرور اصلی سیستم عاملت رو عوض کنی. وقتی apt update یا pacman -Syu می‌زنی، باید از یه آدرس ایرانی دانلود کنه.

برای اوبونتو، فایل /etc/apt/sources.list رو ویرایش کن و آدرس‌های archive.ubuntu.com رو با میرور ایرانی جایگزین کن. برای آرچ، /etc/pacman.d/mirrorlist رو ویرایش کن.

لیست میرورهای قابل اعتماد ایرانی رو می‌تونی توی devneeds.ir پیدا کنی. ArvanCloud معمولاً مطمئن‌ترین انتخابه از نظر uptime و پوشش پکیج‌ها.

# بعد از تغییر میرور اوبونتو
sudo apt update && sudo apt upgrade

۲. میرور Docker

Docker هم به‌صورت پیش‌فرض از docker.io و registry-1.docker.io pull می‌کنه. این رو باید توی فایل daemon.json عوض کنی:

sudo nano /etc/docker/daemon.json
{
  "registry-mirrors": ["https://mirror.arvancloud.ir"]
}

بعد Docker رو restart کن:

sudo systemctl restart docker

از تجربه‌ی شخصی: ArvanCloud برای مدت طولانی مطمئن‌ترین انتخاب بود، ولی اخیراً Liara هم عملکرد بهتری داشته. هر دو رو چک کن و ببین کدوم توی لحظه‌ای که داری کار می‌کنی بهتر جواب می‌ده.

۳. میرور پکیج منیجرهای اپلیکیشن

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

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

از پی اچ چی دارید و از کامپوزر استفاده میکنید همینطور.

کارگو برای راست. ناگت برای سی شارپ و هر چیزی خلاصه ببینید پکیج منیجرتون چیه و میرورشو به روشی که توضیح میدن ست کنید.

اگر پکیج منیجرتون لینک دانلود و یا وریفای پکیج هارو ذخیره میکنه در جایی - مثلا npm در package-lock اینکارو میکنه - مطمعن شید که اون لینک ها هم آپدین شدن مثلا برای ان پی ام:

npm install --package-lock-only --registry=https://registry.npmjs.org/

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

اینجاست که ماجرا کمی دردسرتر می‌شه. مثلاً آرچ PostgreSQL 17 به بعد رو توی repo رسمیش نداره. معمولاً باید میرور رسمی خود PostgreSQL رو اضافه کنی — ولی اون میرور از ایران جواب نمی‌ده.

راه‌حل: به devneeds.ir مراجعه کن. میرور ایرانی از نسخه‌های مختلف PostgreSQL اونجا هست که از نت ملی هم پاسخگوئه.

برای اوبونتو، PostgreSQL repository رسمی معمولاً توی apt بدون مشکل کار می‌کنه — ولی اگه روی نت ملی isolated هستی، اینجا هم باید میرور ایرانی پیدا کنی.

۵. تست روی سیستم خودت قبل از deploy

یه قدم که خیلی‌ها رد می‌کنن اینه که همه‌ی این تنظیمات رو روی ماشین محلی خودت هم چک کنی. اگه روی ماشین خودت با همین میرورها npm install بزنی و همه چیز دانلود بشه، با اطمینان بیشتری می‌تونی روی سرور هم همین کار رو بکنی.

این یه شبیه‌سازی ساده‌ست: مطمئن می‌شی که lockfile ها درست هستن و هیچ dependency ای نیست که فقط از خارج قابل دسترسه.

SSL روی سرور ایرانی

این یه بحث جداست — و صادقانه بگم، راحت نیست. Let's Encrypt از ایران مشکل داره، و خیلی از راه‌حل‌های خودکار SSL روی شبکه‌ی ملی کار نمی‌کنن. devneeds.ir مستندات مربوط به ست کردن SSL در این شرایط رو داره — بهتره مستقیم از اونجا بخونی چون وضعیت ممکنه تغییر کرده باشه و اطلاعات به‌روز باشه.

شوخی نیست — دردسره. ولی مجبوریم.

خلاصه‌ی checklist

قبل از deploy روی هر سرور ایرانی:

  • میرور توزیع لینوکس → devneeds.ir یا ArvanCloud
  • میرور Docker daemon → ArvanCloud یا Liara
  • میرور پکیج منیجرها (npm، pip، Composer و بقیه) → liara.ir/mirrors
  • lockfile ها رو پاک و rebuild کن تا لینک‌ها آپدیت بشن
  • پایگاه داده‌های خارج از repo سیستم عامل → devneeds.ir چک کن
  • روی ماشین محلی با همین میرورها تست کن قبل از deploy

اگه این‌ها رو انجام بدی، احتمال اینکه deploy ات بدون مشکل بره بالاست — و مهم‌تر از اون، اگه یه روز نت قطع شد، می‌تونی بدون وابستگی به اینترنت خارجی آپدیت و نگهداری کنی. این آمادگی نباید ضروری باشه، ولی متأسفانه هست.

مدل‌های MiMo شیائومی: وقتی یه غول سخت‌افزاری وارد بازی LLM می‌شه نوشته شده توسط عرفان دهقانی

مدل‌های MiMo شیائومی: وقتی یه غول سخت‌افزاری وارد بازی LLM می‌شه

شیائومی بیشتر با گوشی و لوازم هوشمند شناخته می‌شه — ولی از اوایل ۲۰۲۶ یه سری مدل زبانی با برند MiMo منتشر کرده که توی جامعه‌ی مدل‌های open-weight سروصدا کرده. نسل فعلی شامل MiMo-V2، V2-Pro، V2-Flash، و جدیدترین V2.5 می‌شه — با نسخه‌های Mixture-of-Experts که تعداد پارامترهاشون توی نسخه‌های Pro به یه تریلیون پارامتر می‌رسه.

قبل از هر چیز، یه تجربه‌ی مستقیم:

تست فارسی: جایی که انتظارش نداشتم

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

این برای یه مدل چینی که احتمالاً داده‌ی فارسی کمتری در pretraining داشته، قابل توجهه.

ولی یه محدودیت هم پیدا کردم که مهمه: context window اسماً ۲۵۶K توکن داره، ولی بعد از حدود ۳۰ دقیقه کار یا session طولانی، مدل شروع می‌کنه به فراموش کردن جزئیاتی که اول گفتی. کار رو انجام می‌ده، ولی اون constraint خاصی که گذاشتی یا اون قالب که مشخص کردی ممکنه رعایت نشه. این همون مشکلیه که توی خیلی از مدل‌ها با context window بلند وجود داره: داشتن یه window بزرگ با attention یکنواخت روی همه‌ی اون window فرق داره.

پس برای task های کوتاه‌تر — ترجمه، تحلیل متن، دستورات مشخص — عالیه. برای agentic task های طولانی‌مدت که ساعت‌ها طول می‌کشه، باید حواست باشه.

چی خوبه

استدلال و کدنویسی: توی benchmark هایی مثل AIME، نسخه‌های V2.5 نمره‌هایی می‌گیرن که با مدل‌های top رقیبه. جامعه‌ی LocalLLaMA و Artificial Analysis هر دو از این مدل‌ها توی رتبه‌بندی‌های agentic بالا می‌آورن. کدنویسی، شبیه‌سازی وب، و multi-step task ها جایی‌ان که MiMo معمولاً خوب عمل می‌کنه.

سرعت: نسخه‌های UltraSpeed به بیش از هزار توکن در ثانیه می‌رسن و بعضی تست‌ها سه هزار توکن در ثانیه رو هم گزارش کردن. برای agentic loop هایی که زمان پاسخ مهمه، این عدد فرق محسوسی می‌کنه.

ارزش: نسخه‌ی non-Pro از نظر هزینه خیلی رقابتیه. Artificial Analysis اون رو با Intelligence Index حدود ۴۹ رتبه‌بندی می‌کنه — که در همون محدوده‌ی مدل‌های proprietary گران‌تره، با قیمت خیلی کمتر. کاربرهای زیادی از Reddit و LocalLLaMA از اون به‌عنوان «بهترین ارزش الان» یاد می‌کنن.

tool use: در مقایسه با بعضی رقبا مثل Gemini، follow-through بهتری در task های چندمرحله‌ای داره و hallucination کمتری گزارش شده.

چی ضعیف‌تره

نوشتن خلاقانه: اینجاست که مدل‌هایی مثل Claude هنوز جلوترن. اگه می‌خوای متنی بنویسی که ظرافت داشته باشه یا سبک خاصی داشته باشه، MiMo معمولاً نتیجه‌ی معمولی‌تری می‌ده. برای ترجمه خوبه، ولی برای خلق محتوای خلاقانه‌ی فارسی همون ضعفی که اکثر مدل‌ها دارن رو داره.

context طولانی: همون‌طور که گفتم، روی session های بلند focus ضعیف می‌شه. نه به‌خاطر اینکه context window کوچیکه — بلکه به‌خاطر اینکه attention روی اطلاعات اول session با پیشرفت مکالمه کمرنگ‌تر می‌شه.

در دسترس بودن: روی همه‌ی platform های غربی به‌راحتی host نشده. بعضی کاربرها از محدودیت‌های استفاده در تیرهای Pro شکایت دارن.

نسخه‌های اولیه: V1 و V2 اولیه مشکلاتی داشتن که V2.5 خیلی‌شون رو بهتر کرده. اگه چند ماه پیش امتحان کردی و نتیجه خوبی نگرفتی، ارزش داره دوباره V2.5 رو تست کنی.

کدوم نسخه برای چی

V2.5 non-Pro: برای اکثر کاربردهای روزانه — کدنویسی، ترجمه، تحلیل، task های متوسط. بهترین نسبت هزینه به کیفیت الان.

V2-Flash: وقتی سرعت مهم‌ترین چیزه و می‌تونی کمی کیفیت بدی. برای agentic loop هایی که باید خیلی سریع iterate کنن.

V2-Pro / V2.5-Pro: برای task های خیلی سنگین با نیاز به reasoning عمیق. ولی باید بسنجی که آیا هزینه‌ی اضافه‌اش نسبت به non-Pro توجیه داره — بعضی تست‌ها می‌گن در کاربردهای روزانه فرق محسوسی نیست.

جمع‌بندی

MiMo یه رقیب جدی توی فضای open-weight است — نه به‌خاطر اینکه در همه چیز بهترینه، بلکه چون نسبت هزینه به کیفیتش جذابه و توی task های خاص (کدنویسی، ترجمه، agentic کوتاه‌مدت) نتایج واقعاً خوبی می‌ده.

اگه با فارسی کار می‌کنی یا دنبال یه مدل ارزون برای workflow های برنامه‌نویسی هستی، V2.5 non-Pro ارزش امتحان کردن داره. فقط انتظار نداشته باش که روی task های خلاقانه‌ی پیچیده یا session های خیلی بلند همون نتیجه رو بده.

Laravel 13.20: پردازش تصویر بدون package شخص ثالث نوشته شده توسط عرفان دهقانی

Laravel 13.20: پردازش تصویر بدون package شخص ثالث

یه کار که تقریباً هر پروژه‌ی Laravel ای در یه نقطه‌ای بهش نیاز داره اینه که تصویر آپلودشده رو resize کنه، فرمتش رو عوض کنه، یا یه thumbnail ازش بسازه. تا الان برای این کار حتماً باید یه package جداگانه نصب می‌کردی — معمولاً intervention/image — و بعد خودت wrapper می‌نوشتی. Laravel 13.20 که ۱۴ جولای ۲۰۲۶ منتشر شد، این کار رو داخل خود فریم‌ورک آورده.

Image facade: پردازش تصویر first-party

یه Image facade جدید اضافه شده که یه API immutable برای تبدیل تصاویر داره. immutable یعنی هر transformation یه instance جدید برمی‌گردونه — یعنی می‌تونی از یه تصویر چند variant مختلف بسازی بدون اینکه مشکل side effect داشته باشی.

رایج‌ترین حالت استفاده اینه که مستقیم از request بگیری:

$request->image('avatar')
    ->cover(200, 200)
    ->toWebp()
    ->store('avatars');

ولی می‌تونی از هر جایی image بسازی:

Image::fromPath('/path/to/photo.jpg');
Image::fromUrl('https://example.com/photo.jpg');
Image::fromBytes($bytes);
Image::fromStorage('photos/avatar.jpg', 's3');
Storage::disk('s3')->image('photos/avatar.jpg');

transformationهایی که در دسترسن:

$image->cover(200, 200);    // crop و resize با هم
$image->contain(800, 600);  // resize بدون crop
$image->crop(200, 200);
$image->resize(1024, 768);
$image->scale(1200, 800);
$image->rotate(90);
$image->blur(10);
$image->sharpen(10);
$image->grayscale();
$image->flip();
$image->flop();
$image->orient();           // EXIF rotation رو اعمال می‌کنه

برای output هم:

$image->toWebp();
$image->toJpg()->quality(80);
$image->optimize();          // WebP با quality 70
$image->optimize('jpg', 85);

چون immutable هست، ساختن چند variant از یه عکس تمیزه:

$image = $request->image('photo');

$image->cover(200, 200)->toWebp()->store('thumbnails');
$image->grayscale()->toWebp()->store('grayscale');

دو driver داره — GD و Imagick — و می‌تونی per-image هم انتخاب کنی:

$image->usingGd();
$image->usingImagick();

یه نکته‌ی مهم: خود intervention/image به‌عنوان suggested dependency اضافه شده، نه required. یعنی باید خودت نصبش کنی:

composer require intervention/image

ویژگی WithoutMiddleware

یه attribute جدید اضافه شده که counterpart ویژگی #[Middleware] هست. تا الان می‌تونستی روی کل controller یه middleware بذاری و برای بعضی method ها استثنا بدی. حالا این کار رو می‌تونی با attribute بکنی:

#[Middleware(EnsureTokenIsValid::class)]
class UserController
{
    public function index()
    {
        // middleware اینجا اعمال میشه
    }

    #[WithoutMiddleware(EnsureTokenIsValid::class)]
    public function profile()
    {
        // اینجا اعمال نمیشه
    }
}

یه نکته‌ی ظریف: از ReflectionAttribute::IS_INSTANCEOF استفاده می‌کنه، یعنی subclass های اون middleware هم automatically exclude می‌شن.

پیشوند جداگانه برای Session در Redis

اگه هم SESSION_DRIVER و هم CACHE_STORE هر دو به Redis اشاره می‌کنن، تا الان session ها از همون prefix که برای cache تنظیم کردی استفاده می‌کردن. این debug کردن Redis keyspace رو مشکل می‌کرد.

حالا می‌تونی توی config/session.php یه prefix جداگانه بذاری:

'prefix' => env('SESSION_PREFIX', Str::slug(env('APP_NAME', 'laravel')).'-session-'),

cache store قبل از اعمال session prefix کلون می‌شه، پس این تغییر روی cache key ها تاثیر نمی‌ذاره.

incrementEachQuietly و decrementEachQuietly

Eloquent قبلاً incrementQuietly() و decrementQuietly() داشت که یه column رو بدون trigger کردن model event تغییر می‌دادن. این نسخه نسخه‌ی multi-column اینا رو اضافه کرده:

$user->incrementEachQuietly(['posts_count' => 1, 'points' => 10]);
$user->decrementEachQuietly(['credits' => 3, 'tokens' => 2]);

وقتی داری یه batch operation انجام می‌دی و نمی‌خوای event هایی مثل saved یا updated fire بشن، این دقیقاً چیزیه که می‌خوای.

Enum به‌عنوان کلید WithoutOverlapping

WithoutOverlapping middleware برای queue jobs الان مستقیم enum قبول می‌کنه:

public function middleware(): array
{
    return [new WithoutOverlapping($this->category)];
}

قبلاً باید enum رو به string تبدیل می‌کردی. این تغییر backward compatible هست.

بقیه چیزهای کوچیک ولی مفید

چند چیز دیگه که کمتر headline می‌گیرن ولی در عمل کاربرد دارن:

make:migration حالا timestamp prefix هایی می‌سازه که collision-free و مرتب هستن — مشکل قدیمی که دو migration همزمان ساخته‌شده اسم تکراری می‌گرفتن.

#[SensitiveParameter] به parameter هایی که secret حمل می‌کنن اضافه شده، یعنی password ها و token ها دیگه توی stack trace نمایش داده نمی‌شن.

Storage::assertEmpty() اضافه شده که توی test ها مفیده.

Str::containsAll() دیگه برای آرایه‌ی خالی true برنمی‌گردونه — یه bug قدیمی که رفتار غیرمنطقی داشت.

Number::forHumans() دیگه برای عددهای خیلی کوچیک منفی، -0 برنمی‌گردونه.

upgrade کردن

تغییر breaking ای وجود نداره. اگه می‌خوای از Image facade استفاده کنی، فقط intervention/image رو نصب کن. بقیه‌ی تغییرات opt-in هستن یا bug fix.

چرا باید اصول برنامه‌نویسی رو یاد بگیری وقتی AI همه چیز رو می‌نویسه؟ نوشته شده توسط عرفان دهقانی

چرا باید اصول برنامه‌نویسی رو یاد بگیری وقتی AI همه چیز رو می‌نویسه؟

یه سوال جدی هست که بیشتر و بیشتر آدم‌ها می‌پرسن — خصوصاً کسایی که تازه شروع کردن: الان که Claude Code یه component کامل React رو توی ده ثانیه می‌نویسه، الان که GPT یه API endpoint رو با تمام error handling‌اش تحویل می‌ده، واقعاً باید بشینم data structure یاد بگیرم؟ باید algorithm بفهمم؟ باید بدونم HTTP دقیقاً چطور کار می‌کنه؟

جواب صادقانه: بله. ولی نه به همون دلیلی که فکر می‌کنی.

مدل کد می‌نویسه، تو تصمیم می‌گیری

یه چیزی که توی استفاده از AI coding tools خیلی زود مشخص می‌شه اینه که کیفیت خروجی مستقیماً به کیفیت input تو وابسته‌ست. اگه ندونی چی می‌خوای، مدل هم نمی‌دونه. اگه ندونی معماری درست چیه، خروجی مدل ممکنه technically بی‌نقص باشه ولی برای پروژه‌ات کاملاً اشتباه.

یه مثال ساده: از Claude Code می‌خوای یه caching layer بسازه. اگه ندونی فرق Redis و یه in-memory cache ساده چیه، نمی‌دونی کِی از کدوم بخوای. اگه ندونی race condition یعنی چی، نمی‌فهمی که خروجی مدل این مشکل رو داره یا نه. اگه ندونی TTL چطور کار می‌کنه، نمی‌تونی بگی آیا مدل اون رو درست تنظیم کرده یا نه.

مدل کد می‌نویسه. تو تصمیم می‌گیری این کد چیه و چرا.

review کردن بدون فهمیدن ممکن نیست

یه اشتباه رایج اینه که فکر می‌کنیم «می‌خونیم» کد AI رو. ولی خوندن بدون درک، review نیست — یه نگاه انداختنه که حس خوبی می‌ده ولی هیچ چیزی رو تضمین نمی‌کنه.

وقتی AI یه function می‌نویسه که O(n²) complexity داره و تو نمی‌دونی این یعنی چی، می‌گی «خوبه، merge می‌کنم» — و شاید واقعاً هم خوب باشه. ولی وقتی data ات از ده هزار record به یه میلیون رکورد می‌رسه، اون function سرور رو می‌خوابونه. این اتفاق نه به‌خاطر اینه که مدل اشتباه کرد — مدل چیزی نوشت که برای context ای که داشت معقول بود. اشتباه اینجا بود که کسی که review کرد نفهمید مشکل کجاست.

debugging جایی‌ه که اصول واقعاً مهم می‌شن

هر چیزی که AI می‌نویسه، در یه لحظه‌ای اشتباه می‌کنه — یا مدل اشتباه می‌کنه، یا کد توی production با شرایطی مواجه می‌شه که مدل پیش‌بینی نکرده بود. اون لحظه، تنها کسی که می‌تونه مشکل رو پیدا کنه و درستش کنه توئی.

debugging یه مهارتیه که بدون فهمیدن اصول ممکن نیست. نمی‌تونی race condition پیدا کنی اگه ندونی thread یعنی چی. نمی‌تونی memory leak رو trace کنی اگه lifecycle object ها رو نفهمی. نمی‌تونی بفهمی چرا request تایم‌اوت می‌شه اگه ندونی TCP handshake چطور کار می‌کنه.

AI توی debugging هم کمک می‌کنه — ولی فقط اگه بدونی چه اطلاعاتی بهش بدی. اگه ندونی دنبال چی می‌گردی، error log رو copy می‌کنی توی chat و امیدوار می‌شی مدل جواب بده. گاهی می‌ده. ولی این یه روش قابل اعتماد نیست.

یه نقطه‌ی ظریف درباره‌ی سرعت

یه غلط‌فهمی وجود داره که «اصول یاد گرفتن» یعنی زمان زیادی می‌بره و در آخر هم مستقیماً استفاده نمی‌شه. ولی اصول قراره چیزی باشن که دیگه بهشون فکر نمی‌کنی — اتوماتیک تبدیل می‌شن به شهود.

وقتی یه توسعه‌دهنده باتجربه یه codebase جدید رو می‌بینه، می‌فهمه مشکل architecture کجاست — نه به‌خاطر اینکه یه checklist داره، بلکه چون دیده‌ها و تجربه‌هاش به یه حس تبدیل شدن. این همون چیزیه که با AI codingهای سطحی از دست می‌ره.

هرچقدر اصول قوی‌تر باشن، از AI هم بهتر استفاده می‌کنی. چون prompt های بهتری می‌نویسی، خروجی رو بهتر ارزیابی می‌کنی، و زودتر می‌فهمی کِی باید از مدل کمک بخوای و کِی باید خودت فکر کنی.

اصول چه چیزی نیستن

اینجا یه تفاوت مهم هست که باید مشخص بشه: یاد گرفتن اصول با حفظ کردن syntax یه زبان یا دونستن تمام APIهای یه فریم‌ورک فرق داره. دومی رو الان واقعاً AI بهتر از تو می‌دونه. اگه نمی‌دونی Array.reduce چطور کار می‌کنه، بپرس. اگه نمی‌دونی کدوم CSS property برای این استفاده می‌شه، بپرس.

ولی اینکه چرا state management پیچیده می‌شه، چرا database query ات کند شده، چرا این race condition فقط توی production اتفاق می‌افته — اینا رو باید بفهمی. اینا قراره بخشی از طرز فکر تو بشن، نه اینکه هر بار از صفر از مدل بپرسی.

جواب سوال اول

پس چرا باید اصول یاد بگیری؟

نه برای اینکه AI کدت رو بنویسه و تو باید بدونی که نوشته. نه برای اینکه شاید یه روز AI نباشه — هست و بیشتر هم می‌شه.

بلکه چون کار یه توسعه‌دهنده همیشه بیشتر از نوشتن کد بوده. طراحی سیستم، تصمیم‌گیری، تشخیص مشکل، ارزیابی trade-off ها — اینا هنوز جایی هستن که ابزار جایگزین فکر نمی‌شه. AI سرعت رو بالا می‌بره، ولی اگه نقطه‌ی شروع ضعیف باشه، فقط سریع‌تر به جای اشتباه می‌رسی.

اصول یاد می‌گیری تا بتونی از AI درست استفاده کنی — نه به‌رغم اینکه AI هست.