Cy Logic Insights

چگونه یک پروژه نرم‌افزاری سفارشی را مدیریت کنیم؟ نقشه راه هشت مرحله‌ای از تحلیل تا پشتیبانی

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

دلیل شکست پروژه‌های نرم‌افزاری سفارشی غالباً فنی نیست: محدوده مبهم، تصمیمات دیرهنگام و عدم شفافیت در اینکه چه کسی چه چیزی را تأیید می‌کند. در این مقاله، فرآیند هشت مرحله‌ای سای‌لاژیک، خروجی ملموس هر مرحله و انتظارات از سمت کسب‌وکار را شرح می‌دهیم. به عنوان مثال، پورتالی را برای یک شرکت املاک در نظر بگیرید که آگهی‌ها، درخواست‌های مشتریان و فرآیندهای فروش را مدیریت می‌کند؛ این مثال فرضی است و صرفاً برای ملموس‌تر کردن مراحل استفاده شده است.

۱. کشف نیاز

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

۲. تحلیل

فرآیندها و داده‌های موجود بررسی می‌شوند: فیلدهای آگهی، منابع درخواست، دسترسی‌های مشاوران، نیازهای گزارش‌دهی. در این مرحله بین «بایدها» (Must-haves) و «خوب است که باشد» (Nice-to-haves) تمایز قائل می‌شویم. خروجی: نقشه فرآیند، دیکشنری داده و فهرست اولویت‌بندی.

۳. برنامه‌ریزی

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

۴. طراحی

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

-- نمونه سطر ماتریس دسترسی (مفهومی)
-- rol: danisman   | kaynak: musteri_talebi | işlem: oku   | koşul: atanan_danisman = kullanıcı
-- rol: yonetici   | kaynak: musteri_talebi | işlem: oku   | koşul: aynı şube
-- rol: yonetici   | kaynak: rapor          | işlem: oku   | koşول: yok

۵. توسعه

کد به صورت ماژولار و قابل تست نوشته می‌شود. دو اصل اهمیت دارند: هر ماژول باید بتواند به طور مستقل منتشر شود و قوانین کسب‌وکار (مثلاً محاسبه کمیسیون) باید در لایه‌ای جدا از رابط کاربری قرار داشته باشند. در طول توسعه، سمت کسب‌وکار باید هر دو هفته یک بار نرم‌افزار کارآمد را ببیند؛ رویکرد «در نهایت [همه چیز را] نشان خواهیم داد» بزرگ‌ترین ریسک است.

۶. تست

تست در سه سطح انجام می‌شود: تست‌های واحد و یکپارچه‌سازی خودکار، کنترل‌های امنیتی (سیاست‌های دسترسی، اعتبارسنجی ورودی، عناوین OWASP Top 10) و تست‌های پذیرش با کاربران کسب‌وکار. در تست پذیرش از سناریوهای واقعی استفاده می‌شود: «درخواست جدید آمد، به مشاور اختصاص یافت، یادداشت گفتگو ثبت شد، فروش بسته شد.»

۷. انتشار

گذار به محیط زنده به صورت کنترل‌شده انجام می‌شود: تمرین مهاجرت داده، برنامه بازگشت (Rollback)، نظارت شدید در هفته اول. مدت زمان کار موازی با سیستم قدیمی از پیش تصمیم‌گیری می‌شود. خروجی: چک‌لیست انتشار و کتابچه راهنمای بهره‌برداری.

۸. پشتیبانی و توسعه

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

گران‌ترین جمله در یک پروژه نرم‌افزاری این است: «ما منظورمان این نبود»; این جمله با پیشرفت مراحل به طور تصاعدی گران‌تر می‌شود. بیان آن در مرحله پروتوتایپ ارزان‌ترین حالت است.

مسئولیت‌های سمت کسب‌وکار

  • تعیین یک مالک پروژه واحد که اختیار تصمیم‌گیری داشته باشد.
  • بررسی و تأیید خروجی هر مرحله در زمان مشخص‌شده.
  • اشتراک‌گذاری به‌موقع داده‌های واقعی و اسناد موجود (قالب‌های قرارداد، لیست قیمت‌ها).
  • مشارکت دادن کاربران نهایی در تست پذیرش.

یکپارچه‌سازی‌ها: از ابتدا برنامه‌ریزی کنید

