۱۳۸۸ مهر ۱۰, جمعه

چگونگی آموزش #C به یک فرد کاملا مبتدی

این سوال همیشه در ذهنم بوده که اگر یک شخص  کاملا بی تجربه (به شرط داشتن حداقل هوش، استعداد و علاقه ی لازم)، در ابتدای دهه ی سوم از زندگی خود و در سال 2009 تصمیم به یادگیری برنامه نویسی داشته باشد باید از کجا شروع کند؟ ما در اواخر دهه ی 70 خورشیدی از انواع Basic یعنی GWBasic و QBasic و غیره شروع کردیم و به صورت رویه ای برنامه نوشتیم بعد به زبان های حرفه ای تر _اما همچنان رویه ای_ مانند Pascal و سپس C رجوع کردیم و به مرور زمان به زبان های شی گرا مانند ++C و در حال حاظر به #C رسیدیم و در این مسیر گاهی اوقات بدون اینکه بدانیم، Reverse Engineering کردیم! کسی هم در آن زمان نمی توانست بگوید مسیر غلطی پیمودیم.

تجربه ی ما چیزی در حدود 9 سال زمان برده و اگر شخصی که اکنون تصمیم به یادگیری گرفته تصور کند که چنین زمانی لازم دارد تا یک برنامه نویس حرفه ای شود احتمالا از تصمیم خود بر خواهد گشت (مخصوصا اگر هم سن و سال ما باشد).

بهترین کتابی که در تمام عمرم در مورد آموزش توسعه ی نرم افزار و تفکر در این مورد دیدم کتاب آموزش برنامه نویسی شی گرا با ++C نوشته آقای رابرت لی فور (Robert Lafore) بوده. “در این کتاب فرض شده خواننده حتی با زبان C هم آشنایی ندارد… شاید این اشتباه باشد که برنامه نویس ابتدا زبان های رویه ای را بیاموزد و سپس به سمت شی گرایی برود. برنامه نویس باید از ابتدا به صورت شی گرا تفکر کند و برنامه های خود را از پایه به صورت شی گرا بنویسد”. به شخصه هرچه زودتر با این کتاب آشنا می شدم کمتر وقتم را هدر میدادم. اما اکنون که برنامه نویسان نوپا مایل به برنامه نویسی در زبان های سطح بالاتر و جدیدتر مانند #C هستند جای چنین کتابی برای این چنین زبان هایی خالی به نظر می رسد!

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

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

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

اگر بخواهم جمع بندی کنم به نظر من برای برنامه نویس شدن در کوتاهترین زمان و بهترین یادگیری، جدا از علاقه و سماجت و …، باید موارد زیر را هم در نظر بگیریم:

1. اول کاربرد، بعد یادگیری (اول سوال بعد جواب)

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

2. هرچیزی که می بینیم باید بتوانیم بسازیم یا حداقل بدانیم چطور بسازیم

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

3. از چیزهایی که نمی دانیم ترس نداشته باشیم در عین حال سعی کنیم به مرور از پشت صحنه ی هر اتفاق سر در بیاوریم

مثلا وقتی می بینیم یک Object از نوع Form در #C این همه متد و خصیصه دارد نگران نشویم و تمام وقت خود را صرف یادگیری همه آنها نکنیم چون به مرور زمان و حتی ناخواسته با بیشتر آنها آشنا خواهیم شد. و از طرف دیگر در موارد ساده تر مثلا وقتی با #C از دستور Console.Write(“test”) استفاده می کنیم سعی کنیم بدانیم که چه اتفاقاتی می افتد تا کلمه test روی مانیتور نمایش داده می شود. البته در این مورد باید از زیاده روی جلوگیری کرد و این کار به مرور انجام شود، وگرنه ممکن است از راه اصلی دور شویم. (اما وقتی که حرفه ای تر شدیم باید همه چیز را بدانیم تا یک توسعه گر موفق باشیم و در همه جا جایی داشته باشیم)

4. جمله معروف “از یک چیز همه چیز و از همه چیز یک چیز”

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