از المپیاد زیست تا ++Turbo C - داستان برنامه‌نویس شدنم

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

محیط خاطره‌انگیز ++Borland Turbo C!
محیط خاطره‌انگیز ++Borland Turbo C!

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

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

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

همون سال اول دبیرستان برای درس برنامه‌نویسی، دبیری داشتیم جوان (که فامیلیش یادم نمیاد) که دانشجوی کامپیوتر بود و برای ما ++C درس میداد. هم مسلط بود و هم نحوه‌ی تدریسش خوب بود. سی‌پلاس‌پلاس را توی محیط Borland Turbo درس میداد و خب از اونجایی که برای DOS طراحی شده بود جذابیت زیادی نداشت و کار باهاش کسل‌کننده و دشوار بود. اکثر بچه‌ها به مفاهیم برنامه‌نویسی مسلط بودن و تمرینات رو ذهنی حل میکردن و سختی اجرای کامپایلر Borland رو به خودشون نمیدادن.

اولین بار که خواستم ++Turbo C رو اجرا کنم چون کامپیوتر شخصی و لپ‌تاپم ۶۴بیتی بود (یا شایدم بخاطر یه مشکل دیگه) هرکار کردم اجرا نشد. بعد رفتم سراغ کامپیوتر شخصی قدیمیمون (با ۲۵۶ مگابایت رم!) که توی زیرزمین خونمون بود و داییم هر از چندگاهی روشنش میکرد و باهاش کار میکرد. فولدر کامپایلر Turbo رو باز کردم، روی آیکون اجراییش کلیک کردم و BOOOM! اجرا شد. با این که محیط کامپایلرش قدیمی و بدون امکانات خاصی بود، اما رنگ‌بندی آبی‌سفیدش حس خفنی داشت! و من که تازه داشتم با دنیای برنامه‌نویسی آشنا میشدم، این محیط بهم اعتماد به نفس میداد و حس میکردم دارم کار مهمی میکنم. و البته که حسم درست بود.

وداع با زیست‌شناسی

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

شروع عشق و حال

حالا که رشتمو انتخاب کرده بودم و خیالم راحت بود، شروع کردم به یاد گرفتن و بازی کردن با ابزارها و زبان‌های برنامه‌نویسی مختلف. یادمه که سی‌شارپ رو میپرستیدم و اون اوایل با WPF و Blend ساعت‌های زیادی رو میگذروندم و به هرجایی که میشد سرک میکشیدم. WPF تکنولوژی قوی‌ای بود و با استفاده از چیزی به نام XAML (که خیلی شبیه به XML) بود میشد رابط‌های گرافیکی پیچیده با انمیشین‌های مختلفی درست کرد. آشنایی من با XAML و شباهتش با HTML و ساختار طراحی UI در وب، تکه‌ای از پازل علاقه‌مندی من به وب بود. دنیای جذاب و جالبی بود و خوشحالم که شروع برنامه‌نویسیم با سی‌شارپ بود. اگرچه بعدا باهاش قهر کردم!

نمونه‌ی یه اپلیکیشن ساخته شده با WPF
نمونه‌ی یه اپلیکیشن ساخته شده با WPF

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

کم کم به دنیای وب علاقه‌مند شدم و شروع کردم به یادگیری HTML و PHP. خیلی برام سخت بود. مفاهیم ابتدایی وب رو نمیدونستم و کاملا گیج میزدم! نمیدوستم چی به چیه، سرور چیه، کلاینت چیه، این PHP چرا اینجوری اجرا میشه، چرا کدهای HTML رو باهاش قاطی میکنن! و خلاصه چندباری دنیای وب رو ول کردم و باز دوباره شروع کردم تا این که با کامل‌تر شدن ذهنیتم، PHP رو یاد گرفتم و عاشق وب شدم.

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

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

لینوکس رو پیدا کردم

لینوکس میترکونه!
لینوکس میترکونه!

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

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

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

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

دانشگاه

