برنامه نویسی

برنامه نویسی چیست

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

  • درس ۱ از ۱۴
  • مقدماتی
  • رایگان، بدون ثبت نام

پنج قدمی که هر برنامه از آن رد می شود

  1. ۱

    مسئله

    دقیقا چه چیزی باید حل شود، ورودی چیست و خروجی چه شکلی است.

  2. ۲

    الگوریتم

    مراحل کار به زبان خودتان، قبل از نوشتن یک خط کد.

  3. ۳

    کد

    همان مراحل، این بار با قواعد یک زبان مشخص.

  4. ۴

    اجرا

    اولین باری که واقعا می فهمید چه گفته اید، نه چه فکر می کردید گفته اید.

  5. ۵

    اصلاح

    قدمی که تمام نمی شود و بیشترین وقت هر برنامه نویسی را می گیرد.

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

آخرین بررسی: فکت ها و نام ابزارهای این درس در همین تاریخ با منابعشان بازبینی شده اند.

برنامه یعنی چه؟ ساده ترین تعریفی که غلط نیست

برنامه فهرستی از دستورهاست که یک ماشین به ترتیب اجرا می کند. تفاوتش با دستور پختی که به یک آدم می دهید همین جاست: آدم جاهای خالی را خودش پر می کند و «کمی نمک» را می فهمد. ماشین نه می فهمد و نه می پرسد.

هر چیزی که نگفته باشید انجام نمی شود، و هر چیزی که اشتباه گفته باشید دقیقا همان اشتباه انجام می شود. جمله ساده ای است و تمام سختی این کار در آن جمع شده. بیشتر خطاهایی که خواهید دید از بلد نبودن زبان نمی آید؛ از این می آید که جمله داخل ذهنتان کمی با جمله ای که نوشتید فرق داشت.

سه کلمه را از همان اول از هم جدا کنید. کد متن دستورهاست، همان چیزی که تایپ می کنید و روی دیسک ذخیره می شود. زبان برنامه نویسی قواعدی است که این متن باید رعایت کند تا بشود ترجمه اش کرد. و برنامه آن چیزی است که وقتی متن ترجمه و اجرا می شود اتفاق می افتد. متن می ماند؛ برنامه در حافظه زنده می شود، کارش را می کند و تمام می شود.

پس برنامه نویس بودن یعنی این توانایی: چیزی را که می خواهید، آنقدر دقیق و بی ابهام بنویسید که یک ماشین بی درک بتواند انجامش بدهد. زبان و ابزار بعدا می آیند.

یک برنامه واقعی، در پنج خط

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

from pathlib import Path

for f in Path("images").rglob("*.jpg"):
    size = f.stat().st_size
    if size > 200_000:
        print(f.name, round(size / 1024), "KB")

خط به خط بخوانیدش. خط اول ابزار کار با پوشه ها را می آورد. خط دوم می گوید داخل پوشه images و همه زیرپوشه هایش هر فایلی که به jpg ختم می شود را یکی یکی بردار. خط سوم اندازه فایل را برحسب بایت می گیرد و در جایی به اسم size نگه می دارد. خط چهارم یک شرط می گذارد: فقط اگر این عدد از دویست هزار بیشتر بود. خط آخر اسم فایل را با اندازه اش چاپ می کند.

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

و یک چیزی که این برنامه ندارد: هیچ جا نمی پرسد آیا پوشه images اصلا وجود دارد. اگر وجود نداشته باشد هیچ اتفاقی نمی افتد و هیچ خطایی هم چاپ نمی شود، چون حلقه روی یک مجموعه خالی می چرخد و تمام. برنامه ای که کار نمی کند ولی شکایتی هم ندارد، گیج کننده ترین حالت برای تازه کار است، و همان چیزی است که بند «از تجربه خود ما» در پایین همین صفحه درباره اش حرف می زند.

از مسئله تا کدی که کار می کند، پنج قدم

