انواع طراحی در نرم‌افزار

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

یکی از این مفاهیم تفاوت دو مدل طراحی نرم‌افزار است که به نظر شخصی من تفکیک این دو طراحی کمک زیادی به تیم‌های تولید نرم‌افزار می‌کند تا بتوانند نرم‌افزار بهتری تولید کنند. از دید من طراحی نرم‌افزار به ترتیب زمان اجرا به دو نوع تقسیم می‌شود.

طراحی کارکرد (نوع اول)

طراحی کارکرد برنامه از دید کاربرد. این نوع طراحی مواردی مثل زیر را مشخص می‌کند:
۱- روال انجام یک کار معین چطور است و شامل چرا مراحلی می‌شود.
۲- روش ارتباط کاربر با برنامه از چه طریق بیشتر باشد، صفحه کلید، ماوس یا چیز دیگر؟
۳- اگر برنامه در جایی دچار خطا شد این خطا را چطور به کاربر اعلام کند و بعد از اعلام خطا چه چیزی باید اتفاق بیفتد؟
۴- برنامه چطور باید جلوی اشتباهات احتمالی کاربر را بگیرد.
۵- کار کردن با برنامه چقدر برای کاربر راحت است؟
۶- رنگ، اندازه قلم و کوچک بزرگی دکمه‌ها و فرم‌ها چطور باید باشد؟
۷- اگر کاربر اطلاعاتی را در صفحه‌ای وارد کرد و سهواً خارج شد، آیا برنامه تمهیدات لازم را برای جلوگیری از دست رفتن اطلاعات کابر دارد؟
۸- اگر یک چیز کوچک از نیازمندی‌های برنامه دچار مشکل شد، مثلاً اینترنت قطع شد یا کاغذ پرینتر تمام شد، آیا کل برنامه از کار می‌افتد؟
۹- آیا امکان تست برنامه یا قسمتی از آن بدون تاثیر بد روی اطلاعات عملیاتی وجود دارد؟
۱۰- امکانات backup/restore چقدر آسان و مطمئن است؟
۱۱- آیا سابقه‌ای از خطاهای سیستم وجود دارد؟
۱۲- آیا ساختار برنامه با منطق و صنعت مشتری (حسابداری، انبارداری و…) منطبق است؟
۱۳- آیا می‌توان در سیستم مشخص کرد که هر کسی چه کاری کرده؟
۱۴- آیا واقعاً برنامه توانسته سرعت عمل کاربرانش را بالا ببرد؟
۱۵- آیا برنامه می‌تواند علت خطاهای به وجود آمده را خوب بفهمد و علت واقعی خطا را نمایش دهد؟
۱۶- آیا برنامه طوری نوشته شده که نیاز به حضور مستمر افراد تیم پشتیبانی نداشته باشد؟
۱۷- چقدر طول می‌کشد تا کاربر بتواند به اطلاعات مورد نظرش دست پیدا کند؟ به عبارت دیگر جستجوی اطلاعات چقدر آسان یا سخت است.
۱۸- آیا برنامه یادش می‌ماند که کاربر در مراحل قبلی در حال انجام چه کاری بوده؟ این موضوع به کاربر کمک می‌کند تا مجبور نشود یک سری عملیات را مجدداً تکرار کند. مثلاً وقتی روی یکی از اقلام Grid کلیک شد و وارد صفحات اطلاعات جزیی شد، بعد از اتمام کار در صفحه جزیی بتواند به همان صفحه و آیتم از Grid قبلی بازگردد. یا اگر مثلاً کاربر در سه روز پیش در حال وارد کردن اطلاعات حضور و غیاب بود، بعد از سه روز باز هم بتواند از همانجا کارش را ادامه دهد.
۱۹- آیا امکان کار به صورت تعداد بالا یا فله‌ای (Bulk) موجود است؟ مثلاً اگر قرار شد ۱۲۰ تا نامه در پوشه «اداره مالیات» بایگانی شود باید این کار را تک تک انجام داد یا امکان انجام دفعتی آن موجود است؟
۲۰- آیا چیزی به نام امکان «ذخیره موقت» موجود است؟ مثلاً اگر انجام کاری ۳۰ دقیقه طول بکشد، آیا کاربر می‌تواند وسط کار بلند شده و با ذخیره موقت کار خیالش راحت باشد که اگر حتی کامپیوترش خاموش هم که شد باز کار نصفه نیمه‌اش از دست نخواهد رفت؟
۲۱- آیا برنامه امکان یادگیری از کاربر را دارد؟ مثلاً برنامه می‌تواند از کاربر یاد بگیرد روش اسکن و ذخیره مدارک چطور است و خودش این کار را با کمک چیزی مثل macro به طور خودکار و با کمترین دخالت کاربر انجام دهد؟
۲۲- آیا با یک نگاه کلی به برنامه می‌توان وضعیت فعلی برنامه مثل ارتباط با شبکه، عدم hang یا کاربر login کرده را فهمید؟
۲۳- …

