مهندس نرم افزار کیست؟

کیفیت کدواحد اندازه گیری کیفیت کد: به تعداد فوشهایی که برای درک کد در یک دقیقه برای نویسنده اثر اختصاص داده میشه، کیفیت کد رو مشخص میکنه :) کد مثل شعر یک اثر هنری هست، بعد شما قرار هست یکی اون رو بخونه، حین نوشتن کد، یک اثر هنری خلق کنید چون کسی کد رو بو نمیکنه یا نمیخوره!! میخونه و باید قابل خواندن باشد :)صلاحیت توسعه دهنده ها!ابتدا بنده قبل شروع پست گاردم رو بگیرم! هدف آزرده خاطر کردن یا تحقیر کردن هیچ کسی نیست، مطالب حتی خود من رو هم دربر میگیره - در فلسفه یکسری ریزورها هست که مثل چاقو برش دارهHanlon's razor چیزی رو که میشه بهش اسم حماقت داد، به چشم سواسفاده دیدن کار اشتباهی هست. ما همه توسعه دهنده هستیم و همگی سعی داریم کار خوبی انجام دهیم و نیتمون همیشه خیر هست، ولی گاها به دلیل نبود دانش کافی و عدم صلاحیت کافی کارو خراب میکنیم و اینحا ریزور هنلونز میگه این شخص نیتش سو استقاده نبود، فقط حماقت کرده، ما اجازه نداریم این رو بر پایه سو استفاده قضاوت کنیم هم عادلانه نیست هم اخلاقی نیست، پس منم به عنوان توسعه دهنده خیلی جاها کدهای بدی نوشتم و دلیلشم عدم دید کافی بوده و سو نیتی نداشتم.با گاردی که گرفتیم و استباطی که از ریزور هنلونز میتونیم بکنیم، اینحوری بگیم، اگر وارد یه شرکتی میشید و چشم باز میکنید و توی دستتون یه پروژه میبینید که کدهام کثیف هستند اینجا نگید توسعه دهنده قبلی سواستفاده کرده و فقط پولش رو گرفنه، وقتیم دیده نمیشه استعفا داده رفته، هنلونز میگه اینجا ما میتونیم این رو با حماقت توجیه کنیم، شخص قبلی فقط حماقت کرده چون صلاحیت کافی رو نداشنه همین، نمیشه قضاوت کرد که داشته از شرکت سواستفاده میکرده چون چنین قضاوتی خیلی غیر اخلاقی هست.من گاردم رو گرفتم و بازم میگم به عنوان توسعه دهنده هممون نیتمون خیر هست.افراد جونیور و کسانی که تازه وارد این رشته شدن مورد هدف این متن نیست.بر گردیم به اصل موضوع.چرا بیشتر توسعه دهندها صلاحیت کافی برای پیشبرد پروژه رو ندارن ولی با این حال دنبال اینن که مدیریت پروژه رو به دست بگیرن، بعدشم با حماقت هاشون هم وقت تیم هم بودجه شرکت رو به باد بدن، اخرشم پروژه شکست میخوره، اصلا خودش رو مقصر نمیدونه!!آیا برای هدایت تیم و پیشبرد یه پروژه نرم افزای داشتن تخصص برنامه نویسی کافی هست؟مهندس نرم افزار کیست؟مهندسی نرم افزار چیست؟خوب به دلیل اینکه نمیشه همه اینارو توی پست جا داد و لینکدین محدویت کلمه داره، از طرفیم معقوله مهمی هست من در قالب مقاله آوردم تا دوستان هم بتونن نظر خودشون رو بدن تا به یه جمع بندی برسیم.همانطور که میدونید مدیریت، لیدر بودن یه علم جدایی از مهندسی هست و یه مهندس خوب لزوما یه مدیر خوب نیست، یعنی اگر ده ساله دارید توسعه دهنگی میکنید لزوما صلاحیت لیدری یه تیم نرم افزاری رو ندارید، کسیم که لیدر هست لزوما مهندس نرم افزار خوبی نیست.پس وقتی یه جایی چند سال کار کردیم زود هوس مدیریت برمون نداره که من اینجا قدیمیم و باید بهم پست مدیریت بدن! اگر چندین سال توسعه دهندگی کردی که مدیر بشی! باید بگم راه رو اشتباه اومدی چون علم مهندسی با علم مدیریت از دور و نزدیکم به هم ربطی ندارن و بهتر بود شما از اول مدیریت بخونی و برای ارضای اگو خودت یا نمیدونم ارضای نیازهای مادیت میرفتی پی مدیریت، بخاطر حماقت و جاه طلبی شما قرار نیست تیم زیر دستت باشه و کلی هزینه بالا دست شرکت بگذاری آخرشم بگی مقصر شما هستین و شما از نرم افزار چیزی نمیدونید!! برای مدیریت باید علم مدیریت خوند و سافت اسکیل بالایی داشت.اگر دقت کنید یکسری سوالات پایه ای رو مطرح کردم، این سوال رو از یه برنامه نویس یکساله بپرسی یه تعریفی داره از یه برنامه نویس با ده سال تجربه یه تعریفی داره!!!شاید یکی بگه بخاطر انتزاعی بودن نرم افزار هست که هر کسی یه تعریفی دارد، میشه گفت بله! خود معقوله نرم افزار انتزاعی هست، ولی مهندسی نرم افزار خیرمهندسی نرم افزار از نظر اقای وود یکی از پیچیده ترین مهندسی های جهان هست، الان نمیخام وارد پیچیدگی بشم یه مقاله قبلا در مورد پیچیدگی نوشتم می تونید از اونجا نگاه کنید. وقتی ما به دیگر علوم مثل ریاضی و یا پزشکی، فلسفه نگاه میکینم میبینم این علوم بالای چندین قرن هست که داره از طرف ملل های شرق و غرب توسعه داده میشه! از زمان سینوهه تا بو علی و … ولی مهندسی نرم افزار شصت سالش نشده!! هنوز یه بچه نوپا هم نیست، تعریف دقیق این علم رو شاید بعد گذشت چند صد سال مثل دیگر علوم در آینده بشه نوشت ولی الان فقط میتونیم برحسب دیده هایی که در جهان و در عمل از این مهندسی میبینم تعریف کنیم، پس با یه علم ناشناخته و خیلی نوپا،پویا ...رو در رو هستیم که گاها بخاطر اشتباه یکسری افراد ضرر های ملیون دلاری به جهان وارد کردن و هنوزم به قوت خودشون ادامه میدن مثل نال پوینتر ها!! بیایم در پیرامون تعریف این مهندسی یکم بیشتر صحبت کنیم و از دید شرکت آی بی ام که سالهای دوهزار میلادی یو ام ال رو به عنوان زبان مشترک بین توسعه دهندها عرضه کرد، بعدشم آر یو پی رو دادن که از نظر من یکی از نفیس ترین منابع در پیرامون مهندسی نرم افزار هست و میشه گفت تا به الان هیچ شرکتی نتوسته در مورد این علم چنین تعاریف و ابزار جامعی عرضه بکنه، نمیخام اینجا تایید کنم این مدل رو، اینم دارای ایرادات هست چون اینام مثل منو شما با یه علم نوزاد طرف حساب هستند.این نوزاد رو هر کسی میخاد یه مدلی بشناسنه، هر کسی میخاد مثل این نوزاد به دنیا بیاره، ولی به دلیل عدم شناخت این علم دانشگاها عاجز موندن و نمیدونن چیکار باید بکنن که بعد فارغ التحصیلی یه دانشجو نرم افزار بتونه یه نرم افزار رو تولید بکنه!!!موضوع از همنیجا منفجر میشه، چرا که افراد چندین سال زحمت میکشن، درس میخونن در دانشگاه ولی وقتی با یه نرم افزار خیلی ساده رو به رو میشن هنگ میکنن!! در مقاله های قبلیم توضیح دادم در مورد ذات نرم افزار که اصلی ترین ذاتش پیچده بودنش، قابل تغییر و قابل دیده نشدنش هست، توی دانشگاه نمیتونه استاد به دانشجو یاد بده، ولی در اینور شما میبینی یکی بعد از فارغ التحصیلی از مهندسی عمران یا دکترای پزشکی وارد بازار کار میشه و خیلی زود شروع میکنه به کسب درامد و میتونه به خودش مهندس بگه... توی مهندسی نرم افزار کار هر کسی نیست که بتونه به خودش مهندس نرم افزار بگه!! این علم خیلی خیلی پیچیده هست و دارای ابعاد مختلفی هست، تنها به داشتن توانایی فنی نیست، چون وقتی یه پروژه رو میخای شروع کنی یه قسمت وصله به مشتری که انسان هست! پس باید بلد باشی تعامل با انسان رو، از طرفی هم باید بتونی نیاز مشتری رو بهتر از خودش بدونی، باهاش همدردی بکنی تا نیازهاش رو درک کنی. همچین دنیایی نداریم که بگیم من نابغه نرم افزار هستم ولی نمیتونم دو کلام با تستر یا مشتری بدون دعوا و خونریزی صحبت کنم.به نظر شما دلیل اصلی مشاجره بین برنامه نویس و مشتری یا تیم فروش یا تیم تست چیه؟ به نظر شما اقای اریک چرا اومد زبان مشترک رو پیشنهاد داد؟ به نظر شما چرا شرکت های بزرگ هر روز با متد های متفاوت، مثل تست نویسی، سعی دارند این مشاجره و اشتباهات رو به حداقل برسونن؟از همین جایی که وایسادیم با تعاریف بالا به مهندسی نرم افزار نگاه میکنیم، متوجه میشیم آتیشش خیلی تند هست و نمیشه با صبح اومدن و شب رفتن به خونه تو این رشته موفق بود، چون این رشته هوش و پشتکار میخاد، اگر امروز و فردات هیچ تفاوتی نداشته باشه موفق نمیشی، این رشته گاو و گوسفند پرست نیست بیشتر شعور و سخت کوش پرست هست! حالا سخت کوشهاشونم کاسه چه کنم دستشون هست، با چند ماه کارآموزی و دوتا فیلم اموزشی نمیشه مهندس نرم افزار شد!! یه کد نویس مبتدی میشید،یه توسعه دهنده نمیشید.توسعه دهنده گیست؟کد نویس کیست؟کد چیست؟افراد نا کاربلد توی این رشته خیلی زیاد هست، خودشون محتاج آموزش هستند، دارند آموزش میدن، خودشون محتاج نقشه راه هستن ولی دارند منتوری میکنن، خودشون الف بای مدیریت رو نمیدونن شدن کوچ، اسکرام مستر :)این افرادی که میگم توی دنیای نرم افزار واقعا شاهکار هستند و اینقدر که اینه اعتماد به نفس دارند هیچ حیوان درنده و برنده ای نداره !!اسم تحلیل گر سیستم گذاشته برا خودش رفته با مشتری صحبت کرده، امده رو کاغذ به توسعه دهنده راه نشون میده و میگه من تحلیل کردم شما پیاده سازی بکن! حالا هی بهش بگو این کارا اینجوری پیش نمیره!شاید به من بگید اقا یکم با ادب باش ولی واقعا دارم خودم رو کنترل میکنم! افرادی که هیچ صلاحیتی ندارن و میان به توسعه دهنده راه نشون میدن و بدترش، میگه توسعه دهنده احمق هست و چیزی که من خواسته بودم رو اشتباه متوجه شد!! سیب خواستم بهم هندوانه داده؟! داخل عمل انجام شده هم میگذاری شروع میکنه حاشا و داد و بیداد :) فک کن یکی بگه دکترم اما جیزی بارش نباشه!!حالا اگر اینجا توسعه دهنده خودشم صلاحیت کافی نداشته باشه واویلا میشه و باید دعا کرد به حال تیمی که بعد اینا قرار هست محصول اینارو به دست بگیره؟بعدشم میان میگن توسعه دهنده جماعت بی نظم هست، زیاد حقوق میخاد، بد قول هست؟دلیل بدقولی توسعه دهنده ها چیه؟کسی که با دوتا فیلم آموزشی میاد برنامه نویس میشه اون یکیم با دوتا دوره میشه کوچ و اسکرام مستر معلومه که وجود یکی از این موجودات در تیم باعث شکست پروژه میشه و باعث بد قولی میشه، اگر پروژه به موقع تموم بشه دست آورد کوچ، مدیر، اسکرام مستر هست، شکست بخوره مقصر توسعه دهنده هست، باید اخراج بشه یکی دیگه بیاد! این چرخه ادامه دارد، در نهایت در ذهن همه از برنامه نویس یه موجود ترسناک بدقول میسازن؟کسی که صبح میره و شبم میاد و روزهاش کلا فرقی نداره نمیتونه مهندس نرم افزار بشه.وقتی برا پروژه زمان میدی دوماه! ولی توی شیش ماه هنوز نتونستی نصف کارو جلو ببری یعنی صلاحیت کافی نداری و باید زیر دست یه سینیور کار کنی و یاد بگیری.اگر نمیدونی پروژه رو از کجا شروع کنی یعنی صلاحیت کافی نداری و راه زیادی داری مهندس نرم افزار بشی و هنوز در سطح جونیور هستی!اگر نمیتونی به عنوان لیدر پروژه اهمیت و زحمت کار رو به بالا دستی ها نشون بدی، صاحیت کافی نداری باید روی مهارت های نرم زیاد کار کنی و با توجیه اینکه مدیر بالایی بی سواد هست نمی فهمه! اگر در طول تمامی چرخه های نرم افزار کیفیت مطلوب رو نداره محصول و بهانت اینه عجله داشتیم، زمان کم بود ،بخاطر امنیت و پرفورمنس کد ها کثیف هستن!! شما صلاحیت این کارو نداری نیاز هست رو خودت بیشتر کار کنی!! فکر کنم کسی قبول نمیکنه وقتی دکتر عمل قلب انجام میده بگه عجله داشتم یا میخاستم سریع تموم کنم بخاطر این کشته شد!اگر نمیتونی با تیم کار کنی باید روی سافت اسکیل هات زیاد کار کنی، نرم افزار خیلی پیچیده هست و کار یک نفر نیست: وقتی دکتر داره جراحی میکنه، یکی داره عرق پیشونیش رو تمیز میکنه! یکی داره علایم حیاتی رو چک میکنه! یکی داره ابزار میده یکی داره محل خونریزی رو تمیز میکنه! اگر دکتر تنهایی وارد اون عمل بشه بیمار از دست میره!! مهندسی نرم افزار هنوز ناشناخته هست فعلا یه گروه هم به امنیت، پرفورمنس، تمیزی، تست .. نگاه میکنه، در آینده هر قسمت مجزا تیم خواهد داشت، مثل پزشکی و شاخه های متعددی به وجود خواهد آمد طوری که مهندس توسعه دهنده پرفورمنس، فقط روی پرفورمنس کار خواهد کرد مثل دکتر قلب یا مغز.کسی که دنبال پست مدیریت هست و همیشه رقابت سر مدیر شدن داره نمیتونه توسعه دهنده موفقی باشهکسی که سافت اسکیل قوی نداشته باشه نمیتونه مدیر فنی موفقی باشهکسی که سافت اسکیل و هارد اسکیل قوی داشته باشه و در کنارش سالهای طولانی چندین نرم افزار در چندین تیم متفاوت تجربه داشته باشه میتونه وارد مدیریت، منتوری، کوچ شدن بشه ولی باید سرش به تنش بی ارزه با یه پروژه در سطح شهری یا استانی نمیشه این چیزا!!میگه بدون وضو نماز میشه خوند! میگه ما خوندیم شد :) حال روز بیشتر کارکنان در دنیای نرم افزار هست، درصد زیادی صلاحیت کافی ندارن و شرکتم توانایی تشخیص نداره، همینجوری دارن تخته گاز منابع رو هدر میدن و از خودشون گیگ ساختن! متاسفانه با یه هودی و یه اسپرسو نمیشه! سیگار شاید به کارش بیاد!!باید بتونه آنالیز ریسک بکنه ، راحل های بهینه بده و برای هر چیزی راحل کد نویسی نده!!!باهوش بودنش میتونه اونو به توان برسونه ولی لزوما نیازمند هوش بالایی نیست.اونایی که به دلیل درامد نسبتا خوب این رشته میان به این بیزینس، به نظرم دوبار فکر کنن چون هر کسی نمیتونه موفق بشه تو این کار، نبود صلاحیت کافی باعث میشه همیشه تو اسرتس باشه و اخرشم نتونه به جایگاهی که میخاد برسه، یه مدت بعد دید نمیشه میره دو روز کلاس اسکرام میاد شده اسکرام مستر یا کوچ بعدش ضررهای میلیاردی به شرکت ها و ضررهای معنوی به روحیه و ذهن توسعه دهنده ها میزنه!! همیشه هم شاکی هست از زمین و زمان، اگر این نشانه ها رو داری یه لطفی به خودت ما بکن برو دنبال یه کاری که توش صلاحیت داری، تاوان عدم صلاحیت شمارو نباید شرکت ها تو توسعه دهنده ها بدند.این وسط افراد مستعد و خیلی کاربلدم داریم که خدا سایشون رو از بالا سرمون کم نکنه و چند تا محصول درست حسابی که تو بازار میبینم بخاطر برکت وجود این متخصص ها هست.توسعه دهنده ای که همیشه دعوا داره با تیم تست، بهتر هست یه فکری به سافت اسکیل هاش بکنه اگر دید نشد! یه لطفی بکنه از دنیای نرم افزار خدا حافظی بکنه.اگر برای یاد گرفتن خودت میخای یه تکنولوژی رو وارد پروژه بکنی، شما صلاحیت کافی رو نداری و راه زیادی با مفهموم مهندسی نرم افزار داری.اگر روز یا هفته هات بدون تغییر در سطح علمیت یکسان میمونه، هرچه سریعتر تغییر شغل بده یا که یه فکری بکن به حال و روزت و تا زمانی که درستش نکردی پیش یکی که صلاحیت داره کار بکن و پروژه ملت رو نگیر دستت، آموزشم نده!! همه یوتوبر شدن :) بیست سالش نشده عنوانش مهندس نرم افزار هست!! ارزش هر چی مهندس نرم افزار هست رو یکجا به باد داده و جایگاه اجتماعی و درآمدی این حیطه رو به گند کشیده! در ادامه مقاله سعی خواهم کرد در مورد مولفه های مهندسین نرم افزار و افراد مستعد و افراد با صلاحیت کافی رو بیشتر توضیح بدم و وارد اجزای مهندسی نرم افزار از لحاظ مفهومی بشم تا ببنیم مهندسی نرم افزار چیست و چه کسی مهندس نرم افزار هست، شرکت ها برای پیشبرد پروژه نیازمند کدام نیرو هستند و چه کسی صلاحیت لیدر، کوچ، منتور و اسکرام مستر رو داره! در مورد مهارت های نرم بیشتر صحبت خواهیم کرد و دلیل نیازمندی به این توانایی هارو خواهیم نوشت!!