چگونه برنامهنویسی یاد بگیریم؟ (بخش اول)
من Max Kanat-Alexander هستم و برنامهنویسی میکنم. یکی از سؤالاتی که مردم همیشه از من میپرسند این است که “چگونه برنامهنویس شوم؟” یا “برنامهنویسی را چگونه یاد بگیرم؟” پاسخهای احتمالیِ زیادی بسته به شخص و اینکه چگونه قصد یادگیری دارد برای این پرسش وجود دارد. فکر کردم چون مردم این سؤال را اغلب میپرسند، بهتر است که در موردش مقالهای بنویسم.
بهترین راه را پیدا کنید
یکی از قوانینی که زمان یادگیری برنامهنویسی خیلی به من کمک کرد، فارغ از اینکه از چه متدی استفاده کرده بودم، این بود که همیشه میپرسیدم “بهترین راه به انجام رساندن ِاین تسک چیست؟” یا “راه درستِ به انجام رساندنِ این تسک چیست؟” این موضوع به این خاطر است که در برنامهنویسی مسیرهای متفاوتی برای به انجام رساندنِ یک تسک وجود دارد. اما معمولاً فقط یکی از این روشها توصیه میشود، حال چه مدرنترین راه برای نوشتنِ آن برنامه به زبان برنامهنویسی شما باشد چه بهترین شیوههایی که جامعه برنامه نویسان بر اساس تجربه در موردش به توافق رسیده، باشد. معمولاً شما میتوانید این اطلاعات را بامطالعه مستندات و نوشتههای زبان برنامهنویسی که قصد یادگیری آن رادارید به دست آورید یا با جستوجوی آنلاین از طریق گوگل یا سایت Stack Overflow. اگر به پاسخ نرسیدید در یک انجمن، mailing list یا همان Stack Overflow بپرسید. من تا به امروز همه این کارها را انجام میدهم. این کار رازمانی انجام میدهم که تسکی به من محول شده باشد و موضوعی را در مورد این تسک ندانم.
مزیت این روش این است که شما فقط برنامهنویسی یاد نمیگیرید، بلکه برنامهنویس خوبی هم میشوید. همچنین شمارا مجبور میکند تا در آن زبان برنامهنویسی عمیق شده و ابزارها و زبانهایی را که استفاده میکنید، بفهمید. اگر این کار را به شکل ادامهدار و روبهجلو انجام دهید، تصادفاً درک عمیق و خوبی از سیستمهایی که با آن کار میکنید توسعه دهید و همزمان ازلحاظ عملی هم خودتان را پیگیر و علاقهمند به موضوع حفظ کنید. (این یعنی شیرجه عمیقتر در موضوعاتی که واقعاً با آنها سروکار دارید – نه موارد تصادفی که هرگز استفاده نمیکنید. این کار هم میتواند جالب باشد، اما یک سیستم آموزشی که بتوانید برای یادگیری برنامهنویسی تا ابد استفاده کنید، وجود ندارد)
البته زمانی که تصمیم به یادگیری گرفتید، باید از فهم هر چه میخوانید اطمینان حاصل کنید. این موضوع ممکن است به معنی شیرجه زدن و مطالعه مستندات و نوشتههای بیشتر باشد، و بعد حتی مستندات بیشتر، تا زمانی که تمام کلمات و نمادهای بهکاررفته را بفهمید. مشکلی نیست! این بخش بزرگی است که باعث میشود این سیستم کار کند- تا شما به درک صحیح و عمیقی از نمادها و مفاهیمی که با آنها کار میکنید برسید.
حال ببینید، بگذارید رک باشم، زمانی که تازه شروع به یادگیری برنامهنویسی کرده اید و تسکی چالشبرانگیز به شما داده میشود، اشکالی ندارد که با هر روش قدیمی که بلدید انجامش دهید. شما در حال یادگیریِ اصول اولیه هستید نه بهترین روشها. البته این بخش برای زمانی است که شما قورباغه یادگیری اصول اولیه را صرفاً برای به انجام رساندن هر تسکی قورت داده باشید. برای پروژهای که صرفاً برای یادگیری انجام میدهید، مهمترین بخش این است که مواردی که برای یادگیری مشخص کرده بودید را بیاموزید. اما بهمحض اینکه به اصطلاح روی غلتک افتادید، حفرهای عمیقتر بکنید و سعی کنید بفهمید که کارها را به بهترین روش ممکن انجام دادهاید یا خیر.
خوب، حالا که مسائل گفته شد، بیایید در مورد متدهای مختلفی که مردم واقعاً برای یادگیری برنامهنویسی به کار میبرند، صحبت کنیم.
دانشگاه
رایج ترین موضوع مرتبط با برنامهنویسی که در دانشگاهها تدریس میشود، “علم کامپیوتر” است. میگوییم مرتبط با برنامهنویسی بهاینعلت که بخش بسیار کمی ازآنچه مردم در رشتههای علوم کامپیوتر میآموزند در انتها در زندگی روزانه و بهعنوان برنامهنویس شاغل و حرفهای به دردشان میخورد. البته جمله قبل همیشه هم صحیح نیست، در برخی رشتهها علم کامپیوتر بسیار مفید است. اما عموماً رشتهای که ما “مهندسی نرمافزار” یا “توسعه” (development) مینامیم با آنچه دانشگاهها تحت عنوان “علم کامپیوتر” پوشش میدهند، متفاوت است.
معمولاً اصول اولیه علم کامپیوتر که در دانشگاهها تدریس میشوند بسیار مفید است. نگارنده به دانشگاه رفتم و علم کامپیوتر خواندم و دو سال اول مطالعه دانشگاهی برایم خیلی مفید بود، مخصوصاً چند کلاس اول ورود به دانشگاه. من در برخی از مفاهیم اولیه توسعه نرمافزار به دیدی اساسی رسیدم.
موضوعی که نگارنده آن زمان متوجه نشدم، بههرحال، این بود که علم کامپیوتر فقط بخشی از مطالعه برنامهنویسی است. بخش دیگر یادگیری الگویتم ها است. (برای کسانی که در حال خواندن این مطلب هستند و نمیدانند الگوریتم چیست، یک الگوریتم رشتهای از گامها برای به انجام رساندنِ یک وظیفه است.) مطالعه الگوریتمها معمولاً شامل یادگیری مؤثرترین راه برای انجام امور است. این به معنی کشف چگونگی به انجام رساندن یک تسک مانند مرتبسازی فهرستی از اعداد صحیح با کمترین مراحل یا کمترین استفاده از میزان حافظه است. برخی مسائل هستند که هرگز نمیتوان آنها را با الگویتم ها حل کرد، مگر اینکه الگوریتم صحیح را بدانید. هرز گاهی در برنامهنویسی به مسئلهای برمیخورید که نیازمند این دانش است. بنابراین کاربردی است. اما حل این مسائل با الگوریتم موضوعی نیست که بخواهید بیشتر وقت خود را صرف آن کنید.
حتی دانشگاههایی که رشتههایی برای “مهندسی کامپیوتر” ارائه می دهند، تجربه کمی در مورد اینکه دنیای واقعی کامپیوتر به چه شکل است دارند. چرا که اغلب رشتهها حداکثر فقط چند ماه طول میکشند و شما در بهترین حالت تنها با تعداد کمی از افراد همکاری میکنید و درنهایت مبنای کد زدن شما چند هزار خط کد است. در جهان واقعی شما با تعداد زیادی از افراد کار می کنیدو کدهای مبنایی که دارید شامل دهها هزار خط کد است، گرچه این رشتههای مهندسی نرمافزار هنوز هم از هیچ بهتر هستند.
با تمام این گفتهها تعداد کمی از دانشگاهها برنامهنویسانی عالی دارند. حال چه درزمینه علم کامپیوتر چه در رشتههای مهندسی نرمافزار. همواره، گذراندن کلاسهای یادگیری برنامهنویسی دانشگاه ارزشمند است. در حداقلیترین حالت، بودن در یک دانشگاه، ساختار و نظمی فراهم میکند که تشویقکننده شما برای اتمام کلاسها است.