بهزاد مرادی

برای موفقیت مهارت کدنویسی مهم‌تر است یا دانش کدنویسی؟

بهزاد مرادی مدرس، کپی‌رایتر و دولوپر

این محتوا بدون نظارت تیم تولید محتوای سکان آکادمی تولید شده و صرفاً نظرات شخصی بهزاد مرادی می‌باشد.

پیش از شروع بحث، برای اینکه تنظیم‌فرمان شویم ابتدا تعاریفی از دانش و مهارت آورده، سپس یک مثال از یادگیری زبان می‌زنیم و در ادامه به این پرسش پاسخ خواهیم داد که «برای موفقیت مهارت کدنویسی مهم‌تر است یا دانش کدنویسی؟» و در نهایت هم یک مثل از مهارت رانندگی می‌زنیم.

دانش چیست؟
در یک تعریف خودمانی از نگاه بنده، دانش مجموعه‌ای از اطلاعات ساختاریافته‌ است که در طول زمان صحت و سقم آن‌ها اثبات شده و ما آن را فرا می‌گیریم تا در آینده به عنوان یک مبنا برای حل موضوعات مختلف استفاده کنیم.

مهارت چیست؟
وقتی دانشی را به دست آوردم، حال نیاز داریم تا با تمرین و تکرار آن را نهادینه ساخته، با یکسری اصطلاحاً Best Practice آشنا شویم که منجر بدین خواهند شد تا دانش به دست آمده را بهتر به کار گیریم مضاف بر اینکه آنچه در حین فراگیری دانش کسب نکرده بودیم را نیز به دست خواهیم آورد.

مقایسه دانش و مهارت در یادگیری زبان انگلیسی
خوانندهٔ این مقاله اگر در حوزهٔ زبان حرف‌های زیادی برای گفتن نداشته باشد، به احتمال قریب به یقین در حال یادگیری است و در غیر این صورت، توصیهٔ من این است که اصلاً به دنبال صنعت توسعهٔ نرم‌افزار نرود که بدون زبان فقط وقت تلف کردن است!

وقتی زبان انگلیسی در دانشگاه یا مؤسسات زبان یاد می‌گیریم، معمولاً دانش زبان انگلیسی به ما منتقل می‌شود. مثلاً اینکه زمان حال ساده چیست، گذشته فعل Go چه می‌شود، جملات سببی چیست و چه کاربردی دارند، Used to به چه معناست و چیزهایی از این دست.

وقتی از کسانی که در ایران زبان یاد گرفته‌اند سپس به یک کشور انگلیسی زبان رفته‌اند می‌پرسیم، می‌گویند که هرچه داخل ایران فرا گرفته بودیم کشک تازه داریم زبان کاربردی رو اینجا یاد می‌گیریم!

در واقع، این همان تفاوت دانش و مهارت است. یک کسی که انگلیسی زبان دوم وی هست دانش زبان دارد اما کسی که به صورت مادرزادی انگلیسی زبان به دنیا آمده و یا اینکه انگلیسی زبان دومش هست اما سال‌ها است در یک کامیونیتی که انگلیسی داخلش صحبت می‌شود زندگی کرده، وی به مهارت زبان انگلیسی دست یافته است. برای درک بهتر این موضوع مثالی می‌زنم. 

همهٔ ما با افعالی همچون Surprise یا Amaze آشنا هستیم و اگر کسی از ما بخواهد که گزارهٔ «کَفم بُرید!» را برگردان کنیم به انگلیسی، احتمالاً بگوییم I`m surprised یا I`m amazed اما چه بخواهیم قبول کنیم چه نخواهیم، این‌ها معادل دقیق اصطلاح فوق نیستند. به عبارتی، ما تا اینجا دانش زبان را به کار گرفته‌ایم که خبر خوب این است که کارمان هم با این دانش راه خواهد افتاد اما مهارت آن را نداریم و تقصیری هم نداریم چون در فضایی نبوده‌ایم که آن را فرا بگیریم. مثلاً کسی که مهارت زبان دارد قاعدتاً باید بتواند معادل اصطلاحات زیر را به انگلیسی بداند:

- عین خیالش نیست!
- اینقدر به من گیر نده. 
- بابا این یارو یه تخته‌اش کمه.
- ببخشید پشتم به شماست. 
- طرف توی باغ نیست.

