عنوان: خودآموز برنامه نویسی در 10 سال

عنوان اصلی : Teach Yourself Programming in Ten Years

ترجمه: مهدی عسگری
نویسنده: Peter Norvig

خلاصه: در این مقاله Peter Norvig (نویسنده ی کتاب معروف هوش مصنوعی مورد استفاده در اکثر دانشگاه های جهان) در مورد پدیده و تب یادگیری سریع برنامه نویسی صحبت کرده و نشان می دهد که برای تخصص در برنامه نویسی بر خلاف کتاب های عامه پسند (آموزش در 21 روز ، 24 ساعت ، ...) حداقل 10 سال زمان و کار لازم است تا یک نفر به تخصص برسد (در هر رشته ای ، نه فقط یرنامه نویسی)

چرا همه این قدر عجله دارند ؟
تو هر کتاب فروشی که بروید ، کلی کتاب می بینید که می خواهند در چند ساعت یا چند روز به شما کامپیوتر یا برنامه نویسی یاد بدهند (از ویندوز و اینترنت گرفته تا ویژوال بیسیک و جاوا و ...) من جستجوی زیر را در آمازون انجام دادم:
pubdate: after 1992 and title: days and
(title: learn or title: teach yourself)
یعنی کتاب هایی که از سال 1992 تا الان چاپ شده و در عنوانشان کلمات days و "یادگیری یا خودآموز" وجود دارد. نتیجه شامل 248 مورد بود. (مترجم: اعداد و آمار منتشر شده در این مقاله مربوط به سال 2001 هستند. ) 78 کتاب اول کتاب های مربوط به کامپیوتر بودند. عبارت days را با hours جایگزین کردم ؛ نتایج مشابه قبلی بود: 253 مورد که 77 تای اول در مورد کامپیوتر بودند. از 200 کتاب صدر نتایج جستجو (در کل) 96 درصد مربوط به کامپیوتر بود.
خلاصه این که یا مردم خیلی عجله دارند که در مورد کامپیوتر ها چیز یاد بگیرند یا هم که یادگیری کامپیوتر خیلی آسان تر از یادگیری چیزهای دیگر است. وگرنه هیچ کتابی در مورد بتهوون ، یا فیزیک کوانتوم یا حتی تربیت سگ ، در چند روز وجود ندارد.
خب ببینیم عنوانی مثل "آموزش پاسکال در 3 روز" چه معنی ای دارد:
  • یادگیری: در 3 روز شما وقت کافی برای نوشتن چند برنامه ی مهم و یادگیری از موفقیت ها و اشتباهاتتان و همینطور وقت برای کار کردن با یک برنامه نویس با تجربه را نخواهید داشت. خلاصه ، وقت کافی برای یادگیری چندانی نخواهید داشت. در واقع این کتاب ها بیشتر در مورد یک آشنایی کلی بحث می کنند نه درک عمیق از موضوع. به قول آلکساندر پوپ: "یادگیری سطحی ، چیز خطرناکی است"
  • پاسکال: در 3 روز شاید بتوانید سینتکس پاسکال را یاد بگیرید (ان هم به شرطی که قبلا با یک زبان مشابه کار کرده باشید) اما زیاد نمی توانید درباره ی کاربرد زبان یاد بگیرید. یعنی اگر قبلا با بیسیک برنامه نویسی کرده باشید ، یاد می گیرید که برنامه ها را در پاسکال ولی با روش بیسیک بنویسید اما نقاط ضعف و قوت پاسکال را یاد نمی گیرید. به قول آلن پرلیس: "زبانی که طرز فکر شما را درباره ی برنامه نویسی تغییر ندهد ، ارزش یادگیری ندارد". ممکن است شما بخواهید قسمتی از پاسکال (یا هر زبان دیگری) را یاد بگیرید تا بتوانید از ابزار خاصی استفاده کرده و کار مشخصی را انجام دهید؛ در این صورت دیگر برنامه نویسی یاد نمی گیرید ، بلکه یاد می گیرید چطور ان کار مشخص را انجام دهید.
  • 3 روز: همانطور که در بخش بعدی می بینید ، این مدت کافی نیست.


