چگونه همچون یک برنامه‌نویس اسطوره‌ای،‌ مثل بنز کد بزنیم!

در اسطوره‌شناسی برنامه‌نویسی، «برنامه‌نویس اسطوره‌ای» به برنامه‌نویسی می‌‌گویند که می‌تواند در بازۀ زمانی برابر، ۱۰ برابر بیشتر از یک برنامه‌نویس عادی کد بزند! در مقابل، «برنامه‌نویس عادی» برنامه‌نوسی است که کار خود را به خوبی انجام می‌دهد اما از قدرت‌های جادویی برنامه‌نویس اسطوره‌ای بی‌بهره است. در واقع برای روشن‌تر شدن تعریف برنامه‌نویس عادی می‌توان گفت که برنامه‌نویس عادی برنامه‌نویسی است که بازده او برابر با متوسط بازدهٔ برنامه‌نویسان حرفه‌ای است. جامعۀ برنامه‌نویسی، در مورد این‌که آیا اصلاً موجودی به نام «برنامه‌نویس اسطوره‌ای» وجود دارد یا نه به ۲ گروه تقسیم شده است. گروه اول برنامه‌نویسانی هستند که معتقدند اصلاً اصطلاحی به نام با قدرت ۱۰ برابر وجود ندارد و گروه دوم هم معتقدند که چنین موجودی فعلاً وجود خارجی ندارد اما اگر بدانیم کجا دنبالش بگردیم، حتی «برنامه‌نویسانی با توان کدنویسی ۱۰۰ برابر» نیز وجود خواهد داشت. آنچه در این مقاله قصد داریم مورد بررسی قرار دهیم -با فرض این‌که برنامه‌نویس اسطوره‌ای وجود خارجی دارد- مهارت‌هایی است که منجر می‌گردد برنامه‌نویسان عادی بتوانند توان کدنویسی خود را ارتقاء داده و راندمان خود را بالا ببرند. در ادامه با سکان آکادمی همراه باشید. 

واقعیت این است که اگر دیدگاهی خطی نسبت به برنامه‌نویسی داشته باشیم، وجود برنامه‌نویسی که ۱۰ برابر قدرتمندتر از یک برنامه‌نویس عادی باشد، فرضی محال خواهد بود؛ مثلاً دونده‌ای را در نظر بگیرید که ۱۰ برابر سریع‌تر از یک دوندۀ خوب می‌دود و بدیهی است این تصور در عمل نمی‌تواند رخ دهد. اما کاری که برنامه‌نویس انجام می‌دهد مانند کار یک دونده نیست! برنامه‌نویسی شامل یک رشته فعالیت‌های طراحی شده است که به نحو بسیار ویژه‌ای با هم در ارتباط هستند. به عبارت دیگر یک برنامه‌نویس باید قادر به طراحی و اجرای مجموعه‌ای از فعالیت‌های مرتبط با هم باشد.

از سوی دیگر نه طراحی و نه اجرای برنامه را نمی‌توان توانایی‌هایی خطی در نظر گرفت زیرا موارد متعددی همچون تجربه، مهارت کدنویسی، سطح دانش، شناسایی بخش‌های غیرضروری در برنامه و ... نه تنها مهارت‌هایی خطی نیستند بلکه به نحو پیچیده‌ای نیز با یکدیگر در ارتباط هستند. این پیچیدگی زمانی بیشتر می‌شود که یک برنامه‌نویس هر دو وظیفۀ طراحی و اجرا را خود به عهده داشته باشد.

با چنین دیدگاهی، معنای قدرت ۱۰ برابری یک برنامه‌نویس نسبت به برنامه‌نویس دیگر روشن‌تر می‌شود؛ یک برنامه‌نویس اسطوره‌ای، هدف‌گرا بوده و توانایی‌های خود را برای دستیابی به هدف در کمترین زمان و با کمترین تلاش به کار می‌گیرد. حالا سوال اینجا است که ویژگی‌های برنامه‌نویس اسطوره‌ای که بهره‌وری او را تا این حد افزایش می‌دهد چیست؟ چه چیزی یک برنامه‌نویس اسطوره‌ای را از یک برنامه‌نویس عادی متمایز می‌کند؟ در ادامه به شرح این موارد خواهیم پرداخت.

