فکر، پیش از قبول درخواست مشتری را فراموش نکنید!

برنامه‌نویسان عزیز، بدون فکر چیزی را قبول نکنید! برنامه‌نویسان عزیز، بدون فکر چیزی را قبول نکنید!همه‌ ما در طی سال‌هایی که مشغول به کار بوده‌ایم، تجربیات تلخ و شیرینی داشتیم. امروز من قصد دارم با به‌اشتراک‌گذاشتن یکی از خاطرات تلخ و البته آموزنده خودم، از بروز آن برای شما در شرایط مشابه جلوگیری کنم.حدودا ۹ سال پیش، مشغول انجام یک پروژه برنامه‌نویسی بودم. از همان سال‌ها، همواره اعتقاد داشتم که همیشه حق با مشتری است، موضوعی که هنوز هم به آن اعتقاد دارم. با آنکه عقیده صحیحی داشتم، اما بی‌تجربگی من باعث اقدامات اشتباهی شد.موضوع از جایی شروع شد که در یکی از جلسات، مشتری از من خواست که در یک صفحه، به کمک جاوا برایش ساختار درختی طراحی کنم. باوجود آنکه تجربه این کار را نداشتم، با اعتماد به نفس بالا، درخواست مشتری را پذیرفتم.درخت را با JSP و تگ‌های سرورساید (Server-side) به نحوی طراحی کردم که فقط قابلیت مشاهده ساختار درختی را داشت و عملیات‌ Crud را نیز در فرم‌های جداگانه طراحی کردم و با همان اعتماد به ‌نفس اولیه، نتیجه کار را پیش مشتری بردم.مشتری وقتی طراحی من را دید، ضمن ابراز نارضایتی اشاره کرد که عملیات‌ Crud لازم است داخل خود درخت انجام شود و فردی که از آن استفاده می‌کند، بتواند با راست کلیک روی نودهای درخت، عملیات ثبت، ویرایش، حذف و اضافه را انجام دهد. با توضیحات جدید مشتری، کار پیچیده‌تر شد، با وجود آنکه انتظار چنین امکاناتی در درخت را نداشتم، اما به دلیل آنکه همه چیز در ذهنم شدنی بود، باز هم انجام آن را قبول کردم.اصلاحات جدید را انجام دادم. کاربر با یک راست کلیک روی درخت و انتخاب منو، می‌توانست عملیات دلخواه خود را انجام دهد. اما چون صفحه را از اول Server-side طراحی کرده بودم، بعد از انجام هر عملیات، صفحه رفرش می‌شد، باز هم مورد قبول مشتری قرار نگرفت.برای ویرایش‌های بعدی، به دلیل آنکه تمام کدهای صفحه، تگ‌های سرورساید بودند و اصلا وقت و البته حوصله کلاینت ساید کردن آن را نداشتم، از فریم ورک ajax-zone استفاده کردم که به من این امکان را می‌داد در هر جایی از صفحه که تگ سرورساید وجود داشت، بتوانم به‌راحتی آن را به کلاینت ساید تدیل کنم.بعد از اتمام کار با امید زیاد، نتیجه را برای مشتری ارائه کردم و شکر خدا، نتیجه تا اینجای کار مورد قبول قرار گرفت. اما مورد قبول قرارگرفتن همانا و روانه‌شدن درخواست‌های بیشتر همانا. درخواست‌هایی مثل نمایش امکانات کپی، کات، جایگزینی و نشان‌دادن ریشه‌ها با یک شکل، و برگ‌ها با شکل دیگر، فعال و غیرفعال‌کردن برخی نودها، عدم امکان انتقال بعضی از نودها، عدم امکان کپی روی برخی نودها و... . خلاصه قرار بود درخت ما هر کاری انجام دهد به جز سیب‌دادن!با بررسی این درخواست‌ها متوجه شدم پیاده‌سازی آن بسیار زمان‌بر خواهد بود. خصوصا در درختی که ۱۶۰۰۰ مجموعه داشت که هر کدام حاوی زیرمجموعه‌های تو در توی دیگر بود، که لودشدن این درخت عظیم، باعث می‌شد حجم صفحه به‌شدت بالا برود و به‌شدت نیز کند شود.برای رفع این مشکلات، گشتن در اینترنت برای پیداکردن یک کامپوننت Client-side که بتواند امکانات خواسته‌شده را پوشش دهد را آغاز کردم و dhtmlx را پیدا کردم که هم زیبا بود و هم امکانات خوبی داشت.بازنویسی صفحه مورد نظر را با این تکنولوژی آغاز کردم و در میانه راه، متوجه شدم بخشی از عملیات‌ درختی در نسخه غیررایگان آن وجود دارد. در شرایطی قرار گرفته بودم که نه راه پس داشتم و نه راه پیش، برخی از امکانات مورد نظر نیز فقط در ظاهر درخت اعمال شد و برای قسمت بک‌اند آن امکانی که می‌خواستم وجود نداشت. با توجه به آنکه راه برگشتی نداشتم، فایل dhmtlx.js تک‌خطی (برای پایین‌آمدن حجم) را باز کردم و شروع کردم به دیباگ‌کردن فایل js، پیداکردن مشکلات و اضافه‌کردن امکانات مورد نیاز خودم. کسانی که قبلا فایل‌های جاوا اسکریپت چند ده هزار خطی را دیباگ کرده‌اند، می‌دانند که این کار بسیار طاقت‌فرسا و دشوار است و من نیز، ناچار به انجام این کار دشوار شده بودم.ناچار شدم متدهایی که فقط در نسخه پولی در اختیارم قرار می‌گرفت را خودم با مدل dhtmlx بنویسم و به فایل js اضافه کنم. هرچه بیشتر پیش می‌رفتم کار بسیار سخت‌تر می‌شد و ناچار می‌شدم متدهای بیشتری از فایل js را بازنویسی کنم. کار آنقدر سخت شده بود که در بخشی از مسیر به رفتن پیش مشتری و ابراز ندامت هم فکر کردم! اما با این وجود کار را ادامه دادم و به‌ سرانجام رساندم، سرانجامی پر از درس برای همیشه.موقعیتی که درباره آن صحبت کردم، امکان دارد برای هر کسی رخ دهد یا پیشتر آن را تجربه کرده باشد. برای همین سعی کردم با به‌اشتراک‌گذاشتن تجربه و درس‌هایی که از آن گرفتم، راهگشای دیگران باشم.درس اول آن بود که قبل از قبول نیازمندی‌های مشتری، مطمئن شوید که توانایی انجام آن را دارید، روی روش‌های انجام آن اشراف کامل دارید و بدون فکر چیزی را قبول نکنید.درس دوم، سوال‌کردن از مشتری است. نیاز مشتری را دقیق بپرسید و از سوال‌کردن زیاد نترسید. خصوصا درباره مشتری‌هایی که راهکاری جز برآورده‌کردن نیازهایش دارید، ترس از آنکه با سوال‌کردن زیاد، درخواست‌هایش هم بیشتر شود، اشتباه است. آن نیازها روزی گریبان‌گیر شما خواهند شد، پس به اندازه نیازتان سوال کنید تا برایتان شفاف شود.درس آخر برای من، سوال و مشورت با افراد خبره بود. اگر نیازی از سمت مشتری دریافت کردید که به روش انجام آن اشراف ندارید، اعتماد به نفس کاذب را کنار بگذارید و برای انتخاب تکنولوژی و روش انجام آن، با افراد خبره مشورت کنید.توجه به این موارد، به ما کمک می‌کند در نهایت ناچار به انجام فرایندهای سخت و زمان‌بر نشویم.