آموزش برنامه نویسی در 10 سال
محققان (1) نشان دادند که برای متخصص شدن در بسیاری از زمینه ها (از شطرنج گرفته تا آهنگ سازی ، اپراتوری تلگراف ، نقاشی ، نواختن پیانو ، شنا ، تنیس ، عصب شناسی ، ...) حدود 10 سال زمان لازم است. نکته ی مهم انجام کار پیوسته و با توجه است ، نه صرفا کاری را مدام تکرار کردن ، بلکه به چالش کشیدن خودتان با کارهایی که فراتر از توانایی فعلی تان است و تحلیل کارایی تان قبل و بعد از انجام ان کار و اصلاح اشتباهاتتان. و بعد تکرار کنید. و دوباره تکرار کنید. هیچ میانبری وجود ندارد: حتی موزارت که در 4 سالگی اعجوبه ای در موسیقی بود ، 13 سال طول کشید تا بتواند اولین کار حرفه ای و جهانیش را بسازد. گروه موسیقی بیتلز در سال 1964 با وارد شدن به صحنه ی موسیقی اکثر کارهایشان جزو کارهای محبوب (و به قولی "نامبر وان") بودند ولی فراموش نکنید که اعضای گروه از سال 1957 در کلوب های کوچک لیورپول و هامبورگ فعالیت می کردند و اولین موفقیت بزرگشان (Sgt. Peppers) در سال 1967 عرضه شد. در یک مطالعه بر روی دانش آموزان در آکادمی برلین ، محققان اعضای برتر ، متوسط و پایین کلاس را مقایسه کرده و از آن ها پرسیدند که چقدر تمرین کرده اند:
همه (از هر سه گروه) نواختن را از حدود 5 سالگی شروع کرده و در سال های اول هر کس به یک میزان فعالیت می کرد (حدود 2 یا 3 ساعت در هفته) اما در حدود 8 سالگی تفاوت های واقعی نمایان شد. کسانی که در کلاس هایشان بهترین بودند ، بیش از بقیه تمرین می کردند: 6 ساعت در هفته در سن 9 سالگی ، 8 ساعت در 12 سالگی ، 16 ساعت در 14 سالگی و الی آخر تا سن 20 که هفته ای بیش از 30 ساعت کار می کردند. در سن 20 سالگی افراد برتر نزدیک به 10000 ساعت از عمرشان را به تمرین گذرانده بودند. دانش اموزان رده بعدی حدود 8000 ساعت و دانش اموزان معمولی (معلمین موسیقی در آینده!) حدود 4000 ساعت.
شاید هم 10000 ساعت ان عدد جادویی باشد نه 10 سال. به نظر ساموئل جانسون (1709-1784) زمان بیشتری لازم است: "برتری در هر رشته ای فقط با یک عمر کار به دست می آید و با قیمت کمتری قابل خرید نیست" و اما دستورالعمل من برای موفقیت در برنامه نویسی:
  • به برنامه نویسی علاقه داشته باشید. اطمینان حاصل کنید که انقدر از برنامه نویسی لذت می برید که حاضر باشید 10 سال از عمرتان را صرفش کنید.
  • با برنامه نویسان دیگر ارتباط داشته باشید. کد برنامه های دیگر را مطالعه کنید. این خیلی مهم تر از هر کتاب یا دوره ی آموزشی است.
  • برنامه بنویسید. بهترین نوع آموزش ، انجام دادن است. در واقع حداکثر سطح کارایی برای افراد در هر رشته ای ، به طور خودکار با تجربه ی بیشتر حاصل نمی شود بلکه نیاز به تلاش تعمدی برای بهبود دارد.
  • می توانید تحصیلاتتان را در دانشگاه هم ادامه بدهید. این کار باعث می شود از رشته تان درک عمیق تری به دست آورده و همچنین به کارهایی مشغول شوید که نیاز به مدرک دانشگاهی دارند. البته اگر از مدرسه و درس لذت نمی برید ، می توانید تجربه ی مشابهی را در کار کسب کنید (البته با تلاش بیشتر) Eric Raymond در دیکشنری هکر ها می گوید: "مطالعه و تحصیلات آکادمیک در رشته ی کامپیوتر یک شخص را تبدیل به یک برنامه نویس حرفه ای نمی کند ، همانطور که یک فرد فقط با مطالعه ی رنگ و قلم مو نمی تواند نقاش شود". یکی از بهترین افرادی که در عمرم استخدام کردم (Jamie Zawinski) ، فقط تا دبیرستان درس را ادامه داده بود؛ با این وجود این شخص نرم افزار های خیلی خوبی تولید کرده (موزیلا و xemacs) و گروه خودش را در googlegroups دارد و حتی انقدر پول دراورد که بتواند یک کلوب شبانه بخرد.
  • روی پروژه های تیمی کار کنید. در بعضی از پروژه ها بهترین و در بعضی دیگر بدترین برنامه نویس باشید. وقتی بهترین هستید توانایی های خودتان به عنوان یک رهبر گروه را تست کرده و به دیگر افراد الهام می دهید. وقتی هم که بدترین باشید یاد می گیرید که حرفه ای ها چه کار می کنند و همچنین چه کارهایی را دوست ندارند انجام دهند (چون این کارها را می سپارند به شما!)
  • روی پروژه های دیگران کار کنید. برنامه هایی که دیگران نوشتند را مطالعه کنید. سعی کنید باگ های برنامه های دیگران را رفع کنید. به این فکر کنید که چطور برنامه هایتان را طراحی کنید که کار کسانی که می خواهند ان را نگهداری کنند آسان تر شود.
  • کلی زبان برنامه نویسی یاد بگیرید. یک زبان که از شی گرایی و کلاس ها پشتیبانی کند (مثل جاوا یا سی پلاس پلاس) ، یک زبان تابعی (مثل لیسپ یا ML) (م: یا Haskell) ، یک زبان اعلانی (مثل پرولوگ یا قالب ها در سی پلاس پلاس) ، یک زبان که از coroutine ها پشتیبانی کند (مثل Scheme یا Icon) (م: امروزه زبان های دیگری از جمله سی شارپ هم coroutine را دارند) و یک زبان که از برنامه نویسی موازی پشتیبانی کند (مثل Sisal) (م: و Erlang)
  • یادتان باشد که ما با کامپیوتر سر و کار داریم. بدانید که چقدر طول می کشد تا کامپیوترتان یک دستورالعمل را اجرا کند، یک کلمه را از حافظه واکشی کند (در هر دو حالت وجود و نبودش در کش) ، کلماتی متوالی را از دیسک بخواند ، یا به یک مکان از دیسک برود (seek) (م: منظور نویسنده آشنایی با معماری کامپیوتر است. آقای Stroustrup خالق سی پلاس پلاس هم روی این نکته تاکید دارند)
  • درگیر استاندارد سازی یک زبان شوید. حالا می تواند کمیته ی ANSI C++‎ باشد یا استاندارد شخصی تان برای کدنویسی (مثلا این که برای تورفتگی از 2 فاصله استفاده کنید یا 4 تا) در هر حال یاد می گیرید که بقیه چه چیزهایی را در یک زبان دوست دارند و همینطور علت این دوست داشتن را.

