همیشه یکی از سخت ترین و در عین حال مهمترین کارها در تشکیل تیم فنی پیدا کردن و انتخاب یا همان استخدام نیروی برنامه نویس است.

در اهمیت این موضوع آقای فردریک بروکس (Fredrick Brooks) سالها پیش (۱۹۷۵) در کتاب معروفش The Mythical Man-Month اشاره میکند که:

در میان برنامه نویسانی با ۲ سال سابقه و آموزش یکسان، بهترین هایشان ۱۰ برابرِ بدترینشان کارایی دارند!

حدود ۲۰ سال بعد تیم آقای Barry Bohem به این نتیجه رسیدند که یک برنامه نویس خوب ۲۵ برابرِ برنامه نویس بد کارایی و بهره‌وری دارد و ۱۰ برابر باگ کمتری در کدها بجا میگذارد!

حتی اگر ما همان حداقل یعنی ۱۰ برابر را نیز در نظر بگیریم بازهم تفاوت بسیار زیاد است.

پس اینجا به یکی از مهمترین فاکتورهای شکست یا پیروزی بسیاری از شرکتهای نرم‌افزاری و استارتاپها پی میبریم. چون هم تعداد باگ و بهره وری و هم سرعت در پیاده سازی عامل بسیار مهم و تعیین کننده‌ای هست.

علاوه بر آن میزان دستمزد یک برنامه نویس خوب و بد هم قطعا در یک تیم تفاوت ۱۰ یا ۲۵ برابری ندارد! پس اهمیت انتخاب صحیح افراد تیم بسیار بیشتر خواهد شد.

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

از مهمترین وظایف مدیر فنی که باید بصورت همیشگی و مستمر انجام شود استخدام برنامه نویسان خوب هست. البته اینجا یک نکته مهم وجود دارد (که منتصب به استیو جابز هست ولی مطمئن نیستم) :

A’s hire A’s and B’s hire C’s

پس اولین قدم استخدام مدیران سطح A هست!

مبحث استخدام و جذب نیروی برنامه‌نویس موضوع مفصلی هست که من در سال گذشته در ارائه ای که در اولین رویداد استارت تاپ ناب در دانشگاه فردوسی مشهد داشتم به این موضوع بصورت مفصل پرداختم که فایل ارائه را در این ادرس می توانید دریافت کنید.

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

اما در اینجا به همین نکته بسنده میکنم که الزاما افراد خیلی عالی تیم خوب و عالی نمیسازند و این یک اشتباه بزرگ هست که برخی از شرکتها و استارتاپهای بزرگ و دارای سرمایه زیاد بدنبال جذب بهترین های مثلا حوزه برنامه‌نویسی در یک شهر و یا حتی کشور میگردند و تصور میکنند که اگر مثلا ۱۰۰ نفر از بهترین برنامه نویسان را جذب کنند می توانند بهترین تیم برنامه‌نویسی را هم تشکیل دهند.

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

در آینده در این مورد بیشتر خواهم نوشت.

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

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

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

در تعاریف استارتاپی ما چیزی به نام «محصول حداقلی» یا «حداقل محصول قابل قبول» داریم که احتمالا با آن آشنا هستید، Minimum Viable Product یا  MVP. در ساده‌ترین تعریف یعنی محصولی که در سریعترین زمان ممکن با حداقل امکانات ایجاد شود که ویژگیهای مورد نظر ما را بتواند به مشتری انتقال دهد و قابلیت توسعه نیز داشته باشد.

حالا در اینجا می خواهیم در مورد «برنامه‌نویس حداقلی» یا «حداقل برنامه‌نویس قابل قبول» صحبت کنیم که شاید بتوان آنرا Minimum Viable Programmer یا باز هم همان MVP نامید.

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

انواع مهارتهای یک برنامه نویس:

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

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

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

مهارتهای شخصیتی و فردی یک برنامه نویس:

بنا به تجربه خودم در زیر به برخی از مهارتهایی اشاره می کنم که در تمام این سالها بارها نتایج مثبت آنها را در افراد مختلفی که شروع بکار کرده اند و یا مشغول بکار بوده اند دیده ام:

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

2- توانایی برقراری ارتباط با دیگران: برای اینکه بتوان پرسشهای درست پرسید باید با اصول برقراری ارتباط آشنا بود و همینطور در کار گروهی و همکاری با یک تیم باید بتوان ارتباط خوب و موثر برقرار کرد.

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

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

5- مطالعه غیر تخصصی: بله منظور خواندن رمان، داستان و یا کتابهای غیر درسی دیگر است که به برنامه‌نویس کمک خواهد کرد مهارتهای دیگر خود را به شدت افزایش دهد. در اینجا فکر نمیکنم بیش از این نیاز باشد از فواید مطالعه صحبت کنم!

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

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

8- توانایی و علاقه مندی به نوشتن و مستند سازی: یکی از مهمترین و شاید سختترین کارها در برنامه‌نویسی نامگذاری و کامنت‌گذاری کدهای برنامه است. شاید این نکته عجیب باشد ولی یک برنامه‌نویس باید توانایی نوشتن خوبی داشته باشد تا بتواند کدهایی خواناتر تولید کند. و علاوه بر آن باید به نوشتن علاقه‌مند باشد و باید نویسنده خوبی باشد.