بسیاری از نرم‌افزارهای سفارشی به‌تنهایی کار نمی‌کنند: نرم‌افزار حسابداری، سرویس‌های پیامک و ایمیل، زیرساخت پرداخت، سرویس‌های نقشه. اگر نیازمندی‌های مربوط به قرارداد، اطلاعات دسترسی و محیط تست یکپارچه‌سازی‌ها در مرحله کشف فهرست نشوند، این موارد بیشترین تأخیر را در تاریخ انتشار ایجاد خواهند کرد. ایجاد یک لایه یکپارچه‌سازی مبتنی بر REST API و وب‌هوک که قابل ردیابی باشد (ثبت سوابق هر انتقال)، این ریسک را کاهش می‌دهد.

قرارداد و محدوده: چگونه ابهام را مدیریت کنیم؟

در نرم‌افزار سفارشی، محدوده با چیزهایی که در طول پروژه آموخته می‌شود تغییر می‌کند؛ این یک نقص نیست، ماهیت آن است. قرارداد باید این موضوع را به رسمیت بشناسد. یک مدل عملی: مراحل تحلیل و طراحی با محدوده ثابت و هزینه ثابت، و مراحل توسعه با تحویل‌های تدریجی (مجموعه ویژگی‌های تعریف‌شده در هر تحویل) انجام می‌شوند. معیار پذیرش هر تحویل مکتوب است؛ «خوشمان نیامد» معیار پذیرش نیست، اما «این سناریو کار نمی‌کند» معیار است.

درخواست‌های تغییر

هنگامی که درخواست جدیدی می‌آید، سه سوال پرسیده می‌شود: آیا این مورد در محدوده مرحله فعلی قرار دارد؟ اگر نه، به کدام مرحله منتقل خواهد شد؟ آیا تقویم فعلی را تحت تأثیر قرار می‌دهد؟ درخواست تغییر رد نمی‌شود، بلکه دسته‌بندی می‌شود. هنگامی که این دسته‌بندی به صورت مکتوب انجام شود، بحث‌های پایان پروژه مانند «شما گفته بودید / ما نخواسته بودیم» از بین می‌رود.

مستندسازی: چه چیزی و چقدر؟

مستندسازی همه چیز ممکن نیست؛ مستندسازی چیزهای درست ممکن است:

  • تصمیمات معماری: چرا این پایگاه داده، چرا این مدل دسترسی؛ سوابق تصمیم‌گیری کوتاه.
  • دیکشنری داده: معنای هر جدول و ستون حیاتی، طبقه بندی داده‌های شخصی، مدت زمان نگهداری.
  • کتابچه راهنمای بهره‌برداری: انتشار، پشتیبان‌گیری، بازیابی، مشکلات رایج.
  • راهنمای کاربر: مبتنی بر وظیفه نه مبتنی بر صفحه («چگونه درخواست جدید باز کنیم»).

اگر تیم توسعه تغییر کند، بقای سیستم به این چهار سند وابسته است.

استراتژی تست: کدام تست کجا؟

تست‌های واحد قوانین کسب‌وکار (محاسبه کمیسیون، زنجیره تأیید)، تست‌های یکپارچه‌سازی سیاست‌های پایگاه داده و قراردادهای API، و تست‌های سرتاسری جریان‌های حیاتی کاربر را پوشش می‌دهند. تست خودکار سیاست‌های دسترسی به ویژه مهم است: قاعده «مشاور الف نباید بتواند مشتری مشاور ب را ببیند» باید در هر نسخه تأیید شود؛ اگر این تست وجود نداشته باشد، امنیت تصادفی خواهد بود.

// نمونه: تست سیاست دسترسی (مفهومی)
test('danışman yalnızca kendi taleplerini görür', async () => {
  const asConsultantA = clientFor(userA);
  const rows = await asConsultantA.from('enquiries').select('id');
  expect(rows.every((r) => r.assigned_to === userA.id)).toBe(true);
});

۳۰ روز اول پس از انتشار

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

چه زمانی نباید نرم‌افزار سفارشی ساخت؟

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

در سای‌لاژیک، هر پروژه نرم‌افزاری سفارشی این هشت مرحله را دنبال می‌کند؛ مراحل بر اساس مقیاس کوتاه‌تر می‌شوند اما حذف نمی‌شوند.