برخورداری از مهارت‌های پایه‌ای برنامه‌نویسی‌‌ + تفکر الگوریتمیک
یکی از بارزترین تفاوت‌های برنامه‌نویس اسطوره‌ای با برنامه‌نویس عادی، توانایی پرداختن به وظایف جزئی در حین برنامه‌نویسی است. این وظیفۀ جزئی می‌تواند نوشتن یک فانکشن، یک الگوریتم و یا هر چیز دیگری باشد؛ شاید بگویید این کاری است که همۀ برنامه‌نویسان انجام می‌دهند اما این‌طور نیست و همۀ برنامه‌نویسان قادر نیستند این کار را در کوتاه‌ترین زمان و با کمترین کدنویسی انجام دهند. حتی گاهی ممکن است برنامه‌نویسی با سطح دانش پایین‌تر اما برخورداری از تفکر الگوریتیمک و نگاه کردن به قضایا از زوایای مختلف، راه‌حل به مراتب بهتر و ساده‌تری را نسبت به یک برنامه‌نویس با سطح دانش تئوری بالاتر ارائه دهد.

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

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

بدیهی است که وجود این دلایل و تلاش برای افزایش تمرکز، به طور جانبی سبب کاهش کارایی برنامه‌نویس خواهد شد. برنامه‌نویس اسطوره‌ای قبل از شروع کار، عوامل درونی و بیرونی کاهش تمرکز را برطرف می‌کند و همکاران، دوستان و اطرافیانش به خوبی می‌دانند که در حین کار، نمی‌بایست مزاحم وی شوند.

توانایی تمایز قائل شدن مابین اهداف اصلی و فرعی پروژه
همۀ پروژه‌ها علاوه بر اهداف اصلی، شامل اهداف فرعی متعددی نیز هستند؛ اغلب پیچیدگی‌های طراحی هنگامی به وجود می‌آیند که طراح به جای تمرکز بر اهداف اصلی، بیشتر وقت خود را صرف پرداختن به اهداف فرعی می‌کند. این موضوع گاهی ممکن است دستیابی به هدف اصلی را نیز با مشکل مواجه کند، از این رو توانایی تشخیص اهداف اصلی از اهداف فرعی برای یک طراح بسیار مهم است.

یک برنامه‌نویس اسطوره‌ای برای این‌که بتواند با کمترین تلاش و در کمترین زمان به بهترین نتیجه برسد، باید قادر به تشخیص اهداف اصلی از فرعی بوده و بتواند در صورت لزوم از پرداختن به اهداف فرعی صرف نظر کند.

ساده‌نویسی
برای درک مفهوم سادگی بهتر است به درک عوامل ایجاد پیچیدگی بپردازیم. نداشتن اولویت اهداف اصلی نسبت به اهداف فرعی و مرتکب شدن اشتباهات بیش از حد در طراحی، یکی از عوامل عمدۀ ایجاد پیچیدگی در پیاده‌سازی پروژه‌های نرم‌افزاری است.

اگر هر بار که با یک خطای طراحی مواجه می‌شوید، به جای طراحی مجدد آن بخش، به ارائه راه‌حل دیگری برای رفع این اشکال می‌پرازید، باید بدانید که این کار شما را از راه‌حل بهینه دورتر و دورتر می‌کند! حفظ این بخش‌های نادرست و تلاش برای حل آن‌ها، خود اشتباه دیگری است و این اشتباهات پی‌درپی در نهایت موجب پیچیدگی طراحی خواهند شد.  

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

کمال گرایی
کمال‌گرایی ممکن است به صورت یک ویژگی شخصیتی و یا به صورت یک تعصب مهندسی -مبنی بر این‌که باید به بهترین و کامل‌ترین راه‌حل دست پیدا نمایم- بروز نماید. صرف نظر از این‌که این ویژگی در کدام یک از این دو حالت ظاهر شود، کمال‌گرایی می‌تواند بزرگ‌ترین سد دستیابی یک برنامه‌نویس به راه‌حل‌های سریع و ساده باشد.

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