قدم اول مسئله است و از همه کوتاه تر نوشته می شود: دقیقا چه چیزی باید حل شود، ورودی چیست و خروجی چه شکلی است. «سایتم کند است» مسئله نیست؛ «فهرست تصویرهای بالای دویست کیلوبایت را می خواهم» مسئله است.

قدم دوم الگوریتم است و همان قدمی است که تقریبا همه رد می کنند. الگوریتم یعنی مراحل کار را به زبان خودتان بنویسید، قبل از هر خط کد: پوشه را باز کن، فایل ها را یکی یکی بردار، اندازه هر کدام را ببین، اگر از فلان مقدار بیشتر بود اسمش را بنویس. اگر نتوانید کاری را به فارسی مرحله به مرحله توضیح بدهید، مشکل شما پایتون نیست.

قدم سوم کد است: همان مراحل، این بار با قواعد یک زبان. قدم چهارم اجرا است، و اولین باری که واقعا می فهمید چه گفته اید. قدم پنجم اصلاح است.

قدم پنجم تمام نمی شود، تکرار می شود، و برای هر برنامه نویسی بیشترین وقت را می گیرد. تصور رایج این است که آدم حرفه ای کد را درست می نویسد و تمام؛ چیزی که در عمل اتفاق می افتد این است که آدم حرفه ای سریع تر می فهمد کجا اشتباه شده. یک قاعده کوچک این حلقه را چند برابر سریع تر می کند: هر بار فقط یک چیز را عوض کنید. اگر سه چیز را با هم عوض کنید و برنامه درست شود، نمی دانید کدامش بود و دفعه بعد باز از صفر شروع می کنید.

حلقه ای که یاد گرفتن واقعا در آن اتفاق می افتد

حلقه اصلاحبیشترین وقت اینجا می گذرد
  • ۱ بنویس
  • ۲ اجرا کن
  • ۳ بخوان چه گفت
  • ۴ یک چیز را عوض کن

شرط این حلقه یک چیز است: هر بار فقط یک چیز را عوض کنید. اگر سه چیز را با هم عوض کنید و درست شود، نمی دانید کدامش بود.

چرا بیشتر وقت یک برنامه نویس صرف نوشتن کد نمی شود

آنچه از بیرون دیده می شود تایپ کردن است. زیر آب چهار کار دیگر نشسته که هیچ آموزشی برایشان ویدیو نمی سازد.

اول خواندن کدی که قبلا نوشته شده. کد بیشتر خوانده می شود تا نوشته، چه مال خودتان باشد چه مال کس دیگر. دوم بازسازی کردن خطا: تا وقتی نتوانید یک خطا را عمدا دوباره بسازید، هر تغییری که بدهید حدس است، و ممکن است چیزی که درست شده اصلا ربطی به کار شما نداشته باشد.

سوم اسم گذاشتن و تصمیم گرفتن. اسم متغیرها و تقسیم کار بین تابع ها تزیین نیست؛ اسم بد سه ماه بعد به یک خطای واقعی تبدیل می شود، چون خودتان یادتان می رود منظورتان چه بوده. چهارم منتظر ماندن: نصب، اجرا، تست، بالا آمدن سرور. وقتی که در هیچ برنامه آموزشی شمرده نمی شود و در روز واقعی کاری هست.

این را برای دلسرد کردن نمی گوییم. برعکس: اگر بدانید کار واقعی این شکلی است، اولین باری که یک ساعت روی یک خطا می مانید فکر نمی کنید استعدادش را ندارید. آن یک ساعت خود کار است.

چیزی که دیده می شود و چهار چیزی که دیده نمی شود

نوشتن کد

تنها بخشی که از بیرون دیده می شود و تنها بخشی که ویدیو دارد.

