در این سفر مهیج به دنیای برنامه نویسی، ما به کاوش در یک پروژه حساس پرداختیم.
سفر خودمون رو با این سوال آغاز می کنیم : کار کردن کردن یک سیستم مهم است یا کارایی و عملکرد آن سیستم ؟
+ پاسخ توسعه دهنده MR (فردی که ابتدا اقدام به توسعه و پیاده سازی سیستم کرده است ، که آن را MR صدا میکنیم )
بنظرم تو زمان محدودی که من داشتم و اینکه قالب پروژه مشخص نبود من بهترین کارو انجام دادم و اولیتم صرفا تعهد زمانی بوده که من به طرف قراردادم داشتم بود ،لازم ذکر کنم شرط ادامه این پروژه تحویل سریع این فاز و رونمایی بوده.
عالیه بنظرم اینکه نسبت به تعهد زمانی پایند باشی یک اصل مهمیه تو هر پروژه ، ولی به چه قیمتی ؟
خب قبل اینکه به سوال بالا پاسخ بدیم همین سوال رو از ChatGPT با در نظر گرفتن پاسخ MR میپرسیم تا ببینم نظر اون چیه :)
خب این سوالی رو با توجه به ابعاد پروژه و پاسخ اولیه آقای MR از ChatGPT پرسیدیم
خب برگردیم سر سوال قبلی مون :
تعهد زمانی مهم تره یا توسعه درست سیستم ؟ کدومش بیشتر برامون هزینه داره ؟
باید بگم هر دو این موارد با توجه به شرایط مهم هستن ولی ! ولی ! ولییییی ! تو رفتی ولی فکر تو سر من موند آقای MR 😂
ولی بنظر من (شخصیت کمالگرای خودم) اولیت توسعه درست هستش در کنار تعهد زمانی
خب چرا اولیت من توسعه درست هستش ؟
پاسخ کلیشه ای :
چون وقتی تو میخوای پروژه تحویل یکی دیگه بدی ، و پروژه تو هیچ مستندی نداره و طرف بعدی باید حداقل ۳ الی ۴ ماه باید وقت بزار کد شما رو بخونه سرویس های مرتبط رو چک کنه تا بتونه با ساختار کلی سیستم آشنا بشه.
پاسخ فنی با توجه تجربه خودم و افرادی که باهاشون در ارتباطم :
ببیند توسعه بد یک ویژگی باعث میشه شما یک بنا با پایه کج رو توسعه بدید.
هزینه زمانی اولیه شما برابر هستش با : ۱۰ ساعت با میانگین هزینه مالی ۲،۰۰۰،۰۰۰
خب حالا سیستم بالاس و داره کارشو میکنه ( دقت کنید فقط کار میکنه با عملکرد کاری نداریم فعلا )
حالا میخواید سیستم رو توسعه بدید و یک متد با در نظر گرفتن مورد "پشته یا Stack " یکی از موارد ساختمان داده هست پیاده سازی کنید . به طوری که متد فعلی شما روی داده قبلی شما که توسط ویژگی قبلی ایجاد شده تاثیر میزاره.
خب حالا مورد چیه ؟ (مثال)
دیتاتایپ های ایجاد شده در دیتابیس هیچکدوم استاندارد متد جدید شما رو نداره. مثلا یک مقداری که کلا قرار ۱ تا ۱۰ رو نگهداری کنه با فرمت چیه ذخیره شده ؟
یک ضرب المثل قدیمی هست که میگه هیچوقت نزار قدم بعدیتو حدس بزنن 😂
باید بگم در وحشتناک ترین حالت این داده با مقدار varchar ذخیره میشه :|
که بنظرم استاندارد بود از tinyint استفاده بشه چون فضای ذخیره سازی کمتری میگیره و استاندارد عدد هستش . شاید بگید بابا ۱۰۰ تا رکورد این حرف ها رو نداره . آره ولی یه جدول با ۱۰ میلیون رکورد ندید که کلا ۴ تا سطر داشت ولی ۵۰ گیگ شده بود :|
حالا میخواید اصلاح کنید و فیچر جدیدم بنویسید.
برای MR عزیزی که ویژگی اول نوشته و میخواد حالا ویژگی جدید با در نظر گرفتن بروز رسانی دیتاتایپش میشه :
5 ساعت متد جدید + ۵ ساعت بروزرسانی دیتابیس و اصلاح بخش ها و مایگریت کردن (MR) هزینه زمانی با در نظر گرفتن افزایش حقوق احتمالی بعد از ۶ ماه ( ۳.۰۰۰.۰۰۰)
حالا یه فرد جدید که با سیستم تازه اشنا شده و سورسو رو گرفته و میخواد این موضوع رو اصلاح کنه
به دلیل آشنایی کمش و ضریب ریسکش
۱۰ ساعت متد جدید + ۲ ساعت سردرگمی در پروژه + ۱۰ ساعت پیدا کردن باگ و ریفکتور کردن ( با احتمال آسیب رساندن به بخش های دیگه )
مجموعا ۲۲ ساعت = هزینه تقریبی نیروی جدید (حداقل ۶.۰۰۰.۰۰۰) !!!
حالا توسعه بد هم زمان شما رو اشغال کرده هم کیفیت کارو پایین اورده و ممکنه تاثیر بدتریم بزاره و هزینه بیشتری از نظر مالی رو دست شما گذاشته.
ببینید این موارد که گفتم صرفا هزینه زمانی و مالی ریفکتور کردنه ! ریفکتور کردن از توسعه فیچر جدید جلوگیری میکنه و افزودن ویژگی های جدید رو دشوار میکنه. و حتی گاهی اوقات بوده که پرژوه ی میکروسرویسی داشتیم که ۱۳ تا سرویس بوده و نگهداری بسیار دشواری داشته !! چرااااا ؟ چون تحویل مهم تر از کارایی بوده !!!
دوستان موقع کد زدن یا زمان دادن برای طراحی و توسعه سیستم دستتون رو کیبورد و موس قرار بدید و با ذهن باز و آگاه کار ببینید !
یه دستتون توپ تنیس نباشه دستت دیگه اتون رو کیبورد !
اشتباه کوچیک ما میتونه به قیمت جون چند میلیون آدم یا حتی از هم پاشیدن یک کسب و کار بشه !
تو پست بعد سعی میکنم حتما نمونه های واقعی از سورس کد ها قرار بدم :)