تا حالا، چند باری پیش اومده که دور و بریام یا تو فضای مجازی ازم این سوالا رو بپرسن که:
چجوری هکر یا برنامهنویس بشم؟ برم سراغ برنامهنویسی موبایل یا سایت؟ اصلاً از کدوم زبان شروع کنم؟ چجوری برنامهنویس بشم و...
منم هر دفعه مجبورم اندازه یه رمان براشون توضیح بدم. البته از اینکه بتونم بهشون کمک کنم خوشحال میشم، ولی دیدم دیگه بجای تکرار شفاهی هر دفعه این رمان، یه بار به رشته تحریر درش بیارم و از این به بعد، هرکی درباره این چیزا از من سوال کرد، فقط یه لینک بهش بدم و خلاص و اگه باز هم بعدش سوالی داشت، اون موقع در خدمت باشم.
.
سن:
تا جایی که من دیدم، تو واقعیت، ما برنامهنویس بچه داریم، پیر هم داریم. خوب یه فرقهایی هست و نمیشه ردّشون کرد و مطمئناً اون فرد جوونه، وقت بیشتری داره ولی من دوست دارم اینطوری بگم که: ممکنه یه نفر ۶ سالش باشه و کامپیوتر و برنامهنویسی رو شروع کنه و با بیخیالی و شل گرفتن، تا آخر عمرش به جایی تو کامپیوتر و برنامهنویسی نرسه(حالا ممکنه تو جای دیگه موفق باشه. ). برعکسش هم اینه که یه نفر تو ۶۰ سالگی، تازه وارد این کار بشه و تو چند سال به موفقیت مدّنظرش برسه و تا ۹۵ سالگی هم عمر کنه. حالا من میگم که اگه اون فرد تو ۶۰ سالگیش، این کار رو شروع نکنه، تا آخر عمرش ممکنه حصرتش رو بخوره که چرا این کار رو نکرده.
.
امکانات:
در مورد امکانات هم اینطوری بگم که: یه رفیق داشتم که تا یه مدتی دسترسی به کامپیوتر نداشت و یه کیبورد داشت. با همون کیبورد، بطور خیالی کدهای کتابها رو مینوشت و جلو میرفت. بعدش تو خیالش به ارور هم میخورد :) (خودش برام تعریف کرد، شوخی هم نداشت. ). ولی جدا از اینا، توی گوشی یا حتی روی کاغذ هم میشه قسمت زیادی از کامپیوتر و برنامهنویسی رو یاد گرفت. چونکه برای خیلی از ابزارها، معادلش برای گوشی اومده و خیلی از بخشها هم اصلاً کدنویسی نیست و مطالعاتی و خوندنیه و میشه فایلش رو تو گوشی یا کتابش رو خوند.
.
رشته و تحصیلات:
در مورد تحصیلات هم این رو شنیدم و خودم دیدم که افرادی با تحصیلات تو رشتهی ادبیات، شیمی و یا با تحصیلات دبیرستان، توی عمل تونستن برنامهنویسای خوبی بشن. من که خودم رفتم کارشناسی مهندسی نرمافزار، تو دانشگاه اکثر مطالب تئوری بود و از هر زبان برنامهنویسی یه مقداری میگفتن و به نظر من، بیشتر برای آشنایی بود و حتی خود استادها میگفتن که شما باید کدنویسی رو خارج از دانشگاه و خودتون یاد بگیرین، چونکه تو دانشگاه وقت نمیشه که بخوایم این همه مطلب آموزش بدیم و توی دانشگاه، روش مهندسی کردن و طراحی درست نرمافزار رو قراره به شما یاد بدیم.
از دید خودم هم بخوام بگم، محیط دانشگاه یه مقداری کمک کرد که یه چیزایی یاد بگیرم، ولی بیشتر برام وقت خرید که سربازیم عقب بیفته و خودم بتونم مطالب رو یاد بگیرم. آخرش هم یه مدرکی میدن که به شخصه علاقهای بهش ندارم، ولی متأسفانه برای بعضیها از سواد و توانایی بیشتر ارزش داره. الآن اکثر همکلاسیهام، نمیتونن با یه زبان برنامهنویسی هم کد بزنن.
.
ریاضی و زبان، دو سر قیچی مرگ:
خیلیها رو دیدم که به علت ترس از این دوتا هیولا، بیخیال کامپیوتر و برنامهنویسی شدن که البته خودم هم یکی از اونا بودم، ولی خوشبختانه ترسم ریخت. میرسیم به اینکه چرا این دوتا اینقدر مهمن.
اوایل که کامپیوترها ساخته میشدن، اصلاً رشتهی مستقلی به عنوان علوم کامپیوتر یا نرمافزار وجود نداشت و در واقع محل تداخل علومی مثل ریاضی، فیزیک، شیمی و... بود و اینا بنیاد کامپیوتر رو میسازن که تو بخشهای مختلف سختافزار و نرمافزار استفاده شدن. گذشت و گذشت و گذشت تا رسید به الآن. الآن دیگه لزوماً نیاز نیست که شما ریاضیتون خیلی خوب باشه که از این مفاهیم بتونین سر در بیارین، چونکه مفاهیم سادّه سازی شده و شما برنامه رو مینویسین و باقی کارها رو خود سیستم انجام میده. ولی این هم یه چیز نسبیه و بستگی به خودتون داره که میخواین تا کجا پیش برین. مثلاً:(برای برنامههای عادی که خیلیها برای موبایل درست میکنن، معمولاً دونستن ۴ عمل اصلی ریاضی کافیه. ولی هرچی برنامه بزرگتر میشه و کارای سنگینتر و مهمتری میکنه، مثل مدیریت یه نیروگاه یا مدیریت اطلاعات خیلی زیاد، اونجاست که ریاضیات سطح بالا وارد صحنه میشه. یا مثلاً برای طراحی سختافزار، ریاضی و فیزیک و شیمی لازم میشه، اونم در سطح بالا. )
بعد از این هم میرسیم به دونستن زبان. خوب، الآن دیگه خیلی از آموزشها، فارسیش هم وجود داره و میشه چیزای ابتدایی و متوسط و حتی پیشرفته رو با کمترین مقدار زبان دونستن یاد گرفت. ولی دونستن زبان جایی نیاز میشه که بخواین چیزایی رو یادبگیرین که تو زبان فارسی نیست(غیب گفتم :/ ). مثلاً یادگیری یه زبان برنامهنویسی تازه که هنوز خیلی تو ایران یا حتی دنیا جا نیفتاده یا کارهایی که آموزش فارسی براش نیست یا حرکت روی لبهی فناوری. البته، اینا هم تا حدی راهحل داره که میشه استفاده از مترجمهایی مثل «گوگل ترنسلیت» یا مترجم زیرنویس یوتیوب رو مثال زد. تازه، بعد از یه مدتی کار کردن، معمولاً کمکم آدم بطور ناخودآگاه اصطلاحات تخصصی رو تا حدودی یاد میگیره.
.
چقدر طول میکشه:
بعد از این سوالا، یکی از سوالایی که ازم میپرسن اینه که یادگیری برنامهنویسی چقدر زمان میبره. منم میگم که جواب نداره. چونکه متغیرهای زیادی توی جواب مؤثره، مثل:(هدف شما از برنامهنویسی(یعنی تو چه حوزهای، به چه سطحی برسین)، زبان یا زبانهای موردنظرتون برای یادگیری، پیشزمینه شما از علوم و مهارت کامپیوتریتون، انگیره و حوصله، میزان وقتگذاشتن و تمرین کردن، منبع آموزشی و... ) . ولی اگه یه نفر خیلی اصرار کنه، من میگم که بین ۲ تا ۶ ماه برای یادگیری اولین زبان، زمان نیازه.
حالا منظورم از اولین زبان چیه. توی یادگیری اولین زبان، شما با خیلی از مفاهیم و الگوهایی آشنا میشین که توی اکثر زبانها تکرار میشن و فقط روش(نوشتار) انجامشون متفاوته و به همین علت، بعد از یادگیری اولین زبان، معمولاً سرعت یادگیری زبانهای بعدیتون بالاتر میره. مثلاً خودم ۲ سال طول کشید که اصول ++C رو تموم کنم. چونکه فقط برای اوایلش یه کلاس رفتم که خیلی گرون در میومد و مجبور شدم بقیهاش رو خودم از روی یه کتاب انگلیسی بخونم و هِی بیخیال میشدم و دوباره میرفتم سراغش و هر از گاهی میومدم برم سراغ کارای دیگه و همین باعث میشد که بین بخشهای مختلف کتاب، فاصله بیفته. ولی اگه بطور پیوسته در نظر بگیریم و این فاصلهها رو ازش کم کنیم، میشه گفت که برای من تقریباً ۶ ماه وقت گرفت که اولین زبان رو یاد بگیرم.
بعدش برای روی ریل افتادن و انجام پروژههای تمرینی و راهافتادن هم چند ماهی نیازه که مدت اون هم متغیره.
.
از کدوم زبان شروع کنم:
الآن برای از کجا شروع کردن، چندتا جواب دارم. اگه هدفتون از برنامهنویس شدن اینکه که فقط یه چیزی از برنامهنویسی یاد بگیرین و یه آشنایی مختصری با این مفاهیم پیدا کنین و یه ناخنکی به این رشته زده باشین، پیشنهاد من «پایتونه» چونکه کد خیلی سادّهای نسبت به بقیه زبانها داره. ولی اگه میخواین واقعاً مفاهیم رو از پایه یادبگیرین و آروم بیاین بالا و واقعاً تو برنامهنوبسی به جایی برسین، یا علاقهمندین ولی هنوز گرایشی برای آیندهتون انتخاب نکردین، پیشنهاد من «++C» که خیلی از مفاهیمی که تو زبانهای دیگه استفاده شده رو تو خودش داره و این باعث میشه که بعد از یادگیریش، یادگیری زبانهای بعدیتون خیلی راحتتر بشه. حالت بعدی هم اینه که فقط دلتون میخواد که برین سراغ طراحی سایت یا ساخت برنامه برای اندروید یا بازی برای ویندوز که دیگه یه راست میرین سراغ اون زبانها و مفاهیم.
.
چندتا زبان باید یادبگیرم:
حقیقتش، این مورد هم جواب خاصی نداره و بستگی به خودتون داره. خیلیها میگن که بهتره روی یه مبحث بطور تخصصی کار کنین و روی یک یا چند زبان مرتبط با اون موضوع تمرکز داشته باشین و یه مقداری هم از زبانها و فناوریهای دیگه بدونین تا در صورت نیاز، بتونین از اونها هم استفاده کنین یا برین سراغ یادگیریشون. دونستن ۴-۵ تا زبان هم چیز عادی محصوب میشه.
این رو هم بگم که تو خیلی از موارد میشه از یه زبان، برای انجام کارهای مختلف استفاده کرد. مثلاً هم باهاش بازی ساخت، هم برنامه برای موبایل یا کامپیوتر ساخت، هم سایت ساخت و... و یا اینکه برای یه سیستم، با زبانهای مختلفی برنامه نوشت که هر زبان، میتونه یه سری برتری یا کاستیهایی نسبت به بقیهی زبانها داشته باشه که اون هم بستگی به ساختار اون زبان و نوع اجراش تو سیستم و... داره.
.
یه زبان رو چجوری تو جاهای مختلف استفاده میکنن:
اینطوریه که وقتی شما یه زبان رو یاد میگیرین، مثل اینه که اصول و اسکلت یه کاری رو یاد گرفتین. حالا اگه بخواین از همون زبان برای کارهای مختلف استفاده کنین، خیلی پیش میاد که نیاز بشه که یه سری مهارتهای جانبی هم در کنار اون زبان یاد بگیرین تا بتونین در مجموع، اون کار رو با اون زبان انجام بدین.
.
یادگیری کِی تموم میشه:
سوال بعدی اینه که تا کی باید این چیزا رو یاد بگیرین و من برای این یکی یه جواب سر راست دارم «وقت گل نِی :) » حقیقتش هم اینه که اگه واقعاً میخواین وارد این میدون بشین، دیگه تمومی براش نیست و مجبورین که همیشه خودتون رو بروز نگه دارید. چونکه مرتباً داره زبانها و نرمافزارها و قابلیتهای جدید معرفی میشن و یا همون مطالب قبلی اصلاح یا بهبود داده میشه و اگه میخواین که تو میدون بمونین، مجبورین که اونا رو یادبگیرین. ولی این مژدگانی رو هم میدم که وقتی مفاهیم کلّی(مثلا همون اولین زبان) رو یاد بگیرین، یادگیری چیزای جدید خیلی آسون میشه.
.
منابع آموزشی چی استفاده کنم:
برای این مورد، جواب خیلی سر راستی ندارم، چونکه بستگی به خودتون و زبان مورد نظرتون داره. ولی با گشتن تو اینترنت میتونین کلّی آموزش رایگان و پولی به صورت کتاب یا سایت یا فیلم گیر بیارین. ببینین بیشتر با کدونشون راحتترین و ادامه بدینش. اگه هم تو هر آموزش، یه بخشی رو خوب متوجه نشدین، برای اون بخش، از آموزشهای دیگه کمک بگیرین یا تو اینترنت بگردین. این هم یادتون بمونه که آموزش بهتر و بدتر داریم، ولی هیچ آموزشی کامل نیست و خودتون رو زیاد درگیر اینجور چیزها نکینین.
.
الگوریتم و فلوچارت و حل مسئله:
اگه بخوام این سهتا کلمه رو باز کنم و همینجا توضیح بدمشون، دنیایی میشه. ولی خلاصهشون این میشه که: الگوریتم و فلوچارت، روشهای مرحله به مرحلهی حل مسئلهان که قابل تبدیل شدن به کد هستن. مثلاً برای جمع دو عدد، میگه که باید اول یه عدد بگیریم، بعدش یه عدد دیگه بگیریم و بعدش این دوتا ورودی رو با هم جمع کنیم. در کل اگه این بخشتون(توانایی حل مسئلهتون) قوی بشه، خیلی روی عملکرد و یادگیریتون تأثیر داره. این هم بگم که عملاً کدنویس با برنامهنویس متفاوته و برنامهنویس کسیه که برنامه رو طراحی میکنه و کدنویس کسیه که بر طبق اون برنامه، کدهای پروژه رو مینویسه. ولی خیلی پیش میاد که برای پروژههای کوچیک و متوسط، این کارها رو یک یا چند نفر به صورت مشترک انجام بدن و هم برنامهنویس باشن و هم کدنویس و به همین علت، دیگه خیلی پیش میاد که از این کلمات بجای هم استفاده بشه.
این رو هم بگم که بطور کلی و نظری، طراحی یا الگوریتم برنامه از کد و زبان استفاده شده برای پروژه جداست و روی کاغذ، میشه الگوریتم رو با زبانهای مختلف پیادهسازی(کدنویسی) کرد. ولی باز تو عمل و دنیای واقعی، دقیقاً اینطور نیست.
.
مستندات فراموش نشه:
یه مفهوم دیگه هم داریم به اسم مستدات که در کل به این معنیه که برنامهنویس یا کدنویس بنویسه که چرا برای هر بخش از کد یا برنامه، فلان کار رو کرده تا اگه خودشون یا یه شخص دیگهای در آینده خواست روی کد کار کنه، بتونه ازش سر در بیاره و گیج نشه. البته، زیاد پیش میاد که افراد برای پروژههای شخصی مستندات نمینویسن، ولی وقتی بعد از ۶ ماه به کد خودشون نگاه میکنن، عین چی پشیمون میشن :)
.
روشهای درآمدی و کارها:
روشهای کسبدرآمد از برنامهنویسی متنوعه. ممکنه شما اینا رو یاد بگیرین که بیاین سایت یا برنامه یا بازی خودتون رو بنویسین و از اون درآمد کسب کنین یا خودتون اینا رو آموزش بدین و از اون روش کسب درآمد کنین یا بصورت آزادکاری پروژه بگیرید و انجام بدید یا برای یه شرکت، برنامهنویسی کنین یا برای قطعات یا بُردها(مثلاً لباسشویی یا عروسک) برنامه بنویسین یا برین تو کار توسعهی سیستمعامل یا حتی ساخت یه زبان برنامهنویسی جدید یا یه پروتکل جدید و... .
.
مهارتهای جانبی:
یه سری مهارتهای جانبی هم هست که کلاً دونستنشون خوبه. مثلاً دونستن پایگاهداده یا لینوکس یا گیت یا شبکه و... که باز هم بستگی داره چیکار بخواین بکنین. مثلاً گیت توی پروژههای کوچیک و متوسط به بزرگ، کاربرد داره. گیت برای خودش دنیاییه، ولی اگه بخوام خلاصه بگم، اینه که یه ابزار نرمافزاریه که برای مدیریت نسخههای مختلف پروژه میشه ازش استفاده کرد که بدونیم چه تغییری رو کِی توی کد اعمال کردیم و یا مثلاً مشکلات و باگها کِی تو پروژه به وجود اومدن.
.
میرسیم به چیزی که خیلیها تو کفِشن، یعنی هکری:
طرف میاد ازم میپرسه میخوام هکر بشم. من هم بهش میگم: منم یه موقعی، خیلی آتیش داشتم که یهویی تو یه مدت کوتاه هکر بشم، ولی زهی خیال باطل :) .
تو هک و نفوذ و امنیت و اینجور چیزها، کلاً دو نوع آدم داریم. یا واقعاً آدم وقت میذاره و از پایه مباحث رو یاد میگیره و قدم به قدم میره جلو، یا فقط یه سری روش و تکنیک یاد میگیره و با همونا کیف میکنه و خوشحاله که هکره، در صورتی که درکی از عمق و مفهوم کارهایی که میکنه نداره.
یه هکر واقعی، کسیه که سیستم و نرمافزارها و حتی شبکه و سختافزار و... رو خوب میشناسه و علت به وجود اومدن حفرههای امنیتی رو میدونه یا پیدا میکنه(اینی که دلیلشون رو هم پیدا میکنه دیگه هکر نخبه است) و اینکه پشت کدها داره چه اتفاقی میفته. در اصل هم معنی کلمه «هکر» بد جا افتاده و هکر کسیه که سیستمها رو خوب میشناسه که میتونه از اونا برای انجام کارهای غیر معمول که بقیه اون کار رو نمیکنن استفاده کنه که یه موردش میتونه نفوذ به سیستم هم باشه. یه مثال از هک کردن توی دنیای واقعی اینه که بخوای یه پیچ رو باز کنی، ولی پیچگوشتی نداری و با یه وسیلهی دیگه پیچ رو باز میکنی.
هک و نفوذ و امنیت هم برای خودش کلّی شاخه داره و واقعاً یه نفر باید اهل دل باشه که توی همهی اونا به تخصص برسه. چونکه هم وقت زیادی از آدم میگیره و هم حوصله و علاقهی زیادی میخواد و به همین دلیل، پیش میاد که افراد فقط سراغ یک یا چندتا از این گرایشها میرن، مثلاً امنیت شبکه و یا مهندسی معکوس و... .
از هک هم میشه عین بچهی آدم و بصورت قانونی پول درآورد که چندتا از نمونههاش کشف باگ نرمافزارها و گزارش اونها به شرکتهای سازنده است یا بررسی نفوذپذیری شرکتها یا اماکن(به درخواست خود شرکت یا اون مکان) یا نظارت بر امن نوشتن نرمافزار که بعد از انتشار، باگ امنیتی نداشته باشه و... .
دونستن امنیت، برای یه برنامهنویس هم میتونه خیلی مفید باشه، چونکه بهش کمک میکنه که برنامههای امن بنویسه و بعداً ازش مشکل امنیتی در نیاد.
.
هکر/برنامه نویس خفن:
توی اکثر فیلمها(ایرانی و خارجی هم نداره)، وقتی میخوان یه برنامهنویس یا هکر رو نشون بدن، میان یه یارویی رو نشون میدن که شونصد کلمه در ثانیه رو حفظی و بدون یدونه غلط تایپ میکنه و یه فاز خیلی خفن هم داره(توضیحات بیشتر نمیدم، خودتون دیگه میدونین چی میگم). ولی تو واقعیت، معمولاً اینطور نیست و خیلی پیش میاد که یه برنامهنویس به مشکل بخوره و تو اینترنت دنبال جواب بگرده یا از بقیه کمک بگیره. اون تعدادی هم که حفظی همهچیز رو تایپ میکنن، ببینین دیگه چند وقته که دارن تخصصی رو اون زمینه کار میکنن که دیگه تکتک دستورات رو حفظ شدن. خلاصه که هر وقت این چرندیات رو تو فیلمی میبینم، حتی اگه فیلمش خیلی جدی هم باشه، بازم خندهام میگیره :)
.
هکر/برنامهنویس منزوی و شبزی:
خیلی جا افتاده و اینور و اونور میبینیم که هکرها یا برنامهنویسها، موجوداتی منزوی و شبزی هستند. از همین رسانه میخوام اعلام کنم که غلطشون رو کردن. ممکنه در کل این موارد یه مقداری تو برنامهنویسها بیشتر از عموم مردم باشه، ولی هیچ اصلی وجود نداره که چون هرکی هکر یا برنامهنویسه، پس حتماً اینطوریه. تحقیقات هم ثابت کرده که این کارها برای سلامتی خوب نیست. خلاص که از این کارا نکنین. ما قراره واقعاً برنامهنویس باشیم، نه اینکه ادای فیلمها رو دربیاریم.
.
این همه براتون داستان گفتم که برسم به این جمله که: تا وقتی خودتون نپرین تو آب، من هر چقدر هم از شنا کردن براتون بگم، باز هم شنا کردن رو یاد نمیگیرین و خودتون باید تجربهاش کنین.
.
آخر سر هم یه چیزی میخوام بگم که شاید ترستون از کارای کامپیوتری بریزه.
تا حالا فکر میکردی که با چقدر هزینه میتونین یه سایت شخصی برای خودتون راه بندازین؟ ۵۰۰ هزار تومن یا ۱۰ میلیون تومن؟
الآن که دارم این متن رو مینویسم، یه چیزی تو مایههای این سایت، تقریباً ۵ یا نهایتاً ۱۰ هزار تومن سالانه خرج داره و چند ساعت کار کردن روش برای ریختن یه سری فایل برنامه داخل هاست(سرور) و یه سری خردهکاریهای دیگه.
تو خیلی از موارد هم میشه از نرمافزارهای رایگان استفاده کرد و حتی یک خط کد هم نیاز نیست که بنویسید و تغییر بدید.
پس دیدید. خیلی چیزای دیگهی کامپیوتر و دنیای اطرافمون هم همینطوریه و چونکه فقط نمیدونیمشون، ازشون میترسیم. پس بریم تو دل ترسهامون که با دور موندن ازش، چیزی عایدمون نمیشه :) .
.
توی اینجا هم ماجرای اومدنم سمت دنیای کامپیوتر و برنامه نویسی رو نوشتم و اگه دوست داشتین، میتونین بخونینش.
.
شخصاً ادعایی دربارهی برنامهنویسی یا کدنویسی ندارم و وقتی به چیزهایی که میدونم و نمیدونم نگاه میکنم، حقیقتاً میبینم که یه کدنویس تازه کارم.
.
ارادتمند شما، کدنویس تازه کار مهیاد