سطح آب
  • خواندن کدی که قبلا نوشته شده

    کد بیشتر خوانده می شود تا نوشته، چه مال خودتان باشد چه مال کس دیگر.

  • بازسازی کردن خطا

    تا نتوانید خطا را عمدا دوباره بسازید، هر تغییری حدس است.

  • اسم گذاشتن و تصمیم گرفتن

    اسم بد سه ماه بعد به یک خطای واقعی تبدیل می شود.

  • منتظر ماندن

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

این تقسیم بندی نسبت دقیقی نیست و ما عددی برایش نداریم. فقط ترتیب کارهایی است که وقت می برند و در آموزش ها دیده نمی شوند.

برای شروع دقیقا به چه چیزی نیاز دارید؟

یک کامپیوتر معمولی، یک ویرایشگر متن رایگان، یک زبان، و ترمینال. همین. هیچ کدام از این چهار تا پول نمی خواهد و هیچ کدام هم به سخت افزار گران نیاز ندارد؛ برنامه ای که در این درس دیدید روی ضعیف ترین لپ تاپ هم اجرا می شود.

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

موضع ما، که با تبلیغ بیشتر دوره ها جور درنمی آید: هیچ دوره ای نخرید تا ده خط کد ننوشته اید. اول یک کار کوچک و واقعی از زندگی خودتان انتخاب کنید، مثل مرتب کردن اسم فایل ها یا شمردن چیزی در یک فایل متنی، و همان را با کمک مستندات و چند جستجو بسازید. اگر بعد از آن باز هم احساس کردید ساختار منظم لازم دارید، آن وقت دوره بخرید و می دانید دنبال چه هستید.

یک راه کوتاه تر هم هست که برای خیلی ها بهتر جواب می دهد: به جای زبان های عمومی، از ساختن یک صفحه وب شروع کنید. خروجی را در مرورگر می بینید، بازخورد سریع است، و همان سه مفهوم حلقه و شرط و متغیر بعدا در جاوااسکریپت سر جایشان هستند.

برنامه نویسی، کدنویسی و مهندسی نرم افزار چه فرقی دارند؟

در گفتگوی روزمره این سه را به جای هم به کار می برند و اشکالی هم ندارد. اگر بخواهیم دقیق باشیم، کدنویسی عمل نوشتن دستورها به یک زبان است، برنامه نویسی کل کار حل مسئله را می گیرد که کدنویسی فقط یک قدمش است، و مهندسی نرم افزار وقتی معنا پیدا می کند که چند نفر روی یک چیز کار کنند و آن چیز سال ها بماند: نسخه بندی، تست، مستندسازی، تحویل.

فایده این تفکیک عملی است. اگر دنبال یاد گرفتن هستید، از کدنویسی شروع می کنید ولی چیزی که واقعا باید تمرین کنید برنامه نویسی است، یعنی همان قدم دوم که همه رد می کنند. مهندسی نرم افزار هم چیزی نیست که در خانه تمرین کنید؛ وقتی به آن نیاز پیدا می کنید که چند نفر شدید یا کدتان به اندازه ای بزرگ شد که خودتان هم گمش می کنید.

مسیر سریع با هوش مصنوعی

