به طور کلی، برنامهنویس اسطورهای به کسی میگویند که میتواند در بازۀ زمانی برابر، ۱۰ برابر بیشتر از یک برنامهنویس عادی کد بزند! در مقابل، برنامهنویس عادی کسی است که کار خود را به خوبی انجام میدهد اما از قدرتهای جادویی برنامهنویس اسطورهای بیبهره است! در واقع، برای روشنتر شدن تعریف برنامهنویس عادی میتوان گفت که برنامهنویس عادی فردی است که بازده او برابر با متوسط بازدهٔ برنامهنویسان حرفهای است. جامعۀ برنامهنویسی، در مورد اینکه آیا اصلاً موجودی به نام برنامهنویس اسطورهای وجود دارد یا نه به دو گروه تقسیم شده است؛ گروه اول برنامهنویسانی هستند که معتقدند اصلاً چیزی با قدرت ۱۰ برابر وجود ندارد و گروه دوم هم معتقدند که چنین موجودی فعلاً وجود خارجی ندارد اما اگر بدانیم کجا دنبالش بگردیم، چنین دولوپرهایی را خواهیم یافت. آنچه در این مقاله قصد داریم مورد بررسی قرار دهیم -با فرض اینکه برنامهنویس اسطورهای وجود خارجی دارد- مهارتهایی است که منجر میگردد برنامهنویسان عادی بتوانند توان کدنویسی خود را ارتقاء داده و راندمان خود را بالا ببرند.
واقعیت این است که اگر دیدگاهی خطی نسبت به برنامهنویسی داشته باشیم، وجود برنامهنویسی که ۱۰ برابر قدرتمندتر از یک برنامهنویس عادی باشد، فرضی محال خواهد بود؛ مثلاً دوندهای را در نظر بگیرید که ۱۰ برابر سریعتر از یک دوندۀ خوب میدود و بدیهی است این تصور در عمل نمیتواند رخ دهد. اما کاری که برنامهنویس انجام میدهد مانند کار یک دونده نیست! برنامهنویسی شامل یک رشته فعالیتهای طراحی شده است که به نحو بسیار ویژهای با هم در ارتباط هستند؛ به عبارت دیگر، یک برنامهنویس باید قادر به طراحی و اجرای مجموعهای از فعالیتهای مرتبط با هم باشد.
از سوی دیگر نه طراحی و نه اجرای برنامه را نمیتوان تواناییهایی خطی در نظر گرفت زیرا موارد متعددی همچون تجربه، مهارت کدنویسی، سطح دانش، شناسایی بخشهای غیرضروری در برنامه و ... نه تنها مهارتهایی خطی نیستند، بلکه به نحوی پیچیده نیز با یکدیگر در ارتباط هستند و این پیچیدگیها زمانی بیشتر میشوند که یک برنامهنویس هر دو وظیفۀ طراحی و اجرا را خود به عهده داشته باشد!
با چنین دیدگاهی، معنای قدرت ۱۰ برابری یک برنامهنویس نسبت به برنامهنویس دیگر روشنتر میشود؛ یک برنامهنویس اسطورهای، هدفگرا بوده و تواناییهای خود را برای دستیابی به هدف در کمترین زمان و با کمترین تلاش به کار میگیرد. حالا سؤال اینجا است که ویژگیهای برنامهنویس اسطورهای که بهرهوری او را تا این حد افزایش میدهد چیست و چه چیزی یک برنامهنویس اسطورهای را از یک برنامهنویس عادی متمایز میکند؟ که در ادامه به شرح این موارد خواهیم پرداخت.
برخورداری از مهارتهای پایهای برنامهنویسی + تفکر الگوریتمیک
یکی از بارزترین تفاوتهای برنامهنویس اسطورهای با برنامهنویس عادی، توانایی پرداختن به وظایف جزئی در حین برنامهنویسی است. این وظیفۀ جزئی میتواند نوشتن یک فانکشن، یک الگوریتم و یا هر چیز دیگری باشد؛ شاید بگویید این کاری است که همۀ برنامهنویسان انجام میدهند اما اینطور نیست و همۀ برنامهنویسان قادر نیستند این کار را در کوتاهترین زمان و با کمترین کدنویسی انجام دهند! حتی گاهی ممکن است برنامهنویسی با سطح دانش پایینتر اما برخورداری از تفکر الگوریتیمک و نگاه کردن به قضایا از زوایای مختلف، راهحل به مراتب بهتر و سادهتری را نسبت به یک برنامهنویس با سطح دانش تئوری بالاتر ارائه دهد.
تجربه و تطابق با الگوها
منظور از تجربه، آگاهی عملی نسبت به مجموعهای از راهحلهای آزموده شده و تکراری برای یک مسئله است. یک برنامهنویس اسطورهای با تکیه بر تجاربی که از الگویهای ارائه شده برای مسائل مشابه قبلی اندوخته است، در نهایت راهحلی بهینه برای صرفهجویی در وقت و هزینه و همچنین دوری از خطاهای طراحی و سادهنویسی کدها پیدا میکند.
تمرکز
صرف نظر از کیفیت کار، میزان تمرکز برنامهنویس تعیین کنندهٔ تعداد ساعاتی است که صرف یک کار مشخص مینماید و این در حالی است که عدم تمرکز میتواند موجب طولانیتر شدن زمان اسمی کدنویسی شده و در آن واحد، زمان واقعی و مفید صرف شده را کاهش میدهد.
عوامل متعدد درونی و بیرونی ممکن است باعث کاهش تمرکز برنامهنویس شوند که از جمله عوامل درونی میتوان به بیعلاقگی، وضعیت جسمی و روحی نامساعد، خستگی و خواب ناکافی اشاره نمود. عوامل بیرونی نیز مواردی مانند محیط کار نامناسب، مزاحمت همکاران و اطرافیان، ملاقاتهای پیدرپی و متعدد در حین کار، چک کردن ایمیلها، تلگرام و ... را شامل میشود (به منظور پی بردن به اهمیت تمرکز، میتوانید به مقالهٔ نقش تمرکز در موفقیت کسبوکار: وقتی میخواهید همه چیز باشید، هیچ چیز نمیشوید! نیز مراجعه نمایید).
بدیهی است که وجود این دلایل و تلاش برای افزایش تمرکز، به طور جانبی سبب کاهش کارایی برنامهنویس خواهد شد. برنامهنویس اسطورهای قبل از شروع کار، عوامل درونی و بیرونی کاهش تمرکز را برطرف میکند و همکاران، دوستان و اطرافیانش به خوبی میدانند که در حین کار، نمیبایست مزاحم وی شوند.
توانایی تمایز قائل شدن مابین اهداف اصلی و فرعی پروژه
همۀ پروژهها علاوه بر اهداف اصلی، شامل اهداف فرعی متعددی نیز هستند. اغلب پیچیدگیهای طراحی هنگامی به وجود میآیند که طراح به جای تمرکز بر اهداف اصلی، بیشتر وقت خود را صرف پرداختن به اهداف فرعی میکند و این موضوع گاهی ممکن است دستیابی به هدف اصلی را نیز با مشکل مواجه کند؛ از این رو توانایی تشخیص اهداف اصلی از اهداف فرعی برای یک دولوپر بسیار مهم است. یک برنامهنویس اسطورهای برای اینکه بتواند با کمترین تلاش و در کمترین زمان به بهترین نتیجه برسد، باید قادر به تشخیص اهداف اصلی از فرعی بوده و بتواند در صورت لزوم، از پرداختن به اهداف فرعی صرف نظر کند.
سادهنویسی
برای درک مفهوم سادگی بهتر است به درک عوامل ایجاد پیچیدگی بپردازیم. نداشتن اولویت اهداف اصلی نسبت به اهداف فرعی و مرتکب شدن اشتباهات بیش از حد در طراحی، یکی از عوامل عمدۀ ایجاد پیچیدگی در پیادهسازی پروژههای نرمافزاری است.
اگر هر بار که با یک خطای طراحی مواجه میشوید، به جای طراحی مجدد آن بخش، به ارائه راهحل دیگری برای رفع این اشکال میپردازید، باید بدانید که این کار شما را از راهحل بهینه دورتر و دورتر میکند! حفظ این بخشهای نادرست و تلاش برای حل آنها، خود اشتباه دیگری است و این اشتباهات پیدرپی در نهایت موجب پیچیدگی طراحی خواهند شد.
راهکار درست این است که بخشهای اشتباه به طور کامل حذف شده و مورد طراحی مجدد قرار بگیرند. برنامهنویس اسطورهای با سادهنویسی بخش به بخش مسئله، در نهایت به راهحل سادهای برای کل مسئله دست خواهد یافت. علاوه بر این، تجربه و مهارتهای شخصی طراح نرمافزار نیز در این زمینه به کمک او آمده و ارائهٔ راهحلهای معقولتر و سادهتر را دست یافتیتر میکند (بنابراین هر وقت متوجه شدید که راهحل پیچیدهای را ارائه دادهاید، ابتدا به سادهسازی آن فکر کنید و اگر مشخص شد که سادهسازی آن امکانپذیر نیست، این راهحل را کنار گذاشته و به دنبال یک راهحل جایگزین و ساده باشید).
کمال گرایی
کمالگرایی ممکن است به صورت یک ویژگی شخصیتی و یا به صورت یک تعصب مهندسی -مبنی بر اینکه باید به بهترین و کاملترین راهحل دست پیدا نمایم- بروز نماید. صرف نظر از اینکه این ویژگی در کدام یک از این دو حالت ظاهر شود، کمالگرایی میتواند بزرگترین سد دستیابی یک برنامهنویس به راهحلهای سریع و ساده باشد.
کمالگرایی و ترس از قضاوت بیرونی، منجر به تصمیمگیری بر اساس عوامل صرفاً روانشناختی و بیاهمیت شده و سبب میشود تا عوامل مهمی مانند بهینگی، سادگی و سرعت نادیده گرفته شوند. برنامهنویس اسطورهای علیرغم اینکه حداکثر تلاش خود را برای دستیابی به بهترین نتیجه انجام میدهد، کمالگرا نبوده و اصراری بر خاص و بیبدیل بودن برنامۀ نوشته شدۀ خود ندارد!
دانش
آگاهی کلی در زمینههای مرتبط با مسئله یکی دیگر از ویژگیهای برنامهنویس اسطورهای است. در هنگام مواجهه با مسائل پیچیده، آگاهی از دیتا استراکچرها، محدودیتهای محاسباتی اصلی و الگوریتمهای متناسب با مسئلۀ پیشرو و غیره، میتواند بر توانایی حل مسئله تأثیرگذار باشد (البته منظور ما این نیست که در همۀ این زمینهها باید متخصص باشید؛ بلکه منظور داشتن یک دانش کلی و در حد مورد نیاز برای ارائه راهحل مناسب است).
آگاهی از نحوۀ عملکرد کامپیوتر
ویژگی دیگری که موجب افزایش چشمگیر قدرت و توانایی برنامهنویس میشود، درک نحوۀ عملکرد کامپیوتر است. حتی هنگامی که برنامهنویسی در یک زبان سطح بالا صورت میگیرد، باز هم عدم درک درست از این موضوع میتواند منجر به بروز مشکلاتی شود. چنین مشکلاتی ممکن است با طراحی و اجرای مجدد برنامه نیز حل نشوند زیرا مشکل اصلی که در ابزارها و الگوریتمهای مورد استفاده است، همچنان پابرجا است.
در چنین مواردی، داشتن یک دانش نسبی در مورد زبان C، درک نحوۀ کار CPU و آگاهی از نحوۀ کار پردازنده و نحوهٔ اجرای دستورات در سیستم است که میتواند به برنامهنویس کمک کند (توصیه میکنیم برای درک بهتر این موضوع، به مقالهٔ آیا واقعا با وجود زبانهای پیشرفته، نیازی به یادگیری زبان C هست؟ مراجعه نمایید).
مهارت دیباگ کردن
یک برنامهنویس اسطورهای مهارت خوبی در دیباگ کردن کدها دارد. مجموع مهارتهای یک برنامهنویس در یافتن باگها، دیباگ کردن در طی چند مرحلۀ منطقی، گرایش به سادهنویسی کدها -که خود موجب کاهش باگها میشود- میتواند موجب افزایش بهرهوری برنامهنویس شود.
سخن پایانی
در این مقاله به بیان ویژگیهای مرتبط با یک برنامهنویس به اصطلاح اسطورهای پرداختیم که موجب افزایش بهرهوری و کارایی برنامهنویسان میشوند. اگر مجموعه مهارتهایی که در بالا گفته شد در یک برنامهنویس جمع شوند، اصلاً عجیب نیست که وی کارایی ۱۰ برابری نسبت به سایر برنامهنویسان داشته باشد.
جمع شدن همۀ این مهارتها در کنار یکدیگر، فضایی برای برنامهنویس ایجاد میکند که در هر مرحله از توسعهٔ نرمافزار، وی به دنبال سادهترین و کوتاهترین راهحل بوده و تمام تلاش خود را به کار میبندد تا مسئلۀ پیشرو را با کمترین تلاش و در کمترین زمان حل نماید.
به نظر شما کسب این مهارتها میتواند از یک برنامهنویس عادی، یک برنامهنویس اسطورهای بسازد؟ آیا تجربهای در این زمینه داشتهاید؟ نظرات و تجربیات خود را با سایر کاربران سکان آکادمی به اشتراک بگذارید.