با در نظر گرفتن این موارد ، این سوال پیش می آید که صرفا با مطالعه ی کتاب چقدر می توانید یاد بگیرید. قبل از تولد اولین بچه ام ، تمام کتاب های "چگونه..." (How To…) را خواندم بودم و باز هم حس می کردم مبتدی ام. 30 ماه بعد (پس از تولد دومین فرزندم) دیگر سراغ کتاب هایم نمی رفتم؛ به جایش به تجربه ی شخصی ام تکیه کردم که معلوم شد خیلی مفیدتر و مطمئن تر از هزاران صفحه کتاب هایی است که توسط متخصصین نوشته شده اند. آقای Fred Brooks در مقاله ی "No Silver Bullets" (2) طرحی سه بخشی برای پیدا کردن بهترین طراحان نرم افزار مشخص کرد:
1- به طور سیستماتیک و هر چه زودتر طراحان برتر را مشخص کنید
2- یک مربی حرفه ای به آن ها اختصاص دهید تا مسئول و مراقب کار باشد
3- فرصت هایی را فراهم بیاورید که این افراد از طریق ارتباط و برانگیختن همدیگر ، رشد کنند
آلن پرلیس می گوید: "هر کسی می تواند حجاری یاد بگیرد: میکل آنژ باید یاد می گرفت چطور این کار را نکند. در مورد برنامه نویسان بزرگ هم همینطور است"
باشه ، بروید و ان کتاب جاوا را بخرید؛ احتمالا به دردتان بخورد ولی زندگی تان یا تخصصتان در کل در طول 24 ساعت ، روز یا حتی ماه تغییر چندانی نخواهد کرد.