دانش
آگاهی کلی در زمینه‌های مرتبط با مسئله یکی دیگر از ویژگی‌های برنامه‌نویس اسطوره‌ای است. در هنگام مواجهه با مسائل پیچیده، آگاهی از ساختار داده‌ها، محدودیت‌های محاسباتی اصلی و الگوریتم‌های متناسب با مسئلۀ پیش‌رو و ...، می‌تواند بر توانایی حل مسئله تاثیرگذار باشد. البته منظور ما این نیست که در همۀ این زمینه‌ها باید متخصص باشید، منظور داشتن یک دانش کلی و در حد مورد نیاز برای ارائه راه‌حل مناسب است.

درک سطح پایین و آگاهی از نحوۀ عملکرد کامپیوتر
ویژگی دیگری که موجب افزایش چشمگیر قدرت و توانایی برنامه‌نویس می‌شود، درک نحوۀ عملکرد کامپیوتر است. حتی هنگامی که برنامه‌نویسی در یک زبان سطح بالا صورت می‌گیرد، باز هم عدم درک درست از این موضوع می‌تواند منجر به بروز مشکلاتی شود. چنین مشکلاتی ممکن است با طراحی و اجرای مجدد برنامه نیز حل نشوند زیرا مشکل اصلی که در ابزارها و الگوریتم‌های مورد استفاده است، همچنان پابرجا است. در چنین مواردی، داشتن یک دانش نسبی در مورد زبان C، درک نحوۀ کار CPU و آگاهی از نحوۀ کار پردازند و نحوهٔ اجرای دستورات در سیستم است که می‌تواند به برنامه‌نویس کمک کند (توصیه می‌کنیم برای درک بهتر این موضوع، به مقالهٔ آیا واقعا با وجود زبان‌های پیشرفته، نیازی به یادگیری زبان C هست؟ مراجعه نمایید.)

مهارت دیباگ کردن
یک برنامه‌نویس اسطوره‌ای مهارت خوبی در دیباگ نمودن کدها دارد؛ مجموع مهارت‌های یک برنامه‌نویس در یافتن باگ‌ها، دیباگ کردن در طی چند مرحلۀ منطقی، گرایش به ساده‌نویسی کد‌ها -که خود موجب کاهش باگ‌ها می‌شود- می‌تواند موجب افزایش بهره‌وری برنامه‌نویس شود.

سخن پایانی
در این مقاله به بیان ویژگی‌های مرتبط با یک برنامه‌نویس به اصطلاح «اسطوره‌ای» پرداختیم که موجب افزایش بهره‌وری و کارایی برنامه‌نویسان می‌شوند. اگر مجموعه مهارت‌هایی که در بالا گفته شد در یک برنامه‌نویس جمع شوند، اصلاً عجیب نیست که وی کارایی ۱۰ برابری نسبت به سایر برنامه‌نویسان داشته باشد. جمع شدن همۀ این مهارت‌ها در کنار یکدیگر، فضایی برای برنامه‌نویس ایجاد می‌کند که در هر محله از توسعهٔ نرم‌افزار، توسعه‌دهنده به دنبال ساده‌ترین و کوتاه‌ترین راه‌حل بوده و تمام تلاش خود را به کار می‌بندد تا مسئلۀ پیش‌رو را با کمترین تلاش و در کمترین زمان حل نماید.

دیدگاه شما چیست؟ به نظر شما کسب این مهارت‌ها می‌تواند از یک برنامه‌نویس عادی، یک برنامه‌نویس اسطوره‌ای بسازد؟ آیا تجربه‌ای در این زمینه داشته‌اید؟ نظرات و تجربیات خود را با ما و سایر کاربران سکان آکادمی به اشتراک بگذارید.

The mythical 10x programmer

0


رائفه خلیلی

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






  • Mehran_73 در تاریخ: 1395/12/21

    مقاله خوبی بود ممنون
    فک میکنم همه برنامه نویس ها بعد از یه مدت کمال گرا میشن کاریشم نمیشه کرد :)

  • سید حمید در تاریخ: 1395/12/22

    مواردی بسیار خوبی رو بیان کردین. مخصوصا مورد کمال گرایی که واقعا سد بزرگی هست.

از طریق این فرم، می توانید بدون ثبت نام نظر دهید و یا اگر قبلا ثبت نام کرده اید، با ورود ناحیه ی کاربری می توانید علاوه بر ثبت نظر، به مدیریت نظرات خود نیز بپردازید.
(فیلد اجباری)
(فیلد اجباری)
(فیلد اجباری)
(فیلد اجباری)