9- توانایی کار به مدت طولانی و بیشتر از ساعت کاری: گاهی اوقات برای رساندن یک کار و انجام پروژه نیاز هست که بیشتر از ساعت کاری مرسوم یا توافق شده کار کرد و یک برنامه نویس نیز باید این توانایی را داشته باشد که چندین ساعت بیشتر از حد معمول کار کند. البته قطعا این مورد نمی تواند برای همیشه ادامه داشته باشد ولی به نظرم در کار برنامه‌نویسی که اتفاقات غیر مترقبه زیادی ممکن است رخ دهد و تمام محاسبات زمانی را به هم بزند، یک برنامه نویس باید بتواند آنرا جبران کند.

10- تسلط به زبان انگلیسی: این مورد هم از الزاماتی است که برنامه نویس اگر بخواهد از منابع موجود و به روز استفاده کند باید به زبان انگلیسی تسلط داشته، مهارت بالا در درک مطلب و مهارت متوسط در نوشتن مطلب چرا که گاهی اوقات باید با دیگر برنامه نویسان غیر ایرانی ارتباط برقرار کرد و یا در سایتهایی مثل StackOverflow سئوالی را مطرح کرد.

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

یک نکته‌ای که همیشه به اشتباه در مورد برنامه‌نویسی و برنامه‌نویس در ذهن افراد وجود داشته اینست که تصور می‌شود برای برنامه‌نویس شدن نیاز به هوش بالا و استعداد خاصی است! من هم در لیست خودم اصلا به این مورد اشاره نکردم و به نظر من اصلا این درست نیست و شاید در یک مقاله دیگر در این مورد بصورت کامل صحبت کنم.

برای برنامه‌نویس شدن نیاز به هوش بالا و استثنایی نیست و یا بعبارت دیگر برنامه‌نویسان الزاما آدمهای باهوش یا نابغه‌ای نیستند!

حرفه ای گری در برنامه نویسی

این آخرین بخش سری مطالب حرفه ای گری در برنامه نویسی است. پیشنهاد میکنم حتما بخشهای گذشته را مطالعه کنید: بخش اول بخش دوم بخش سوم - قسمت اول بخش سوم - قسمت دوم

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

آشنایی با حوزه کار برنامه

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

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

پس حتما قبل از شروع به تحلیل و نوشتن یک برنامه، کمی در مورد حوزه کاری و رفتار کاربران آن تحقیق نمایید.

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

با کارفرما یا مشتری خود یکی شوید!

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

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

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

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

انسانیت

ما برنامه نویسان به نوعی یک خالق هستیم. چیزی را که وجود خارجی ندارد خلق میکنیم. می توانیم به اختیار خود دستوراتی دهیم تا آن مخلوق انجام دهد. می توانید کارهای زیادی انجام دهیم و این ممکن است ما را متکبر و مغرور کند.

اما یک برنامه نویس حرفه ای در اوج قدرت یا مهارت همیشه نکاتی را رعایت میکند. هیچگاه خود را برتر از دیگران نمی داند.

اگر اشتباه خنده داری بکند خودش اول از دیگران به اشتباه خود می خندد. و به اشتباه دیگران نمی خندد چون می داند خودش نیز ممکن است روزی اشتباه کند.

کمک به دیگر برنامه نویسان را یک اصل برای خود می داند و هیچگاه از اینکه ممکن است دیگری از او بیشتر بداند ناراحت نمی شود چرا که خودش نیز همواره در حال یادگیری و ارتقا سطح خود است.

سخن آخر

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

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

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

لطفا نظرات خود را با من در توییتر و یا از طریق ایمیل در میان بگذارید.

حرفه ای گری در برنامه نویسی

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

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

تمرین کردن

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

می توانید به این کاتاها بصورت یک تمرین ۱۰ دقیقه اول روز برای گرم کردن و یک ۱۰ دقیقه در پایان روز برای سرد کردن خود نگاه کنید!

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

همکاری

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

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

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

شاید به همین دلیل باشد که اکثر برنامه نویسان یا گیکها معمولا در یک اتاق تاریک، ساعتها وقت خود را به تنهایی می گذرانند و این باعث می شود که دیگران، برنامه نویسان را انسانهایی جامعه گریز و انزوا طلب قلمداد کنند.

آموختن دانسته ها به دیگران (منتوریگ)

همه ما می دانیم که بهترین راه یادگرفتن عمیق یک مطلب سعی در یاد دادن آن به دیگران است. چرا که برای آموزش یک مطلب می بایست به آن مسلط بود و همینطور گاهی به چالش کشیده شدن دانسته ها می تواند باعث درک بهتر آن شود.

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

یک برنامه نویس حرفه ای نباید از هیچ فرصتی برای یاددادن دانسته های خود به دیگران صرف نظر کند.

برای اینکه مطلب طولانی نشود در پستی دیگر ادامه بحث را خواهم آورد.

