ده توصیه برای برنامه‌نویسان جوان

من عاشق برنامه‌نویسی و لینوکس و منبع‌باز هستم. و خب وقتی به همه این‌ها علاقه‌مند باشی و هکری بزرگ مثل «اریک ریموند» از چیزی تعریف کرده باشد، نمی‌توانی در برابرش مقاومت کنی. توی گوگل پلاس دیدم که لینکی در مورد برنامه‌نویسی را به اشتراک گذاشته و تصمیم گرفتم ترجمه‌اش کنم.

Eric-Raymon-g-plus

اصل مطلب را می‌توانید این‌جا بخوانید و این هم ترجمه‌اش:


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

تبدیل شدن به یک برنامه‌نویس بزرگ کار ساده‌ای نیست، به زمان احتیاج دارد. من در این‌جا ده توصیه برای برنامه‌نویسان تازه‌کار دارم که می تواند در طی کردن این مسیر به آن‌ها کمک کند.

۱- وقت بگذارید

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

۲- کد بنویسید، کد بنویسید

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

۳- توانایی‌های‌تان را گسترش دهید

 افراد با هم متفاوتند. پس نقاط قوت خودتان را پیدا کنید. هنر شما شاید حل مساله باشد یا آموزش به دیگران. یا حتی مثلا تمرکز عمیق و طولانی روی مفاهیم دشوار. بهترین نشانه برای دانستن این‌که در زمینه‌ای مهارت ویژه دارید این است که از انجام آن لذت می‌برید. به مرور زمان در سایر جنبه‌های کدنویسی نیز پیشرفت خواهید کرد.

۴- کار کردن با دیگران را یاد بگیرید

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

group-programming

۵- از دانش استفاده کنید، نه از جادو

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

۶- به غرایزتان اعتماد کنید

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

۷- با هرچه که در اختیار دارید کار کنید

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

۸- از انتقادها استقبال کنید

خودتان را فراموش کنید. این که کسی از کار شما انتقاد کند دردناک است. اما نادیده گرفته شدن از آن دردناک‌تر است. از دیگران بخواهید که شما را نقد کنند. کارهای‌تان را در معرض دید و استفاده عموم بگذارید و هر زمان توانستید، آن‌ها را منبع‌باز کنید. البته گه‌گاه با مریضی برخورد خواهید کرد که واقعا تلاش می‌کند شما را آزار دهد. مساله اصلا شخصی نیست. یاد بگیرید که نسبت به آن بی‌تفاوت باشید.

criticism

۹- هزینه‌های‌تان را پایین نگه دارید

کم‌هزینه بودن مهم است. یاد بگیرید که از لینوکس و یک کامپیوتر ارزان دست دوم استفاده کنید. استفاده از خط فرمان را یاد بگیرید. به زبان‌های کوچکی مانند C بچسبید و ترجیحا به سراغ زبان‌های عظیمی مانند ++‌C نروید. یاد گرفتن یک زبان بزرگ‌تر شما را برنامه‌نویس بهتری نمی‌کند!

۱۰- کارهای‌تان را منتشر کنید

کدهای‌تان را با اسم واقعی‌تان منتشر کنید. به عنوان یک مشارکت‌کننده در پروژه‌های منبع‌باز شرکت کنید. اگر شما را نخواستند، به دنبال پروژه‌هایی بگردید که شما را بخواهند! وجهه عمومی خوبی برای خودتان بسازید. به سراغ GitHub بروید. همه این‌ها در آینده رزومه شما را خواهند ساخت.


اگر این مطلب مورد پسندتان بود، بد نیست سری هم به مجموعه «پندهای یونیکسی استاد فو» بزنید.

‌BIRRC ابزاری احتمالا مفید برای بلاگرها

خلاصه

برای دوستانی که حوصله خوندن متن طولانی رو ندارند:

برنامه‌ای نوشتم که می‌تونه تعدادی فایل تصویری رو بگیره (در واقع عکس‌هاتون رو انتخاب کنید و بکشید روی آیکن این برنامه) و همه اون‌ها رو به فرمت jpg تبدیل کنه، ابعادشون رو به حداکثر ۸۰۰ پیکسل کاهش بده، کیفیت شون رو برای آپلود در وب تا حدود ۸۰ درصد پایین بیاره و بعد با اسمی که شما تعیین می‌کنید از نو نام‌گذاری‌شون کنه. این برنامه احتیاجی به نصب شدن نداره و می‌تونید از این‌جا دانلودش کنید.