البته مهارت زبان به این‌ها فقط ختم نمی‌شود بلکه مثلاً اینکه بدانیم تفاوت واژگانی همچون Thin ،Skiny ،Slender و Slim چیست هم نشان از ماهر بودن ما در استفاده از زبان انگلیسی دارد و خیلی چیزهای دیگر که در مقاله‌ای تحت عنوان روش‌های یادگیری و آموزش زبان انگلیسی به طور کامل در این خصوص صحبت کرده‌ام.

آشنایی با تفاوت دانش و مهارت در صنعت توسعهٔ نرم‌افزار
خب مسلماً با مثال فوق بدون توضیح بنده خواهید توانست تعریف مشخصی برای یک دولوپری که دانش کدنویسی دارد و کسی که مهارت کدنویسی دارد ارائه دهید اما در ادامه من هم تعریف خودم را عرض خواهم کرد.

- دولوپری که «دانش» کدنویسی دارد کسی است که از طریق سِلف اِستادی، سایت‌های آموزش آنلاین، بوت‌کمپ‌ها و یا دانشگاه‌ها با اصول توسعهٔ نرم‌افزار، حداقل یک الی دو زبان برنامه‌نویسی، مبانی الگوریتم و دیتا استراکچر و سایر مباحث مربوطه آشنا شده است (به واژهٔ آشنا خوب توجه کنید.)

- دولوپری که «مهارت» کدنویسی دارد کسی است که از طُرُق فوق‌الذکر با اصول کار آشنا شده اما برای مدت چند سال در فضای واقعی کسب‌وکار قرار گرفته، روی پروژه‌های عجیب و غریب کد زده، آزمون و خطا کرده، اشتباه کرده، ریفکتور کرده و در یک کلام با کدنویسی زندگی کرده است.

تعاریف فوق کمی کلاسیک به نظر می‌رسند و حق مطلب را آن‌طور که باید و شاید ادا نمی‌کنند و باید مبحث را بیشتر شکافت. مثلاً زمانی که دانش مرتبط با حلقه‌ها در زبان PHP را کسب کردم، خواستم تا یک فرم طراحی کنم که در آن روزهای ماه به صورت دینامیک لود شوند و فلذا نیاز به استفاده از حلقه داشتم اما در کمال ناباوری نتونستم یک حلقهٔ ساده پیاده‌ کنم و دانش کدنویسی که کسب کرده بودم هم به دادم نرسید اما الان که کمی مهارت کسب کرده‌ام می‌توانم چند حلقهٔ تو در تو بنویسم تا بتونم الگوریتم مد نظرم رو پیاده کنم.

کارفرماها به دنبال کسانی هستند که مهارت دارند نه دانش!
اگر بخواهیم در شرکت درست و درمانی مشغول به کار شویم، این دست کمپانی‌ها به دنبال کسانی هستند که مهارت کدنویسی دارند اما در عین حال یکسری شرکت‌ها هم هستند که دنبال کارآموز هستند و صرفاً اینکه کسی دانش توسعهٔ نرم‌افزار داشته باشد برایشان کفایت می‌کند. به عبارتی،‌ اگر قصد داریم از کارفرما دلربایی کنیم، حقوق بالایی بگیریم و کاری کنیم که اگر روزی به کارفرما گفتیم که من از ماه بعد دیگه نمی‌تونم خدمت‌تون باشم و دست و دل کارفرما بلرزه، باید پس از کسب دانش، مهارت کدنویسی هم پیدا کنیم.

چه‌طور در کدنویسی ماهر شویم؟
ابتدا به ساکن باید گفت که مهارت چیزی نسبی است و آن‌طور که دانش را می‌شود از طریق مدارک مختلف اندازه‌گیری کرد، اصلاً‌ نمی‌شود به سادگی و به دقت دست به سنجش مهارت زد اما اگر مهارت را همان‌گونه که در بالا توصیف کردیم که یک کارفرما به دنبالش هست، می‌توان گفت که استراتژی‌های زیر می‌توانند در هرچه ماهرتر شدن ما در این حوزه کمک کنند:

