با یادگیری اینکه «چیزها چطور کار میکنند» در برنامهنویسی پیشرفت کنید – قسمت اول
وقتی صحبت از پیشرفت در برنامهنویسی میشود، ما معمولا دربارهی تست، نوشتن کد با قابلیت استفاده مجدد، الگوهای طراحی و خوانایی کد صحبت میکنیم.
البته که همه اینها اهمیت دارند، اما در این مطلب میخواهم در مورد چیز متفاوتی صحبت کنم: یادگیری اینکه چیزها چطور کار میکنند. این روش اصلی من برای پیشرفت در برنامهنویسی است.
مثالهایی از اینکه «چیزها چطور کار میکنند»
برای اینکه توضیح دهم منظورم از این عبارت چیست، چند مثال از حیطههای مختلف برنامهنویسی میزنم و اینکه شما در آن حیطه چه چیزی را میتوانید در مورد اینکه «چطور کار میکند» یاد بگیرید.
فرانتاند با جاواسکریپت
- حلقه رویداد (event loop) چگونه کار میکند؟
- متدهای مختلف HTTP مثل GET و POST
- DOM چیست و با آن چه کارهایی میتوانیم انجام دهیم؟
- سیاست same-origin و CORS
CSS
- عناصر درخط (inline elements) چگونه متفاوت با عناصر بلوکی به نمایش درمیآیند؟
- default flow چیست؟
- flexbox چگونه کار میکند؟
- CSS چگونه مشخص میکند که کدام «انتخابکننده» روی کدام عنصر تاثیر بگذارید. (قسمت cascading از cascading style sheets)
برنامهنویسی سیستمی
- تفاوت استک و هیپ چیست؟
- حافظهی مجازی چگونه کار میکند؟
- اعداد چگونه در سیستم دودویی نمایش داده میشوند؟
- «جدول نماد» چیست؟ (symbol table)
- کدهای کتابخانههای خارجی چگونه لود میشوند؟ (استاتیک و داینامیک لینک)
- دستورات atomic با mutex چه تفاوتی دارند
شما میتوانید بدون اینکه بدانید چطور چیزها کار میکنند از آنها استفاده کنید (و این میتواند خوب باشد!)
ما با بسیاری از سامانههای مختلف کار میکنیم و غیرمنطقی است که انتظار داشته باشیم تک تک افراد در مورد همه سیستمها همه چیز را بدانند. برای مثال افراد زیادی هستند که برنامههای ارسال ایمیل مینویسند اما احتمالا بسیاری از این آدمها همه چیز را درباره نحوه کارکرد ایمیل نمیدانند. ایمیل واقعا پیچیده است! برای همیناست که تجرید (abstraction) بهوجود آمده است.
اما اگر قرار باشد در همین حال که نمیدانید واقعا چیزی (مثل CSS یا HTTP یا گو-روتینها یا ایمیل) چطور کار میکند، بخواهید با آن کار جدیتری انجام دهید، احتمالا به مشکل برمیخورید.
باگها به شما میگویند که لازم است مدل ذهنی خود را ارتقا دهید
وقتی که برنامهنویسی میکنم ولی یک مفهوم کلیدی را نمیدانم، این مساله همیشه به شکل واضحی خودش را نشان نمیدهد، بلکه اتفاقی که میافتد این است که:
- به خاطر مدل ذهنی غلط، برنامه من باگ دارد.
- من تلاش میکنم که سریع آن باگ را حل کنم اما به دلیل مدل ذهنی نادرست، من موفق نمیشوم سوالات درستی برای تشخیص مشکل بپرسم. (منظور سوالاتی است که من را به منشا باگ برساند.)
- من کاملا ناامید میشوم.
یک مهارت مهم همین است که متوجه شویم این اتفاق دارد میافتد. من آرام آرام یاد گرفتم که حس «من واقعا گیج شدم، حس میکنم چیزی وجود دارد که من درباره کارکرد سامانه به درستی متوجه نشدهام.» را تشخیص دهم.
توسعهدهندهی ارشد اکثر اوقات نیازی نیست بداند همه چیز دقیقا چطور کار میکند، بلکه مهارت مهم او این است که سریع متوجه شود که چیزی را نمیداند و سریع آن را یاد بگیرد. صحبت از توسعهدهندههای ارشد شد…
حتی توسعهدهندگان ارشد هم باید یاد بگیرند سیستمهایشان چطور کار میکنند
تا این لحظه من یادگیری درباره اینکه چیزها چطور کار میکنند را متوقف نکردهام، چرا که انواع و اقسام سیستمهای متفاوتی وجود دارند که با آنها کار میکنیم.
برای مثال من درباره نحوه کارکرد برنامههای سی و برنامهنویسی وب (مثل مثالهای بالای همین مطلب) میدانم، اما وقتی کار به برنامهنویسی گرافیک و کارت گرافیک و OpenGL برسد، من فقط تعداد کمی از نکات پایهای را میدانم. علاوه بر این، گاهی نکته جدیدی را درباره سیستمی که فکر میکردم با آن آشناام متوجه میشوم، مثلا سال گذشته متوجه شدم که درباره کارکرد CSS نکات مهمی بود که نمیدانستم.
گاهی ممکن است از اینکه سالها با چیزی کار میکردیم اما نمیدانیم دقیقا چطور کار میکند، احساس بدی پیدا کنیم: «من ۱۰ سال با این سیستم کار میکردم، چطور نمیدانستم» اما این طبیعی است. چیزهای زیادی برای دانستن درمورد کامپیوترها وجود دارد و ما به طور پیوسته چیزهای جدیدی برای دانستن ابداع میکنیم، طبیعی است که هیچکس نمیتواند همه جزئیات را بداند.
چطور از مرحلهای «گیج شدم» به «آهان! فهمیدم» برسیم
وقتی متوجه میشوم که گیج شدم، معمولا اینطوری مشکل را حل میکنم:
- متوجه میشوم که درمورد یک موضوع خاص گیج شدهام مثلا «من کلیدواژهی await را دربرنامه جاوااسکریپتی خود نوشتهام، الان دارد چه اتفاقی میافتد؟»
- سعی میکنم قسمتی را که نمیدانم به یکسری سوال علمی تبدیل کنم، مثلا: «وقتی await دارم و در حال صبر است، چطور تصمیم گرفته میشود که کدام قسمت کد پس از آن اجرا شود؟ این اطلاعات کجا نگهداری میشوند؟»
- به سوالات قبلی مثلا با نوشتن تکهبرنامه، خواندن مطالبی به شکل آنلاین و یا پرسیدن از دیگران پاسخ میدهم.
- درکم را با نوشتن یک برنامه آزمایش میکنم. «خب دلیل اینکه با async باگ داشتم این بود و اینطوری حل میشود.»
مرحلهآخر «آزمایش درک» واقعا مهم است. کل برنامهنویسی با کامپیوتر، این است که واقعا برنامه بنویسیم و چیزها کار کنند!
من متوجه شدم که وقتی از یافته جدیدم استفاده میکنم تا یک ویژگی جدید پیادهسازی کنم یا یک باگ را حل کنم یا حتی یک برنامهی نمایشی بنویسم که نشان بدهد آن چیز چطور کار میکند، در مقایسه با اینکه فقط در موردش بخوانم، حس واقعی بودن دارد. همچنین در این صورت احتمال بیشتری دارد که در عمل بتوانم از آن استفاده کنم.
یادگیری چند حقیقت ساده، میتواند خیلی کمک کند
یادگیری اینکه چیزها چطور کار میکنند، لازم نیست چیز بزرگی باشد. مثلا من قبلا نمیدانستم اعداد شناور چطور کار میکنند و بابت اینکه متوجه اتفاقی که میافتد نمیشوم، اضطراب داشتم.
سپس در سال ۲۰۱۳ من به یک سخنرانی از استفان کارپینسکی رفتم که در آن نحوه کارکرد اعداد ممیز شناور را توضیح میداد. اکنون احساس اعتماد به نفس در استفاده از اعداد ممیز شناور دارم! میدانم محدودیتهای اولیهشان چیست و کجاها نباید از آنها استفاده کنم. (مثلا برای اعداد صحیح بزرگتر از ۲ به توان ۵۳) و همچنین میدانم که چه چیزهایی را نمیدانم. مثلا میدانم که پیادهسازی الگوریتمهای جبر خطی به شکل پایدار سخت است و ایدهای ندارم چطور باید اینکار را انجام دهم.
این مطلب ادامه دارد.
منبع: بلاگ Julia Evans
.
.
.
.
با ما همراه باشید
آدرس کانال تلگرام: JavaCupIR@
آدرس اکانت توییتر: JavaCupIR@
آدرس صفحه اینستاگرام: javacup.ir
صفحه ویرگول: javcup
آدرس گروه لینکدین: Iranian Java Developers