وبلاگ شخصی حامد شیربندی

حامد شیربندی

توسعه دهنده نرم افزار

آیا من یک برنامه نویس هستم؟

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

 آیا من یک برنامه نویس هستم ؟

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

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


یک واقعیت که تحمل شنیدنش را نداری!


آیا همین که من به یک تکنولوژی یا یک ابزار توسعه مسلط شدم و چند کار را با آن انجام دادم برنامه نویس هستم؟ آیا اگر من یک یا چند دوره ی آموزشی برنامه نویسی را پشت سر گذاشته و چند کار را انجام دادم برنامه نویس هستم؟

 شخصی فارغ التحصیل رشته ی برق یا مثلا عمران است و بازار خوب برنامه نویسی را دیده و تصمیم میگیرد در یک دوره ی آموزشی 3 ماهه شرکت کند، بعد تقلا میکند و در یک شرکتی به عنوان کارآموز مشغول میشود و 1 سال بدون دریافت حقوق کار میکند. حالا این شخص در دوره ی بعدی 2 سال است که در یک شرکت با یک حقوقی مشغول به کار است، نگاه که میکنی میبینی هِد فنی آن شرکت هم هست و در شرایط پیاده سازی یک پروژه ی جدید به هیچ وجه قبول نمیکند کسی بجز خودش طراحی و مدل کردن دامین آن نرم افزار را انجام دهد چرا که این استرس را دارد که دیگران نتوانند این بخش حساس را به درستی انجام دهند در حالی که خودش پایه ای ترین مفاهیم مدلسازی و تجزیه و تحلیل را نمیشناسند. حالا کافی ست از او درمورد برنامه نویسی بپرسید و به او چند سورس "خوب" را نشان بدهید، قطعا کار هیچ کسی را قبول ندارد و اگر شده چند نقص از دل سورس اختراع میکند. او قادر است 3 روز درباره ی شرایط بد کد نویسی و سطح پایین کدنویسان در ایران برای شما صحبت کند. سعی کنید به این شخص بگویید اشتباه میکند، فقط یک لحظه سعی کنید تا شما را با هفتاد روش سامورایی متلاشی کند. 

اما آیا او یک برنامه نویس است؟


از پیله تا پروانه ( لوپِ پی بردن به یک توهم )


آنجا که من احساس کردم قطعا تنها برنامه نویس روی کره ی زمین هستم داشتم روی پروژه ی MVC که به تازگی توسط مایکروسافت ارائه شده بود کار میکردم و تمام تمرکز و سعی و تلاشم را روی آن گذاشته بودم و کاملا نسبت به طراحی نرم افزار حواس پرت شده و توسعه وب با MVC را مساوی توسعه ی وب می پنداشتم. یعنی من در آن دوران فکر میکردم که همه چیز این دنیا (وب)  فقط MVC است، فقط این مهم بود که دیتا را چطور توی یک پیج رندر کنم و چطور به فعالیت های کاربر پاسخ دهم. طبیعی است که با این همه زمانی که فقط به یک تکنولوژی اختصاص داده بودم خیلی در آن قدرتمند شده و آن احساس غرور سراغم آمده بود پس "آن" حامد حق داشت که یقین داشته باشد برنامه نویس خوبی است اما "این" حامد میداند که آن موقع درمورد معماری، مدیریت منابع، الگوهای طراحی، اصول SOLID و .. هیچ تلاش درخوری انجام نداده بود. یعنی آن حامد بدون اینکه با SOLID آشنا باشد چندین نرم افزار را  به صورت آشفته کد نویسی کرده بود که در دل آن یک MVC تمیز کار شده بود.آیا حق نداشت زمانی که با اصل SRP آشنا شد و فهمید چه آشغال کدی توسعه داده سرخورده شود و احساس کند برنامه نویس نیست؟

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

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


پس چه کسی برنامه نویس است؟


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

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

