با یادگیری اینکه «چیزها چطور کار میکنند» در برنامهنویسی پیشرفت کنید – قسمت دوم
پیشتر قسمت اول این نوشته را در جاواکاپ خواندیم. در این قسمت چند نکته دیگر مثلا در مورد سوال پرسیدن خواهیم خواند.
حقایق را به اطلاعاتی که هماکنون دارید گره بزنید
زمانی که یک حقیقت جدید را یاد میگیرید، کار ساده این است که عین جمله را تکرار کنید مثلا «خب، میدانم که در یک بایت ۸ بیت وجود دارد» این گزاره صحیح است اما خب؟ چیزی که سختتر (و البته مفیدتر) است این است که قادر باشید این را به اطلاعاتی که تاکنون داشتید گره بزنید.
همین مثال را ادامه دهیم «۸ بیت تشکل یک بایت میدهند». در برنامهتان احتمالا رشته دارید، مثلا “Hello”، حالا میتوانید سوالات زیادی بپرسید مثلا:
- چند بایت از مموری اشغال میشود تا رشتهی “Hello” ذخیره شود؟ در زبان سی پاسخ ۶ است، ۵ بایت برای ۵ کارکتر و یک بایت نال انتهایی.
- کارکتر H دقیقا معادل چه ترکیبی از بیتها میشود؟ از روی انکودینگ اسکی جواب را به دست میآوریم، در یک جدول اسکی دنبالش بگردید.
- اگر یک برنامه در حال اجرا داریم که رشتهی “Hello” را چاپ میکند، آیا میتوانیم به مموری نگاه کنیم و بایتهای متناظر را در مموری ببینیم؟ چگونه؟
(یادداشت مترجم: پاسخ سوال آخر در متن نیامده ولی شما میتوانید از یک دیباگر مثل gdb استفاده کنید. مثلا اینجا یا اینجا را مطالعه کنید.)
چیزی که اینجا مهم است این است که سوال بپرسید و درمورد چیزهایی که کنجکاو هستید به اکتشاف بپردازید. ممکن است به اینکه رشتهها چطور در مموری نگهداری میشوند علاقهمند نباشید ولی دلتان بخواهد بدانید که یک ایموجی قلب در یونیکد چند بایت مموری اشغال میکند، یا مثلا میخواهید بدانید که سیستم ممیز شناور چگونه کار میکند.
من متوجه شدم که وقتی نکات جدید را به چیزهایی که هماکنون میدانم متصل میکنم (مثلا ایموجی یا سیستم ممیز شناور یا رشتهها)، اطلاعات بهتر در خاطرم میمانند.
در قدمهای بعد میخواهم به شما ۲ روش گرفتن اطلاعات را نشان دهم: پرسیدن سوالات بله و خیر از اشخاص و پرسیدن از کامپیوتر.
چگونه اطلاعات کسب کنیم: سوالات بله و خیر
وقتی با کسی که در مورد موضوع خاصی بیشتر از من میداند صحبت میکنم، یکی از راههای کمککننده این است که با سوالات بله و خیر شروع کنم. مزیت این کار این است که من مجبور میشوم دقیقا بیان کنم که مدل ذهنی من چیست. همچنین فکر میکنم پاسخ دادن به سوالات بله و خیر برای شخص مورد سوال هم راحتتر است.
برای مثال اینجا چند نوع سوال متفاوت وجود دارد.
- بررسی اینکه درک فعلیام درست است.
- مثلا: آیا pixel shader و fragment shader یکچیز هستند؟
- مفاهیمی که شما شنیدهاید چطور به هم مرتبط میشوند.
- مثال: آیا Shadertoy از OpenGL استفاده میکند؟
- مثال: آیا کارتهای گرافیکی درمورد مثلثها میدانند؟
- سوالات سطح بالا درمورد هدف اصلی یک چیز.
- مثال: آیا mysql orchestrator کوئریهای دیتابیس را پراکسی میکند؟
- مثال: OpenGL در مقایسه با Vulkan کنترل بیشتر یا کمتری روی کارت گرافیک میدهد؟
سوالات بله و خیر باعث میشوند مکالمه از کنترل خارج نشود
وقتی که یک سوال با پایان بار مثلا «X چطور کار میکند» میپرسم، معمولا به دو شیوه مشکل پیش میآید:
- شخص مورد پرسش به من درباره چیزهایی میگوید که هماکنون میدانم.
- شخص درباره چیزهایی به من میگوید که نمیدانم ولی این چیزی نیست که علاقهمندم بدانم.
هردوی اینها میتواند خستهکننده باشد و قطعا تقصیر سوالشونده نیست! آنها نمیدانند من دقیقا چه اطلاعاتی درباره X میخواستم بدانم چرا که خود من اصلا اطلاعات کافی ندادهام. همچنین حس بدی دارد که وسط حرف کسی بپری و بگویی «اوه نه! این چیزی نبود که من میخواستم بدانم».
پرسیدن سوالات بله و خیر همیشه آسان نیست
وقتی که من برای یاد گرفتن چیز جدید، از دیگران سوال میپرسم گاهی این سناریو اتفاق میافتد:
- من: خب، برای چک کردن اینکه درست متوجه شدهام، X اینطوری کار میکند، درسته؟
- همکارانم: در واقع نه، درواقع اینطوری است: [توضیحات کاملا متفاوت]
- من در دلم: (اوه اوه!)
- من: باشه، اجازه بدید یک دقیقه برای سوال بعدیام فکر کنم.
حتی اگر اطلاعات مفیدی دریافت کنیم، اصلا حس خوبی نیست که متوجه شویم که مدل ذهنیمان کاملا غلط بودهاست. پرسیدن سوالات با دامنه محدود (مثلا سوالات بله و خیر) در مقایسه با سوالات باز، ما را نسبت به پیش آمدن موقعیت بالا آسیبپذیرتر میکند چراکه ممکن است مشخص شود درمورد چیز خاصی کاملا اشتباه میکردهاید.
وقتی این اتفاق میافتد من معمولا میگویم که به من یک دقیقه اجازه دهید تا اطلاعات جدید را به مدل ذهنیام اضافه کنم و درمورد سوال بعدیام فکر کنم.
خب اینجا بحث مورد علاقهام درباره سوالات بله و خیر را تمام کنیم!
چگونه اطلاعات کسب کنیم: پرسیدن از کامپیوتر
گاهی اوقات، هنگامی که میخواهم به سوالی که دارم پاسخ دهم، کسی که بتواند سوالم را پاسخ دهد پیدا نمیکنم، گوگل کردن یا جستوجو در مستندات هم کمکی به من نمیکند اما چیز قشنگ در مورد کامپیوترها این است که اغلب میتوان جواب سوالات در مورد کامپیوتر را از خودشان پرسید!
اینجا چند نمونه از سوالاتی را میبینید که من به کمک خود کامپیوتر جوابشان را پیدا کردم:
- سرعت اتمیکها در مقایسه با mutex چگونه است؟
- در لینوکس اگر یک کاربر جدید به گروه اضافه کنیم، آیا پروسسهای فعلی کاربر جدید هم عضو گروه میشوند؟
- در لینوکس، اگر یک سرور که روی 0.0.0.0 گوش میدهد داشته باشیم اما این سرور هیچ کارت شبکهای نداشته باشد، بازهم میتوان به آن سرور متصل شد؟
- دادههای SQLite چگونه روی دیسک قرار میگیرند؟
پرسیدن سوال از کامپیوتر مهارت است
قطعا یادگیری این مهارت که جملهی «من درباره X گیج شدهام» را تبدیل به سوالات مشخص کنید زمانبر است. همچنین پس از آن باید بتوانید سوال مشخص را به یک آزمایش تبدیل کنید که بتوانید روی سیستم خود انجام دهید تا جواب آن را به شکل قاطع پیدا کنید.
اگرچه یادگیری این مهارت سخت است اما بسیار قدرتمند است، به این شکل شما محدود به گوگل، مستندات و آدمهای اطرافتان نیستید، سپس میتوانید کارهای جالب زیادی انجام دهید!
از آنچه هنوز نمیدانید آگاه باشید
همانطور که قبلتر گفتم، هدف این نیست که تک تک جزئیات را بدانید، بلکه هرچه به سمت خبرهشدن پیش میروید مهم است بدانید که چه چیزهایی را نمیدانید. برای مثال اینها لیست ۵ تایی از چیزهایی است که من نمیدانم (البته لیست کامل بسیار بلندتر است!)
- تراکنشهای (transaction) پایگاه داده چطوری انجام میشوند؟
- در موضوع گرافیک، vertex shadersها چطور کار میکنند؟
- سیستم رندر کردن فونتها چگونه کار میکند؟
- مکانیسم BGP یا peering چگونه کار میکند؟
- وراثت چندگانه در پایتون چگونه کار میکند؟
و در حال حاضر لازم نیست بدانم آنها چطور کار میکنند اما مطمئنم که یک روز من لازم است بدانم تراکنشهای پایگاه داده چگونه کار میکنند. آن روز قطعا چیز جدیدی یاد خواهم گرفت.
یکی از کسانی که این مطلب را خواند از من پرسید که «از کجا متوجه میشود که چیزی را نمیدانی؟» و من جواب خوبی نداشتم، پس مشتاقم پاسخهای شما را بشنوم.
منبع: بلاگ Julia Evans
.
.
.
.
با ما همراه باشید
آدرس کانال تلگرام: JavaCupIR@
آدرس اکانت توییتر: JavaCupIR@
آدرس صفحه اینستاگرام: javacup.ir
صفحه ویرگول: javcup
آدرس گروه لینکدین: Iranian Java Developers