چیزی که برای یادگیرنده امروز واقعا سریع تر شده تولید کد نیست؛ داشتن معلمی است که خسته نمی شود و ساعت دو نصف شب هم جواب می دهد. تفاوت کسی که با این ابزار جلو می افتد و کسی که جا می ماند در یک جمله است: اولی توضیح می خواهد، دومی کد می خواهد. برای این کار یک مدل قوی بهتر از یک مدل سریع و ارزان جواب می دهد، چون کار قضاوت است نه کار مکانیکی؛ انتخاب فعلی ما در بخش هوش مصنوعی همین سایت هست.

  1. کاری که می خواهید انجام شود را در یک جمله بنویسید و ورودی و خروجی اش را مشخص کنید. این تنها قدمی است که هیچ مدلی نمی تواند جای شما بردارد، چون او نمی داند شما چه می خواهید.
  2. نسخه پایین را پر کنید و به مدل بدهید. کوچک ترین برنامه ای که کار کند بخواهید، نه کامل ترین؛ سی خط کدی که نفهمیده اید از پنج خطی که می فهمید بدتر است.
  3. خودتان اجرایش کنید. اگر خطا داد، متن کامل خطا را عینا برگردانید، نه برداشت خودتان از خطا؛ برداشت شما همان چیزی است که هنوز بلد نیستید.
  4. وقتی کار کرد، نسخه ای را که یک اشتباه عمدی دارد اجرا کنید و خودتان اشتباه را پیدا کنید. تمرین واقعی همین است، نه کپی کردن نسخه درست.
  5. تا وقتی نمی توانید بدون نگاه کردن بگویید هر خط چه می کند، سراغ کار بعدی نروید. این تنها معیاری است که در این مسیر اندازه گیری واقعی می دهد.

نسخه آماده کپی

نقش: معلم برنامه نویسی برای کسی که تا امروز یک خط کد ننوشته است.

کاری که می خواهم انجام شود:
{کار را در یک جمله بنویسید}
ورودی: {چه چیزی به برنامه داده می شود}
خروجی: {دقیقا چه چیزی باید چاپ یا ساخته شود}
زبان: {پایتون، اگر ترجیح دیگری ندارید}

قواعد جواب:
۱. کوچک ترین برنامه ای که این کار را انجام بدهد، نه کامل ترین. بدون کتابخانه اضافه و بدون تنظیمات.
۲. زیر برنامه، خط به خط توضیح بده، برای هر خط یک جمله.
۳. بگو این برنامه در چه حالتی بی سر و صدا کار نمی کند و هیچ خطایی هم نمی دهد.
۴. در پایان یک نسخه دوم بده که دقیقا یک اشتباه در آن گذاشته باشی، و نگو اشتباه کجاست.

قبل از اعتماد به خروجی: مدل برنامه را اجرا نمی کند مگر ابزارش را به او داده باشید، پس جمله «تست شد و کار می کند» را باور نکنید تا خودتان اجرا نکرده اید. و اگر اشتباه عمدی قدم چهارم را پیدا نکردید، آن برنامه هنوز مال شما نیست: دوباره توضیح بخواهید، نه نسخه درست را.

هوش مصنوعی در این کار

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

ابزارهایی که واقعا کمک می کنند

  • Gemini یک حالت جدا برای درس خواندن دارد به اسم Guided Learning که به جای دادن جواب سوال می پرسد و آخر مبحث جمع بندی می کند؛ برای یاد گرفتن دقیقا همان رفتاری است که لازم دارید. صفحه خود گوگل می گوید اپ وب جمنای در بیش از دویست و سی کشور و منطقه کار می کند و ایران در آن فهرست نیست.
  • Claude برای توضیح دادن یک تکه کد و خواندن پیام خطا خوب جواب می دهد و وقتی بگویید کوتاه ترین نسخه را بده، کمتر از خودش چیز اضافه می کند. ایران در هیچ یک از دو فهرست کشورهای پشتیبانی شده انتروپیک نیست؛ این را از صفحه خود انتروپیک خوانده ایم و نه از تست شبکه.
  • ChatGPT رایج ترین انتخاب و برای این کار قابل قبول است. ما هنوز صفحه ای برایش در بخش هوش مصنوعی نداریم، پس درباره دسترسی و قیمتش اینجا ادعایی نمی کنیم.

کجا نتیجه معکوس می دهد