سه سال از وقتی که تصمیم گرفته بودم برم رشته‌ی ریاضی-فیزیک میگذشت. کلی چیز جدید یاد گرفته بودم و هر روز بیشتر از دیروز به این نتیجه میرسیدم که راهی که انتخاب کردم راه درستیه. سال کنکور خیلی کم درس خوندم. نتایج کنکور اومد و راضی بودم. مطمئنم بودم که میتونم توی یه دانشگاهی در جایی از خاک این کشور رشته‌ی کامپیوتر بخونم و همین برام کافی بود :)

در کل کمتر از ۴۰ تا انتخاب رشته کردم که از بهترین دانشگاه‌های تهران شروع میشد و تا دانشگاه قم تموم میشد. فقط مهندسی نرم‌افزار و IT رو انتخاب کردم. حتی سخت‌افزار هم نزدم! انتخاب یکی مونده به آخر که دانشگاه دولتی شهر محل زندگیم (کاشان) بود قبول شدم.

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

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

  • زبان انگلیسی رو یاد بگیر: حقیقت اینه که دنیای علوم کامپیوتر دنیایی جهانیه و زبان این دنیا زبان انگلیسیه. بنابراین مهم‌ترین پیش‌نیاز برای پیشرفت به عنوان یه برنامه‌نویس (شما بخونید مهندس نرم‌افزار، دانشمند داده و ...) تسلط حداقلی به زبان انگلیسیه.
  • مفاهیم اولیه و کلیدی رو بیاموز: اگرچه غرق شدن در مفاهیم میتونه خودش یه معضل باشه، اما نمیشه بدون دونستن نحوه‌ی کارکرد سیستم‌های مختلف و معماری اونها، با روش درست باهاشون کار کرد. بنابراین به نظر من در کنار یاد گرفتن ابزارهای کاربردی، مهمه که آدم نحوه‌ی کار اون ابزارها رو هم بدونه، حتی اگه خیلی ابتدایی و ناچیز.
  • تا میتونی چرخ‌ها را دوباره اختراع کن: بهترین توصیه‌ی من برای افزایش مهارت برنامه‌نویسی، اینه که سعی کن ابزارها، کتابخانه‌ها و اپلیکیشن‌هایی که دور و برت میبینی رو پیاده‌سازی کنی. این معناش این نیست که توی پروژه‌های مهم و واقعی، از کتابخانه‌ها و فریمورکهای بقیه استفاده نکنی و همش رو خودت بنویسی! معنیش اینه که یکی از بهترین تمرین‌ها برای برنامه‌نویسی، پیاده‌سازی کدهاییه که قبلا نوشته شده و ورودی‌ها و خروجی‌هاش مشخصه و تمرینت اینه که اون سیستم رو با زبان برنامه‌نویسی‌ای که میخوای یادبگیری پیاده‌سازی کنی.
  • با لینوکس دوست باش: قرار نیست همه‌ی برنامه‌نویسا فقط با لینوکس کار کنن و متعصبانه از بقیه‌ی پلتفرم‌ها دوری کنن. اما مهمه که با هر تکنولوژی‌ و پلتفرمی که کار میکنی، با لینوکس هم آشنا باشی و فلسفه‌ی طراحی اون رو بدونی. چون بخوای یا نخوای، دنیای گنو/لینوکس بخش مهمی از علوم کامپیوتره.
  • کنجکاو باش و قانع نشو: هیچوقت به چیزهایی که بلدی قانع نباش و همیشه بخشی از زمان روزانت رو به یادگرفتن اختصاص بده. هم یاد گرفتن چیزهای جدید و هم جزئیات عمیق‌تر درمورد چیزهایی که بلدی.
  • از متفاوت بودن نترس: دنیای مهندسی، دنیای خلاقیته و اگرچه در هر برهه زمانی یه سری راه استاندارد برای انجام یه کار مشخص وجود داره ولی همون راه‌های استاندارد یه زمانی جدید و غیرمتعارف بوده. آزمون و خطا بهترین معلم و خلاق‌ترین مهندسه.