ارتباطات و کدنویسی بهترین کار و کامپیوتر بهترین رشته دنیاست.من برنامهنویسی اندروید رو با یک تیم بینظیر در پیام رسان هدهد شروع کردم و در کنارش تو Quera برای دولوپرها مارکتینگ هم انجام میدم :)
کپی پیست کردن یا نوشتن کدها، مسئله این است!
تابحال برایتان پیش آمده که قطعه کدی را از جایی مثل سایت Stack Overflow کپی کرده و داخل برنامهتان قرار دهید درحالی که ندانید آن قطعه کد چه مفهومی دارد یا دقیقاً چه کاری انجام میدهد؟
در این حالت شما اصطلاحاً مشغول استفاده از یک روش توسعه نرمافزار به نام Cargo Cult Programming هستید که بین برنامهنویسان تازهکارتر رواج زیادی دارد! در این روش، برنامهنویس بدون دانستن ساز-و-کار آن قطعه کد و ارتباطش با بقیه کدها، صرفاً عمل کپیپیست را انجام میدهد... یا گاهی بدون آنکه از ساز-و-کار دقیق کد مطلع باشد، بخشهایی از آن را تغییر میدهد به امید اینکه مشکلات کد برطرف شده باشد.
اگر فکر میکنید چنین کاری کاملاً بیخطر است، باید بگوییم که سخت در اشتباهید؛ این کار ممکن است عواقب ناخوشایندی برای شما یا پروژهتان داشته باشد!
مشکل در اصل، کپی کردن کد دیگران نیست؛ هر کسی میتواند بدون به خطر انداختن پروژهاش، کدهای دیگران را ببیند، آن را بفهمد، کپی کند، در آنها تغییر اعمال کند و از آنها یاد بگیرد! مشکل این است که از کدهای دیگران چیزی یاد نگیریم و از آن بدتر، آنها را در جایی که نباید به کار ببندیم.
اگر میخواهید حین کپی کردن کدها، چیزهای جدید هم یاد بگیرید این پیشنهادها را در نظر بگیرید:
- قطعهی کد را با دقت بخوانید.
- سعی کنید زبانی که کد به آن نوشته شده، کتابخانههای به کار گرفته شده و فریمورکهای درگیر را پیدا کرده و ویژگیها و امکانات هر کدام از آنها را متوجه شوید.
- سعی کنید اطلاعات خود را راجع به فریمورکها و کتابخانههای استفاده شده در آن کد به روز کنید.
- متوجه کارکرد هر خط از کد، و نقشی که فریمورکها و کتابخانهها در آن کد خاص ایفا میکنند بشوید.
قطعاً رعایت کردن نکات بالا قرار است برای برنامهنویسان تازهکار بسیار دشوار باشد، چرا که باید با خواندن کدها از ساز و کار هر خط کد سر دربیاورند و ذهنشان با ربط دادنِ ارتباط کدها به هم اطلاعات زیادی را پردازش کند! تمرین زیاد و استفاده از برخی تکنیکهای ثابت شده، میتواند به فرد کمک کند تا به طور آگاهانه یا حتی ناخودآگاه، ذهنش را برای این کار آماده کند.
دو تکنیک مفید در راستای یادگیری بهتر میتواند به کار بیاید: یکی Blocked Practice است که هدف آن یادگیری با تکرار چندینباره کارهاست. البته این روش بهینهترین روش ممکن برای یادگیری نیست! جایگزین بهتر آن روش Interleaving Practice است که هدف آن یادگیری از طریق ترکیب آموختههای مختلف است!
قبل از آنکه صحبت را ادامه دهیم، خوب است که نگاهی به مخروط تجربی ادگار دیل بیندازیم:
سالها قبل ادگار دیل مخروطی را معرفی کرد و مفهوم جدیدی را به مهارت یادگیری اضافه کرد که به هرم یادگیری معروف شد. این نظریه نشان میدهد که مردم فقط ۱۰ درصد از آن چیزهایی را که میخوانند (مثل کتاب و روزنامه و…)، ۲۰ درصد از آن چیزی را که می شنوند (مثل فایل های صوتی، رادیو و…)، ۳۰ درصد از آن چیزی را که مشاهده می کنند (مثل فیلم)، ۵۰ درصد از آن چیزی را که همزمان هم میبینند و هم میشنوند (مثل یک آزمایش علمی)، ۷۰ درصد از آن چیزی را که به صورت عملی با آن درگیر میشوند و ۹۰ درصد از آن چیزی که شخصاً اجرا میکنند و به دیگران یاد می دهند را یاد میگیرند. این هرم نشان میدهد که یادگیری از طریق تجارب عملی و مستقیم، به مراتب بهتر از یادگیری انتزاعی و غیرمستقیم است.
جالب است بدانید هر دو روش Blocked Practice و Interleaving Practice میتواند در یادگیری بهتر کدها به ما کمک کند. اجازه بدهید با ذکر چند مثال ببینیم که چگونه:
>> زمانی که کدی را کپیپیست میکنید، آن را صرفاً میبینید، هرم فوق به خوبی نشان میدهد که چنین کاری شانس بسیار کمی برای ماندگاری در حافظه شما دارد. در طرف مقابل حتی اگر عین همان کد را خودمان مجدداً تایپ کنیم، باز هم ذهنمان درگیری بیشتری با کد دارد و شانس ماندگاری آن در حافظه بالا میرود.
>> نامگذاری چیزها در برنامهنویسی یکی از سختترین کارهایی هست که همه برنامهنویسها با آن چالش دارند... ممکن است با کپی پیست کردن بلوکهای کد، یک تابع یا کلاس را با نامی کپی کرده باشیم که قبلاً برای یک تابع دیگر به کار رفته است. راهحل بهتر این است که سعی کنید بفهمید هر تابع چه کاری انجام میدهد و آن را مجدداً و به شکل بهتری اسمگذاری کنید. ممکن است خروجی کد همچنان همان باشد، اما این کار کوچک از اشتباههای آتی جلوگیری میکند.
>> یکی دیگر از مشکلاتی که ممکن است حین کپی کردن پیش بیاید، این است که تغییر دادن بخشی از کد را که نیاز به تغییر دارد، فراموش کنیم. به عنوان مثال، به قطعه کُد HTML زیر توجه کنید:
<label for="name"></label>
<div class="input-wrapper">
<input type="text" id="name">
</div>
تصور کنید با کپی کردن این کد، بخواهیم یک فیلد جدید اضافه کنیم. اما چون نمیدانیم کد چهطور کار میکند، مشخصه for برای label را تغییر ندهیم! در این حالت قرار نیست خروجی مد نظر را دریافت کنیم.
<label for="name"></label>
<div class="input-wrapper">
<input type="text" id="name">
</div>
<label for="name"></label>
<div class="input-wrapper">
<input type="password" id="password">
</div>
جالب خواهد بود که اشاره کنیم این دست مشکلات را نمیتوانید با تستهای خودکار پیدا کنید و باید به صورت دستی توسط برنامهنویسان آن را پیدا کرد.
>> یکی دیگر از جاهایی که کپی پیست میتواند مشکلساز شود، در تستها است: وقتی برای یک تابع جدید از تستی که قبلاً نوشتهایم استفاده میکنیم، این احتمال وجود دارد که فراموش کنیم برخی پارامترها و چیزهایی که باید حتماً در تابع جدید تست شود را آپدیت کنیم و مسائلی از این دست به سادگی باعث میشوند که تست به ما بگوید که تابعی مشکلی دارد و در نتیجه شروع به بررسیاش کنیم اما این در حالی است که مشکل از تابع جدید نیست، بلکه خودِ تست است که منجر به خطا شده است.
در چنین مواقعی، متوانیم با استفاده از Test Driven Development یا به اختصار TDD جلوی این مشکل را بگیریم. به عبارتی، ابتدا به ساکن یک تابع تست نوشته میشود سپس اقدام به کدنویسی تابع اصلی میکنیم به طوری که باید بتواند آن تست را پاس کند که این رویکرد تضمین میکند مشکلات به اصطلاح False-Positive به حداقل برسند.
خلاصه که تنبلی را کنار بگذاریم و بجای کپی پیست کدها، آنها را از نو بنویسیم تا بازدهی ما در یادگیری به بیشترین حالت ممکن برسد! فراموش نکنید که مهمترین سرمایه یک توسعهدهنده، نه دستانش، که مغز او محسوب میشود!
بر اساس مطلب:
"Don’t copy-paste code. Type it out." > by Fagner Brack @ freeCodeCamp
کوئرامگ مجله تخصصی کوئرا برای توسعهدهندگان است که هر هفته با مطلبهایی در زمینه تکنولوژی، رشد فردی و آینده برنامهنویسی بهروزرسانی میشود. برای اطلاع از آخرین مطلبهای ما، میتوانید توئیتر یا کانال تلگرام ما را دنبال کنید.
مطلبی دیگر از این انتشارات
فهرست ۸ دوره برتر کارآموزی برنامه نویسی در ایران
مطلبی دیگر از این انتشارات
بدترین باگهای تاریخ کامپیوتر: انفجار موشک ۳۷۰ میلیون دلاری
مطلبی دیگر از این انتشارات
یادگیری ماشین: خواندن دستخط بدون یادگیری عمیق