خطر اصلی برای تازه کار این نیست که مدل کد غلط بدهد؛ این است که کد درست بدهد. برنامه ای که اجرا می شود و شما نمی دانید چرا اجرا می شود، چیزی به شما اضافه نکرده، و اولین روزی که خراب شود دست خالی می مانید. دو عادت جلوی این را می گیرد: همیشه کوچک ترین نسخه را بخواهید، و قبل از هر اجرا حدس بزنید خروجی چه خواهد بود. خطر دوم مشخص تر است: مدل درباره کامپیوتر شما با همان لحن مطمئن چیزی می گوید که وجود ندارد، مثل نام یک دستور یا مسیر یک فایل. خود انتروپیک این حالت را در مستنداتش توهم می نامد و راه های کم کردنش را توضیح می دهد، یعنی سازنده هم آن را ضعف واقعی می داند نه شایعه. قاعده ساده است: هر چیزی که مدل درباره سیستم شما می گوید باید با یک اجرای واقعی سنجیده شود. برای اینکه بدانید هر کدام از این ابزارها از ایران چطور قابل پرداخت است، راهنمای خرید را ببینید.

منبع ها: Anthropic: reduce hallucinations Anthropic: supported countries Google: where the Gemini web app is available Google: how Guided Learning can help you study

حد این توصیه

این درس نقشه می دهد نه مهارت. با خواندنش هیچ کس برنامه نویس نمی شود، همان طور که با خواندن قواعد شنا کسی شناگر نمی شود؛ تنها کاری که می کند این است که اولین ده خط را کمتر ترسناک کند. دوم اینکه مثال این صفحه پایتون است و نحوش مال پایتون است؛ مفهوم حلقه و شرط و متغیر همه جا هست ولی شکل نوشتنشان در هر زبان فرق می کند. و سوم، هیچ چیزی در این صفحه به شما نمی گوید چه چیزی بسازید. آن سوال جواب فنی ندارد و جوابش را باید از کار یا زندگی خودتان بیاورید.

از تجربه خود ما

روزی که این درس بررسی شد، همان پنج خط بالا را روی پوشه آپلودهای همین سایت اجرا کردیم. ۳۱۸ فایل jpg بررسی شد و ۱۰۰ خط چاپ شد. اولین خطی که برگشت این بود: یک فایل با اندازه 199 KB، زیر برنامه ای که قرار بود فقط فایل های بزرگ تر از ۲۰۰ کیلوبایت را نشان بدهد. برنامه هیچ اشتباهی نکرده بود: شرط size > 200_000 بایت می شمارد و round(size / 1024) بر ۱۰۲۴ تقسیم می کند، پس فایلی که ۲۰۴۱۲۵ بایت است دقیقا ۱۹۹ می شود. جمله ای که در ذهن ما بود با جمله ای که نوشتیم یکی نبود، و همین است تمام چیزی که این درس می خواهد بگوید. اگر می خواهید خودتان همین را ببینید، پنج خط را روی یک پوشه تصویر اجرا کنید و اولین خط خروجی را با شرطی که نوشته اید مقایسه کنید.

سوال هایی که واقعا پرسیده می شوند

برنامه نویسی سخت است؟

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

برای برنامه نویسی باید انگلیسی بلد باشم؟

کلمه های خود زبان کم اند و حفظ می شوند: پایتون روی این سرور ۳۵ کلمه کلیدی دارد و با دستور python3 -c "import keyword; print(len(keyword.kwlist))" خودتان می توانید بشمریدشان. چیزی که واقعا انگلیسی می خواهد مستندات و پیام های خطاست، و برای همان هم ترجمه ماشینی امروز کافی است. پس نبود انگلیسی دلیل شروع نکردن نیست، ولی خواندن انگلیسی فنی سرعتتان را چند برابر می کند.

از کجا بفهمم برنامه نویسی به درد من می خورد؟

یک کار تکراری در هفته خودتان پیدا کنید که حوصله تان را سر می برد و ده خط بنویسید که همان را انجام بدهد. اگر لحظه ای که کار کرد برایتان جالب بود، جوابتان را گرفته اید؛ اگر فقط خیالتان راحت شد که تمام شد، احتمالا ابزار می خواهید نه برنامه نویسی، و آن هم انتخاب کاملا درستی است.