- هرگز به مباحث تئوریک اکتفا نکرده و برای خود پروژه‌های کوچک تعریف کنیم.
- در حین تحصیل به هر شکلی از آن، سعی کنیم یک جایی به عنوان کارآموز مشغول به کار شویم.
- از پروژه‌های عجیب و غریب نترسیم و به استقبال آن‌ها برویم چون مهارت در این دست پروژه‌ها به دست می‌آید.
- سورس‌کد پروژه‌های موفق را بخوانیم.
- بریم ببینیم برنامه‌نویس‌های ماهر چه کار می‌کنن، ازشون ایده بگیریم.
- در انتخاب محل کار خود دقت کنیم چون برخی شرکت‌ها هستند که اصلاً نمی‌شود در آن‌ها ماهر شد چون پروژه‌های خوبی به تورشان نمی‌خورد هرگز.
- یک مسئله رو همیشه با یک الگوریتم حل نکنیم بلکه راه‌های مختلف ولو احمقانه رو تست کنیم (البته نه روی پروژه‌های مردم!)

مهارت در رانندگی
باز برای درک بهتر این موضوع، در پایان بد نیست مثالی از رانندگی بزنیم. وقتی که ما گواهینامه می‌گیریم، به نوعی می‌توان گفت که دانش راندن یک وسیلهٔ نقلیه را کسب کرده‌ایم و همین می‌شود که خیلی‌ها بلافاصله با گرفتن گواهینامه با بچه‌‌ها راه می‌افتند می‌رن شمال و همه رو به کشتن می‌دن!

ما در کلاس رانندگی یاد می‌گیریم که دنده چیست، کلاچ چیست و شاید کمی هم در مورد مسائل فنی یاد بگیریم اما در طول زمان، رانندگی در جادهٔ چالوس، گردنهٔ هراز، روی سه سانتی‌متر یخ، در شب، در طوفان و ... هست که به مهارت رانندگی مجهز می‌شویم. 

حال شما مقایسه کنید که آیا دوست دارید بنشینید کنار دست کسی که دانش رانندگی دارد و بروید سفر یا کسی که مهارت رانندگی دارد 😂

یک مثال جالب
اگر از یک کسی که دانش رانندگی دارد بپرسیم که «آیا بدون کلاچ هم می‌شود دنده عوض کرد؟» احتمال قریب به یقین، البته اگر بداند که کلاچ چیست، خواهد گفت خیر اما اگر از کسی که مهارت رانندگی دارد همین سؤال را بپرسیم، با یک خندهٔ زیرکانه که گویی فقط اوست که چنین مهارتی داره خواهد گفت چرا که نه! در واقع،‌ راننده‌های ماشین سنگین باید این مهارت را داشته باشند که اگر به هر دلیلی مشکلی پیش آمد، بتوانند به مرور دنده را پایین آورده و سرعت را کم کنند تا ریسک تصادف بیاد پایین.

نتیجه‌گیری
هیچ‌کس بابت دانش ما پولی حاضر نیست بده اما برای مهارت‌مون آدم‌ها حاضر حتی باج هم بدن!

ممنون که وقت گذاشتید. جای نظر، انتقاد و پیشنهاد شما در بخش کامنتینگ است.

ایدهٔ خود را در سکان‌پلاس بنویسید!

لیست نظرات
کاربر میهمان
دیدگاه شما چیست؟
کاربر میهمان
حامد هردانی
حامد هردانی
۱۳۹۷/۰۸/۲۵
ممنون مثل همیشه عالی بود 👌👍

در مثال مهارت رانندگی، کلمه "شمال" ناقص تایپ شده
کاربر میهمان
عباس زادهمن یک کاربر مهمان هستم
۱۳۹۷/۰۸/۲۴
البته بهزاد جان متاسفانه چیزی که در ایران بسیار مغفول مانده است تفاوت بین کد زن و برنامه نویس است.
همون طور که خودتون بهتر می‌دونید کد زن کسی است که مثلا چشم بسته اپلیکشن کارت شارژ و فروشگاه اینترنتی رو می‌نویسه اما اصل برنامه‌نویسی به تحلیل درک و طراحی الگوریتم‌های پیچیده است
متاسفانه دلال‌های آموزشی به جای یاد دهی اصول سیستماتیک برنامه‌نویسی مقدمات کد زنی را آموزش میدن و باعث میشن بازار کار از متخصصان مهندسی خالی باشه و با تکنسین ها پر بشه
حمید
حمید
۱۳۹۷/۰۸/۲۴
سلام
تشکر از مقاله خوبتون
در متن مقاله عبارت "دولوپری که دانش کدنویسی دارد کسی است که" دوبار ذکر شده ( هم برای مهارت هم دانش)