Competency رمز موفقیت دولوپرهای حرفه‌ای است یا Proficiency: مسئله این است!

Competency رمز موفقیت دولوپرهای حرفه‌ای است یا Proficiency: مسئله این است!

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

واقعیت امر آن است که در اغلب موارد، دو مفهوم Proficiency و Competency مشابه یکدیگر در نظر گرفته می‌شوند؛ اما در حقیقت این‌طور نیست! چنانچه این دو واژه واقعاً هم‌معنا بودند، هر کسی که در هر کاری سررشته داشت می‌بایست در کار خود بهترین می‌بود؛ به‌ علاوه اینکه شکی نیست که در قرن بیست و یکم، هر روز بیش از روز قبل نیاز به کسب تخصص احساس می‌شود.

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

برنامه‌نویس شدن و ورود به بازار کار برای هر کسی و در هر سنی امکان‌‌پذیر است اما در عین حال، تبدیل شدن به یک برنامه‌نویس حرفه‌ای کاری زمان‌بَر و به‌ نسبت دشوار است. پیش از این در مقاله‌ای تحت عنوان چگونه هرچه زودتر برچسب دولوپر «تازه‌کار» را از روی خود برداریم؟ به بیان نکاتی پرداختیم که می‌توانند به برنامه‌نویسان مبتدی کمک کنند تا هرچه سریع‌تر از دوران گذار خود عبور کنند؛ اما در این مقاله قصد داریم در تکمیل نکات طرح شده در مقالهٔ فوق، ببینیم که به چه شکل با سرمایه‌گذاری روی Proficiency، می‌توان به یک دولوپر ارشد مبدل شد.

آشنایی با تفاوت میان Proficiency (تخصص) و Competency (مهارت)
بررسی این مسئله کمی چالش‌برانگیز به‌ نظر می‌رسد چرا که غالباً این دو واژه هم‌معنی تلقی می‌شوند؛ اما تفاوت ظریفی که میان این دو مفهوم وجود دارد، از اهمیتی فوق‌العاده برخوردار است. به طور کلی:

- Competency یعنی داشتن تجربه و دانش کافی برای انجام یک تَسک (کار) 
- Proficiency به معنی اِشراف به چرایی انجام تَسکی در قالب روشی مشخص است (و اینکه چگونه آن تَسک در مجموعهٔ مربوطه جای می‌گیرد.)

به عبارت دیگر، یک دولوپر به اصطلاح Proficient (متخصص) می‌‌تواند Competent (داری مهارت) هم باشد؛ اما عکس این گزاره درست نیست! کتابی تحت عنوان Dreyfus Model of Skill Acquisition این موضوع را با همۀ جوانب و جزئیاتش بررسی کرده است (گرچه عنوان کتاب تاحدی آکادمیک به‌ نظر می‌رسد، اما نکاتی که در این کتاب مطرح شده‌اند بسیار کاربردی و قابل‌فهم هستند.)

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

- نحوۀ کار با سیستم‌های ورژن کنترلی همچون Git
- نحوۀ به‌کارگیری یک معماری برنامه‌نویسی
- نحوۀ راه‌اندازی یک سروِری که پایدار باشد
- نحوۀ کوئری زدن به دیتابیس
- نحوۀ پیاده‌سازی یک لی‌‌اوت ریسپانسیو (واکنش‌گرا)
- نحوۀ کار با API و غیره

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

اساساً Proficiency (تخصص) عبارت است از «چرایی» انجام کارها در قالب روشی مشخص. در واقع، تعریف تخصص گویای تفاوت میان فهم هر یک از اجزای مسأله به‌تنهایی، با فهم چگونگی قرارگیری هر جزء در کل تشکیل دهندۀ آن است (به نظر می‌رسد که این جمله کمی گنگ باشد! در همین راستا، در ادامه سعی می‌کنیم بیشتر این مسئله را رمزگشایی کنیم.)

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

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

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

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

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

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

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

- به دلیل انجام یک کار پی ببرید: برای خود توضیح دهید که به چه دلیل می‌خواهید تَسکی را در قالب شیوه‌ای مشخص انجام دهید. برای این کار، به بهترین شیوه‌هایی که نوعاً مورد استفاده قرار می‌گیرند و یا به دستورالعمل‌های عمومی اکتفا نکنید؛ بلکه مزایا و معایبی اَپروچ‌ها (رویکردها) را به‌ صورت جداگانه و دقیق بررسی کنید.

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

- ببینید سایر دولوپرها چرا و چگونه دست به ساختارشکنی زده‌اند: در واقع، به قانون‌شکنی‌هایی که مقدمۀ پیروزی شده‌اند، دقت کنید. گاهی برخی از قوانین خود را بشکنید و ببینید کدام‌یک به شما آسیب می‌رساند، کدام‌یک کمک‌تان می‌کند و کدام یک هیچ تغییری ایجاد نمی‌کند!

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

- خود را درگیر پروژه‌های عملی کنید: خود را عمیقاً در پروژه‌ای که با آن چندان آشنا نیستید درگیر کنید و تلاش کنید تا راه درستی برای انجام آن پیدا کنید. برای این کار، به روتین‌های قدیمی خود، عادت‌ها و سولوشن‌های قدیمی و تاریخ‌گذشته اکتفا نکنید.

- از دیگران در مورد دلیل انجام کارهایشان سؤال کنید: تا می‌توانید از دیگر دولوپرها سؤال کنید اما دلایل جزمی و متعصبانه را اصلاً نپذیرید! از آن‌ها بخواهید با مثال توضیح دهند و خود در رابطه با زمینۀ کاری آن‌ها تحقیق کنید؛ بدین ترتیب، می‌توانید وضعیت مورد بحث را در شرایطی مشابه شرایط ایشان تصور کنید. انجام این کار به شکل خارق‌العاده‌ای ارزشمند و مؤثر است چرا که به شما کمک می‌کند نقاط ضعف و قوت ایده‌های دیگران را در عادات معمول‌شان ببینید.

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

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

حال نوبت به نظرات شما می‌رسد. آیا پس از ورود به حوزهٔ توسعهٔ نرم‌افزار صرفاً به Competency توجه کرده‌اید یا اینکه تمام تمرکز خود را روی Proficiency یا بهتر بگوییم «تخصص» معطوف نموده‌اید؟ نظرات، دیدگاه‌ها و تجربیات خود را با دیگر کاربران سکان آکادمی به اشتراک بگذارید.

منبع