پروژههای نرمافزاری کلاً غیرقابل پیشبینی هستن و آیندهشون هم بیشتر اوقات نامعلومه. شما امروز یه کدی میزنید که شاید فردا نیاز باشه دوباره تغییرش بدید. همینطور محیطی که توش دارید برنامهنویسی میکنید (Env) هم از اول پروژه تا پایان پروژه احتمالاً کلی تغییر لازم داره؛ از ورژن کتابخونهها و ابزارها گرفته تا زیرساختها.
حالا فرض کنید دارید یه نرمافزاری مینویسید که کلی وابستگی داره. همونطور که میدونید، هرکدوم از این وابستگیها برای شما یک فضای عدم قطعیت بهوجود میاره. فرض کنین میخواین از یه دیتابیس جدید استفاده کنین، از یه کتابخونهای که تا به حال باهاش کار نکردید یا از هر محصول ThirdParty استفاده کنید. این عدم قطعیتها باعث میشه توی خیلی از چیزا تردید داشته باشید، مثل:
- تخمین زدن ددلاینها: این که بتونید زمان دقیق تحویل پروژه رو بگید، خیلی سخته، چون هر لحظه ممکنه یه تغییر توی یکی از این وابستگیها همه چی رو به هم بریزه.
- زمان انجام تسکها: شما ممکنه فکر کنید یه تسک قراره سریع تموم بشه، ولی وقتی وابستگیها شروع به تغییر کنن یا مشکلات جدید ظاهر بشن، کل زمانبندی بهم میریزه.
- یکپارچهسازی وابستگیها: آیا این وابستگی قراره بدون دردسر و کثیفکاری با پروژه شما Integrate بشه؟ یا اینکه باید برید یه روش دیگه پیدا کنید؟
همه این چیزا باعث میشه کلی شک و تردید توی کارتون بهوجود بیاد و از اونجایی که هر اشتباهی توی این موارد میتونه کل پروژه رو خراب کنه و همینطور کار افرادی که وابسته به پروژه شما هست هم به دلیل زمانبندی نامناسبی که داشتین عقب میفته، پس باید خیلی دقیق عمل کنید.
واقعیت اینه که این عدم قطعیتها جزو لاینفک توسعه نرمافزار هستن و شما باید یاد بگیرید چطور باهاشون کنار بیاید. یکی از روشهای کنار اومدن با این ناشناختگیها که من استفاده میکنم، اینه که بیاید اول کار وابستگیها رو وصل کنید به هم و یه فانکشن ساده از کل سیستم رو به همراه همه وابستگیهای که دارید پیاده کنید. بله درسته، بهترین روشی که میتونید این ناشناختگیها رو حذف کنید اینه که قبل تخمینزدنها و حسابکردن روی پروژه، بیاید واقعا دست به کد بشین و یه فانکشن ساده از پروژه رو که وابستگیهای ناشناختهتون رو درگیر میکنه پیادهسازی کنین. اما دقت کنین که این فانکشن رو توی شرایط پروداکشن داشته باشین و کدی که میزنین تمیز باشه تا بعدا هم بتونین ازش استفاده کنین.
به نظر من توی توسعه نرمافزار بهتره قبل این که لایههای نرمافزاریتون رو کامل پیادهسازی کنین، اول از هر چیزی یه پایه ریزی انجام بدین یعنی ارتباط بین لایههای مختلف رو برقرار کنین و بعدش شروع کنید و آروم آروم تغییرات رو اضافه کنید.