بیشتر موارد این صفحه را می‌توان با اصطلاحاتی مثل کاربر پسندی (UserFriendly)، کاربرد پذیری و خطا ناپذیر سازی
بیان کرد. اما با این وجود منظور من از طراحی نوع اول همه‌ی این موارد با هم است. به نظر من انجام این طراحی توسط هر شخصی که نسبت به نرم‌افزار، کامپیوتر و نیازهای کاربران آشنایی و تجربه کافی دارد قابل انجام است و هیچ لزومی به برنامه‌نویس بودنش نیست. البته این به معنی کم اهمیت بودن موضوع نیست. بلکه برعکس خیلی مهم است. کافی است نگاهی به طراحی(نوع اول) ویندوز، Office، جیمیل، Visual Studio یا ویکی‌پدیا بیندازید تا بفهمید رعایت همین موارد ساده چقدر در موفقیت آنها تاثیر داشته.

طراحی فنی (نوع دوم)

این نوع طراحی را خیلی راحت‌تر می‌توان درک کرد. منظور از این طراحی، طراحی مورد نیاز برای پیاده‌سازی نرم‌افزار از جمله موارد زیر است:
۱- معماری لایه‌های نرم‌افزار چطور باشد؟
۲- از کدام رابط برای ارتباط با دیتابیس استفاده شود؟ از ADO.NET یا NHibernate؟
۳- تعریف عملیات در یک کلاس واحد باشد یا در طول چند کلاس پراکنده؟
۴- آیا لازم است از interfaceها استفاده شود؟
۵- تبادل اطلاعات بین صفحات از طریق query string انجام شود یا session؟
۶- دریافت اطلاعات از متودها به صورت ref و out باشد یا از کلاس‌های کمکی موسوم به DTO استفاده شود؟
۷- خوانایی مهم‌تر است یا performance؟
۸- منطق تجاری برنامه در اسکریپت‌ها و stored procedureهای دیتابیسی نگهداری شود یا در کلاس‌های سرویسی دات‌نت؟
۹- استفاده از تریگرها در دیتابیس مجاز است یا خیر؟
۱۰- از کدام فناوری برای Ajax استفاده شود؟
۱۱- …

همین طور که مشخص است این نوع طراحی فقط مخصوص برنامه‌نویس‌هاست. شاید بتوان گفت بخش زیادی از موضوع این نوع طراحی مربوط است به مبحث software artichecture. مشخص است که اگر بخواهیم در طراحی کارکرد (نوع اول) دستمان باز باشد باید حسابی به طراحی فنی (نوع دوم) مسلط بوده و آن را به بهترین وجه ممکن انجام داده باشیم.

مقایسه با صنعت ساختمان

اگر شما هم مثل من در دوران دانشگاه افتخار هم صحبتی با چندین دانشجوی معماری و عمران را داشته باشید، به درستی حدس خواهید زد که طراحی کارکرد (نوع اول) بسیار شبیه به کار معمارها و طراحی فنی (نوع دوم) بسیار شبیه به کار مهندسین عمران است. به عبارت دیگر تفاوت این دو نوع طراحی کاملاً مشابه تفاوت رشته‌های معماری و عمران می‌باشد. کار معمارها طراحی فضاها، نورپردازی، رنگ، بافت، دوری و نزدیکی اتاق‌ها به هم، مکان صحیح مثلاً آشپزخانه یا اتاق خواب والدین در ساختمان و… با توجه به مسائل فرهنگی، سبک‌های هنری، مسائل اجتماعی و حتی مذهبی و دیگر موارد است. در حالی که کار مهندسین عمران پیاده‌سازی طرح‌های معمارها و محاسبات فنی و ریاضی آن است. مهندسین عمران باید حساب کنند چه تیرآهنی با چه ضخامتی مورد نیاز است، عمق پی ساختمان چقدر باید باشد، ضخامت دیوارها مختلف چقدر باید باشد، از چه نوع سیمان، ماسه یا آجری باید استفاده شود و…