خودآموز برنامه نویسی در 10 سال
تو هر کتاب فروشی که بروید ، کلی کتاب میبینید که میخواهند در چند ساعت یا چند روز به شما کامپیوتر یا برنامه نویسی یاد بدهند (از ویندوز و اینترنت گرفته تا ویژوال بیسیک و جاوا و ...)
خلاصه: در این سری مقالات،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 سال
محققان نشان دادند که برای متخصص شدن در بسیاری از زمینهها (از شطرنج گرفته تا آهنگ سازی، اپراتوری تلگراف، نقاشی، نواختن پیانو، شنا، تنیس، عصب شناسی ، ...) حدود 10 سال زمان لازم است. نکته مهم انجام کار پیوسته و با توجه است، نه صرفا کاری را مدام تکرار کردن ، بلکه به چالش کشیدن خودتان با کارهایی که فراتر از توانایی فعلیتان است و تحلیل کاراییتان قبل و بعد از انجام آن کار و اصلاح اشتباهاتتان و بعد تکرار کنید. و دوباره تکرار کنید. هیچ میانبری وجود ندارد: : حتی موزارت که در 4 سالگی اعجوبهای در موسیقی بود، 13 سال طول کشید تا بتواند اولین کار حرفهای و جهانیاش را بسازد.
به نظر ساموئل جانسون(1784- 1709) : "برتری در هر رشتهای فقط با یک عمر کار به دست میآید و با قیمت کمتری قابل خرید نیست" در قسمت دوم این مقاله دستورالعملهایی برای موفقیت در برنامه نویسی ارائه میکنم.
به برنامه نویسی علاقه داشته باشید. اطمینان حاصل کنید که انقدر از برنامه نویسی لذت میبرید که حاضر باشید 10 سال از عمرتان را صرفش کنید!
* به برنامه نویسی علاقه داشته باشید. اطمینان حاصل کنید که آنقدر از برنامه نویسی لذت میبرید که حاضر باشید 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- نظر مترجم: با توجه امکانات زبانهای امروزی، شاید برای این بخش بهتر باشد به نصیحت Don Syme خالق F# گوش کنیم که میگوید حتما Haskell,Prolog,F# , Python و سی شارپ را یاد بگیرید.