(1) :
Bloom, Benjamin (ed.) Developing Talent in Young People, Ballantine, 1985.
Hayes, John R., Complete Problem Solver Lawrence Erlbaum, 1989.
Bryan, W.L. & Harter, N. "Studies on the telegraphic language: The acquisition of a hierarchy of habits. Psychology Review, 1899, 8, 345-375
Chase, William G. & Simon, Herbert A. "Perception in Chess" Cognitive Psychology, 1973, 4, 55-81.
(2) http://citeseer.nj.nec.com/context/7718/0

ضمیمه: انتخاب زبان
چندین نفر از من پرسیدند که کدام زبان برنامه نویسی را باید اول یاد بگیرند. هیچ جواب قطعی ای وجود ندارد ، اما به نکات زیر توجه کنید:
  • دوستان: وقتی کسی از من می پرسد از چه سیستم عاملی استفاده کنم ، جواب می دهم: "از هر چیزی که دوستانت استفاده می کنند" مزیتی که از یادگیری از دوستانتان به دست می آورید ، هرگونه تفاوت بین سیستم عامل ها یا زبان های برنامه نویسی را خنثی می کند. البته دوستان آینده تان را هم در نظر بگیرید: جامعه ای از برنامه نویسان که شما در آینده جزئی از ان ها خواهید بود. آیا زبانی که انتخاب کردید یک جامعه ی بزرگ و فعال و در حال رشد دارد یا این که روز به روز از استفاده کنندگانش کم می شود ؟ آیا کتاب ، وب سایت و فروم های اینترنتی برای رسیدن به جواب سوال هایتان وجود دارد ؟ آیا از اعضای این فروم ها خوشتان می اید ؟
  • سادگی: زبان هایی مثل جاوا و سی پلاس پلاس برای پروژه های بزرگ و حرفه ای طراحی شده اند که توسط تیمی از برنامه نویسان حرفه ای استفاده می شوند که کارایی زمان اجرا برایشان مهم است ؛ در نتیجه این زبان ها بخش های پیچیده ای دارند تا بتوانند نیاز های این افراد را براورده کنند. اما شما نیازی به این زبان ها ندارید ، چون می خواهید برنامه نویسی یاد بگیرید. شما نیاز به زبانی دارید که یادگیری اش آسان باشد و یک برنامه نویس تازه کار بتواند به راحتی با آن کار کرده و سینتکسش در یادش بماند.
  • تفریح: کدام روش را برای یادگیری پیانو می پسندید: روش معمولی و تعاملی که به محض فشار دادن هر کلید نتی را می شنوید یا روش دسته ای که پس از اتمام یک آهنگ نت ها را می شنوید ؟ مسلما روش تعاملی یادگیری را آسان تر می کند. از زبانی استفاده کنید که حالت تعاملی (interactive mode) دارد.

با توجه به این سه مورد ، توصیه ی من برای اولین زبان برنامه نویسی ، پایتون یا Scheme است. البته اگر سنتان تک رقمی است توصیه می کنم از Alice یا Squeak شروع کنید. مهم ترین چیز این است که انتخاب کرده و شروع کنید.

نظر مترجم: (translator notes)
مقاله ی آقای Norvig الان با وجود گذشت فقط 8 سال از نگارش ، جزو مقالات کلاسیک محسوب می شود. بعضی از قسمت ها با توجه به گذر زمان مطمئنا قدیمی هستند (مثل زبانی با قابلیت coroutine) و زبانی امروزی مثل F#‎ اکثر قسمت هایی را که ایشان روی آن ها تاکید دارند پشتیبانی می کند (شاید برای این بخش بهتر باشد به نصیحت Don Syme خالق F#‎ گوش کنیم که می گوید حتما Haskell,Prolog, F#‎ , Python و سی شارپ را یاد بگیرید) ولی نکته ای که هست و هیچ وقت غبار زمان به خودش نمی گیرد این است که به صرف خواندن چند کتاب و پاس کردن چند ترم درس و چند هزار خط کد نوشتن ، کسی حرفه ای نمی شود و اگر می خواهیم در دنیای به شدت پویای نرم افزار زنده بمانیم ، باید حاضر باشیم عمرمان را (درست) صرف شغلمان کنیم.
متن اصلی : http://www.norvig.com/21-days.html
ایمیل مترجم: mehdi.asgari@yahoo.com