خیلی طولانیه، نمیخونم:
هرچیزی که باهاش راحتتر هستید، شما رو زودتر به پولتون میرسونه و مشتریتون رو هم راضی نگه میداره میشه بهترین فریمورک برای شما!
بریم تو جزئیات:
برنامهنویسی، یک حرفه هست. یه فرق بین یک مهندس نرمافزار و برنامهنویس وجود داره. یک برنامهنویس الزاما دانش مهندسی نداره، و یک مهندس نرمافزار الزاما دانش برنامهنویسی. از اینجاست که وقتی کسی ازمون بپرسه که «من میتونم برنامهنویس بشم؟» با وجود اینکه مثلا رشتهی تحصیلیش آبیاری گیاهان دریایی بوده (صرفا منظورم بیربط بودن رشتست)، ما بهش میگیم «آره که میتونی، فقط کافیه یه درک از ریاضی (که اینجا منظورمون احتمالا الگوریتم حل مسئلست) داشته باشی…».
اما اگه یکی بیاد و از ما بپرسه که «من میتونم مهندس نرمافزار بشم؟» اونجاست که یکم صبر میکنیم، فکر میکنیم و شرایط رو میسنجیم تا جوابی صرفا از روی باد هوا ندیم.
راستش هدفم این نیست که راجع به مهندسی نرمافزار توضیح بدم. اما فکر میکنم برای چیزی که میخوام بگم، لازمه درموردش کمی حرف بزنم و تفاوتهاش با حرفهی برنامهنویسی رو بگم.
مهمترین تفاوت حرفهی برنامهنویسی و مهندسی نرمافزار، توی تحصیلاتیه که یک مهندس میگذرونه. یک مهندس نرمافزار، با دانش مدیریتی و ریاضیاتی که کسب میکنه، موضوع (میتونید فرض کنید یک پروژه) رو از بالا نگاه میکنه، اون رو آنالیز میکنه و نیازهای مشتری رو میسنجه، کاربرها و مشتریهای اون رو بررسی میکنه و در نهایت با یک راه حل مهندسی شده یا Engineered Solution برمیگرده. اصولا مهندسی نرمافزار یک کار تیمیه، در حالی که حرفهی برنامهنویسی یک کار یک نفره.
یک برنامهنویس، یا توسعهدهندهی نرمافزار، کسیه که رهنمودها یا Guidelineهای مهندس رو میگیره و اونها رو تبدیل به یک برنامهی کامپیوتری میکنه. مهمترین ویژگی برنامهنویسها اینه که خوب تجربه کسب میکنن و اکثرا تجربشون به دانشی که نیاز دارن برای اینکار میچربه.
اما سریع تفاوتهاشون رو بررسی میکنم:
- تحصیلات، مهندس نرمافزار توی دانشگاه درس میخونه و مدرک مهندسی توی شاخهی کامپیوتر میگیره. برنامهنویس به صورت خودآموز یاد میگیره و تجربهی کاری کسب میکنه.
- مهندس نرمافزار معمار سیستم میشه، برنامهنویس کسیه که اون رو پیادهسازی میکنه.
- مهندس نرمافزار کلینگر و برنامهنویس جزئینگر به حساب میاد.
- مهندس نرمافزار یک رویکرد علمی نسبت به حل مسئله داره و اون رو آنالیز میکنه، برنامهنویس تیکههای مختلف رو میسازه و روی یک موضوع در لحظه فوکوس میکنه.
- مهندس نرمافزار باید دانش تحلیلی زیاد و قدرت حل مسئلهی زیاد داشته باشه، برنامهنویس دانش زبان برنامهنویسی میخواد.
- مهندسین نرمافزار تو تیمهای مهندسی کار میکنن و برنامهنویسها قالبا به تنهایی.
قبول دارم که گاهی تشخیص حد فاصل بین این دو واقعا سخت میشه، اما باید با خودمون روراست باشیم، برنامهنویس هستیم یا مهندس نرمافزار؟ اما این موضوع چه ربطی به فریمورک داره؟ جدا، مگه انتخاب فریمورک چی داره که لازمه فرق مهندسی نرمافزار و برنامهنویسی رو دونست؟
یکی از دانشهایی که یک مهندس نرمافزار تو دورهی تحصیلش کسب میکنه، قدرت مدیریت پروژه هست. یعنی میتونه یک پروژه رو کاملا آنالیز و نیازسنجی فنی بکنه. یعنی میتونه پروژه رو تعریف، برنامهریزی و اجرا کنه، و در نهایت اون رو ببنده (اینا اصول ساده مدیریت پروژه هستن). این توانایی مهمی محسوب میشه: آنالیز کردن پروژه!
بخشی از آنالیز کردن پروژه شامل این میشه که شما نیاز مشتریتون رو درک کنید، و وقتی که به برنامهریزی میرسید، بتونید سه فاکتور مهم زمان، هزینه و تلاش (Effort یا گاهی Scope) در اجرای پروژه رو تو حالت اوپتیمال نگهدارید.
یک بخش از این پروسهی اوپتیمال نگه داشتن، شامل انتخاب ابزاری میشه که به مصرف کنندش (برنامهنویس و مهندس نرمافزار) خدمت کنه، نه اینکه جلوی دست و بالش رو بگیره. این خیلی خلاصه یعنی: ابزار باید به شما خدمت کنه، نه شما به اون. و بخشی از این خدمترسانی یعنی «اوپتیمال نگه داشتن مثلث جادویی».
پس ما باید ابزاری رو انتخاب کنیم که کیفیت مثلثجادویی رو حفظ کنه، اما خود این مثلث تابع چیاست؟ خیلی ساده و کوتاه:
- هزینهای که مشتری شما میخواد پرداخت کنه، و هزینهای که لازمه شما تو طول انجام پروژه پرداخت کنید،
- زمانی که مشتری میخواد پروژه رو تحویل بگیره، و مدت زمانی که شما میتونید کار کنید و پروژه رو به اتمام برسونید و
- تلاشی که میخواید برای پروژه بکنید و محصولی که مشتری میخواد در نهایت ببینه.
تو این بحث دو تَن وجود دارن: شما و مشتری شما! «شما» اینجا اِلِمان ثابت هستین اما «مشتری» شما نیست، یعنی شما تا آخر عمرتون با یک شخص یا برای یک شخص کار نمیکنید.
پر واضحه که نیازهای پروژهها بر مبنای نیازهای ذینفع یا Stakeholderهای پروژه تغییر میکنه، و این خیلی ساده ما رو به این نتیجه میرسونه که انتخاب ابزار، بر مبنای نیاز مشتری تغییر میکنه.
فاقد از اینکه شما یک مهندس نرمافزار هستید که دانش اینکار رو داره یا برنامهنویس که با تجربه، این دانش رو بدست آورده، تلاش کنید که اول مدیریت پروژه و نیازسنجی رو یاد بگیرید. گرچه برنامهنویسها نیاز بیشتری به این موضوع دارن تا تو دام «این فریمورک از اونیکی بهتره» یا همون «جنگ بزرگ فریمورکها و ابزارها» نیوفتن.
این دانش مدیریت پروژست که به شما میتونه کمک کنه، سریعتر، بهترین ابزار رو برای کارتون انتخاب کنید. در نهایت، هرکسی که یه ابزاری رو ساخته، معتقده که ابزارش مشکل خودش رو به خوبی حل میکنه، اما تو دنیا ابزاری نداریم که مثل شاهکلید باشه، حلال همهی مشکلات…
سعی کنید که به مشتریتون اهمیت بدید، چون در نهایت اونه که پول رو به شما میده.
آرزوی موفقیت دارم براتون
آیین