حرفه ای گری در برنامه نویسی

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

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

این بخش بدلیل اینکه مفصل تر می باشد من آنرا در ۳ قسمت آورده ام که این نوشته قسمت اول آنست.

اخلاق کاری

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

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

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

در کتاب The Clean Coder عمو باب می گوید که مثلا اگر شما قرار است در هفته ۴۰ ساعت برای کارفرما خود کار کنید باید ۶۰ ساعت زمان برای کار کردن بگذارید. که ۴۰ ساعت برای کارفرما و ۲۰ ساعت دیگر برای خودتان است تا مطالعه کنید، تمرین کنید، کدهای جدید بنویسید و کدهایی را ببینید و در کل سطح مهارت خود را بالا ببرید و یا بهتر بگویم بالا نگه دارید.

ممکن است گاهی لازم باشد بیشتر هم وقت بگذارید. این زمان برای خودتان است و نه کارفرما.

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

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

البته که شما نباید از وقتی که برای کارفرما اختصاص داده اید (همان ۴۰ ساعت) برای اینکار استفاده کنید. کارفرما نباید هزینه اینکه شما ممکن است چیزی را برای انجام پروژه وی ندانید، را بدهد؛ چرا که یک برنامه نویس حرفه ای استخدام کرده است و دستمزد برنامه نویس حرفه ای را هم پرداخت میکند.

یکی از تفاوتهای عمده برنامه نویس حرفه ای و آماتور در اینست که از برنامه نویس حرفه ای انتطار نمی رود از زمانی که برای انجام کار در اختیار دارد برای یادگیری نحوه انجام آن کار استفاده نماید.

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

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

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

خودم در سالهای ۷۶ و ۷۷ با اینکه بیش از ۵ سال کار برنامه نویسی برای خودم انجام داده بودم دنبال شرکتهای نرم افزاری میگشتم که من را بصورت رایگان بپذیرند تا در کنار آنها آموزش ببینم و شاید مدت ۲ سال بصورت رایگان در چند شرکت بزرگ، برنامه نویسی کردم که گاهی اوقات متوجه میشدم سواد برنامه نویسی من از برخی از کارکنان و برنامه نویسان رسمی آنها نیز بالاتر است ولی هیچ وقت این باعث نشد که از یادگیری از آنها دست بردارم.

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

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

حوزه کاری خود را بشناسید

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

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

همچنین بطور خیلی خلاصه لیستی از چیزهایی که یک برنامه نویس حرفه ای باید در این مورد بداند را لیست کرده است:

  • الگوهای طراحی Design Patterns: شما باید بتوانید هر ۲۴ الگو طراحی برنامه نویسی که در کتاب Gang of Four آمده است را شرح دهید.

  • اصول طراحی Design Principles: شما باید اصول SOLID در طراحی شیء گرا را بشناسید. (که اشاره می کند به ۵ اصل طراحی شیء گرا که برای اولین بار همین آقای عمو باب در سال ۲۰۰۰ مطرح نمود و مخفف Single responsibility, Open-closed, Liskov substitution, Interface segregation Dependency inversion می باشد).

  • متدهای پیاده سازی: شما باید با روشهای XP، SCRUM، Lean، Kanban، Waterfall و همچنین طراحی و آنالیز ساخت یافته نیز آشنایی داشته باشید.(Structured Analysis , Structured Design)

  • دیسیپلین: شما باید در زمینه های TDD و طراحی شیء گرا، برنامه نویسی ساخت یافته، یکپارچه سازی مداوم (Continuous Integration) و همینطور برنامه نویسی دوتایی (یا جفتی) (Pair Programming) تمرین های کافی را داشته باشید.

  • ابزارهای اصلی طراحی: شما باید روش استفاده از این ابزارها را بدانید: UML ،DFDs، نمودارهای ساختار (Structured ChartsPetri Nets ، State Transition Diagrams and Tables، فلوچارت و جداول تصمیم.

یادگیری مداوم

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

باز هم عمو باب در کتاب آورده است، کدام پزشک موفقی را میشناسید که آخرین ژورنالهای پزشکی را نداشته باشد؟ چه کسی وکیلی را استخدام میکند که از آخرین تغییرات قانون خبر نداشته باشد؟ یک برنامه نویسی را استخدام میکند که به روز نباشد؟

کتاب، بلاگ، مقاله و … بخوانید. در گروه ها و انجمنها و خبرنامه های مختلف عضو شوید. همیشه چیزهایی را خارج از حوزه تخصصی خود هم یاد بگیرید.

اگر برنامه نویس .NET هستید حتما زبان Java را هم یاد بگیرید، همینطور اگر برنامه نویس Java هستید با Ruby هم کار کنید. اگر با C برنامه نویسی میکنید زبان Lisp را هم یاد بگیرید. و اگر دوست دارید مغزتان حسابی به چالش کشیده شود زبانهایی مانند Prolog و Forth را کار کنید.

موضوع اخلاق کاری هنوز ادامه دارد و چند مورد دیگر آنرا در قسمت دوم این موضوع آورده ام.