خط اولی که در ایران کار نمیکند خط کد نیست، خط نصب است. سمانه در کرج یک اسکریپت شصت خطی نوشته که سفارشهای یک کارگاه سفال را میخواند و میگوید کوره در کدام دو هفته سال خالی مانده است. اسکریپت درست است و روی دستگاه خودش جواب میدهد. دستوری که کتابخانه خواندن فایل اکسل را نصب میکند جواب نمیدهد.
در هیچکدام از سیودو جلسه دورهای که گذرانده، آن یک خط موضوع درس نبوده. نویسنده هر آموزشی، فارسی یا انگلیسی، از کنار جمله نصبش کنید رد میشود، چون برای خودش یک ثانیه طول کشیده. برای کسی که از ایران بازش میکند همانجا اولین جایی است که کار میایستد، و چون در متن اسمی ندارد، خواننده اسمش را روی خودش میگذارد.
تقسیم بر جایی است که کد باید در آن دوام بیاورد
هر چه به فارسی درباره برنامهنویسی فروخته میشود یک دوره به ازای هر زبان است: دوره پایتون، دوره جاوااسکریپت، دوره PHP. فرض این دستهبندی غلط است، اینکه زبان کار شما را تعیین کند. آنچه تعیین میکند این است که چه چیزی اجازه دارد خراب شود، و آن از جایی میآید که کد در آن اجرا میشود.
سه شاخه از این هشتتا هر جا بروید همراهتان میآیند. ایدههایی که با عوض شدن زبان از بین نمیروند آن چیزی است که اگر هر زبانی را که بلدید از شما بگیرند باقی میماند: اینکه یک حلقه چقدر خرج برمیدارد و خطا کجا پنهان میشود. نحو و اکوسیستم، هر بار یک زبان جایی است که خود زبان و چند صد بسته دور آن نوشته میشوند، و بیرون بردن کد از دستگاه خودتان، و زنده نگه داشتنش هر چیزی است که بعد از کار کردن برنامه و پیش از رسیدنش به دست کسی دیگر میافتد.
پنج شاخه دیگر موضوع نیستند، مجموعه محدودیتاند، و هرکدام را چیزی میکشد که بقیه را نمیکشد. در هر چه میان یک مرورگر و یک سرور میگذرد هیچکدام از آن دو ماشین مال شما نیست و شبکه میانشان جوری قطع میشود که هیچ طرفی گزارشش نمیدهد. در برنامههایی روی دستگاهی که آدمها با خود میبرند مرزها باتریاند، صف بازبینی فروشگاه، و گوشیای که نمیتوانید واردش شوید تا ببینید چه شد. ذخیره داده، جوری که بشود دوباره بیرونش کشید شرطی دارد که آن چهار تای دیگر ندارند: وسط یک نوشتن برق برود و داده هنوز سر جایش باشد. روی دفتری که مالک ندارد کد عمومی و ماندگار است و معمولاً پول نگه میدارد، پس استقرار دومی در کار نیست. و در سیستم، هنر و کد، که در قالب چیزی که بازی میکنید منتشر میشود بودجه شانزده میلیثانیه برای هر فریم است، شصت بار در ثانیه.
یک محدودیت ششم هست که مخصوص اینجاست و از روی هر پنج تای آنها رد میشود: اینکه ماشین آن طرف اصلاً جواب میدهد یا نه. مخزن بستهها، کنسول سرویس ابری و رابط برنامهنویسی مدلها از ایران یا کند جواب میدهند یا هیچ. این شاخه از هر شاخه دیگری در دانش شکل دارد خوشه دارد، چون مسئلهای که روی وب حل شد باید روی گوشی دوباره حل شود و داخل یک بازی بار سوم.
هفته ششم
دوراهی بعد از اولین برنامهای که کار میکند
هر دو مسیر حس پیشرفت میدهند. تنها یکیشان به چیزی میرسد که یک غریبه میتواند بازش کند.
- کاری که تقریباً همه میکنندشروع یک زبان دومدوباره ماه اول، و چون همهچیزش نو است شبیه پیشرفت خوانده میشود
- نحوی که از قبل دارید، با املای دیگر
- هنوز هیچچیز شما هیچجا اجرا نمیشود
- فاصله بیصدا بازتر میشود، در هر دو زبان
- کاری که جواب میدهدهمان برنامه را روی ماشینی بگذارید که مال شما نیستدو هفته که هیچچیز کار نمیکند، و بعد یک نشانی
- ترمینالی که خودتان بازش کردهاید
- مخزنی که نسخههایش قفل شدهاند
- یک نشانی که کس دیگری میتواند کلیکش کند
نمیگوید زبان دوم اشتباه است. میگوید جایش هفته ششم نیست، و کسانی که هفته ششم سراغش میروند معمولاً به جای آن یکی میروند.
یک زبان، تا وقتی چیزی از شما جایی اجرا شود که خودتان آنجا نیستید
یاسمن سه سال جاوااسکریپت نوشته، یک سال پایتون و از اسفند Go. هر سه را میخواند، و هیچچیزی که با هیچکدامشان نوشته تا امروز روی ماشینی جز لپتاپ خودش اجرا نشده. زبان دوم گرانترین راه فرار از موضوع دوم است.
وسوسهاش دلیلی دارد که ارزش گفتن دارد: زبان تازه ماه اول را به شما پس میدهد، و نحوی که از قبل در سرتان هست هفته اول را تند میکند. رساندن همان برنامه به جای دیگر دو هفته هیچچیز نمیدهد و بعد یک نشانی میدهد که کس دیگری میتواند بازش کند.
ترتیب اشتباه دوم آرامتر است و در ایران رایجتر: دوره بعد از دوره. کسی که چهار دوره خریده و هر چهار تا را تا جلسه دوازدهم جلو رفته، پیشرفتش را از روی شماره دوره میخواند نه از روی کاری که میتواند بکند. مبانی هم پیشنیازی نیست که اول باید تمامش کرد. روزی به کار میآید که اسکریپت سمانه هشتاد هزار سطر را یکییکی با فهرست هر سفارش دیدهشده مقایسه میکند و همان کار با یک دیکشنری پیش از روشن شدن فن تمام میشود.
ایست، روزی است که کد باید جایی اجرا شود که شما چیزی در آن تنظیم نکردهاید
هر کسی در این کار یک جمله برایش دارد: روی سیستم من که کار میکرد. کسی که چهار ماه پیوسته جلو رفته یکباره جلو نمیرود و نتیجه میگیرد که برای برنامهنویسی ساخته نشده. نشدهاش نیست. وارد موضوع دومی شده که هیچکس نگفته بود موضوع است، و به شکل شکست خوردن در موضوع اول ظاهر میشود.
شصت خط سمانه چهار چیز را فرض گرفته که هیچکدام داخل فایل نوشته نشدهاند: پایتونی که با سیستمعامل آمده و دو نسخه عقب است، کتابخانهای که پارسال با دستوری نصب شده که دیگر یادش نیست، مسیری که نام کاربری خودش داخلش است، و مخزن بستهای که آن روز جواب میداد. هیچکدامشان پایتون نیستند و هر چهار تا باید پیش از خط یک درست باشند.
دلیل اینکه کسی هشدارش را نمیدهد صادقانه است: کسی که زبان را درس میدهد محیط را بخشی از زبان نمیداند، که حرف درستی است و به درد نمیخورد. نصفه دیگر این ایست ترمینال است، که دستور زبان خودش را دارد و همسایه دیوار به دیوار این شاخه است زیر لایهای میان سختافزار و هر چیزی که اجرا میکنید.
نشانهای که میشود همین امروز بررسی کرد
اندازه پیشرفت این نیست که چقدر نحو را از حفظ مینویسید. این است که وقتی یک نصب شکست میخورد چند ثانیه طول میکشد تا بگویید تقصیر کدام یکی بود. سه جواب بیشتر ندارد و هر سه داخل خود متن خطا نوشته شدهاند:
- خطای شبکه نام میزبان را میآورد و از مهلت تمامشده یا اتصال قطعشده حرف میزند. ویرایشگر را باز نکنید.
- خطای وابستگی نام دو بسته و دو بازه نسخه را کنار هم میگذارد. یکی را انتخاب کنید و انتخابتان را در فایل قفل بنویسید.
- خطای خودتان نام فایلی را میآورد که خودتان نوشتهاید، و در انبوه سطرهای یک ردیابی تنها سطری است که ارزش باز کردن دارد.
در ماه اول هر سه خطا یک شکل دارند، یک دیوار قرمز. در ماه سوم در کمتر از یک دقیقه از هم جدا میشوند، و جدا کردنشان خودِ مهارت است؛ درست کردن بعد از آن یک جستوجوست.
ایست
سرفصل موضوعی که هیچکس نگفته بود موضوع است
چهار ماه پیشرفت پیوسته به یک ساحل میرسد، و آن طرف هفته اول چیز دیگری است که سطح مقدماتی خودش را دارد.
- ۰۱ترمینال، و اینکه مسیر خودش یک چیز استدستور از کجا اجرا میشود تعیین میکند چه چیزی را پیدا میکند
- ۰۲نشانی مخزن بسته، یک بار، در فایل خانگی خودتانمحدودیت ششم، حلشده به جای اینکه هر بار تکرار شود
- ۰۳یک فایل قفل، تا نسخهها عمدی باشندکد دیگران، قفلشده به جای تازهترین
- ۰۴یک ماشین که شما پیکربندیاش نکردهایدهیچکدام از چهار سال شما رویش نیست، و نکتهاش همین است
چهار تخته و تخته پنجمی نیست. این موضوع ته دارد، و همین بخشی است که وقتی روی ساحل اول ایستادهاید کسی نمیگویدش.
با چه چیزی کار کنید
VS Code از حدود ۲۰۱۶ ویرایشگر پیشفرض است و رایگان. جای Sublime Text و Atom را گرفت، و Atom در دسامبر ۲۰۲۲ بایگانی شد، چهار سال بعد از آنکه سازندهاش را سازنده VS Code خرید. دو جایگزین جدی دارد: JetBrains که یک زبان را عمیق میشناسد و برای کسی میارزد که تمام روز داخل همان زبان است، هرچند پرداخت اشتراکش از ایران مستقیم نیست، و Neovim برای کسی که کارش روی ماشینهایی میگذرد که مال خودش نیستند. اشتباه رایج نصب سی افزونه پیش از نوشتن اولین خط است.
Git در ۲۰۰۵ برای هسته لینوکس نوشته شد، جای Subversion و عادت کپی گرفتن از یک پوشه پیش از دست زدن به آن را گرفت، و رایگان است. برای خواننده ایرانی یک ویژگی دارد که هیچ ابزار دیگری در این صفحه ندارد: ثبت تغییر، شاخه زدن و برگرداندن یک فایل بدون یک بایت شبکه کار میکنند، پس تنها ابزار این شاخه است که مسئله دسترسی به آن نمیرسد. اشتباه رایج یاد گرفتن add و commit و push به شکل یک ورد سهکلمهای است، جوری که اولین بار که چیزی خراب شد تنها حرکت بلد کلون کردن دوباره مخزن باشد. از Git 2.23 در ۲۰۱۹، git switch شاخه عوض میکند و git restore فایل را برمیگرداند، و هر آموزشی قدیمیتر از آن هر دو کار را با git checkout نشان میدهد.
دستیار کدنویسی داخل ویرایشگر بزرگترین تغییر این کار از ۲۰۲۲ است و جای گشتن دنبال کسی را گرفت که پیش از شما همان را پرسیده باشد. در کدی که خودتان کندتر مینوشتید بسیار خوب است، و بیشتر کد از همان جنس است. در هر چیز غیرمعمول با اطمینان اشتباه میکند، با خروجی روان و مرتبی که شبیه کدی است که کار میکند. و تازهکار نمیتواند بگوید کدامیک روی صفحهاش است، چون تشخیص دادنشان خودِ همان چیزی است که دارد یاد میگیرد. نسخههای رایگانشان واقعیاند و رسیدن به بیشترشان از ایران واسطه میخواهد. عادتی که از این میماند: خطی را که ننوشتهاید وادار کنید توضیح بدهد، بعد توضیحش را با چیزی که اجرا میشود بسنجید، که همان حرکت گرفتن جواب بهدردبخور، به جای جوابی که فقط قانعکننده به نظر میرسد است.
چهارمی در فهرست ویرایشگرها جا ندارد، چون جواب ایست است نه جواب کار. برای پایتون، uv در ۲۰۲۴ آمد، رایگان و متنباز، و جای pip و virtualenv و pyenv را گرفت که سه ابزار برای یک کار بودند: uv نسخهای از پایتون را نصب میکند که پروژه خواسته است و هر بسته را در یک فایل قفل میبندد، پس ماشینی که مخزن شما را کلون میکند همان چیزی را میگیرد که شما داشتید. هر اکوسیستمی نسخه خودش را از این فایل قفل دارد، و اشتباه رایج بیرون نگه داشتنش از مخزن است، به گمان اینکه نویز باشد.
و آن یک خطی که محدودیت ششم را از حالت اتفاق درمیآورد: هر مدیر بسته یک نشانی مخزن دارد که در فایل پیکربندی خانگی شما مینشیند. برای پایتون pip config set global.index-url است و روی لینوکس در ~/.config/pip/pip.conf مینشیند؛ برای Node دستور npm config set registry است و در ~/.npmrc. خود نشانی آینه عوض میشود و نوشتنش روی این صفحه فقط تاریخ صفحه را میسوزاند. آنچه عوض نمیشود نام تنظیم و جای فایل است، و یک بار درست نوشتنش تفاوت میان شکستی است که هر بار تکرار میشود و شکستی که یک بار حل شد.
نشانه
یک برنامه در چهار حالت، که در هر کدام کمتر از شما در آن هست
میان فریم اول و آخر هیچچیز در کد عوض نمیشود. آنچه عوض میشود مقدار تکیهاش به دستگاه و شبکه خود شماست.
- ۰۱با زدن دکمه اجرا کار میکندداخل ویرایشگری که همهچیز را برای شما نصب کرد
- ۰۲در ترمینالی که خودتان باز کردید کار میکندهمان دستگاه، بدون هیچ کمکی
- ۰۳از یک کلون تازه کار میکندمخزن خودتان، و اولین حسابرسی صادقانه از هر چه ننوشته بودید
- ۰۴جایی کار میکند که هرگز واردش نشدهایدفریمی که برنامه در آن دیگر مال شما نیست
فاصله فریمها در زمان یکسان نیست. آخری معمولاً از سه تای پیش از خودش روی هم بیشتر خرج برمیدارد، و یک نوار فیلم نمیتواند این را بکشد.
از کدام شاخه وارد شوید
بیشتر آدمها از مبانی یا از زبانها شروع میکنند، و تقسیم صادقانه میانشان این است که یکی از عوض شدن زبان جان سالم به در میبرد و آن یکی خودِ عوض شدن است. دومی را فقط آنقدر جلو ببرید که اولی دیده شود. انتشار را زودتر از آنچه معقول به نظر میرسد باز کنید: کنترل نسخه و تست و کانتینر روی برنامهای شصت خطی خیلی راحتتر یاد گرفته میشوند تا روی چهار هزار خطی.
از آن پنج جا، وب بدون دلیل خاصی برای ترجیح بقیه اول باز میشود، و دلیلش فنی نیست: غریبهای چیزی را که ساختهاید با یک کلیک میبیند. بازیسازی سختترین محدودیت این هشتتا را دارد، که چرا کسی آنجا کارایی را زود یاد میگیرد.
برای خوانندهای که به خاطر درآمد اینجاست، و در فارسی بیشترشان به همین دلیل اینجا هستند، مهارت همسایه فروختن مهارت خودتان، بیواسطه است و مهارت جداگانهای است: اولین قرارداد دورکاری را کیفیت کد نمیبندد، بستنش با چیز دیگری است که هیچ دورهای درسش نمیدهد.
میماند پرسشی که تقریباً همه با آن میآیند، اینکه با کدام زبان شروع کنند. شاخه زبانها هنوز به فارسی جوابش را ننوشته، ولی شکل مفید پرسش را میشود همینجا گفت: کدام زبان را کسانی مینویسند که قرار است سوالهای شما را جواب بدهند. آن آدمها، نه فهرست ویژگیهای زبان، تعیین میکنند هفته ششم شما چطور میگذرد.