به نظرم رسید که این ابزار می‌تونه برای خیلی از بلاگرها به دردبخور باشه. به همین دلیل گفتم این‌جا منتشرش کنم و در موردش بنویسم تا شاید هم به درد کسی بخوره و هم ایراد و اشکال‌هایی که خودم ندیدم، بهم نشون داده بشه.

پیش‌زمینه

برای سری پست‌های «دوز روزانه معماری» در وبلاگ معماری‌ام، به صورت مداوم به تغییر ابعاد و اندازه عکس‌ها، نام‌گذاری مجددشون براساس شماره پست (مثلا DDA-7-3 برای سومین عکس پست شماره ۷ دوز روزانه) و البته کاهش حجم‌شون (با کاهش کیفیت JPG تا ۸۰٪) نیاز داشتم اما:

۱- نام‌گذاری دسته‌ای ویندوز به خاطر اون پرانتزهاش به دردم نمی‌خورد.
۲- حوصله باز کردن همزمان چندتا عکس توی Paint.NET، تغییر ابعادشون و ذخیره مجدد با کیفیت پایین‌تر رو نداشتم.

به همین دلیل اول برای حل مشکل نام‌گذاری یه برنامه Batch Rename برای خودم نوشتم. بعد هم یک برنامه برای تغییر ابعاد و فرمت عکس‌ها و بعد تصمیم گرفتم هر دو برنامه رو با هم ادغام کنم و اسمش رو بگذارم BIRRC (مثلا سرنام Batch Image Rename,Resize and Convert) که خیلی هم خفن به نظر بیاید.

BIRRC

این برنامه رو به چند دلیل به جای پایتون (همراه با کتابخانه Pillow و شبه‌کامپایلر Pyinstaller) با Pure Basic نوشتم که بعدا توضیح می‌دم. خود برنامه رو می‌تونید از این‌جا دانلود کنید (فعلا فقط نسخه ۶۴ بیتی) و این هم کد برنامه است:

OpenConsole()
UseJPEGImageEncoder()
UseJPEGImageDecoder()
UseJPEG2000ImageDecoder()
UsePNGImageDecoder()
UseTIFFImageDecoder()
UseTGAImageDecoder()
Print("Enter the constant part of file name:")
constantPart.s=Input()
numberOfFiles.i = CountProgramParameters()
iterator.i = 1
itLength = Int(Log10(numberOfFiles))+1
For i=0 To (numberOfFiles-1)
currentFile.s =ProgramParameter()
im = LoadImage(#PB_Any , currentFile)
If ImageHeight(im) > 800 Or ImageWidth(im) > 800
If ImageHeight(im) > ImageWidth(im)
newHeight.i = 800
newWidth.i = (800 * ImageWidth(im))/ImageHeight(im)
Else
newWidth.i = 800
newHeight.i = (800 * ImageHeight(im))/ImageWidth(im)
EndIf
ResizeImage(im , newWidth,newHeight)
EndIf
;;;File Operation
DeleteFile(currentFile)
newFile.s = GetPathPart(currentFile) + constantPart + RSet(Str(iterator), itLength ,"0") + ".jpg"
SaveImage(im , newFile,#PB_ImagePlugin_JPEG,7)
iterator = iterator + 1
Next

دلیل استفاده نکردن از پایتون هم این بود که اولا نصب Pillow و Pyinstaller روی آخرین نسخه پایتون (3.5) کاری ملال‌آوره و دوم این‌که فایل اجرایی حاصل هم حجم زیادی در حد ۸ مگابایت (در مقابل ۸۰۰ کیلوبایت فعلی) داشت.

شیوه استفاده

برنامه احتیاجی به نصب نداره. هرجا خواستید کپی‌اش کنید. اما برای راحتی کار می‌تونید یک shortcut براش روی دسک‌تاپ درست کنید. حالا فایل‌های تصویری موردنظرتون رو انتخاب کرده و روی این برنامه یا shortcutاش بکشید و رها کنید.

Drag-and-Drop

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

Consoleو تمام. فایل‌های شما به فرمت jpg تبدیل می‌شن، اسم‌شون تغییر می‌کنه و کیفیت‌شون هم کم میشه تا حجم فایل‌شون پایین بیاد. توی همین نمونه مثلا حجم عکس‌ها از حدود ۳ مگابایت رسیده به ۶۷ کیلوبایت و اسم‌شون هم به BIRRC-1 تا BIRRC-5 تغییر کرده.

Finished

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

باگ‌ها

من برنامه‌نویس حرفه‌ای نیستم. به همین دلیل ممکنه ایرادهای اساسی توی این برنامه وجود داشته باشه که خوشحال می‌شم بهم اعلام‌شون کنید. به همین دلیل این برنامه رو بدون تست کردن و آزمایش کافی برای کارهای اصلی و روزمره استفاده نکنید. به هر حال دو تا باگ اصلی که الان داره اینه که:

۱- اگر عکس‌های شما از دوربین اومده باشند و توی EXIF عکس‌ها متادیتای دوران دوربین وجود داشته باشه (دوربین روی عکس زاویه گرفته شدن رو ثبت کرده باشه)‌ عکس بعد از تغییر اندازه دوران می‌کنه و ۹۰ درجه می‌چرخه.

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


به هر حال اگر از BIRRC استفاده کردید و خوش‌تون اومد یا به هر دلیلی مشکلی داشت و به درد نخورد یا هر چیز دیگه‌ای خوشحال می‌شم بهم اطلاع بدید.

نوستالژی: زمانی که مردها هنوز مرد بودند! (بخش پایانی- هک‌های عمیق‌تر)

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


برنامه‌نویسی پیشرفته با Commodore 64 Programmers Reference Guide

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

c64-ProgrammersReferenceGuide

اما برخلاف ظاهر بدترکیب و مدت کوتاهی (کمتر از یک هفته) که آن را در اختیار داشتم، این کتاب تاثیر بسیار شدیدی روی دانش من از کامپیوتر (در مقیاس آن دوران) گذاشت. Commodore 64 Programmers Reference Guide در واقع کتاب مقدس برنامه‌نویسان کمودور بود:

مرجعی کامل برای درک کامل یک کامپیوتر.

چیزی که بعید می‌دانم در دنیای کنونی ما برای یک گوشی کوچک موبایل هم وجود داشته باشد. با این کتاب تازه فهمیدم که چیزی به اسم زبان ماشین هم وجود دارد. مفهوم IRQ و عملکردهای بیتی AND و OR را فهمیدم و مفاهیم پوینتر و ذخیره آدرس دو بایتی و بسیاری چیزهای دیگر را درک کردم. بارهای اولی که بازی‌های کمودور را LOAD می‌کردم با تصور این‌که با خواندن کد برنامه می‌توانم آن را درک کنم و تغییر دهم، دستور LIST را اجرا می‌کردم تا برنامه بازی را ببینم و غالبا تنها با یک خط روبرو می‌شدم:

10 SYS 2061

بعد از خواندن کتاب تازه فهمیدم کل برنامه بازی به زبان ماشین در حافظه سیستم بار شده و این دستور تنها کنترل اجرا را به روالی در آدرس 2061 منتقل می‌کند. اما چرا 2061؟

صرفه‌جویی در حافظه، برنامه‌ای که خودش را تغییر می‌داد

در همین کتاب خواندم که کمودور باز هم برای صرفه‌جویی در حافظه، هیچ‌گاه مانند کامپیوترهای دیگر سورس برنامه را به صورت متن نگه‌داری نمی‌کند. بلکه هر یک از کلمات کلیدی و عملگرها و غیره را با یک کد عددی یک بایتی جایگزین می‌کند. فکر می‌کنم شروع این اطلاعات از آدرس ۲۰۴۹ حافظه بود. به این ترتیب هر خط دستور مانند

10 FOR I=1 TO 100

به جای این‌که با احتساب فضاهای خالی ۱۷ کاراکتر جا بگیرد، تبدیل می‌شد به ۹ بایت کد. دو بایت برای شماره خط، دو بایت برای آدرس شروع خط بعدی، یک بایت کد FOR، یک بایت I، یک بایت علامت مساوی، یک بایت عدد ۱، یک بایت کد TO و یک بایت هم ۱۰۰. وقتی این را فهمیدم به این فکر افتادم که احتمالا می‌شود با چند دستور POKE و عوض کردن خانه‌های مناسب حافظه، خود کدهای برنامه در حال اجرا را عوض کرد به گونه‌ای که در هر بار اجرا عملکردی متفاوت داشته باشد.

escher-hands

برنامه‌ای برای این کار نوشتم و آنقدر با شماره خط‌ها و علامت‌های «:» اضافی (جدا کردن دستورات در یک خط) بازی کردم تا بالاخره تغییر محتویات آدرس‌ها Syntax برنامه را خراب نمی‌کرد. حالا برنامه‌ای داشتم که در یک بار اجرا عدد ۱ را چاپ می‌کرد و بار دوم عدد ۲ را و این کار را با متغیرها انجام نمی‌داد. سورس برنامه عوض می‌شد و اگر از آن LIST می‌گرفتم، هر بار لیستی جدید را به نمایش می‌گذاشت! البته هیچ کاربردی برای این برنامه متصور نبودم، اما همین الان با خواندن مطلب ویکی‌پدیا در مورد self-modifying code فهمیدم که چنین برنامه‌هایی می‌توانند کاربردهای جالبی داشته باشند!

احتمالا الان می‌توانید حدس بزنید که ۲۰۶۱ از کجا آمده است. برنامه بیسیک تنها برای این نوشته شده بود که برنامه اصلی بازی به زبان ماشین را صدا بزند. برنامه‌نویسان هم برای حداکثر استفاده از حافظه، روال‌های زبان ماشین را درست از اولین آدرس خالی بعد از کدهای بیسیک ذخیره کرده بودند.

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

کارتریج ACTION-VI : دنیای جدید

در جست‌وجوی یک کارتریج اسمبلر به کارتریج اکشن ۶ برخورد کردم (که باز هم مطابق دید عموم مردم از کمودور ۶۴ به عنوان یک کنسول بازی) برای «نسوز کردن بازی‌ها» مشهور شده بود. اما ابزاری بسیار قدرتمند بود و توانایی‌هایی بسیار بیشتر از اجرا کردن کدهای تقلب بازی‌ها داشت.

 

ActionReplay-6

این کارتریج یک برنامه اسمبلر سریع با خودش داشت. امکاناتی برای فرمت کردن و آماده‌سازی دیسکت‌ها، گرفتن نسخه‌های پشتیبان، دستکاری تنظیمات حافظه و نصب یک Fast Loader فراهم می‌کرد و از همه مهم‌تر سیستمی داشت که می‌توانست محتوای حافظه RAM کمودور را به اصطلاح فریز کرده و بعد از ویرایش خانه‌های دلخواه دوباره کمودور را وادار به ادامه کارش کند. یکی از کلیدهایی که بالای کارتریج می‌بینید (معمولا سمت راستی) دکمه ریست است و دیگری دکمه فریز کردن حافظه. تصویر زیر صفحه آغازین کمودور را هنگام زدن کلید ریست این کارتریج نشان می‌دهد.

ActionReplay6-ScreenShot

در این صفحه من هیچ‌گاه از گزینه CONFIGURE MEMORY سر درنیاوردم و از آن استفاده نکردم. اما در قسمت UTILITIES یک اسمبلر سریع و راحت وجود داشت که با آن اسمبلی را هم کمی تجربه کردم.

بالن هوای گرم، با سرعت نور

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

balloon

برای کند کردن سرعت برنامه دو حلقه تو در توی ۲۵۶ تایی خالی را برای تلف کردن وقت داخل حلقه اصلی بازی گذاشتم تا موفق شدم بالن را ببینم. اما باز هم بالن با سرعت نور قطر صفحه را طی می‌کرد و برنامه تمام می‌شد. به این فکر افتادم که برنامه ۸ وزیر را برای سرعت بالا با اسمبلی بنویسم ولی سواد واقعی من در اسمبلی به چند دستور JMP و CMP و ADD محدود می‌شد که برای برنامه‌ای پر از شرط و محاسبات مانند ۸ وزیر بسیار کم بود.

مالتی تسکینگ واقعی با IRQ

احتمالا می‌دانید که وقفه‌ها یا IRQ (سرنام Interrupt ReQuest) روال‌هایی هستند که به صورت منظم و در فواصل زمانی مشخص توسط پردازنده کامپیوتر اجرا می‌شوند.  دلیل این که وقفه نامیده می‌شوند این است که پردازنده در این فواصل زمانی برنامه در حال اجرا را متوقف کرده و روال‌های IRQ را اجرا می‌کند و دوباره به سراغ برنامه اصلی باز می‌گردد. استفاده از وقفه‌ها بیشتر به دردبرنامه‌نویس‌های سیستم می‌خورد که توسط آن‌ها تمام مدت ابزارهای جانبی را برای دریافت یا ارسال اطلاعات کنترل کنند یا در بازی‌ها و برنامه‌های بی‌درنگ (Real Time) شرط‌های حیاتی را به صورت مداوم چک کنند. مثلا سیستم پیش‌فرض کمودور از یکی ازهمین وقفه‌ها برای نمایش مکان‌نمای چشمک‌زن استفاده می‌کرد.

IRQ

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

هک آخر، بازی دوست‌داشتنی

و اما آخرین و از دید خودم جذاب‌ترین هکی که انجام دادم، به قابلیت فریز کردن حافظه کمودور توسط کارتریج اکشن ۶ مربوط بود و بازی Arkanoid که در قسمت اول از آن صحبت کردم. اندکی پس از شروع بازی، کلید فریز را می‌زدم و وارد منوهای اکشن ۶ می‌شدم. آن‌جا گزینه‌ای برای نسوز کردن بازی وجود داشت. سیستم کار به این شکل بود که یک بار محتویات حافظه را بررسی (یا ذخیره) می‌کرد. بعد از شما می‌خواست به بازی برگردید و عمدا یک بار ببازید و دوباره حافظه را فریز کنید. وقتی این کار را می‌کردید دوباره حافظه را چک می‌کرد تا ببیند محتویات کدام خانه‌ها عوض شده است. معمولا با همان یک بار و گه‌گاه با دوبار تکرار این فرآیند خانه‌ای که اعداد مربوط به «جان» کاراکتر بازی در آن ذخیره شده بود پیدا می‌شد و کارتریج از آن به بعد محتویات آن خانه را ثابت نگه می‌داشت. یعنی بازی شما دیگر نسوز شده بود!

arkanoid_level_10

اما باز هم بازی کردن ۳۲ مرحله Arkanoid با احتساب هر مرحله ۲ یا ۳ دقیقه، آن هم بدون SAVE کلی زمان می‌برد. هک اصلی این بود که من بعد از نسوز کردن بازی به سراغ محتویات حافظه تصویر می‌رفتم و آن‌ها را پاک می‌کردم. اگر خاطرتان مانده باشد در قسمت قبلی گفتم که پس‌زمینه‌ها و برخی اجزای بازی‌ها با فونت‌ها ساخته می‌شدند. من چیزی مانند دستور cls را اجرا می‌کردم و خلاص! همه آجرها از بین رفته بودند. فقط کافی بود در هر مرحله یک بار فریز کنم، حافظه تصویر را پاک کنم و بعد از برگشت به بازی عمدا بسوزم.

arkanoid_last_level
غول مرحله آخر

جان‌هایم که تمام نمی‌شد، اما بعد از سوختن و شروع مجدد مرحله، کامپیوتر متوجه می‌شد که تمام آجرها پاک شده و من به مرحله بعد می‌رفتم! تنها در برخی مراحل که حریف‌های متحرک هم وجود داشتند، مجبور بودم نهایتا ۵ یا ۶ ضربه موفق (به آن اسپرایت‌ها) بزنم تا آن مرحله هم تمام شود. فقط مرحله آخر بود که در ساخت غول آن از اسپرایت و آجر و غیره خبری نبود و این مرحله را باید حتما به صورت عادی رد می‌کردم. به این ترتیب من تقریبا در ۹۰ درصد اوقات بازی را تا آخر تمام می‌کردم و بلند می‌شدم! باید اعتراف کنم این کار به خصوص در جمع‌های فامیلی، باعث می‌شد حس یک گیک تمام عیار را داشته باشم!

پایان داستان

شاید شما هم کنجکاو باشید که بر سر این ابزار عزیز چه آمد! واقعیت چندان هم جذاب نیست! حدود سال ۸۱ بود، ده سال از خرید کمودور می‌گذشت و در دوران پادشاهی پنتیوم ۲ و ۳ مدت‌ها بود سراغش نرفته بودم. آن زمان هم هیچ‌گاه فکر نمی‌کردم چنین حس نوستالژیکی نسبت به این اولین کامپیوترم پیدا کنم. به همین دلیل آن را با همه کارتریج‌ها و نوارها و دسته‌های بازی در اصفهان به قیمت ۱۰۰۰۰ تومان فروختم. کاری که اکنون حس می‌کنم از انجامش به شدت پشیمانم!

c64_Pack


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

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

تا آن زمان، با ماشین‌های‌تان خوش باشید و لذت ببرید!

نوستالژی: زمانی که مردها هنوز مرد بودند! (بخش سوم- معنای قدیمی هک)

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

Glider

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


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

basic

به هر صورت این‌ها به یادماندنی‌ترین تجربه‌هایی هستند که من ۲۰ سال پیش با ابزار محاسباتی آن دوره داشته‌ام.

حلقه‌های تو در تو: هشت وزیر در یک بعدازظهر تابستانی

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

8-Queensهمان روز دست به کار شدم و الگویتم حل مساله را به ساده‌ترین و البته ابلهانه‌ترین شکل ممکن نوشتم. ۸ حلقه تودرتوی FOR که به ترتیب موقعیت وزیرها را در هر سطر مشخص می‌کرد. در نهایت در دل داخلی‌ترین حلقه کنترل می‌کردم که آیا این وزیرها یکدیگر را تهدید می‌کنند یا نه. با توجه به این که امتحان کردن این ۱۶ و خورده‌ای میلیون حالت برای کمودور با پردازنده ۴ مگاهرتزی و زبان BASIC V2 مدت مدیدی طول می‌کشید، برنامه را طوری نوشته بودم که با پیدا شدن اولین جواب تمام شود. به نتیجه رسیدن این برنامه یک ظهر تا شب تمام وقت گرفت و من بیش از هر چیز دیگری باید شکایت‌های سایر اعضای خانواده از اشغال بودن تلویزیون را تحمل می‌کردم! البته جواب هم چیزی گرافیکی مانند تصویر بالایی نبود، بلکه ۸ عدد بود که در ۸ سطر روی صفحه تلویزیون چاپ شد و آن‌ها را روی کاغذ یادداشت کردم.

هوش مصنوعی برای کمودور ۶۴؛ واقعا؟

هوش مصنوعی و کمودور ۶۴؟ این یکی دیگر برای خودم هم باور کردنی نبود. در آن سال‌ها مرکز آموزش انفورماتیک شرکت داده پردازی ایران سری کتاب‌هایی را در حوزه انفورماتیک منتشر می‌کرد. سه کتاب اول «انفورماتیک چیست؟»، «انفورماتیک در جهان» و «انفورماتیک از دیدگاه توسعه» نام داشتند. کتاب چهارم اما چیزی بسیار متفاوت بود.

AI-C64

کتاب «مبانی هوش مصنوعی برای کمودور ۶۴» ابتدا به تعریف هوش مصنوعی و صحبت از تورینگ و . . . می‌پرداخت و بعد به تدریج با جهت‌گیری به سمت بازی‌ها، رفتارها و خودگردان‌ها، پردازش زبان طبیعی، تشخیص الگوها و سیستم‌های مکاشفه‌ای برنامه‌های هوشمندتری را به نمایش در می‌آورد که همه با همان بیسیک بدوی کمودور ۶۴ نوشته شده بودند. معماهای کلاسیکی چون برج‌های هانوی، گشت زدن اسب روی صفحه شطرنج و چیزی شبیه برنامه مشهور الیزا (که قبلا هم در مورد آن نوشته‌ام) از جمله نمونه‌هایی هستند که خط به خط روی کمودور تایپ و اجرا کردم. هرچند از شیوه کار آن برنامه شبه لیزا نه آن زمان و نه حتی الان به درستی سر در نیاوردم. یکی از برنامه‌های دیگری که خاطره شفافی از آن دارم، برنامه‌ای بود که مشخصات یک لابیرنت را به صورت پر و خالی بودن خانه‌های یک صفحه شطرنجی می‌گرفت و با وارونه کردن کار (حذف خانه‌های بن‌ست به جای امتحان راه‌های باز) در نهایت مسیر درست را پیدا می‌کرد.

گرافیک: اشباح و کاراکترها

کمی بعد و البته در حین کار با برنامه‌هایی که فقط منطق برنامه‌نویسی‌شان مهم بود، به گرافیک و رنگ‌ها هم علاقه‌مند شده بودم. دوست داشتم حالا که منطق کار این سیستم را می‌فهمم، بتوانم برنامه‌هایم را با ظاهری جذاب‌تر و با رنگ و لعاب بیشتر همراه کنم. به همین دلیل تصمیم گرفتم به سراغ نوشتن یک بازی بروم. در کمودور ۶۴ وقتی می‌خواستید به سراغ گرافیک بروید، به دو چیز مختلف نیاز داشتید. تصاویر متحرک (کاراکترها، گلوله‌ها و . . . ) و تصویرهای ثابت یا همان پس‌زمینه‌ها.

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

Sprite-C64

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

SpriteEditor-C64اما من آن زمان با 180 خط برنامه بیسیک ادیتور اسپرایت خودم را نوشتم. این برنامه با جوی‌استیک کار می‌کرد و در سمت راست صفحه منویی برای انتخاب ابزار (نوشتن یا پاک کردن) و انتخاب رنگ داشت. البته به لحاظ گرافیکی از تصویر بالایی بسیار ضعیف‌تر بود! با حرکت جوی‌استیک نشانگر آن روی صفحه حرکت می‌کرد و با فشرده شدن تنها کلید جوی‌استیک خانه پر (یا خالی) می‌شد. بعد می‌توانستم اطلاعات این اسپرایت را ذخیره کرده و در بازی‌ام استفاده کنم. البته حتما باید اشاره کنم که بعد از تمام این کارها، هیچ‌وقت به نوشتن بازی یا حتی داستان آن نرسیدم!

اما مساله دوم پس‌زمینه‌ها بودند که به علت محدودیت‌های حافظه و امکانات پردازشی نمی‌توانستند تصاویر معمولی باشند. کمودور حالت گرافیکی و به اصطلاح بیت‌مپ هم داشت اما گرافیک بیشتر بازی‌ها از طریق دستکاری فونت‌ها و نوشتن متن روی صفحه نمایش بوجود می‌آمدند. چیزی شبیه به ASCII ART اما به شدت قدرتمندتر. برای درک بهتر، بد نیست اول نگاهی به PETSCII ها بیاندازید که معادل کدهای ASCII در کمودور بودند، بعد به این تصویر که کلیدهای کمودور را از نزدیک نشان می‌دهد دقت کنید.

C64-KeyboardCloseupبا نشانه‌هایی که کمودور به عنوان فونت و متن می‌شناخت، کافی بود اگر می‌خواهید دایره‌ای ترسیم کنید کلید کمودور را نگه دارید و در سطر اول U و I و در سطر دوم هم J و K را تایپ کنید تا با ترکیب چهار ربع دایره شکل شما کامل شود. حال اگر در نظر بگیرید که در کمودور ۶۴ می‌شد به سادگی علامت‌های کلیدها را تغییر داد و جایگزین کرد به تصویر کلی دست پیدا می‌کنید. هر بازی در ابتدا مجموعه‌ای فونت طراحی کرده و با آن‌ها صحنه بازی را می‌ساخت. مثلا یک کاراکتر را طوری تغییر می‌داد که با تکرار آن روی صفحه نمایش ظاهری شبیه آجر دیده شود و از آن برای ساخت یک دیوار استفاده می‌کرد. حال اگر قرار بود دیوار خراب شود کافی بود کاراکترها از روی صفحه نمایش پاک شوند! و البته اگر تا این‌جای مطلب را خوانده‌اید می‌دانید که کار با متن‌ها و کاراکترها برای کامپیوتر هزاران بار ساده‌تر از گرافیک است. کمی بعدتر می‌گویم که از این موضوع چطور برای تقلب در بازی Arkanoid استفاده می‌کردم.


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

تائوی برنامه‌‏نویسی

استاد می‏‌گوید:

هنگامی که سه روز بگذرد و برنامه‏‌ای نوشته نشود، زندگی معنای خود را از دست خواهد داد.

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