وقتی من صلاحیت کاری را ندارم اما در توهمات خودم و مدیر نا آگاهم غرق شده و هد فنی شده ام باعث ایجاد حالت اذیت کننده ای برای خودم و سایرین میشوم و موجی از انرژی های ناخوشایند را در کل شهر و حتی کشور انتشار میدهم. یک برنامه نویس مجرب و کار بلد برای یک همکاری به شرکت آمده و من که هیچ درکی از صحبتهای او ندارم با او مصاحبه میکنم و با افکار احمقانه اهداف و حرفهایش را زیر سوال میبرم و شب هم یک توییت درمورد سختی های کار مصاحبه با افراد ناپخت میفرستم و 100 نفر دیگر آن را میخوانند و بازنشر میکنند و در حین بازنشر شدن این موج انرژی منفی، آن برنامه نویس مجرب در گوشه ی خانه به حال خودش و کشورش تاسف میخورد و فکر فرار میکند.

مگر میشود شخصی که هیچ اطلاعی از الگوهای طراحی و معماری های نرم افزاری نداشته و درمورد تکنولوژی های مربوط به حوزه کاری خود اطلاعات عمومی مناسبی نداشته باشد ولی تمام مدلسازی ها و تحلیل ها باید زیر نظر او انجام شده و هدِ فنی تیم باشد؟

با توجه به توضیحات فوق تقریبا داریم به واژه ای به اسم "فیلد کاری" در توسعه نرم افزار نزدیک میشویم که کلید حل این معماست. در ادامه به این موضوع میپردازیم.


اهمیت فیلد کاری در برنامه نویسی


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

شما در طول مسیر خود در یادگیری و توسعه نرم افزار ابتدا به سمت علایق خود کشیده میشوید و وارد یک شاخه میشوید مثلا توسعه موبایل و درآنجا نیز با زیر شاخه های مختلفی روبه رو میشوید مثل game و ... که باز هم علاقه و مزیت ها شما را به سمت زیر شاخه ی مطلوب میرساند و در مرحله ی بعدی شما می بینید که در آن شاخه، تکنولوژی و ابزارهای متفاوتی وجود دارد و این شما هستید که باید با مطالعه و تحقیق و بررسی هوشمندانه تعیین کنید که فیلد کاری شما شامل کدام تکنولوژی و ابزارها در آن شاخه میشود و از این به بعد سایر اطلاعات خارج از این شاخه و تکنولوژی ها برای شما دنیای "خارج" محسوب شده و باید فقط و فقط جنبه ی اطلاعات عمومی داشته باشد که اینها باعث می شود دید بهتر و تسلط بالاتری نسبت به فیلد کاری خود بدست آورید.

اما ما چطور باید یک فیلد کاری مناسب را انتخاب کنیم؟  چقدر باید در آن ریز شویم؟ برای مثال ASP.NET MVC به تنهایی یک فیلد کاری است؟

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

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


آیا من یک برنامه نویس هستم؟


اگر شما توانستید که یک برنامه بنویسید که 2 عدد از ورودی بگیرد و حاصل جمع آنها را در خروجی چاپ کند شما قطعا یک برنامه نویس هستید و آن برنامه را خلق کرده اید اما باید این کشش را داشته باشید که اگر در مورد افزایش Performance یک سیستم نرم افزاری صحبت شد با اعتماد به نفس بگویید "من نمیدانم" و این نمیدانم باید به صورت یک تسک در ذهن شما ثبت شود و در اولین فرصت به سراغ آن بروید تا بدانید و این دانستن ها در ادامه باعث رشد شما خواهند شد تا اگر درمورد افزایش Performance یک سیستم نرم افزاری صحبت شد شما با اعتماد به نفس، راهکار ارائه دهید.

همین که شما برنامه نویسی یک اپ را انجام دادید و یا در تکنولوژی خاصی مسلط بودید نباید باعث غرور و بسته شدن دریچه های ذهن شما شود و فرصت رشد را از خودتان بگیرید.

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

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


نوشته شده توسط حامد شیربندی

اگر در مورد این نوشته سوال یا ابهامی وجود دارد میتوانید به ایمیل من ارسال کنید. البته در این مورد باید کمی صبور باشید. در آینده بخش نظرات اضافه خواهد شد.